GPIO beim Raspberry Pi

Prof. Jürgen Plate

Der GPIO beim Raspberry Pi

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):

FunctionPin PinFunction
3,3V1 25V
GPIO 0 (SDA)3 4 
GPIO 1 (SCL)5 6GND
GPIO 4 (GPCLK0)7 8GPIO 14 (TxD)
 9 10GPIO 15 (RxD)
GPIO 1711 12GPIO 18 (PCM_CLK)
GPIO 21 (PCM_DOUT)13 14 
GPIO 2215 16GPIO 23
 17 18GPIO 24
GPIO 10 (MOSI)19 20 
GPIO 9 (MISO)21 22GPIO 25
GPIO 11 (SCLK)23 24GPIO 8 (CE0)
 25 26GPIO 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:

FunctionPin PinFunction
3,3V1 25V
GPIO 2 (SDA1)3 4 
GPIO 3 (SCL1)5 6GND
GPIO 4 (GPCLK0)7 8GPIO 14 (TxD)
 9 10GPIO 15 (RxD)
GPIO 1711 12GPIO 18 (PCM_CLK)
GPIO 2713 14 
GPIO 2215 16GPIO 23
 17 18GPIO 24
GPIO 10 (MOSI)19 20 
GPIO 9 (MISO)21 22GPIO 25
GPIO 11 (SCLK)23 24GPIO 8 (CE0)
 25 26GPIO 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):

FunctionPin PinFunction
5V1 23,3V
GPIO28 (SDA0)3 4GPIO29 (SCL0)
GPIO305 6GPIO31
GND7 8GND

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:

FunctionPin PinFunction
3,3V1 25V
GPIO 2 (SDA1)3 4 
GPIO 3 (SCL1)5 6GND
GPIO 4 (GPCLK0)7 8GPIO 14 (TxD)
 9 10GPIO 15 (RxD)
GPIO 1711 12GPIO 18 (PCM_CLK)
GPIO 2713 14 
GPIO 2215 16GPIO 23
 17 18GPIO 24
GPIO 10 (MOSI)19 20 
GPIO 9 (MISO)21 22GPIO 25
GPIO 11 (SCLK)23 24GPIO 8 (CE0)
 25 26GPIO 7 (CE1)
(GPIO 0) ID_SD27 28(GPIO 1) ID_SC
GPIO 529 30 
GPIO 631 32GPIO 12
GPIO 1333 34 
GPIO 1935 36GPIO 16
GPIO 2637 38GPIO 20
 39 40GPIO 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.

Das Test- und Demo-Board

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.

 

Erste Schritte bei der Shell-Programmierung

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

Weiterführende Links


Copyright © Hochschule München, FK 04, Prof. Jürgen Plate
Letzte Aktualisierung: