Stern inaktivStern inaktivStern inaktivStern inaktivStern inaktiv
 

Um sich mit Threading in Python einzuarbeiten ist es am einfachsten wenn man sich eine konkrete Aufgabe stellt, die zu implementieren ist. Was lag es da näher als an einer Raspberry PI mal eben 6 LEDs anzuschliessen und per GPIO zu steuern. Auf den folgenden Seiten beschreibe ich kurz wie das Programm funktioniert bzw was man anpassen muss, damit man es auf seiner eigenen Raspi laufen lassen kann. Weiterhin findet sich ein Video welches das Programm in Aktion zeigt sowie ein Link zum Download des Python Codes.

 

 

Anbei ein Photo (Klick das Photo um ein Video zu sehen) des Breadboardaufbaues mit einem T-Cobbler, jeweils drei LEDs und zugehörigen Widerständen links und rechts, die zwei im rechten Winkel zueinander stehende Ampeln darstellen sollen.

raspiTrafficLight

 

Im Programm sind drei verschiedene Ampelprogramme implementiert, die die LEDs unterschiedlich ansteuern. Zu Anfang werden alle LEDs ein paar Mal angesteuert um alle LEDs zu testen. Danach starten die Ampelprogramme die jeweils durch das Ampelnotprogramm - da blinken nur die gelben LEDs auf allen Seiten - unterbrochen werden. Dieses wird in einer Endlosschleife fortgeführt. Ein Video der Ampeln in ihrer Aktion ist hier zu finden. Das Pythonprgramm steht hier zum Download zur Verfügung.

Auf dem RaspberryPi Forum gibt es zu dem Pythonprogram und der Handhabung von Threads auch einen interessanten Thread. 

Um das Programm benutzen zu können müssen die folgenden Zeilen die die GPIO Pins definieren, an denen die LEDs angeschlossen sind, entsprechend angepasst werden.

GPIO.setmode(GPIO.BOARD)
# GPIO pins for red yellow green
trafficLight1=[18,22,7]         # <=== Adapt to local environment
trafficLight2=[13,15,16]        # <=== Adapt to local environment

Die erste Pin in der Liste ist die rote LED und die letzte Pin ist die grüne LED.

Folgender Code definiert eine normale Ampelschaltung wo immer rot/gruen, rot-gelb/gelb und gruen/rot bei beiden Ampeln gleichzeitig leuchtet und kann als Vorlage genommen werden um eigene AmpelProgramme zu erstellen:

NORMAL_PROGRAM[0]=[
        [[1,0,0],SLEEP_MAIN],        # red
        [[1,1,0],SLEEP_TRANSITION],  # red yellow
        [[0,0,1],SLEEP_MAIN],        # green
        [[0,1,0],SLEEP_TRANSITION]   # yellow
    ]
NORMAL_PROGRAM_PHASE_RED[0]=0
NORMAL_PROGRAM_PHASE_GREEN[0]=len(NORMAL_PROGRAM[0])/2

Die Bedeutung ist wie folgt:

Pro Ampelprogramm sind 3 Variablen zu definieren, die jeweils in einer Liste stehen.

Das erste Element pro Zeile des Ampelprogrammes NORMAL_PROGRAM (z.B. [1,0,0]) definiert welche LEDs in diesem Zustand leuchten sollten. [1,0,0] lässt z.B. nur die rote LED leuchten. SLEEP_... ist eine Konstante, die definiert, wie lange diese LED leuchten soll. Es sind Vielfache des zentralen Steuerungstaktes CONDUCTOR_TICK_TIME. Das gesamte Ampelprogramm besteht dann aus einer Reihenfolge von diesen Zuständen. NORMAL_PROGRAM_PHASE_RED und NORMAL_PROGRAM_PHASE_GREEN definieren den Index in der Programmliste, der den roten Ampelphasenzustand bzw den grünen Ampelphasenzustand definiert. z.B. ist NORMAL_PROGRAM_PHASE_RED=0 da die erste Zeile im Programm der Rotzustand der Ampel ist während NORMAL_PROGRAM_PHASE_GREEN[0]=len(NORMAL_PROGRAM[0])/2, was genau 3 ist, den Grünzustand der Ampel definiert.

Die Variablen

DEBUG=False                        # threading debug
Thread_CTORDTOR=False

können auf True gesetzt werden und man erhält damit Debugausgaben die helfen den Codeflow sowie die Threadingfunktionen zu verstehen

Das Beispielprogramm wurde unter die GPL gestellt und das git Repository ist hier verfügbar.

Kommentar schreiben

*** Hinweis ***

Kommentare sind erwünscht. Aber um lästige Spamposts abweisen zu können gibt es ein paar Dinge die zu beachten sind:
  1. Kommentare mit dem Text http werden sofort zurückgewiesen mit der Meldung Sie sind nicht berechtigt den Tag zu verwenden. zz
  2. Kommentare werden manuell überprüft und es dauert deshalb in der Regel einen Tag bis sie veröffentlicht werden.