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.