Python 3 - GPIO-ZugriffDer Zugriff auf die GPIO-Pins wird mit dem Python-Modul RPi.GPIO ermöglicht. Auf der elektronischen Platine des
Raspberry Pi (hier Raspberry Pi 3B) befindet sich eine 40-polige Stiftleiste (J8-Header), die für diverse Elektronik-Schaltungen
und –Experimente genutzt werden kann. Alle Pins können je nach Definition als Eingänge oder Ausgänge eingesetzt werden.
Bibliothek & Modus
Mit import RPi.GPIO as GPIO wird die zuständige Bibliothek geladen. Anschließend muss man entscheiden, nach
welchem Prinzip die Pins bezeichnet werden sollen. Zwei Methoden stehen zur Verfügung. Mit GPIO.BOARD wird die Nummerierung des
J8-Headers verwendet. Mit GPIO.BCM entscheidet man sich für Broadcom-GPIO-Nummern. In den folgenden Beispielen und Programmen
wird die Nummerierung des J8-Headers verwendet. Beispiel:
Raspberry Pi 3B, Python 3
#-------------------------------------
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
Digitale Eingänge
Mit GPIO.setup (PinNr, GPIO.IN) wird ein Anschluss als Eingang definiert.
Nachdem ein Pin als Eingang definiert wurde, kann sein Charakter festgelegt werden. Geschieht dies nicht, hängt der Pin
sozusagen in der Luft und kann während des Programmlaufs undefinierte Zustände annehmen. Man kann für einen definierten Zustand
Widerstände einsetzen und den Pin entsprechend verschalten. Eine weitere Alternative ist, dies mit der Software zu realisieren.
Mit GPIO.setup(PinNr, GPIO.IN, pull_up_down=GPIO.PUD_UP) wir ein Pull-Up Widerstand aktiviert. Mit GPIO.setup(PinNr,
GPIO.IN, pull_up_down=GPIO.PUD_DOWN) ein Pull-Down Widerstand. Beispiel:
# ---------------------------------------------------------------
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(37, GPIO.IN, pull_up_down=GPIO.PUD_UP)
Damit wurde der Pin Nr. 37 als digitaler Pull-Up Eingang definiert.
Eingang abfragen (Schleife)
Die Eingänge kann man im Programm mit einer zeitlich verzögerten Schleife auf Zustandsänderungen überwachen. Dies
kann allerdings dazu
führen, dass eine Änderung nicht immer zum richtigen Zeitpunkt erkannt wird. Zwar liefert das Konzept keine optimalen Ergebnisse,
für einfache Anwendungen und Experimente ist es durchaus ausreichend. Beispiel:
# ---------------------------------------------------------------
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setup(37, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# Hauptprogramm
while True:
if GPIO.input(37) == GPIO.LOW:
print ("Taster am Pin 37 wurde betätigt")
time.sleep (0.1)
Eingang abfragen (wait_for_edge)
Mit der Funktion wait_for_edge wartet das Programm auf einen Zustandswechsel eines Pins. Solange kein Zustandswechsel
stattfindet, unternimmt das Programm nichts. Es können drei Abfragen gestartet werden: RISING (steigende Flanke), FALLING
(fallende Flanke) und BOTH (beide Flanken). Mit GPIO.wait_for_edge (PinNr, GPIO_RISING, Timeout=3000) wird 3 Sek. lang auf
eine steigende Flanke gewartet. Beispiel:
# ---------------------------------------------------------------
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(37, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# Hauptprogramm
GPIO.wait_for_edge (37, GPIO.FALLING)
print ("Na endlich tut sich was!")
Eingang abfragen (add_event_detect)
Mit add_event_detect kann ein Eingang überwacht werden, während das Programm andere Aufgaben bewältigt. Zu einem
bestimmen Zeitpunkt kann mit event_detected abgefragt werden, ob ein Ereignis an dem untersuchten Anschluss eingetreten ist. Mit
remove_event_detect(x) kann die Überwachung beendet werden. Beispiel:
# ---------------------------------------------------------------
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setup(37, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect (37, GPIO.FALLING)
# Hauptprogramm
while True:
print ('Eingang 37 wird überwacht')
time.sleep (5)
if GPIO.event_detected (37):
print ('Es wurde fallende Flanke am Pin 37 erkannt')
Eingang abfragen (add_event_callback)
Mit add_event_callback wird eine Funktion angegeben, die bei einem Ereignis am untersuchten Pin aufgerufen wird.
add_event_callback benötigt den add_event_detect Aufruf. Mit bouncetime = n kann an add_event_detect ein dritter Parameter
übergeben werden, mit dem die minimale Zeitspanne zwischen zwei Ereignissen an dem überwachten Pin angegeben wird.
Damit kann Taster-Prellung abgefangen werden. Beispiel:
# ---------------------------------------------------------------
import RPi.GPIO as GPIO
import time
def CallFunktion(n):
print ('Taster wurde betätigt')
GPIO.setmode(GPIO.BOARD)
GPIO.setup(37, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect (37, GPIO.FALLING)
GPIO.add_event_callback (37, CallFunktion)
# Hauptprogramm
while True:
print ('Eingang 37 wird überwacht')
time.sleep (5)
Digitale Ausgänge
Mit GPIO.setup (PinNr, GPIO.OUT) wird ein Anschluss als Ausgang definiert. Der Ausgangszustand wird mit LOW (False, 0)
ausgeschaltet oder mit HIGH (True, 1) eingeschaltet. Beispiel:
# ---------------------------------------------------------------
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(37, GPIO.OUT)
GPIO.output(37, GPIO.HIGH)
Der Pin Nr. 37 wurde als Ausgang definiert und mit HIGH eingeschaltet.
PWM Ausgang
Mit GPIO.PWM kann ein Anschluss als ein PWM-Ausgang definiert werden. Damit wird der Ausgang mit vorgegebenen
Parametern regelmäßig ein- und ausgeschaltet. Mit start und stop kann der Ausgang nach Bedarf aktiviert bzw. deaktiviert werden.
Mit start(x) wird der High-Anteil des Signals in % angegeben. Mit ChangeFrequency(f) kann nachträglich die Frequenz,
mit DutyCycle (x) der High-Anteil verändert werden. Beispiel:
# ---------------------------------------------------------------
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(37, GPIO.OUT)
pwm37 = GPIO.PWM (37, 5) # Frequenz 5 Hertz
pwm37.start(50) # High-Anteil 50%
Pins prüfen
Mit GPIO.gpio_function (PinNr) kann ermittelt werden, wie ein Anschluss definiert ist. Mögliche Rückmeldungen sind:
GPIO.IN, GPIO.OUT, GPIO.SPI, GPIO.I2C, GPIO.HARD_PWM, GPIO.SERIAL, GPIO.UNKNOWN. Beispiel:
# ---------------------------------------------------------------
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
Funktion = GPIO.gpio_function (37)
print (Funktion)
Google-Suche auf MEINE-SCHALTUNG.de :
|
|