In diesem Kapitel beschäftigen wir uns mit Tastern und Schaltern und wie man sie unter Python3 anspricht. Dazu benutzen wir eine Bibliotheksdatei pigpio, die das Lesen und Schreiben von GPIOS unterstützt; dabei werden die Pins des Raspi über die Broadcom-Bezeichner angesprochen.
Vorbereitung des Raspberry Pi
Über PyPi wird die Programmbibliothek pigpio mit
installiert. Ist das erfolgt, wird im Konsolefenster mit
der pigpio-Dämon gestartet.
Welche Befehle stellt die Bibliotheksdatei pigpio.py bereit?
Die Datei pigpio.py befindet sich nach erfolgreicher Installation im Verzeichnis
Öffne die Datei und hole dir dort alle Informationen, die du benötigst, um ein erstes Programm zu schreiben. Ein Pythonprogramm muss am Anfang immer die Bibliothek pigpio importieren und eine oder mehrere Instanzen der Klasse pigpio.pi erzeugen.
Mit
lassen sich dann über pi alle lokalen GPIOs ansprechen.
setzt den lokalen GPIO 2 auf LOW, während
GPIO 3 ihn auf HIGH zieht.
Mit
wird der Zustand des GPIO18 ausgelesen und kann mit einem Vergleichsoperator ausgewertet werden.
setzt bzw. löscht den zugehörigen GPIO pull-up/-down Widerstand (GPIO:= 0..53). Dieser kleine Auszug soll reichen, um ein erstes Programm für Übung 1 zu schreiben.
Übung 1 - Taster schaltet LED ein/aus | ||
Material |
|
|
Aufgaben |
|
Schaltskizze und Schaltungsaufbau
Abb. 1 - Die rote LED wird an GPIO3 (Pin 3) angeschlossen. Sobald der Taster gedrückt wird, wird der Ausgang GPIO3 auf HIGH gezogen und die LED geht an. Um die Leuchtstärke der LED zu erhöhen, kann der Vorwiderstand auf 220 Ohm zurückgesetzt werden.
Taster T1 ist an GPIO18 (Pin12) angeschlossen. In der Zeichnung ist nicht der Pullup-Widerstand eingezeichnet, der softwaremäßig hinzugeschaltet wird. Wird die Programmzeile "pi.set_pull_up_down ..." im Programm vergessen, kann dies zur Zerstörung des RaPi führen.
Das Programm ra_taster_led.py
Wie arbeitet das Programm ra_taster_led.py?
In der Endlosschleife
wird überprüft, ob an GPIO18 der Pegel auf HIGH steht oder anders gesagt, ob der Taster nicht gedrückt ist. Ist das der Fall, wird der Pegel am Ausgang GPIO2 auf LOW gesetzt und eine kleine Pause eingelegt.
Ist der Pegel an GPIO18 auf LOW, der Taster also gedrückt, wird im ELSE-Zweig der Entscheidungsbefehls der Ausgang GPIO2 auf HIGH gesetzt. Die LED geht an.
Mit dem Schaltungsaufbau aus Übung 1 lässt sich auch eine Schaltung programmieren, die eine LED blinken lässt, solange der Taster gedrückt wird. Das nachfolgende Python-Programm zeigt eine mögliche Lösung.
Das Programm ra_taster_blinker.py
Bei gleichem Schaltungsaufbau wie in Übung 1 lässt sich eine Schaltung programmieren, die eine LED bei jedem Tastendruck umschaltet. Leuchtet die LED am Anfang nicht, dann wird mit dem ersten Tastendruck die LED eingeschaltet; ein zweiter Tastendruck schaltet sie wieder aus. Eine Softwarelösung zeigt das folgende Programm.
Das Programm ra_taster_umschalter.py
Wie arbeitet das Programm taster_blinker.py?
Nach der Instantierung der pigpio-Klasse und dem Einschalten des eingebauten Pull-Up-Widerstandes wird die LED ausgeschaltet. Neu ist in der Endlosschleife WHILE(True), die Funktion
GPIO kann alle Werte von 0 ... 31 annehmen
Edge kann RISING_EDGE, FALLING_EDGE oder EITHER_EDGE sein.
Bei jedem Tastendruck liegt eine fallende Flanke vor (GPIO18 wird auf LOW gezogen). Liegt an GPIO2 ein LOW-Pegel an, wird dieser auf HIGH geändert und die LED fängt an zu leuchten. Ist das nicht der Fall, wird GPIO2 auf LOW gezogen.
In dieser Übung soll die LED erst dann anfangen zu leuchten, wenn der Taster ca. 5s gedrückt wird.
Das Programm ra_zeitschalter_led.py
Variante 1:
Vier LEDs sollen gleichzeitig auf HIGH gezogen werden, sobald man einen Taster betätigt. Damit stellen wir die Funktionsfähigkeit der Schaltung für die Varianten 2 und 3 erst einmal sicher.
Variante 2:
Es wird eine Zeit T vorgegeben; sobald der Taster gedrückt wird, leuchtet eine der vier LEDs zufallsgesteuert auf. Das Lichtspiel erlischt nach T Sekunden.
Variante 3:
In einer dritten Variante wird eine Zeit T vorgegeben; sobald dann der Taster gedrückt wird, leuchtet eines der möglichen Muster (bei 4 LEDs) zufallsgesteuert auf. Das Lichtspiel erlischt nach T Sekunden.
In allen drei Varianten wird mit GPIO Zero gearbeitet, dass im neuesten Raspbian-Image (>= 7.2019) bereits installiert ist.
Die maximale Belastung der I/O Ports
Ganz allgemein sollte die Belastung pro Pin bei maximal 15mA liegen. Alle Pins zusammen vertragen nicht mehr als 50mA. Der maximale Spannungswert von 3,3V darf an den I/O Ports des Raspberry Pi nicht überschritten werden.
Die in diesem Versuch angeschlossenen roten LEDs werden mit einem Vorwiderstand an Ausgänge des RasPi angeschlossen. Die Flussspannung einer roten LED liegt bei ca. 1,7 V. Damit lässt sich schnell nach dem Ohmschen Gesetz abschätzen, welcher Strom pro Pin und welcher Gesamtstrom fließt.
In jedem Fall müssen die Grenzwerte eingehalten werden, um den RasPi nicht zu zerstören. Das gilt in dieser Übung besonders für Variante 3.
Bei der ersten Variante geht es "nur" darum, festzustellen, ob alle LEDs und der Taster richtig angeschlossen sind und ob die LEDs auf Tastendruck reagieren und funktionieren.
Kleines LED Lichtspiel - Variante 1 | |
Aufgabe |
|
Material |
|
Schaltskizze
Schaltungsaufbau
Das Programm
Am Ende dieser Übung wissen wir, dass alle aufgebauten LEDs und der Taster richtig beschaltet sind und funktionieren ;-))
In der zweiten Variante dieser Übung geht es darum, zufallsgesteuert jeweils eine der vier LEDs für eine bestimmte Zeit aufleuchten zu lassen. Wer möchte, kann natürlich die Anzahl der LEDs erhöhen und/oder andere Farben wählen, um den Lichtspieleffekt deutlicher sichtbar zu machen.
Kleines LED Lichtspiel - Variante 2 | |
Aufgabe |
|
Material |
|
Versuchsaufbau
Der Versuchsaufbau aus Übung 5 - Variante 1 wird übernommen.
Das Programm Lichtspiel_2.py
Das auskommentierte Programm erklärt jeden Programmschritt.
Vorüberlegung
Bei der dritten Variante dieser Übung geht es darum, wie man ein zufallsgesteuertes Lichtspielmuster auf vier LEDs abbilden kann oder mit anderen Worten, wieviele Möglichkeiten gibt es, bei vier LEDs, unterschiedliche Leuchtmuster zu erzeugen?
Man kommt sehr schnell darauf, dass es bei 4 LEDs genau
sind. Erhöht man die Zahl der LEDs zum Beispiel auf 10, dann gibt es
Zurück zu unseren vier LEDs. Klären wir als erstes, wie denn die 16 verschiedenen Leuchtmuster aussehen. Ein kleines Raster hilft dabei.
Abb. 1
In der obersten Zeile stehen die Stellenwerte des Zweiersystems, darunter in der zweiten Zeile sind die Pinanschlüsse der anzusteuernden LEDs für diese Übung eingetragen. Eine „1“ steht für „Die LED leuchtet“, eine „0“ für „Die LED leuchtet nicht“. Andere Bitmuster als die aufgeführten gibt es nicht.
Die Idee ist es nun, eine Zufallszahl zwischen 0 und 15 zu erzeugen und das zugehörige binäre Bitmuster auf den LEDs abzubilden.
In der Sprache Python gibt es da eine einfache Möglichkeit, die wir uns gleich anschauen werden.
Kleines LED Lichtspiel - Variante 3 | |
Aufgabe |
|
Material |
|
Versuchsaufbau
Der Versuchsaufbau ist mit denen aus Variante 1 und 2 identisch.
Das Programm Lichtspiel_3a.py
Programmzeilen 43 - 81
In dieser Endlosschleife werden die Darstellungsmuster für die LEDs über eine IF-Anweisung an die LEDs übertragen, so wie in Abb. 1 dargestellt. Jedem Zeichen zwischen 0 und 15 entspricht das binäre Bitmuster.
Programmzeilen 83 - 90
Nachdem das Bitmuster an die LEDs übertragen wurde, wird eine Pause von 1 Sekunde eingelegt und die interne Zeitmarke an t1 übergeben. Solange die abgelaufene Zeit (t1 - t0) die eingebene Wunschlaufzeit im Speicher sekunden noch nicht überschritten hat, wird die Endlosschleife weiter durchlaufen.
Programmzeilen 92
Wurde die Laufzeit überschritten, wird die Schleife beendet und alle LEDs auf LOW oder 0 gesetzt.