Die GPIO Pins (General Purpose Input Output) bilden die Schnittstelle zwischen dem Raspberry Pi und externen Geräten wie z.B. Sensoren oder Relais. Dafür ist es notwendig Daten auf die einzelnen GPIO Pins zu scheiben oder Daten zu lesen. Der große Teil der Pins kann nur zwei Zustände annehmen. Ein (high) oder Aus (low). Weitere Pins sind z.B. für Anwendungen vorgesehen, die UART oder PWM nutzen. Die Belegung der Pins ist unter https://de.pinout.xyz/ zu sehen. Dieser Beitrag beschätigt sich mit den „einfachen“ Pins, die nur zwei Zustände annehmen können. Für das Lesen und Schreiben dieser Pins git es bei dem Raspberry Pi mehrere Varianten
Der Zugriff auf die GPIOs ist nur Benutzern gestattet, die Mitglied der Gruppe gpio sind. Wenn Sie also mit einem anderen Benutzer als dem Standardbenutzer pi die GPIOs ansteuern wollen, müssen Sie diesen der Gruppe gpio hinzufügen.
sudo usermod -a -G gpio <Benutzername>
Das ist zum Beispiel relevant, wenn Sie die GPIOs über ein PHP Script des Webservers ansteuern wollen. Der Apache Webserver läuft unter dem Benutzer www-data, der per default keine Rechte hat auf die GPIOs zuzugreifen. Hierzu müssen Sie den Benutzer www-data der Gruppe gpio hinzufügen.
sudo usermod -a -G gpio www-data
Pinbelegung
Egal wie man die GPIOs ansprechen will, es besteht immer das gleiche Problem. Es existieren für die Ansteuerung verschiedene Nummernsysteme. Zum einen das BCM-System (Broadcom SOC channel). Es wurde vom Entwickler des Chips, der auf dem Raspberry verbaut ist, entwickelt. Und zum anderen die Wiring Pi Anschlussnummern. Dieses System wurde vom Entwickler der wiringPi Library entworfen. Beides ist nicht identisch und wird gerne mal verwechselt. Welches Nummernsystem man verwendet ist eigentlich egal. Man muss halt immer darauf achten, welches System die Software zu Grunde legt, mit der man die Pins ansteuern will. Die Pinbelegung für beide Systeme findet man auf der Seite von pinout. Alternativ kann man auf der Konsole eines neueren Raspbian auch den Befehl gpio readall eingeben. Man bekommt dann eine tabelarische Übersicht über die GPIO Pins und deren Nummer in beiden Systemen. Bei älteren Raspbian Systemen muss erst noch die wiringPi Bibliothek installiert werden, bevor dieser Befehl zur Verfügung steht.
Bash
Über die Kommandozeile können Sie mit Hilfe des Pseudo-Verzeichnisses /sys/class/gpio/ auf die GPIO-Pins zugreifen.
Als erstes muss man den gewünschten GPIO-Pin „einschalten. Dieser Befehl müssen Sie bei jedem Neustart des Raspberry durchführen.
# Pin für Schreib- und Lesevorgänge registrieren
echo "17" > /sys/class/gpio/export
Als nächstes legt man fest, ob man von dem GPIO-Pin lesen möchte, oder auf dem GPIO-Pin schreiben möchte
# Pin 17 zum schreiben öffnen echo "out" > /sys/class/gpio/gpio17/direction # Pin 17 zum lesen öffnen echo "in" > /sys/class/gpio/gpio17/direction
Nun kann man den Pin auf Ein oder Aus setzen
# Pin 17 einschalten echo "1" > /sys/class/gpio/gpio17/value # Sets pin 17 ausschalten echo "0" > /sys/class/gpio/gpio17/value
Zum lesen des GPIO-Pins wird folgender Befehl ausgeführt. Das Ergebnis ist 1 oder 0.
cat /sys/class/gpio/gpio17/value
Wenn man fertig ist sollte man den Pin wieder deregistrieren, damit andere Programme auch auf den Pin zugreifen können.
# Pin für Schreib- und Lesevorgänge deregistrieren echo "17" > /sys/class/gpio/unexport
Das Programm gpio
Früher musste man das Programm, auch bekannt unter dem Namen wiringPi, noch nachinstallieren. Mittlerweile ist es in Raspian integriert. Der Befehl zur Ansteuerung der Pins lautet gpio und hat eine Reihe von Parametern. Der wichtigsten Parameter ist -g, das aus historischen Grüden unterschiedliche Nummern für die einzelnen Pins existieren. So ist die Nummerierung von wiringPi eine andere als die vom Raspberry Board. So ist z.B. der physikalischen Pin 11 von Raspberry als BCM Pin 17 und von wiringPi als Pin 0 definiert. Mit dem Parameter -g nutzt man die Raspberry Pinbelegung. Ohne den Parameter muss die wiringPi Belegung angegeben werden. Als erstes wird wieder der GPIO Pin registriert. Hier greift komischweise der Parameter -g nicht und man muss die Raspberry Pinbelegung nehmen
# Pin für Schreib- und Lesevorgänge registrieren gpio export 17 out
Pin 17 einschalten
# Einschalten mit Raspberry Pinbelgung gpio -g write 17 1 #Einschalten mit wiringPi Pinbelegung gpio write 0 1
aktuellen Wert auslesen
# Wert über Raspberry Pinbelgung einlesen gpio -g read 17 # Wert über wiringPi Pinbelgung einlesen gpio read 0
Pin 17 ausschalten
# Ausschalten mit Raspberry Pinbelgung gpio -g write 17 0 #Ausschalten mit wiringPi Pinbelegung gpio write 0 0
Pin 17 deregistrieren
# Pin für Schreib- und Lesevorgänge registrieren gpio unexport 17
eigener Code
Um nun die GPIOs in ihren eigenen Programmen zu nutzen, gib es für eine Reihe von Programmiersprachen Bibliotheken, die man in den eigenen Code einbauen kann. Hier eine gute Übersicht in englisch.