Antriebselektronik Baumueller


Google-Suche auf MEINE-SCHALTUNG.de :





Online Rechner

Chronik

Dauerkalender


Python 3 - GPIO-Zugriff

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

Python 3 - Einführung:




Google-Suche auf MEINE-SCHALTUNG.de :


Home Impressum Datenschutz