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Ω:

Ansteuern einer LED mit Flask. Abbildung hergestellt mit fritzing. [Quelle zum Editieren in GitLab](https://collaborating.tuhh.de/itbh/oer/informatik/einfuehrung-in-die-informationstechnik-i-wise-2021_22/-/tree/main/content/de/einheiten/webanwendungen-mit-flask/hardware-schalten).
Ansteuern einer LED mit Flask. Abbildung hergestellt mit fritzing. Quelle zum Editieren in GitLab.

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

  1. Schließen Sie noch eine zweite LED an einem anderen GPIO an.
  2. Erweitern Sie das Programm so, dass Klicks auf die Links beide LEDs gleichzeitig schalten.
  3. 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.
Zurück
Weiter