Im Folgenden wird ein Einblick in den Programmcode gegeben, der die Arduinos in den Würfeln steuert. Wer sich diesen lieber selbst anschauen möchte findet sämtlichen Code und eine kurze Anleitung zur Verwendung auf unserem Github Repository
Benötigte Libraries
Bevor es mit dem eigentlichen Programmcode losgeht, hier die verwendeten Libraries:
Da hier, anders als bei früheren Prototypen ein Arduino Nano 33 IOT verwendet wird, werden die Libraries WiFiNINA und Arduino LSM6DS3 benötigt um die auf dem Board verbauten Sensoren, sowie das WiFi Modul zu verwenden. Außerdem wird die Library FastLED verwendet um die adressierbaren LED-Streifen an zu steuern. Zu guter Letzt wird außerdem OSC for Arduino von CNMAT verwendet, da dies uns erlaubt einfache String in fertige OSC Nachrichten und OSC Bundles zu konvertieren.
Grundlagen
Kurz zusammengefasst erfüllt das Programm drei Grundlegende Aufgaben:
- Eine Verbindung mit unserem Netzwerk aufbauen.
- Die Sensordaten aus dem Accelerometer auslesen, formatieren, und an unseren Computer schicken, wo sie in Max weiterverarbeitet werden.
- Nachrichten von Max empfangen und dementsprechend die LEDs steuern.
Im Folgenden werden wir uns um die Übersicht zu erleichtern diese beiden Teilaufgaben getrennt anschauen.
Netzwerk
Das integrierte WLAN Modul ermöglicht es relativ einfach eine Verbindung mit unserem Netzwerk auf zu bauen. Dazu müssen zunächst die entsprechenden Libraries eingebunden werden.

Danach werden noch vor dem eigentlichen Programmstart einige Variablen definiert.

In „status“ wird später der Verbindungsstatus gespeichert, zu Beginn ist dieser „idle“ da ja noch keine Verbindung aufgebaut wurde. In „ssid“ und „pass“ werden die Zugangsdaten für unser Netzwerk gespeichert. Diese werden aus einer separaten Datei „secrets.h“ bezogen, was es einfacher macht die Daten zu ändern ohne den Programmcode editieren zu müssen. Außerdem werden mit „targetIp“ und „targetPort“ Ziel IP Adresse und Port und mit „ip“ und „localPort“ die IP Adresse des Arduinos definiert. Letztendlich wird mit „Udp“ ein Objekt erzeugt mit welchem wir später Nachrichten senden und empfangen können.
UDP vs TCP
Zur Übermittlung der Daten wurde als Protokoll UDP (User Datagram Protocol) statt TCP (Transmission Control Protocol) gewählt. UDP ist im Gegensatz zu TCP ein verbindungsloses Protokoll, d.h. es wird keine Verbindung zwischen Sender und Empfänger aufgebaut bevor das Paket verschickt wird. Als solches ist UDP zwar anfälliger für Fehler (mangels Flusskontrolle und Paketwiederherstellung), ist aber auch um einiges schneller. Da wir für unsere Anwendung eine Datenübertragung möglichst in Echtzeit erreichen wollen ist UDP also hier die bessere Wahl.
Als nächstes beginnt das eigentliche Setup, Arduino-typisch in der „void setup()“ Funktion.

Zunächst wird überprüft ob das WiFi Modul überhaupt erreichbar ist. Sollte dies nicht der Fall sein, leuchtet der Würfel rot auf, um einen Fehler zu signalisieren. Zusätzlich wird die entsprechende Fehler-Nachricht in die Konsole ausgegeben um etwaiges debugging zu erleichtern. Durch die Schleife „while (true“ in Zeile 81 wird das Programm an dieser Stelle gestoppt.
Ist das WiFi Modul erreichbar wird die gewünschte IP Adresse aus der „secrets.h“ Datei gelesen und als gewünschte IP für das WIFi Modul registriert bevor es weiter geht:

Hier kommt nun der anfangs definierte Verbindungsstatus ins spiel. Die hier dargestellte Schleife läuft solange durch, bis der Status angibt dass eine Verbindung aufgebaut wurde. Der eigentliche Verbindungsaufbau findet in Zeile 93 statt. Hier werden SSID und Passwort des Netzwerks an das WiFi Modul übergeben um eine Verbindung auf zu bauen. Im Rest der Schleife werden die LEDs im Würfel angesteuert um nacheinander Gelb auf zu leuchten. Dies hat geschieht aus zwei Gründen. Erstens um ein visuelles Feedback zu geben und zweitens um genug Zeit verstreichen zu lassen damit eine Verbindung aufgebaut werden kann, da dies bis zu 10 Sekunden dauern kann. Wird diese Zeit nicht gegeben, wird die Schleife sofort wieder neu gestartet, da noch keine Verbindung aufgebaut werden konnte.
Wurde nun erfolgreich eine Verbindung mit dem Netzwerk aufgebaut gibt es nur noch eins zu tun.

Hier wird zunächst eine Nachricht mit den Netzwerkdetails an die Konsole übergeben, sollte der Arduino an einen Computer angeschlossen sein und alle LEDs leuchten grün auf, um eine erfolgreiche Verbindung zu signalisieren. Zuletzt wird in Zeile 116 ein Socket auf dem vorher definierten Port eingerichtet, was nötig ist um UDP Nachrichten zu senden und Empfangen.
Damit ist die Netzwerkverbindung abgeschlossen. Wie das ganze in Aktion aussieht wird in folgendem Video demonstriert.