Hardware über HTTP ansteuern
Der Raspberry Pi ist auch deshalb ein begehrter Kleincomputer, weil er die Interaktion mit angeschlossener Hardware sehr einfach macht. LEDs, Motoren, Nebelmaschine, Raketentriebwerke: prinzipiell lassen sich z. B. mit Python steuern, starten und regeln.
Ansteuern einer LED
Nachdem Sie nun wissen, wie Requests an einen Webserver mit Flask auf dem Raspberry ankommen, fehlt nicht viel, um diese Anfragen für die Interaktion mit angeschlossener Hardware zu nutzen. Dafür wird folgende einfache Schaltung vorgeschlagen. Der Wert des Widerstands beträgt 330Ω:
Die Belegung der GPIOs
Abhängig von dem RPI-Modell, mit dem Sie arbeiten, sind unterschiedlich viele GPIOs vorhanden und auch nicht einheitlich belegt. Les Pounder hat eine gute Übersicht erstellt. In der Abbildung dort werden auch die Unterschiede zum Raspberry Pi 3 herausgestellt.
GPIOs über die Kommandozeile steuern
Um erste Erfahrungen mit dem Ansteuern der angeschlossenen LED zu sammeln, bietet sich das Programm pinctrl
an. Es wird auf der Kommandozeile eingetippt und mit weiteren Parametern ergänzt. Eine Übersicht der Möglichkeiten gibt der folgende Befehl:
1$ pinctrl help
Aus der Ausgabe lässt sich ablesen, dass mit den folgenden Befehlen die LED ein- und ausgeschaltet werden kann:
1$ pinctrl set 17 op # Definiere GPIO 17 als Ausgang
2$ pinctrl set 17 dh # Schalte GPIO 17 auf 1 (dh = drive high)
3$ pinctrl set 17 dl # Schalte GPIO 17 auf 0 (dl = drive low)
Um den Zustand eines, mehrerer oder aller GPIOs abzufragen, gibt es die folgenden Befehle:
1$ pinctrl get # Frage den Zustand aller GPIOs ab
2$ pinctrl get 17 # Frage den Zustand von GPIO 17 ab
3$ pinctrl get 17,18 # Frage den Zustand von GPIO 17 und 18 ab
Der Quellcode für eine simple Webanwendung mit Python/Flask
Das folgende Beispiel in Python zeigt, wie mithilfe von Flask der GPIO 17 und damit die LED geschaltet werden können, wenn bestimmte Parameter mit dem HTTP-Request zum Server geschickt werden. Das Codebeispiel finden Sie auch in GitLab.
Vorbereitungen
Legen Sie im Ordner Codeprojekte
einen neuen Ordner led-mit-flask
an. Wechseln Sie in diesen Ordner. Kopieren Sie das folgende Skript in eine Datei namens app.py
, die Sie mit nano
erstellen.
Treffen Sie ggf. alle Vorkehrungen aus dem Kapitel Flask auf der Serverseite, bevor Sie fortfahren.
Skript: LED mit Python/Flask schalten
#!/usr/bin/env python3
# Importieren der notwendigen Module
from gpiozero import LED
from flask import Flask
from flask import request
# Definieren einer Variable, die die aktuelle Datei zum Zentrum
# der Anwendung macht.
app = Flask(__name__)
# Definieren einer Variablen mit dem PIN, an den die LED
# angeschlossen ist.
# Belegung vgl. https://gpiozero.readthedocs.io/en/stable/recipes.html#pin-numbering
led = LED(17)
# Festlegen einer Route für die Homepage. Der String in den Klammern
# bildet das URL-Muster ab, unter dem der folgende Code ausgeführt
# werden soll. Hier ist es der Slash /, also die oberste Ebene.
@app.route('/', methods=['GET'])
def switch():
# Zuweisen des Parameters state aus dem Request an eine
# lokale Variable
state = request.args.get('state', '')
# testweise Ausgabe
print(state)
# Fallunterscheidung: An oder aus?
if state == 'on':
# Schalten der LED
led.on()
elif state == 'off':
led.off()
else:
pass
# Mit jedem Request gibt es auch eine Response. Mit dem folgenden
# Konstrukt wird das HTML für die Seite an den Browser geschickt.
return '<a href="/?state=on">on</a> | <a href="?state=off">off</a>'
if __name__ =='__main__':
app.run(host="0.0.0.0", debug=True)
Anwendung starten
Starten Sie das Skript mit folgendem Befehl:
1$ ../bin/python -m flask --app [Dateiname ohne .py] run --host=0.0.0.0
Rufen Sie nun die Anwendung im Browser auf und schauen Sie, ob Sie die LED mit den beiden Links ein- und ausschalten können.
Aufgaben und Fragestellungen
- Schließen Sie noch eine zweite LED an einem anderen GPIO an.
- Erweitern Sie das Programm so, dass Klicks auf die Links beide LEDs gleichzeitig schalten.
- Erweitern Sie das HTML in Z37 so, dass Sie jede LED einzeln schalten können. Die
app.py
müssen Sie dann ebenfalls verändern.