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.