Der Code hinter den Säulen

Im Folgenden soll ein Überblick über den auf den Raspberry Pis laufenden Code gegeben werden. Dazu werden wir mehr oder weniger Zeile für Zeile durch den Code gehen und erklären wo was passiert.

Der erste Schritt im Code der die Säulen zum Leben erweckt sind die verschiedenen Includes bzw. Imports der benötigten Libs. Diese ermöglichen es verschiedene Elemente anzusteuern ohne allzu komplizieren Code schreiben zu müssen.

In Zeile 3 bis 6 finden sich die Imports der OSC Library wieder. Diese sind nötig um auf der Raspberry Pi sowohl einen OSC Server als auch Client laufen zu lassen, welche dann wiederum weitern Code ausführen wenn sie eine Nachricht empfangen bzw. eine Nachricht senden wenn der Code dies aufgrund eines anderen Ereignisses vorsieht. Im Anschluss finden wir die Library zum ansprechen des Time of Flight Sensors (VL53L1X), eine um asynchron Code ausführen zu können (asyncio), eine um Farbwerte zu konvertieren (colorsys), die Library um die LEDs der Säule ansteuern zu können (neopixel) sowie weitere Librarys welche das nutzen des I2C Busses erlauben, die Pins der Pi korrekt zu Adressieren, Zeitintervalle anzugeben und Systemfunktionen die es erlauben das Programm mit der Tastenkombination Ctrl+C wieder zu beenden.

Die nächsten Zeilen werden genutzt um Initiale Variablen zu setzt und Programmkonstanten zu definieren. Einige interessante Beispiele hierzu sind:

  • Zeile 16: Die IP-Adresse des Servers an welchen die Raspberry Pi Pakete schickt. Hier ist die Adresse als Broadcast gesetzt, was bedeutet OSC Pakete werden an alle Clients des Netzwerks gesendet.
  • Zeile 18: Der Zielport auf dem die OSC Pakete ausgeliefert werden bzw. der Port auf dem der Server (PC mit MAX) die Pakete dieser spezifischen Säule erwartet.
  • Zeile 19-24: OSC Adressen
  • Zeile 25 und 26: Timings für den TOF Sensor
  • Zeile 28-33: Standart Werte für LED Farbe und Helligkeit sowie die Cutoff Höhe ab welcher die Säule einen „fehlenden“ Würfel meldet.

Nachdem alle globalen Variablen und Konstanten gesetzt sind Folgen einige Zeilen Setup Code welche die LEDs (Zeile 42-45) und den TOF Sensor (Zeile 47-62) Initialisieren.

Der nächste große Block Code definiert Funktionen welche beim empfangen verschiedener OSC Nachrichten aufgerufen werden sollen (Zeile 72-99) und bindet diese Funktionen an die entsprechenden OSC Adressen (Zeile 102-107), so das die jeweils korrekte Funktion aufgerufen wird.

Bevor jedoch besagte Funktionen definiert werden, wurden noch zwei Funktionen definiert (Zeile 64-70) welche wiederum in den nachfolgenden Funktionen verwendet werden um Farbwerte zu konvertieren und Höhen-Werte zu skalieren.

Nun da alle Setup Schritte abgeschlossen sind wird eine „running“ Flag gesetzt welche den Haupt Loop in einer Endlosschleife laufen lässt. Im Anschluss daran finden wir den Exit Handler, welcher uns ermöglicht das Script mit Ctrl+C zu beenden.

In den letzten Zeilen Code werden der asynchrone „Main-Loop“ sowie eine Initialisierungs-Routine. „async def loop():“ enthält den sich in einer Endlosschleife wiederholenden Code des Programms. Als erstes werden einige Globale Variablen gesetzt (Zeile 133) und anschließend folgt die Endlosschleife. Diese ist durch „while running:“ gekennzeichnet und bedeutet „führe allen nachfolgenden, eingerückten Code solange aus wie die Variable running gleich true ist“. Demzufolge stoppt die Endlosschleife wieder sobald Ctrl+C gedrückt wird da in der zuvor dafür definierten Funktion die Variable running gleich false gesetzt wird. Außerdem geschehen innerhalb dieser Schleife die normalen aufgaben der Säule wie:

  • Abfragen der aktuell gemessenen Distanz vom TOF Sensor (Zeile 135)
  • Vergleich dieses Wertes mit der eingestellten Cutoff Height. Ist diese größer als der gemessene Wert wird besagter Wert zwischengespeichert um per OSC an MAX geschickt zu werden. Anderenfalls wird der Wert -1 gespeichert (Zeile 136-142).Außerdem werden im selben Zuge die Helligkeitswerte für die LEDs gesetzt die sie abschalten bzw. Entsprechend der gemessenen Höhe dimmen. (Zeile 138 bzw. 142).
  • Senden des gespeicherten Höhenwertes via OSC (Zeile 143)
  • Einstellen der zuvor gesetzen Helligkeitswerte der LEDs und anzeigen auf den LEDs (Zeile 145 und 146)

Der fast letzte Bock des Codes beinhaltet die eben angesprochene Initialisierungs-Routine in, welcher ein Asynchroner OSC Server gestartet wird der bei bedarf OSC Pakete von MAX Empfangen kann und entsprechend der angegebenen OSC Adresse dann für die Ausführung der entsprechenden Funktionen weiter oben im Code führt (Zeile 72-99). Im Anschluss daran Springt das Programm mit der Anweisung “ await loop()“ in den „Main-Loop“ und führt diesen aus. Die aller letze Anweisung des Programms in Zeile 161 Startet die Initialisierungs-Routine welche wiederum den „Main-Loop“ startet und so weiter.

Und das ist bereits die ganze Magie hinter den Säulen! Ich hoffe es hat euch gefallen und ihr konntet etwas lernen!

Verfasst von: