
Grundlagen zur Steuerung von GPIO Pins. Alle Code-Beispiele sind in Python geschrieben.
Grundlagen
Zu Beginn muss die bei RaspberryPi bereits vorinstallierte Python Bibliothek importiert werden:
import RPi.GPIO as GPIO
Nun werden verschieden Beispiele gegeben.
Auswählen der PIN Nummerierung/Bezeichnung. Beispiel der GPIO 4 soll Angesteuert werden. Dieser ist auf den physikalischen PIN 7
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD) # Setzen der Bezeichnung
GPIO.setup(7, GPIO.OUT) # Pin7, GPIO 4 wird als Ausgang deklariert
GPIO.output(7, GPIO.HIGH) # Schalte Ausgang auf HIGH => z.B. LED leuchtet
Alternativ:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM) # Setzen der Bezeichnung
GPIO.setup(4, GPIO.OUT) # GPIO 4, Pin 7 wird als Ausgang deklariert
GPIO.output(4, GPIO.HIGH) # Schalte Ausgang auf HIGH => z.B. LED leuchtet
Es sollte nach jedem Programm auch immer wieder Aufgeräumt werden, damit alle PINS in einen definierten Zustand wieder zurückgesetzt werden.
GPIO.cleanup()
Einlesen:
Analog funktioniert das Einlesen der GPIO's
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM) # Setzen der Bezeichnung
GPIO.setup(4, GPIO.IN) # GPIO 4, Pin 7 wird als Eingang deklariert
in_value = GPIO.input(4) # Frage ab
print (in_value) # gebe aus
Um eindeutige Ergebnisse beim Einlesen zu erhalten, ist es häufig notwendig einen Pulldown oder Pullup Widerstand zu verwenden. Diese können auf dem RaspberryPi auch per Software dazugeschaltet werden.
#Beispiel an GPIO 4, natuerlich nur EINE Zeile/Anweisung verwenden!
# Pulldown-Widerstand (gegen Masse)
GPIO.setup(4, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
#Alternativ
# Pullup-Widerstand (gegen + 3,3 V)
GPIO.setup(4, GPIO.IN, pull_up_down = GPIO.PUD_UP)
PWM-Steuerung
Zusätzlich kann jeder GPIO auch mit einer PWM (Puls-Weiten-Modulation) versehen werden.
GPIO.setmode(GPIO.BCM)
# Erzeuge eine Instanz für die PWM Steuerung
#p = GPIO.PWM(channel, frequency)
p = GPIO.PWM(4, 50) #GPIO 4 mit Frequenz 50
Zum Verständnis wird nun ein bisschen damit mal gespielt und jeder Befehl etwas ausführlich Erläutert. Leider muss dafür etwas Mathematik her.
Bei der PWM Steuerung können 2 Werte Manipuliert werden:
Frequenz: z.B. 50 Hz => 1 sec/50Hz = 20ms Periodendauer
Abtastrate: zischen 0% und 100%, 50% bie 20ms Periodendauer, würde also ein HIGH Pegel von 10 ms und LOW Pegel für 10ms verursachen.
LED-Steuern mit PWM:
Beispiel eine LED Ihrer Leuchtkraft kontrollieren mit PWM:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM) # Setzen der Bezeichnung
GPIO.setup(4, GPIO.OUT) # GPIO 4, Pin 7 wird als Ausgang deklariert
p = GPIO.PWM(4, 50) #GPIO 4 mit Frequenz 50
pwm.start(50)
try:
while True:
time.sleep(2.0) # Warte 2 sekunden
p.ChangeDutyCycle(10.0) # ändere auf 10% leuchtkraft
time.sleep(2.0) # Warte 2 sekunden
p.ChangeDutyCycle(80.0) # ändere auf 80% leuchtkraft
time.sleep(2.0) # Warte 2 sekunden
pwm.ChangeFrequency(10.0) # ändern der Frequenz, hat in diesem fall keine Auswirkung auf die LED, da das verhänis von LOW und HIGH gleich bleibt.
time.sleep(2.0) # Warte 2 sekunden
#Abbruch mit STRG (CTRL) + 'C'
except KeyboardInterrupt:
pwm.stop()
GPIO.cleanup()
Servo Steuern mit PWM
Beispiel Servo-Steuerung, etwas Anpruchsvoller:
Aus den Datenblatt lassen sich folgende Daten herauslesen:
Arbeitswinkel: 180° (500 - 2500 μsec)
Neutralposition: 1500 μsec
Es soll eine Standard Frequenz von 50Hz verwendet werden. Daraus resultiert nun die prozentuale Abtastrate um den Servo in seine verschiedene Positionen zu bringen.
Berechnen der Min und Max Werte:
Min = 500 μsec => 0,5 ms
Frequenz 50 Hz => 20 ms Periodendauer
MinValue = 0,5 / 20 = 0,025 * 100% = 2,5
Max = 2500 μsec => 2,5 ms
Frequenz 50 Hz => 20 ms Periodendauer
MaxValue = 2,5 / 20 = 0,125 * 100% = 12,5
Neutralposition: 1500 μsec => 7,5
Programmcode: Der Servo soll auf 0°, danach auf 180° Bewegt und zum Schluss in die Neutralposition gebracht werden, 90°.
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM) # Setzen der Bezeichnung
GPIO.setup(4, GPIO.OUT) # GPIO 4, Pin 7 wird als Ausgang deklariert
p = GPIO.PWM(4, 50) #GPIO 4 mit Frequenz 50
pwm.start(7.5) # Neutral Position
try:
while True:
time.sleep(2.0) # Warte 2 sekunden
p.ChangeDutyCycle(2.5) # 0 Grad
time.sleep(2.0) # Warte 2 sekunden
p.ChangeDutyCycle(12.5) # 180 Grad
time.sleep(2.0) # Warte 2 sekunden
p.ChangeDutyCycle(7.5) # 90 Grad
time.sleep(2.0) # Warte 2 sekunden
#Abbruch mit STRG (CTRL) + 'C'
except KeyboardInterrupt:
pwm.stop()
GPIO.cleanup()
Anmerkung: Sehr Praktisch ist, das auch damit die Ausgangsspannung für analoge Verbraucher im Prinzip kontrolliert werden kann. Dabei wird die Trägheit Ausgenutzt, welche dafür sorgt, das durch das steuern der HIGH und LOW Phasen eine mittlere Spannung erzeugt wird.