GPIO Reloaded I: Python
Dieser Artikel ist der Auftakt einer Mini-Serie, die sich mit der Script-Programmierung des Raspberry Pi 5 beschäftigt. Geplant sind drei Artikel:
- GPIO Reloaded I: Python (gpiozero, lgpio, gpiod, rpi-lgpio)
- GPIO Reloaded II: Bash (gpiod, gpioget, gpioset, pinctrl)
- GPIO Reloaded III: Kamera (rpicam-xxx, Picamera2)
Hinter den Kulissen hat sich mit der Vorstellung des Raspberry Pi 5 mehr geändert, als es in den ersten Testberichten den Anschein hatte. Schuld daran ist der neue I/O-Chip RP1, der unter anderem für die Kommunikation mit der GPIO-Leiste und der Kamera zuständig ist. Der RP1 bringt natürlich viele Vorteile mit sich (u.a. die Möglichkeit, zwei Kameras anzuschließen und größere Bild- bzw. Videomengen zu verarbeiten); er führt aber auch dazu, dass über Jahre etablierte Module und Kommandos nicht mehr funktionieren. Ja, die Raspberry Pi Foundation hat vorgearbeitet und empfiehlt schon eine Weile alternative Werkzeuge. Aber aus Bequemlichkeit blieben viele Programmierer bei langjährig bewährten Tools. Damit ist jetzt Schluss. Wer den Pi 5 als Maker-Tool nutzen will, muss umlernen.
Wo ist das Problem?
In der Vergangenheit gab es mehrere GPIO-Kommuniktionsmechanismen, z.B. das Lesen/Schreiben von sysfs-Dateien (sys/class/gpio) bzw. das direkte Verändern von Speicherbereichen. Diese Verfahren haben schon in der Vergangenheit oft Probleme bereitet. Beim Raspberry Pi 5 funktionieren sie schlicht nicht mehr. Neue Verfahren verwenden die lgpio-Bibliothek, die wiederum auf eine neue Kernel-Schnittstelle zurückgreift. Diese ist nach außen hin durch die Device-Dateien /dev/gpiochip* sichtbar.
Aus Python-Sicht ist insbesondere das Modul rpi.gpio betroffen. Es ist inkompatibel zum Pi 5 und es gibt anscheinend auch keine Pläne, den Code RP1-kompatibel zu reorganisieren.
Welche Alternativen gibt es?
Schon seit einiger Zeit empfiehlt die Raspberry Pi Foundation, das gpiozero-Modul zu verwenden. Es stellt für den Einstieg gut geeignete Klassen wie LED oder Button zur Verfügung, eignet sich aber auch für anspruchsvollere Maker-Aufgaben.
Wenn Sie sich partout nicht mit gpiozero anfreunden wollen, gibt es drei Alternativen: lgpio, gpiod und rpi-lgpio.
gpiozero
Das Python-Modul gpiozero macht die Steuerung von Hardware-Komponenten durch GPIOs besonders einfach. Für häufig benötigte Hardware-Komponenten gibt es eigene Klassen. Dazu zählen unter anderem:
LED(Leuchtdiode ein-/ausschalten)PWMLED(Helligkeit einer Leuchtdiode mit Software Pulse Width Modulation steuern)RGBLED(dreifarbige LED, die über drei GPIO-Ausgänge gesteuert wird)TrafficLights(Kombination aus einer roten, gelben und grünen Leuchtdiode)MotionSensor(für PIR-Bewegungssensoren)LightSensor(Lichtdetektor)Button(Taster)Buzzer(Summer)Motor(zur Steuerung von zwei GPIOs für Vorwärts- und Rückwärts-Signale)Robot(zur Steuerung mehrerer Motoren)MCP3008(für den gleichnamigen A/D-Converter)
Das Modul gpiozero ist umfassend dokumentiert:
https://gpiozero.readthedocs.io/en/latest
Ein Hello-World-Beispiel sieht so aus:
#!/usr/bin/env python3
from gpiozero import LED
import time
myled = LED(7) # BCM-Nummer 7 = Pin 26 des J8-Headers
print("LED ein")
myled.on()
time.sleep(1)
print("LED aus und Programmende")
myled.off()
Dieses Script setzt voraus, dass Pin 26 der GPIO-Leiste (intern BCM/GPIO 7) über einen Vorwiderstand mit einer Leuchtdiode verbunden ist. Anstelle der GPIO-Nummer gibt es einige alternative Adressierungsverfahren, wobei Sie den gewünschente GPIO-Kontakt als Zeichenkette angeben:
# alternative, gleichwertige Schreibweisen
myled = LED(7) # GPIO 7 = BCM-Nummer 7
myled = LED("GPIO7") # GPIO 7 (Achtung, nicht "GPIO07")
myled = LED("BCM7") # BCM 7 (nicht "BCM07")
myled = LED("BOARD26") # Pin 26 auf der GPIO-Leiste des Boards
myled = LED("J8:26") # Pin 26 des J8-Headers (= GPIO-Leiste)
lgpio
lgpio (der Projektname lautet noch kürzer lg) ist eine C-Bibliothek zur lokalen Steuerung der GPIOs. Das gerade erwähnte Modul gpiozero verwendet intern seit Version 2.0 die lgpio-Bibliothek. Alternativ stellt das gleichnamige lgpio-Modul eine direkte Python-Schnittstelle zur lgpio-Bibliothek her. Deren Funktionen sind Hardware-näher implementiert. Der GPIO-Zugriff verbirgt sich also nicht hinter Klassen wie LED oder Button, vielmehr werden die GPIO-Schnittstellen direkt angesprochen.
Ein Hello-World-Beispiel mit lgpio sieht so aus:
#!/usr/bin/env python3
import lgpio, time
# Zugriff auf /dev/gpiochip4 für RP1-Chip
handle = lgpio.gpiochip_open(4)
# Raspberry Pi 4 und früher:
# handle = lgpio.gpiochip_open(0)
# GPIO 7 = Pin 26 als Output verwenden
led = 7
lgpio.gpio_claim_output(handle, led)
# LED zehnmal ein- und ausschalten
for i in range(10):
print("LED ein")
lgpio.gpio_write(handle, led, 1)
time.sleep(1)
print("LED aus")
lgpio.gpio_write(handle, led, 0)
time.sleep(1)
# nichts blockieren
lgpio.gpiochip_close(handle)
Beachten Sie, dass die Initialisierung des Handles für den GPIO-Zugriff je nach Modell variiert! Bei den älteren Raspberry-Pi-Modellen bis einschließlich 4B/400 müssen Sie handle = lgpio.gpiochip_open(0) ausführen. Beim Raspberry Pi 5 ist für die GPIO-Steuerung dagegen der neue RP1-Chip zuständig, den Sie mit gpiochip_open(4) ansprechen. (Die richtige Chip-Nummer stellen Sie am einfachsten mit dem Kommando gpioinfo aus dem Paket gpiod fest. Der hier benötigte Kontakt GPIO7 heißt in gpioinfo ein wenig verwirrend PIN7.)
Wenn Sie mit Python ein lgpio-Script schreiben wollen, das auf allen Pi-Modellen funktioniert, müssen Sie Code zur Erkennung des Pi-Modells integrieren.
Weiterer Codebeispiele finden Sie hier:
- https://abyz.me.uk/lg/examples.html
- https://discourse.ubuntu.com/t/how-to-use-gpio-pins-with-ubuntu-on-raspberry-pi/22009
rpi-lgpio
Was tun, wenn Sie Code für ältere Modelle entwickelt haben, den Sie nun für den Raspberry Pi 5 portieren möchten? Am schnellsten wird dies oft mit dem neuen Modul rpi-lgpio gelingen, das weitgehende Kompatibilität zu rpi.gpio verspricht.
Vor der Installation müssen Sie das in Raspberry Pi OS standardmäßig installierte Modul rpi.gpio installieren. Eine Parallelinstallation beider Module ist ausgeschlossen, weil rpi.gpio und rpi-lgpio den gleichen Modulnamen verwenden (import RPi.GPIO).
sudo apt remove python3-rpi.gpio
Da es in Raspberry Pi OS für rpi-lgpio kein fertiges Paket, installieren Sie dieses am einfachsten mit pip. Da es kein passendes Systempaket gibt, sind keine Konflikte zu erwarten. Wenn Sie die Option --break-system-packages dennoch vermeiden möchten, müssen Sie eine virtuelle Python-Umgebung einrichten.
pip install --break-system-packages rpi-lgpio
Das obige pip-Kommando installiert das Modul lokal, also nur für Ihren Account. Wenn Sie Ihr Script in einem anderen Account ausführen möchten (z.B. als Cron-Job), stellen Sie dem Kommando sudo voran und installieren so rpi-lgpio systemweit.
Nach diesen Vorbereitungsarbeiten sollten viele Ihre alten Scripts ohne Änderungen laufen. Einige Sonderfälle sind hier dokumentiert:
https://rpi-lgpio.readthedocs.io/en/release-0.4/differences.html
Die folgenden Zeilen zeigen einmal mehr eine Schleife zum Ein- und Ausschalten einer Leuchtdiode:
#!/usr/bin/env python3
# Das Script setzt voraus, dass vorher
# rpi-lgpio installiert wurde!
import RPi.GPIO as gpio
import time
# BCM-GPIO-Nummern verwenden
gpio.setmode(gpio.BCM)
# LED an Pin 26 = GPIO 7
gpio.setup(7, gpio.OUT)
# LED über Pin 26 fünf Mal ein- und ausschalten
for _ in range(5):
print("LED ein")
gpio.output(7, gpio.HIGH)
time.sleep(1)
print("LED aus")
gpio.output(7, gpio.LOW)
time.sleep(1)
# alle vom Script benutzten GPIOs/Pins wieder freigeben
gpio.cleanup()
gpiod
Das Python-Modul gpiod wird durch das Paket python3-libgpiod zur Verfügung gestellt, das unter Raspberry Pi OS standardmäßig installiert ist. Das Modul stellt eine Python-Schnittstelle zur Bibliothek libgpiod her. Diese Bibliothek ist wiederum eine Alternative zu der schon erwähnten lgpio-Bibliothek. Da es zum Python-Modul kaum Dokumentation gibt, ist gpiod nur für Entwickler von Interesse, die mit libgpiod bereits C-Programme entwickelt haben. Als Ausgangspunkt für eine eigene Recherche eignen sich die beiden folgenden Seiten:
Das folgende Minibeispiel zeigt, wie Sie eine LED an Pin 26 (GPIO 7) fünf mal ein- und ausschalten:
#!/usr/bin/env python3
import gpiod, time
chip = gpiod.Chip('gpiochip4') # RP1 (Raspberry Pi 5)
led = chip.get_line(7) # GPIO 7 = Pin 26 des J8-Headers
led.request(consumer="example", type=gpiod.LINE_REQ_DIR_OUT)
for _ in range(5): # 5x ein- und ausschalten
led.set_value(1)
time.sleep(1)
led.set_value(0)
time.sleep(1)
Quellen/Links
- https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#gpio-and-the-40-pin-header
- https://gpiozero.readthedocs.io/en/latest/
- https://abyz.me.uk/lg/examples.html
- https://discourse.ubuntu.com/t/how-to-use-gpio-pins-with-ubuntu-on-raspberry-pi/22009
- https://pypi.org/project/gpiod
- https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/about
Das Jahr 2023 war für Linux voller spannender Entwicklungen. Linux, ein kostenloses und quelloffenes Betriebssystem, das von einer großen Gemeinschaft entwickelt wird, hat viele Fortschritte gemacht. In diesem Jahresrückblick werden wir uns die wichtigsten Ereignisse des Jahres anschauen. Es geht los mit Feststellungen und geht dann über in meinen persönlichen Blickwinkel. Neue Linux-Distributionen Ein Kalenderjahr...
Ich wünsche Euch und Euren Familien ein frohes und gesegnetes Weihnachten 2023! Habt einen paar schöne Feiertage und lasst es Euch gut gehen! Vielen Dank, dass Ihr dieses Jahr bei mir reingeschaut habt
Mit Linux Mint 21.3 Codename Virginia kommt die Linux Mint 21er Serie zu Ihrem geplanten Ende. Das dritte Point-Release rundet eine Serie komplett ab. Was genau Virginia im Gepäck hat, was es Neues gibt usw. alles das gibts jetzt. Bleibt dran. Eckpunkte über die Distro Linux Mint ist eine auf Ubuntu basierende Linux-Distribution, die darauf...
Die Entwickler hinter der Distro Zorin OS haben nach langer Entwicklungszeit die allgemeine Verfügbarkeit von Version 17 angekündigt. Obwohl Zorin OS 17 noch auf Ubuntu 22.04 LTS basiert, kommt diese Version mit einigen interessanten Neuerungen. Wie üblich, gibt es die Ausgabe in drei verschiedenen Editionen: Lite, Core und Pro. Die Lite Version ist für bis...
Das GNOME-Projekt hat GNOME 44.7 veröffentlicht, das das siebtes Wartungsupdate der GNOME 44 “Kuala Lumpur” Desktop-Serie darstellt. Dieses Aktualisierung kümmert sich um Fehler und behebt Leistungsprobleme. Es richtet sich an Benutzer, die noch die GNOME 44 Desktop-Umgebung verwenden. GNOME 44.7 bringt Optimierungen für die Anwendungssuche in der GNOME Shell mit und verbessert die Leistung. Die...
Manjaro ist ist eine rollende Linux Distro und kommt mit verschiedenen Desktop-Umgebungen, darunter auch mit dem GNOME-Desktop. GNOME ist eine moderne, intuitive und hübsche Desktop-Umgebung, die im Hause Manjaro dank Anpassungen für eine benutzerfreundliche Bedienung bekannt ist. Manjaro bietet mit Gnome ein aufgeräumtes Erscheinungsbild und eine klare Benutzeroberfläche, die sich besonders für Anfänger eignet. Wir...
Das ging schnell. Im Debian Stable Zweig ist ein Fehler passiert. Ein zur Veröffentlichung freigegebner Kernel führte unter Umständen zu korrupten Daten in Verbindung mit Verwendung von Ext4 Dateisystem. Umgehend nach Bekanntwerden des Problems informierte das Debian Projekt über den Umstand und nahm das problematische Image offline und warnte die Nutzer mit automatischen Aktualisierungen vor...
Die geplante Veröffentlichung von Debian 12.3 wurde vorübergehend auf Eis gelegt, nachdem ein kritischer Fehler im Linux-Kernel 6.1.64-1 entdeckt wurde, der potenziellen Datenverlust auf Systemen mit ext4-Dateisystemen verursachen kann. Der Fehler, mit der Identifikationsnummer #1057843 dokumentiert, birgt das Risiko von Datenbeschädigung. Als Reaktion darauf hat das für die Veröffentlichung von Debian 12.3 verantwortliche Team beschlossen,...
Die Document Foundation hat die Veröffentlichung von LibreOffice 7.6.4, dem vierten Wartungsupdate der aktuellen Open-Source-Office-Suite-Serie LibreOffice 7.6, bekannt gegeben. Dieses Update steht ab sofort zum Download zur Verfügung und kommt nur knapp zwei Wochen nach der Veröffentlichung von LibreOffice 7.6.3. LibreOffice 7.6.4 behebt insgesamt 41 Fehler und Probleme, die von Benutzern gemeldet oder von den...
