Raspberry Pi - GPIO Grundlagen

20.12.2018, 13:24 - Autor: Jasmin Horvath
In dieser kleinen Einführung wollen wir uns die Grundlagen der Arbeit mit dem GPIOs (General Purpose Input Output) näher ansehen.

Zuerst müssen wir uns die PIN-Belegung des Raspberry Pi 3 / Zero ansehen. Ich verwende ausschließlich die physische Nummerierung und nicht die Namen der Pins, da mir diese deutlich übersichtlicher erscheint. Sehen wir uns zunächst die Verdrahrung des Breadbords für die folgenden Beispiele an:



Hierbei habe ich Pin 1 beschriftet. Direkt darüber liegt dann Pin 2, rechts daneben Pin 3, usw. Die gesamte Belegung sieht wie folgt aus:

Funktion Pin Pin Funktion
+ 3,3 V 1 2 + 5 V
(SDA1) GPIO 2 3 4 + 5 V
(SCL1) GPIO 3 5 6 GND
(GPIO_GCLK) GPIO 4 7 8 GPIO 14 (TXD0)
GND 9 10 GPIO 15 (RXD0)
(GPIO_GEN0) GPIO 17 11 12 GPIO 18 (GPIO_GEN1)
(GPIO_GEN2) GPIO 27 13 14 GND
(GPIO_GEN3) GPIO 22 15 16 GPIO 23 (GPIO_GEN4)
+ 3,3 V 17 18 GPIO 24 (GPIO_GEN5)
(SPI_MOSI) GPIO 10 19 20 GND
(SPI_MISO) GPIO 9 21 22 GPIO 25 (GPIO_GEN6)
(SPI_SLCK) GPIO 11 23 24 GPIO 8 (SPI_CE0_N)
GND 25 26 GPIO 7 (SPI_CE1_N)
(nur für I2C) ID_SD 27 28 ID_SC (nur für I2C)
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


Vorbereitungen



Um sicherzustellen, dass die benötigten Python-Module für die GPIO-Programmierung installiert sind öffnen Sie bitte ein Terminal und führen Sie folgenden Befehl aus:

pi@rasbian $ sudo apt-get install -y python-rpi.gpio python3-rpi.gpio



Übung 1 - Eingabe und Ausgabe

Unser erstes Programm können wir in der Python-IDLE schreiben. Öffnen Sie dazu die Python 3 - IDLE:



... und klicken Sie auf Datei -> Neu bzw. File -> New oder verwenden Sie den Shortcut Strg + N.

Dann können wir folgenden Code schreiben:

#!/usr/bin/python
import RPi.GPIO as GPIO
from time import sleep

led = 37
btn = 5

GPIO.setmode(GPIO.BOARD)
GPIO.setup(led, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(btn, GPIO.IN)

while True:
	if GPIO.input(btn) == GPIO.LOW:
		sec = 0.2
	else:
		sec = 0.4

	GPIO.output(led, True)
	sleep(sec)
	GPIO.output(led, False)
	sleep(sec)

Zuerst wird das RPi.GPIO - Modul importiert mit Hilfe dessen wir auf die GPIO-Pins zugreifen können. Außerdem benötigen wir noch die sleep - Funktion aus dem time - Modul um das Script für eine bestimmte Zeit anzuhalten.

Danach setzen wir die Variablen led und btn auf die gewünschten Pin-Nummern. Dies bringt den Vorteil, dass wir später die Pin-Beledung an einer zentralen Stelle ändern können und nicht in mehreren Zeilen des Programms Änderungen vornehmen müssen.

Dann setzen wir mit GPIO.setmode(GPIO.BOARD) das Nummerierungsschema auf die physische Pin-Nummerierung wie oben beschreiben und mit GPIO.setup(...) setzen wir den led- bzw. btn-Pin als Ausgang (GPIO.OUT) bzw. Eingang (GPIO.IN).

Das Hauptprogramm besteht aus einer Endloßschleife (While True) in der wir mit if GPIO.input(btn) == GPIO.LOW prüfen ob am btn-Pin Spannung anliegt oder nicht. Dazu sehen wir uns die Schaltung kurz an - wird der Button gedrückt wird Pin 5 (btn) mit GND verbunden und der dies entspricht GPIO.LOW. Sie könnten auch die +3,3V verwenden und auf GPIO.HIGH prüfen.

Je nach dem ob der Button gedrückt ist oder nicht wird die Variable sec auf eine Wartezeit von 0.2 bzw. 0.4 Sekunden gesetzt. Dann wird der led-Pin auf den Wert True (Strom ein) gesetzt, das Programm für die Wartezeit angehalten, der led-Pin auf False (Strom aus) gesetzt und das Programm wieder für die Wartezeit angehalten.

Diese Schleife wiederholt sich solange bis die Ausführung mit Strg + C abgebrochen wird. Sobald Sie das Script gespeichert haben können Sie es übrigens mit F5 bzw. den Befehl Run -> Run Module ausführen.


Übung 2 - PWM (Pulsweitenmodulation)

Mit Hilfe der Pulsweitenmodulation kann ein Rechtecksignal erzeugt werden, dass geringere Spannungen simuliert um zB LEDs zu dimmen oder Motoren langsam anfahren zu lassen.

#!/usr/bin/python
import RPi.GPIO as GPIO
from time import sleep

pin = 37

GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)

pwm = GPIO.PWM(pin, 200)
pwm.start(100)

while True:
	dc = int(input("Strength 0 - 100: "))
	pwm.ChangeDutyCycle(dc)

Nachdem die benötigten Module importiert wurden und der Pin 37 als Output-Pin konfiguriert wurde wir mit pwm = GPIO.PWM(pin, 200) die PWM-Funktionalität für diesen Pin aktiviert. Die 200 bedeutet hierbei, dass 200 Hz als Frequenz verwendet werden. Schließlich wird der Pin mit pwm.start(100) im PWM- Modus gestartet und der sogenannte Duty-Cycle auf 100% gesetzt.

Der Duty-Cycle ist die prozentuelle Anzahl der Zeit in der Strom fließt. Hierzu ein kleines Beispiel:



Hier wurden zwei Pins als PWM-Output konfiguriert und an Channel 1 und Channel 2 eines Hantek 6022BL USB-Oszilloskops angeschlossen. Dabei war Channel 1 auf einen Duty-Cycle von 0% (aus) gestellt und Channel 2 auf 50%.

Das Hauptprogramm besteht wieder aus der While True-Endloßschleife und ließt mit input("Strength 0 - 100: ") einen Wert von der Konsole ein und verwandelt diese Eingabe mit int(...) gleich in eine Zahl, die in der Variable dc zwischengespeichert wird. Danach wird dieser Wert als neuer Duty-Cycle gesetzt und die Schleife wiederholt solange bis die Ausführung mit Strg + C abgebrochen wird.