Der Raspberry Pi 5 ist gerade erschienen und hat uns einen leistungsstärkeren Pi vorgestellt, aber es hat auch ein paar Dinge geändert und vor allem war es der GPIO.
Wir haben immer noch den gleichen 40-Pin-GPIO, aber er funktioniert jetzt etwas anders, da er mit dem neuen RP1-Southbridge-Chip verbunden ist. Warum ist das wichtig? Nun, alles läuft darauf hinaus, wie wir Code schreiben, der mit dem GPIO interagiert. In der Vergangenheit bevorzugten viele Projekte RPi.GPIO. Dies war ein Gemeinschaftsprojekt von Ben Croston und es hat mehreren Generationen von Raspberry Pi gute Dienste geleistet. Mit dem Raspberry Pi 5 können wir RPi.GPIO aufgrund der Speicherzuordnung der GPIO-Pins nicht verwenden. Dies zwingt uns, eine Alternative zu verwenden, und libgpiod steht im Mittelpunkt dieser Anleitung.
Genauer gesagt Libgpiod python3-gpiod ist ein reines Python-Modul zur Interaktion mit dem GPIO. Es fühlt sich ähnlich wie RPI.GPIO an, da wir die GPIO-Pins explizit festlegen müssen, bevor wir sie verwenden. Wir sehen gpiod eher als Zwischenmodul für Python und den GPIO. Wenn Sie neu in diesem Bereich sind, verwenden Sie GPIO Null das auch mit dem Raspberry Pi 5 funktioniert. GPIO Zero wurde von Ben Nuttall und Dave Jones entwickelt und vereinfacht das GPIO erheblich.
Wir werden zwei sehr einfache Projekte mit gpiod erstellen. Der erste ist ein Ausgang, eine LED. Der zweite ist ein Eingang, eine Taste, die das Ein- und Ausschalten der LED auslöst.
Für diese Projekte benötigen Sie
Projekt 1: Ausgabe, Blinken einer LED
Das erste Ziel beim Erlernen einer Sprache/eines Frameworks ist die Erstellung eines „Hello World“-Programms. Bei Hardware, Hacking und Elektronik ist dies eine blinkende LED.
Die Schaltung ist äußerst einfach. Wir haben das lange Bein (Anode) einer LED über einen Überbrückungsdraht mit GPIO 17 verbunden. Das kurze Bein (Kathode) ist über einen Widerstand und einen weiteren Überbrückungsdraht mit GND verbunden. Der Widerstand kann einen beliebigen Wert zwischen 100 und 330 Ohm haben (Orange-Orange-Braun-Gold). Schauen Sie sich unsere an Referenzhandbuch für Widerstände für mehr Informationen.
1. Öffnen Sie Thonny und importieren Sie zwei Codemodule. Das erste Modul ist gpiod, das zum Steuern und Lesen des GPIO verwendet wird. An zweiter Stelle steht die Zeit, die verwendet wird, um eine Pause in den Code einzufügen.
import gpiod
import time
2. Erstellen Sie eine Variable namens LED_PIN und speichern Sie darin den Wert 17. Diese Variable enthält die Broadcom-Pin-Referenz für einen GPIO-Pin auf allen Raspberry Pi-Modellen. Broadcom-Pin-Referenzen sind der Standard, der in der gesamten Raspberry Pi-Dokumentation verwendet wird. Es nutzt den Breakout vom SoC zum GPIO. Für uns sieht es vielleicht nicht logisch aus, aber für die Ingenieure, die die Platinen erstellen, sind die Stifte korrekt herausgebrochen.
LED_PIN = 17
3. Teilen Sie dem Code mit, wo sich der GPIO befindet. Ursprünglich verfügte der Raspberry Pi über ein einzelnes GPIO-Gerät, das im Speicher abgebildet wurde und wir es mit Python-Modulen wie RPi.GPIO verwenden konnten. Mit dem Raspberry Pi 5 und dem RP1-Chip haben wir jetzt dynamisch geteilte Geräte und unser GPIO liegt bei gpiomem4.
chip = gpiod.Chip('gpiochip4')
4. Erstellen Sie eine Variable namens led_line und speichern Sie einen Verweis auf den LED-GPIO-Pin. Das gpiod-Modul verwendet Zeilen, um auf die GPIO-Pins zu verweisen.
led_line = chip.get_line(LED_PIN)
5. Stellen Sie die LED als Ausgang ein. Wir möchten, dass Strom zur LED fließt.
led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
6. Wickeln Sie den Hauptteil des Codes in eine Try- und While-True-Schleife ein.Try ist Teil eines Ausnahmehandlers, der versucht, unseren Code auszuführen. Er kann Ausnahmen behandeln und beim Beenden einen Codeabschnitt ausführen.
try:
while True:
7. Drehen Sie die LED und warten Sie dann eine Sekunde. Dadurch wird die LED gezwungen, eine Sekunde lang eingeschaltet zu bleiben.
led_line.set_value(1)
time.sleep(1)
8. Schalten Sie die LED aus und warten Sie dann eine Sekunde. Der Ruhezustand zwingt die LED dazu, eine Sekunde lang ausgeschaltet zu bleiben.
led_line.set_value(0)
time.sleep(1) # Sleep for one second
9. Fügen Sie einen Codeabschnitt hinzu, um den GPIO zu bereinigen, wenn der Code beendet wird. Bei GPIO Zero müssen wir das nicht tun, aber gpiod (und das ältere RPi.GPIO) müssen wir vor dem Beenden bereinigen.
finally:
led_line.release()
10. Speichern Sie den Code als blinky.py und klicken Sie zum Starten auf „Ausführen“. Die LED am GPIO 17 blinkt jede Sekunde. Drücken Sie STRG + C oder klicken Sie zum Beenden auf Stopp.
Projekt 1: Vollständige Codeliste
import gpiod
import time
LED_PIN = 17
chip = gpiod.Chip('gpiochip4')
led_line = chip.get_line(LED_PIN)
led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
try:
while True:
led_line.set_value(1)
time.sleep(1)
led_line.set_value(0)
time.sleep(1)
finally:
led_line.release()
Projekt 2: Eingabe, Reaktion auf Benutzereingaben
Nach „Hello World“ besteht das nächste Ziel darin, einen Input zu erstellen. In diesem Beispiel erstellen wir einen Button, eine Seite ist mit dem GPIO-Pin des Buttons verbunden, die andere mit 3V3. Der Standardzustand des Button-GPIO-Pins ist keine Stromversorgung (0, False, Low), aber wenn wir den Button drücken, verbinden wir den 3V3-Pin mit dem Button-GPIO-Pin und ändern seinen Zustand in „Powered“ (1, True, High). Unser Code wird nach dieser Zustandsänderung suchen und entsprechend reagieren. Alles, was wir brauchen, ist der Knopf und zwei Überbrückungsdrähte.
1. Öffnen Sie Thonny und importieren Sie zwei Codemodule. Das erste Modul ist gpiod, das zum Steuern und Lesen des GPIO verwendet wird. An zweiter Stelle steht die Zeit, die verwendet wird, um eine Pause in den Code einzufügen.
import gpiod
import time
2. Erstellen Sie eine Variable namens LED_PIN und speichern Sie darin den Wert 17. Diese Variable enthält die Broadcom-Pin-Referenz für einen GPIO-Pin auf allen Raspberry Pi-Modellen. Broadcom-Pin-Referenzen sind der Standard, der in der gesamten Raspberry Pi-Dokumentation verwendet wird. Es nutzt den Breakout vom SoC zum GPIO. Für uns sieht es vielleicht nicht logisch aus, aber für die Ingenieure, die die Platinen erstellen, sind die Stifte korrekt herausgebrochen.
LED_PIN = 17
3. Erstellen Sie eine Variable namens BUTTON_PIN und speichern Sie darin den Wert 27. GPIO 27 liegt direkt neben GPIO 17.
BUTTON_PIN = 27
4. Teilen Sie dem Code mit, wo sich der GPIO befindet. Ursprünglich verfügte der Raspberry Pi über ein einzelnes GPIO-Gerät, das im Speicher abgebildet wurde und wir es mit Python-Modulen wie RPi.GPIO verwenden konnten. Mit dem Raspberry Pi 5 und dem RP1-Chip haben wir jetzt dynamisch geteilte Geräte und unser GPIO liegt bei gpiomem4.
chip = gpiod.Chip('gpiochip4')
5. Erstellen Sie eine Variable namens led_line und speichern Sie einen Verweis auf den LED-GPIO-Pin. Das gpiod-Modul verwendet Zeilen, um auf die GPIO-Pins zu verweisen.
led_line = chip.get_line(LED_PIN)
6. Erstellen Sie eine Variable namens button_line und speichern Sie einen Verweis auf den Button-GPIO-Pin.
button_line = chip.get_line(BUTTON_PIN)
7. Stellen Sie die LED als Ausgang ein. Wir möchten, dass Strom zur LED fließt.
led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
8. Legen Sie die Schaltfläche als Eingabe fest. Wir möchten, dass Strom zur LED fließt.
button_line.request(consumer="Button", type=gpiod.LINE_REQ_DIR_IN)
9. Wickeln Sie den Hauptteil des Codes in eine Try- und While-True-Schleife ein.Try ist Teil eines Ausnahmehandlers, der versucht, unseren Code auszuführen. Er kann Ausnahmen behandeln und beim Beenden einen Codeabschnitt ausführen.
try:
while True:
10. Rufen Sie den aktuellen Status des Button-GPIO-Pins ab und speichern Sie ihn in einer Variablen namens button_state.
button_state = button_line.get_value()
11. Verwenden Sie eine if-Bedingung, um zu überprüfen, ob die Taste gedrückt wurde. Wenn ja, schalten Sie die LED ein. Der Standardstatus des Button-GPIO-Pins ist niedrig (0, falsch). Aber wenn wir den Knopf drücken, verbinden wir den 3V-Pin des Raspberry Pi 5 mit dem Button GPIO-Pin. Dadurch wird der Button-Pin hochgezogen (1, True). Diese Zustandsänderung ist der Auslöser für unseren Code.
if button_state == 1: # Button is pressed
led_line.set_value(1) # Turn the LED on
12. Verwenden Sie eine andere Bedingung, um die LED auszuschalten, wenn die Taste nicht gedrückt wird.
else:
led_line.set_value(0) # Turn the LED off
13. Fügen Sie einen Codeabschnitt hinzu, um den GPIO zu bereinigen, wenn der Code beendet wird. Mit GPIO Zero müssen wir das nicht tun, aber gpiod (und das ältere RPi.GPIO) müssen wir aufräumen, bevor wir es beenden.
finally:
led_line.release()
button_line.release()
14. Speichern Sie den Code als button-press.py und klicken Sie zum Starten auf „Ausführen“. Drücken Sie die Taste, um die LED einzuschalten, und lassen Sie sie los, um sie auszuschalten. Drücken Sie STRG + C oder klicken Sie zum Beenden auf Stopp.
Projekt 2: Vollständige Codeliste
import gpiod
LED_PIN = 17
BUTTON_PIN = 27
chip = gpiod.Chip('gpiochip4')
led_line = chip.get_line(LED_PIN)
button_line = chip.get_line(BUTTON_PIN)
led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
button_line.request(consumer="Button", type=gpiod.LINE_REQ_DIR_IN)
try:
while True:
button_state = button_line.get_value()
if button_state == 1:
led_line.set_value(1)
else:
led_line.set_value(0)
finally:
led_line.release()
button_line.release()