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. Der Autor Sebastian hat eine gute Übersicht erstellt.
“Bei Linux ist alles eine Datei”
Die Beispiele auf dieser Website zeigen, dass sich die GPIOs über die Inhalte von Dateien im Betriebssystem steuern lassen.
Um bspw. die LED an GPIO 17 über die Eingabeaufforderung bzw. das Terminal anzusteuern, sind folgende Eingaben notwendig:
1$ echo "17" > /sys/class/gpio/export
2$ echo "out" > /sys/class/gpio/gpio17/direction
3$ echo "1" > /sys/class/gpio/gpio17/value
4$ echo "0" > /sys/class/gpio/gpio17/value
5$ echo "17" > /sys/class/gpio/unexport
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.
1#!/usr/bin/env python3
2
3# Importieren der notwendigen Module
4from gpiozero import LED
5from flask import Flask
6from flask import request
7
8# Definieren einer Variable, die die aktuelle Datei zum Zentrum
9# der Anwendung macht.
10app = Flask(__name__)
11
12# Definieren einer Variablen mit dem PIN, an den die LED
13# angeschlossen ist.
14# Belegung vgl. https://gpiozero.readthedocs.io/en/stable/recipes.html#pin-numbering
15led = LED(17)
16
17# Festlegen einer Route für die Homepage. Der String in den Klammern
18# bildet das URL-Muster ab, unter dem der folgende Code ausgeführt
19# werden soll. Hier ist es der Slash /, also die oberste Ebene.
20@app.route('/', methods=['GET'])
21def switch():
22 # Zuweisen des Parameters state aus dem Request an eine
23 # lokale Variable
24 state = request.args.get('state', '')
25 # testweise Ausgabe
26 print(state)
27 # Fallunterscheidung: An oder aus?
28 if state == 'on':
29 # Schalten der LED
30 led.on()
31 elif state == 'off':
32 led.off()
33 else:
34 pass
35 # Mit jedem Request gibt es auch eine Response. Mit dem folgenden
36 # Konstrukt wird das HTML für die Seite an den Browser geschickt.
37 return '<a href="/?state=on">on</a> | <a href="?state=off">off</a>'
38
39if __name__ =='__main__':
40 app.run(host="0.0.0.0", debug=True)
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.