Alle Programme können von hier heruntergeladen werden. |
Einführung |
Schalter und Tasten werden bei Mikroprozessor-Systemen häufig als Eingabegeräte verwendet. Sie können als digitale Sensoren mit zwei Zuständen betrachtet werden. In Abhängigkeit von der konkreten Situation werden diese Zustände off/on, offen/geschlossen, losgelassen/gedrückt, tief/hoch, falsch/ wahr, 0/1, 0V/3.3V, Low/High, usw. genannt. Obwohl Schalter die einfachsten mit dem GPIO verbundenen Sensoren sind, ist der Umgang mit ihnen aus folgenden Gründen nicht immer ganz einfach:
|
Experiment 1: Zustand eines Schalters/Buttons erkennen |
Ziel: Schaltschema: Programm: [►] # Button1.py import RPi.GPIO as GPIO import time # Button pin P_BUTTON = 40 # adapt to your wiring P_LED = 22 # adapt to your wiring def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_BUTTON, GPIO.IN, GPIO.PUD_UP) GPIO.setup(P_LED, GPIO.OUT) setup() while True: if GPIO.input(P_BUTTON) == GPIO.LOW: GPIO.output(P_LED, GPIO.HIGH) else: GPIO.output(P_LED, GPIO.LOW) time.sleep(0.01) Bemerkungen:
|
Experiment 2: Zustand durch Drücken eines Buttons wechseln |
Ziel: Schaltschema: Programm:[►] # Button2.py import RPi.GPIO as GPIO import time P_BUTTON = 40 # adapt to your wiring P_LED = 22 # adapt to your wiring def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_BUTTON, GPIO.IN, GPIO.PUD_UP) GPIO.setup(P_LED, GPIO.OUT) setup() isLedOn = False isButtonReady = True while True: if isButtonReady and GPIO.input(P_BUTTON) == GPIO.LOW: # pressed isButtonReady = False if not isLedOn: isLedOn = True GPIO.output(P_LED, GPIO.HIGH) else: isLedOn = False GPIO.output(P_LED, GPIO.LOW) if GPIO.input(P_BUTTON) == GPIO.HIGH: # released isButtonReady = True time.sleep(0.01) # remove this line to experience bouncing Bemerkungen: |
Experiment 3: Verwendung einer eventbasierten Button-Bibliothek |
Da die Button-Aktionen jederzeit auftreten können, sollten sie wie Ereignisse (Events) behandelt werden, die eine sogenannte Callbackfunktion aufrufen (in der Assembler- und C-Programmierung auch Interrupt-Routine genannt). Da das Programmieren mit Interrupts und Events fortgeschrittene Programmierkenntnisse voraussetzt, stellen wir hier ein kleines Software-Modul button.py (einen "Button Handler") zur Verfügung, das die folgenden Button-Events unterstützt: BUTTON_PRESSED, BUTTON_RELEASED, BUTTON_LONGPRESSED, BUTTON_CLICKED und BUTTON_DOUBLECLICKED. Laden Sie das Modul button.py von hier herunter und kopieren Sie es in dasselbe Verzeichnis des Raspberry Pi, in dem sich Ihr Programm befindet. Wenn Sie den Quellcode oder die Python doc studieren, sehen Sie, dass es eine Klassenbibliothek ist, die eine beliebige Anzahl Buttons unterstützt.
Ziel: Schaltschema: Programm:[►] # Button3.py from button import * import RPi.GPIO as GPIO import time P_BUTTON = 15 # adapt to your wiring P_LED = 7 # adapt to your wiring def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_LED, GPIO.OUT) button = Button(P_BUTTON) button.addXButtonListener(onButtonEvent) def onButtonEvent(button, event): global isRunning if event == BUTTON_PRESSED: print "pressed" elif event == BUTTON_RELEASED: print "released" elif event == BUTTON_LONGPRESSED: print "long pressed" elif event == BUTTON_CLICKED: print "clicked" elif event == BUTTON_DOUBLECLICKED: print "double clicked" isRunning = False setup() isRunning = True while isRunning: GPIO.output(P_LED, GPIO.HIGH) time.sleep(0.1) GPIO.output(P_LED, GPIO.LOW) time.sleep(0.1) GPIO.cleanup() print "all done" Bemerkungen: Bevor Ihr Programm beendet wird, sollten Sie den Befehl GPIO.cleanup () aufrufen, damit das GPIO in den Grundzustand zurückgesetzt wird (alle Ports als Eingang definiert). Wenn Sie den Klick und Doppelklick nicht brauchen, ist es günstiger, die Funktion addButtonListener() zu verwenden und nur die Callbackfunktionen BUTTON_PRESSED, BUTTON_RELEASED und BUTTON_LONGPRESSED zu registrieren. Dadurch entfällt eine kurze Verzögerung, die benötigt wird, um zwischen Klick und Doppelklick zu unterscheiden. |
Eine schöne Anwendung: Erzeugung von Morsecode |
Es ist einfach, einen Morsecode-Generator mit dem Buzzer zu erstellen. Wir zeigen hier, wie man ein Programm durch Verwendung von Funktionen strukturieren sollte, damit es besser lesbar ist. Ziel: Schaltschema: Programm:[►] # MorseGen.py import RPi.GPIO as GPIO import time P_BUZZER = 22 # adapt to your wiring dt = 0.1 # adapt to your speed morse = { 'a':'.-' , 'b':'-...' , 'c':'-.-.' , 'd':'-..' , 'e':'.' , 'f':'..-.' , 'g':'--.' , 'h':'....' , 'i':'..' , 'j':'.---' , 'k':'-.-' , 'l':'.-..' , 'm':'--' , 'n':'-.' , 'o':'---' , 'p':'.--.' , 'q':'--.-' , 'r':'.-.' , 's':'...' , 't':'-' , 'u':'..-' , 'v':'...-' , 'w':'.--' , 'x':'-..-' , 'y':'-.--' , 'z':'--..' , '1':'.----', '2':'..---', '3':'...--', '4':'....-', '5':'.....', '6':'-....', '7':'--...', '8':'---..', '9':'----.', '0':'-----', '-':'-....-', '?':'..--..', ',':'--..--', ':':'---...', '=':'-...-'} def s(n): # wait time.sleep(n * dt) def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_BUZZER, GPIO.OUT) def dot(): GPIO.output(P_BUZZER, GPIO.HIGH) s(1) GPIO.output(P_BUZZER, GPIO.LOW) s(1) def dash(): GPIO.output(P_BUZZER, GPIO.HIGH) s(3) GPIO.output(P_BUZZER, GPIO.LOW) s(1) def transmit(text): for c in text: if c == " ": s(4) else: c = c.lower() if c in morse: k = morse[c] for x in k: if x == '.': dot() else: dash() s(2) setup() transmit("cq de hb9abh pse k") GPIO.cleanup() print "all done" Bemerkungen:
(*) kann für ein leichteres Lesen erhöht werden |