![]() |
GPIO beim Raspberry PiProf. Jürgen Plate |
Zusätzlich zu USB, Ethernet, Audio, Video und HDMI bietet hat der Raspberry Pi verschiedene digitale Ein-/Ausgabeleitungen, die GPIOs (General Purpose Input/Output). Sie sind über die Stiftleiste P1 zugänglich. Beachten Sie, dass alle Signale der GPIO-Pins mit einem Logikpegel von 3,3 V arbeiten und nicht 5-V-tolerant sind. Einige Pins können auch als SPI-, I2C- oder UART-Schnittstelle verwendet werden.
Das folgende Bild zeigt prinzipiell die Innenschaltung eines GPIO-Pins. Man erkennt deutlich die vielen Möglichkeiten, einen Pin ganz nach Wunsch zu konfigurieren, wobei nicht alle Möglichkeiten auf Betriebssystemebene zugänglich sind. Bei Konfiguration eines Pins als Ausgang, wird der Ausgangstreiber freigegeben. Der Ausgangsstrom kann in Schritten von 2 mA von 2 mA bis 16 mA eingestellt werden. Per Default liefern jeder Pin nur einen Strom von 8 mA bei maximal 3,3 V.
Ist der Pin als Eingang konfiguriert, wird eine Spannung von weniger als 0,8 V sicher als "0", eine Spannung von mehr als 2,0 V sicher als "1" erkannt. Die Konfiguration erlaubt auch den Betrieb des Eingangs mit Schmitt-Trigger-Charakteristik. Außerdem kann ein Widerstand am Eingang wahlweise als Pullup- oder Pulldown-Widerstand geschaltet werden (der Wert vom 50k ist ein Schätzwert). Wer sicher gehen will, verläßt sich besser auf einen externen Pullup- oder Pulldown-Widerstand.
Die folgenden Tabelle zeigt das Pinout des Raspberry Pi Revision 1.0 (Modelle A und B):
Function | Pin | Pin | Function | ![]() | |
---|---|---|---|---|---|
3,3V | 1 | 2 | 5V | ||
GPIO 0 (SDA) | 3 | 4 | |||
GPIO 1 (SCL) | 5 | 6 | GND | ||
GPIO 4 (GPCLK0) | 7 | 8 | GPIO 14 (TxD) | ||
GND | 9 | 10 | GPIO 15 (RxD) | ||
GPIO 17 | 11 | 12 | GPIO 18 (PCM_CLK) | ||
GPIO 21 (PCM_DOUT) | 13 | 14 | GND | ||
GPIO 22 | 15 | 16 | GPIO 23 | ||
17 | 18 | GPIO 24 | |||
GPIO 10 (MOSI) | 19 | 20 | GND | ||
GPIO 9 (MISO) | 21 | 22 | GPIO 25 | ||
GPIO 11 (SCLK) | 23 | 24 | GPIO 8 (CE0) | ||
GND | 25 | 26 | GPIO 7 (CE1) |
Die zweite Tabelle zeigt das geänderte Pinout des Raspberry Pi Revision 2.0, der an den neu hinzugekommenen Bohrlöchern erkannt werden kann (Änderungen fett). Das ist auch das Modell, das hier verwendet wird:
Function | Pin | Pin | Function | ![]() | |
---|---|---|---|---|---|
3,3V | 1 | 2 | 5V | ||
GPIO 2 (SDA1) | 3 | 4 | |||
GPIO 3 (SCL1) | 5 | 6 | GND | ||
GPIO 4 (GPCLK0) | 7 | 8 | GPIO 14 (TxD) | ||
GND | 9 | 10 | GPIO 15 (RxD) | ||
GPIO 17 | 11 | 12 | GPIO 18 (PCM_CLK) | ||
GPIO 27 | 13 | 14 | GND | ||
GPIO 22 | 15 | 16 | GPIO 23 | ||
17 | 18 | GPIO 24 | |||
GPIO 10 (MOSI) | 19 | 20 | GND | ||
GPIO 9 (MISO) | 21 | 22 | GPIO 25 | ||
GPIO 11 (SCLK) | 23 | 24 | GPIO 8 (CE0) | ||
GND | 25 | 26 | GPIO 7 (CE1) |
Beim Raspberry Pi Revision 2.0, gibt es einen weiteren GPIO-Anschluss, P5, der aber nicht bestückt ist. Er ist vorgesehen für eine Stiftleiste, die auf der Unterseite des Boards eingesetzt wird. Das Verlöten der Pins erfolgt dann von der Oberseite der Platine. Daher ist die Nummerierung der Pins ebenfalls von der Unterseite her zu sehen (Pin 1 hat ein rechteckiges Lötpad):
Function | Pin | Pin | Function | ![]() | |
---|---|---|---|---|---|
5V | 1 | 2 | 3,3V | ||
GPIO28 (SDA0) | 3 | 4 | GPIO29 (SCL0) | ||
GPIO30 | 5 | 6 | GPIO31 | ||
GND | 7 | 8 | GND |
Die GPIO-Pins 28/29 werden auch für die Kamera-Schnittstelle (CSI) verwendet.
Das ist auch das Modell, das hier verwendet wird:Beim Modell B+" sind weitere GPIO-Pins hinzugekommen, die Belegung der Pins 1 - 26 ist gleich geblieben:
Function | Pin | Pin | Function | ![]() | |
---|---|---|---|---|---|
3,3 V | 1 | 2 | 5 V | ||
GPIO 2 (SDA1) | 3 | 4 | 5 V | ||
GPIO 3 (SCL1) | 5 | 6 | GND | ||
GPIO 4 (GPCLK0) | 7 | 8 | GPIO 14 (TxD) | ||
GND | 9 | 10 | GPIO 15 (RxD) | ||
GPIO 17 | 11 | 12 | GPIO 18 (PCM_CLK) | ||
GPIO 27 | 13 | 14 | GND | ||
GPIO 22 | 15 | 16 | GPIO 23 | ||
3,3 V | 17 | 18 | GPIO 24 | ||
GPIO 10 (MOSI) | 19 | 20 | GND | ||
GPIO 9 (MISO) | 21 | 22 | GPIO 25 | ||
GPIO 11 (SCLK) | 23 | 24 | GPIO 8 (CE0) | ||
GND | 25 | 26 | GPIO 7 (CE1) | ||
(GPIO 0) ID_SD | 27 | 28 | (GPIO 1) ID_SC | ||
GPIO 5 | 29 | 30 | GND | ||
GPIO 6 | 31 | 32 | GPIO 12 | ||
GPIO 13 | 33 | 34 | GND | ||
GPIO 19 | 35 | 36 | GPIO 16 | ||
GPIO 26 | 37 | 38 | GPIO 20 | ||
GND | 39 | 40 | GPIO 21 |
Wie Sie von der Bash aus auf die GPIO-Ports zugreifen können, wird ausführlich im Kapitel GPIO-Programmierung in der Shell behandelt. Aber die weiter unten folgenden kleinen Beispiele lassen sich auch ohne die dort besprochenen Feinheiten verstehen.
Achtung: Die meisten Pins der Steckerleiste sind direkt mit der Broadcom-CPU verbunden. Sie sollten daher beim Anschluss von Peripheriekomponenten sorgfältig zu Werke gehen, denn es besteht immer das Risiko, dass Sie den Raspberry Pi irreparabel beschädigen. Vermeiden Sie Kurzschlüsse, Verdrahtungsfehler und zu hohe Eingangsspannungen. Oft reicht schon ein Multimeter, zum Überprüfen der Verdrahtung, bevor Sie den Pi einschalten.
Damit mal schon einmal mit den Ports spielen kann, hat Matthias Stonebrink ein kleines Aufsteckboard für den Raspberry Pi entworfen, das vier LEDs und zwei Taster enthält. Die Schaltung ist recht einfach. Für jede LED ist ein Schalttransistor vorhanden, um den Port nicht übermäßig zu belasen. Die Taster liefern eine logische "1", wenn sie gedrückt sind; bei offenem Taster sorgen Pull-Down-Widerstände für einen eindeutigen Pegel.
Für Selbermacher gibt es auch die Eagle-Dateien zum Herunterladen: Schaltplan und Platinenlayout. Das Board wird einfach auf den Raspberry Pi aufgesteckt und ist sofort betriebsbereit. Die Stromversorgung erfolgt über den Portsteckern. In der einen Ecke des Boards befindet sich eine Bohrung. Dor kann entweder eine Distanzschraube mit 10 mm Höhe eingebaut werden, die auf dem Board des Raspberry Pi lose aufliegt oder man verschraubt das Board mit dem Pi unter Zwischenlage einer Distanzhülse von 10 mm Höhe (im Bild rot umrandet). Schraube bzw. Hülse nehmen den Druck auf, der beim Betätigen der Taste entsteht. Sonst würde der Portstecker immer leicht gebogen.
Damit sind Sie fit für ein erstes Shell-Script, das zum einen die beiden Taster abfragt und deren Wert in der Shell ausgibt und dann mit allen vier LEDs blinkt. Für das Blinken gibt es eine Shell-Funktion, die den Wert toggelt und eine Kontrollausgabe erzeugt.
#!/bin/sh toggle() { # Zustand des Pins einlesen LedVal=$(cat /sys/class/gpio/gpio$1/value) # LED toggeln if [ $LedVal -eq "0" ]; then LedVal="1" else LedVal="0" fi # Kontrollausgabe auf der Konsole echo "Port $1 := $LedVal" # Pin auf 0 oder 1 setzen echo $LedVal > /sys/class/gpio/gpio$1/value } while : do # Taster einlesen und anzeigen for Port in 17 27 do LED=$(cat /sys/class/gpio/gpio${Port}/value) echo "Port $Port = $LED" done # mit den LEDs blinken for Port in 22 23 24 25 do toggle $Port done echo "" sleep 1 done
Durch Schreiben der GPIO-Nummer in die virtuelle Datei /sys/class/gpio/unexport kann der GPIO wieder deaktiviert werden. Auch diese Aktion darf nur 'root' ausführen. Das folgende Script deaktiviert die Ports vollständig:
#!/bin/sh for Port in 22 23 24 25 do echo "0" > /sys/class/gpio/gpio${Port}/value echo "$Port" > /sys/class/gpio/unexport done