LEGO Mindstorms, IoT und Microsoft Azure – Wie passt das zusammen?

Motivation für den Blog Artikel

Im Verlauf der letzten Jahre hat sich für mich immer wieder die Frage gestellt, wie sich am Einfachsten ein leicht verständliches Demoszenario für IoT Anwendungen aufbauen lässt.
Aus der Maker Szene gibt es inzwischen zahlreiche ‚Kits‘ und ‚Boards‘, die sich dafür einsetzen lassen. Eine der bekanntesten Plattform ist sicher Raspberry Pi. Allerdings bleibt es dann doch immer wieder beim Anwender, sich relativ kleinteilig um entsprechende Sensorik etc. zu kümmern. Oder man landet anders herum sehr schnell beim Beispiel des Temperatursensors und LEDs für Signalisierungszwecke.

Nach einigem Hin und Her bin ich dann auf meinen LEGO Mindstorms Baukasten gekommen. Denn ganz ehrlich, was lässt sich schon schneller und flexibler in unterschiedlichste Formen umbauen als ein auf LEGO Technik basierender Baukasten?

Die technischen Eckdaten der aktuellen EV3 Generation sprechen für sich:

  • 300 MHz ARM 9 Prozessor, 16 MB Flash, 64 MB RAM
  • Integrierter Bildschirm – zwar nur Schwarz-Weiß, aber OK
  • USB Host Port
  • Slot für Mikro SD Karte
  • Umfangreiche Sensorik (Farbe, Berührung, Ultraschall …) und Aktorik (verschiedene Motoren)

Lange Rede, kurzer Sinn, eine optimale Plattform um mit IoT Anwendungen zu experimentieren. Auch aus didaktischer Sicht eignet sich das System um verschiedenste Nutzungsmöglichkeiten zu demonstrieren.

Aus eigener Erfahrung habe ich inzwischen die Leistungsfähigkeit des Microsoft Azure IoT Hub schätzen gelernt. Daher habe ich hier gezielt darauf aufgesetzt. Wesentliche Aspekte für dieses Demo Szenario waren die einfache Anwendbarkeit und die wirklich gute Dokumentation des IoT Hub bzw. der Azure Komponenten im Allgemeinen. Im weiteren Verlauf dieses Artikels werde ich an einigen Stellen auch gezielt auf die Dokumentation verlinken.

EV3RSTORM

Rahmenbedingungen

Erforderliche Komponenten:

  • Lego Mindstorms EV3
  • Micro SD Karte (min. 4 GB)
  • WLAN Adapter (bspw. EDIMAX EW-7811UN Wireless USB Adapter)

Für den EV3 gibt es im Internet verschiedene Firmware Optionen. Der große Vorteil ist, dass das System es erlaubt die Firmware direkt von einer Micro SD Karte zu booten. Dadurch muss die Standard Firmware nicht ersetzt werden und man kann die EV3 Steuereinheit jederzeit durch ein einfaches Entfernen der SD Karte wieder in den Ursprungszustand versetzen.

Folgende Firmware Projekte sind mir bekannt:

  • MonoBrick EV3 Firmware (http://monobrick.dk)
    Der EV3 kann hiermit unter Verwendung des Open Source .Net Framework Mono programmiert werden.
  • ev3dev Firmware (http://ev3dev.org)
    Hierbei handelt es sich um ein Debian Linux basiertes Betriebssystem für die Lego Mindstorms Plattform.

Ich habe die ev3dev Firmware als Grundlage für das hier beschriebene Testprojekt verwendet.

Vorbereitung des Mindstorms EV3

Unter dem ‚Getting Started Link‘ (Englisch) ist recht detailliert beschrieben wie man das aktuelle ev3dev Image herunterladen und auf eine SD Karte flashen kann.
Ich habe die Version vom 21.12.2016 verwendet. Zum Zeitpunkt der Erstellung des Blogs gab es bereits eine etwas aktuellere Version vom 11.02.2017. Mangels Test kann ich allerdings leider nicht sagen, ob diese Einfluss auf die beschriebene Funktionalität hat.

Nach dem Boot des Linux Systems wird auf dem Display des EV3 ein Menü angezeigt in dem erwartungsgemäß mit den Tasten des Bedienfelds navigiert werden kann. Über das ‚Wireless and Networks‘ Menü lässt sich der EV3 nun recht einfach mit einem WLAN verbinden. Die Eingabe des WLAN Passwort ist zwar etwas fummelig, aber spätestens beim zweiten Mal ist man dabei recht fix.

Sobald der EV3 einmal mit einem Netzwerk verbunden ist, lässt sich ganz einfach mit den üblichen Werkzeugen darauf zugreifen. Ich verwende dafür gewöhnlich PuTTY. Für alle, die nicht regelmäßig mit diesen Werkzeugen arbeiten, ist dies auch noch mal auf der ev3dev Webseite beschrieben.

Softwarekomponenten

Das Node Framework sollte normalerweise schon installiert sein. Falls dies nicht der Fall ist, kann es wie folgt installiert werden:

  • sudo curl -sL https://deb.nodesource.com/setup_0.12 | bash –
  • sudo apt-get install -y nodejs

Für den ARM9 Prozessor des Mindstorms EV3 steht aktuell leider keine höhere Node Version zur Verfügung. Dementsprechend kann es bei den folgenden Schritten zu einem Hinweis kommen, dass eine neuere Node Version benötigt wird, als installiert ist (0.10.29).

Installation des ev3dev-lang Pakets:

  • ’sudo npm install ev3dev-lang‘

In meiner Umgebung kam es bei der späteren Ausführung des Programms zu einem Laufzeitfehler, weil eine Datei nicht gefunden werden konnten. Dem ließ sich aber ganz simpel Abhilfe schaffen, indem ich die Dateien aus /node_modules/ev3dev-lang/bin in /node_modules/ev3dev-lang verschoben habe. Dies ist dann ggf. auch innerhalb des Visual Studio Projektes erforderlich.

Für die Kommunikation mit dem Azure IoT Hub werden die entsprechend Node Pakete benötigt. Diese lassen sich wie folgt installieren:

  • IoT Device Funktionalität
    ’sudo npm install azure-iot-device‘

und

  • Kommunikationsschicht
    ’sudo npm install azure-iot-device-http‘
    oder
    ’sudo npm install azure-iot-device-amqp‘

Bei der Verwendung von http/https als Kommunikationsprotokoll werden ggf. Cloud-to-Device Nachrichten erst zeitverzögert übertragen. Grundsätzlich lassen sich aber beide Protokolle nutzen. Das weiter unten folgende Beispielprogramm nutzt aktuell ‚amqp‘. Bei Bedarf muss in ‚clientFromConnectionString‘ nur ‚azure-iot-device-amqp‘ durch ‚azure-iot-device-http‘ ausgetauscht werden.

Bei der Installation der amqp Module kam es leider zu ein paar kleineren Schwierigkeiten. Warum auch immer hat das Installationsskript die Verzeichnisse der Node Module teils rekursiv verschachtelt erstellt. Mir blieb hier nichts anderes über, als die Inhalte der tieferliegenden Node Modulverzeichnisse nach oben in das Top Level Node Modulverzeichnis zu kopieren.

Danach kann es losgehen.

Vorbereitung der Entwicklungsumgebung

Als Entwicklungsumgebung habe ich Visual Studio 2015 in der Community Edition verwendet. Die Software findet sich unter: https://www.visualstudio.com/de/vs/community/
Für routinierte Entwickler sind die folgenden Schritte sicher ganz simpel, ich beschreibe sie aber trotzdem für alle, die sich wie ich nicht dazu zählen, noch mal der Reihe nach.

Projekt erstellen:

  • Unter Starten „Neues Projekt“ auswählen
  • Vorlagen > Andere Sprachen > TypeScript > Node,js auswählen
  • Template: Blank Node.js Console Application | Typescript

Einbinden der Pakete:

  • Im Projektmappen-Explorer (rechts) im Projekt mit einem Rechtsklick auf ‚npm‘ das Menü öffnen und ‚Install New npm Packages‘ öffnen.

  • Einbinden der folgenden Pakete:
    • azure-iot-device  (1.1.6)
    • azure-iot-device-http (1.1.6)
    • azure-iot-device-amqp (1.1.6)
    • ev3dev-lang (1.0.0)

In Klammern sind jeweils die Versionen angegeben, die zum Zeitpunkt meiner Tests aktuell waren.

Ein erstes Programm

Erste Schritte mit dem Azure IoT Hub und Node als Programmiersprache sind an folgenden Stellen beschrieben:

Für den Programmaufbau ist es wichtig zu beachten, dass Javascript / Type Script als ‚single thread‘ Anwendung ausgeführt werden. Deshalb wird hier mit einer entsprechenden Callback Methode gearbeitet, in der die Sensordaten abgefragt und übermittelt werden bzw. die Nachrichten vom IoT Hub verarbeitet werden.

Ein Beispielprogramm steht hier bereit: Source Code EV3 Azure IoT Hub

Das Programm ist relativ einfach aufgebaut. Kern ist die Funktion ‚connectCallBack‘, die mit dem Öffnen der Verbindung an das Clientobjekt übergeben und dann zyklisch gemäß des definierten Intervalls ausgeführt wird.

Die Methode ist wie folgt aufgebaut:

  1. Abruf und Verarbeitung von ‚Cloud-to-device‘ messages, die durch den IoT Hub an das Device übermittelt werden sollen.Um hier eine Ansteuerung der Motoren zu simulieren habe ich folgende simple JSON Notation definiert: {„Motor“:“A“,“run“:“ForDistance“,“distance“:1200,“speed“:500,“stopaction“:“brake“}Hieraus wird mit einfachen Zeichenkettenoperationen ein Funktionsaufruf für das Motorobjekt des gewünschten Motors zusammengebaut und anschließend mittels der JavaScript Funktion ‚eval()‘ ausgeführt. Bei allen Angaben im JSON Objekt muss dadurch zwangsweise die Groß- und Kleinschreibung beachtet werden.Damit das Programm bei fehlerhaften Kommandos nicht direkt abbricht oder die Motoren in undefinierten Szenarien Schaden nehmen, habe ich eine Methode zur rudimentären Prüfung der Kommandoparameter (commandCheck) und einige weitere Validierungen vorgesehen.
  2. Abfrage der Sensordaten des EV3 und Versand der Informationen als JSON Nachrichten an den IoT HubDies erfolgt innerhalb der Funktion ‚setInterval‘, die zyklisch vom Callback Handler aufgerufen wird.

Vorbereitung der Azure Umgebung

In dem Artikel ‚ Erste Schritte mit dem IoT Hub und Node‘ (https://docs.microsoft.com/de-de/azure/iot-hub/iot-hub-node-node-getstarted) ist auch Schritt für Schritt beschrieben wie man einen IoT Hub erstellt.

Anders als dort ebenfalls beschrieben, würde ich aber empfehlen der Einfachheit halber für die Erstellung einer Geräteidentität (= eine Device) den Device Explorer zu verwenden. Dieser findet sich unter folgendem Link: https://github.com/Azure/azure-iot-sdks/releases (Downloads > SetupDeviceExplorer.msi).

Der IoT Hub Connection String entspricht der Verbindungszeichenfolge für den ‚iothubowner‘.

Über den Device Explorer können dann die grundlegenden Funktionen des IoT Hub angesteuert werden.

Ausführung des Programms

In meinem Beispiel habe ich die von Visual Studio vorgeschlagene Programmbezeichnung ‚app‘ beibehalten.

Nach dem Aufruf von der Funktion zum Erstellen des Projektes (Erstellen > ‚Projektname‘ erstellen) finden sich im Programmverzeichnis unter anderem die folgenden Dateien:

  • app.js
  • app.ts
  • package.json
  • README.md

Für die Übertragung der Dateien auf die EV3 Steuereinheit habe ich FileZilla verwendet. IP Adresse, Benutzername und Passwort sollten aus den vorhergehenden Schritten ja bekannt sein.

Weitere Schritte:

  • Oben genannte Dateien in den ‚home‘ Ordner des Benutzers (robot) kopieren
  • Einmalig ‚sudo npm install‘ ausführen um ggf. fehlende Abhängigkeiten auflösen zu lassen

Danach kann die Anwendung ganz einfach mit dem Kommando ‚node app.ts‘ gestartet werden.

Natürlich ist es auch möglich das Programm zunächst testweise in Visual Studio laufen zu lassen und zu debuggen. Da bei allen Abfragen und Kommandos zunächst auf die Existenz der Sensoren und Motoren geprüft wird, sollte auch dies reibungslos funktionieren. Als Sensorinformation wird dann allerdings lediglich übermittelt, dass keine Stromversorgung verbunden ist.

Test des Datenempfangs und der Kommandoverarbeitung

Über den bereits weiter oben genannten Device Explorer lässt sich schnell und einfach testen ob alles wie gewünscht funktioniert. Einfach mit dem IoT Hub verbinden und für das Device, welches dem Roboter entspricht, das Monitoring starten.

Auf dem Reiter „Messages to device“ besteht dann die Möglichkeit direkt ein Kommando an den EV3 zu senden.

Die eingehenden Daten werden auch in der Konsole angezeigt, in der das Programm auf dem EV3 läuft. Wenn die Nachricht korrekt verarbeitet werden kann, sollte der angegebene Motor entsprechend in Bewegung versetzt werden.

Allen die es auch mal ausprobieren wünsche ich viel Erfolg und Freude dabei.

Quellen:

  • Einige Anregungen habe ich mir in folgendem Blog Artikel geholt:
    https://blogs.msdn.microsoft.com/laurelle/2015/12/24/how-to-connect-lego-mindstorms-nxt-ev3-to-azure-iot-hub-using-node-js/
Veröffentlicht in Dies und das

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*