© Yurii Andreichyn/Shutterstock.com
Das Framework Johnny Five zur Hardwareinteraktion nutzen

Fünf GPIO-Pins für ein Smart Home


Embedded-Systeme waren einst Domäne der Rüstungselektroniker, die mit Assembler oder gar C an stark echtzeitkritischen Aufgaben arbeiteten. In der schönen neuen Welt der Informatik ist die Situation dank des Moore’schen Gesetzes und der Umgebungsänderungen anders.

Anstatt aufwendig mit hardwarenahen Programmiersprachen zu arbeiten, hat der Entwickler Interesse daran, Hochsprachen zu verwenden. Das ist aus mehreren Gründen vorteilhaft: Neben dem schnelleren Programmiervorgang reduziert sich die Kopplung innerhalb des Projekts. Im Dunstkreis des Autors findet sich ein Unternehmen, das am Prozessrechner und am Server in vielen Bereichen Code verwendet, der aus denselben Dateien entsteht – Fehler bei der Adaption sind so, frei nach Ted Faison, von Anfang an ausgeschlossen.

Das Framework Johnny Five

Die Tessel-Plattform hat uns in den Fachmagazinen immer wieder beschäftigt. Im Projekt herrscht im Moment allerdings verdächtige Ruhe – der T2 ist seit einiger Zeit auf dem Markt, von einem Nachfolger hört man nichts. Als Alternative etabliert sich ein als Johnny Five bezeichnetes Framework, das seine Arbeit unter Node.js bewerkstelligt und mit verschiedensten Prozessrechnersystemen zurechtkommt. Die Entwickler von Johnny Five wünschen sich die Verwendung von Node.js 4.0. Die nachfolgenden Schritte erfolgen auf einem unter Ubuntu 14.04 laufenden AMD-Achtkernrechner, auf dem dieser Versionsstand vorherrschte:

tamhan@TAMHAN14:~/workspaceJohnny/bsp1$ node -v v10.1.0 tamhan@TAMHAN14:~/workspaceJohnny/bsp1$ npm -v 5.6.0

Wie bei allen Node-Projekten muss auch hier mittels npm ein neues Projekt erstellt und die Johnny-Five-Bibliothek installiert werden. Zum Zeitpunkt der Drucklegung dieses Magazins ist die Version 1.0 aktuell:

tamhan@TAMHAN14:~/workspaceJohnny/bsp1$ npm init tamhan@TAMHAN14:~/workspaceJohnny/bsp1$ npm install johnny-five . . . + johnny-five@1.0.0 added 217 packages in 15.723s

Auf der Workstation des Autors mussten dabei einige Module kompiliert werden, was der Compiler mit Warnungen quittierte – diese sind für das Programmverhalten irrelevant, ignorieren Sie sie einfach. Als Nächstes stellt sich die Frage nach der gewünschten Zielplattform. Zum Zeitpunkt der Drucklegung dieses Magazins ist Johnny Five mit so gut wie allem kompatibel – Abbildung 1 zeigt den entsprechenden Inhalt der Firmenwebseite [1]. Die Links auf der Unterseite erlauben das Filtrieren der angezeigten Prozessrechner nach verschiedenen Betriebsmodi.

hanna_johnnyfive_1.tif_fmt1.jpgAbb. 1: Johnny Five unterstützt eine Vielzahl von Prozessrechnern

Wir wollen in den folgenden Schritten aus Gründen der Bequemlichkeit auf einen Arduino Uno setzen. Die einst von Massimo Banzi entwickelte Platine gewinnt mit Sicherheit keinen Innovationspreis, ist aber universell erhältlich, nicht allzu teuer und demonstriert die Vorgehensweise bei der Arbeit mit Dumb-Terminal-Prozessrechnern anschaulich. Im ersten Schritt müssen Sie – wie immer – dafür sorgen, dass eine Arduino-Programmierumgebung zur Verfügung steht. Besuchen Sie die Webseite der Arduino-Gruppe und laden Sie eine halbwegs aktuelle Version der IDE herunter. Arbeiten Sie die Installationsanweisungen anschließend der Reihe nach ab, als ob Sie den Arduino normal programmieren wollen.

Da unser vorliegender Arduino keine WLAN- oder sonstige Hardware mitbringt, erfolgt die Kommunikation über das universal unbeliebte Firmata-Protokoll. Öffnen Sie die Arduino-IDE und wählen Sie die Vorlage File | Examples | Firmata | StandardFirmata, um den Editor mit dem Firmata-Programm zu laden. Klicken Sie danach auf das bekannte Deployment-Symbol in der Toolbar, um den Arduino zu einem Empfänger von Firmata-Befehlen umzufunktionieren. Firmata ist ein von MIDI abgeleitetes Protokoll zur Steuerung von Prozessrechnern. Die auf GitHub im Detail beschriebene Kommunikationsumgebung [2] erlaubt einem Host, auf einem Zielsystem beispielsweise GPIO-Pins ein- und auszuschalten und sonstige Hardwaresteuerungsoperationen vorzunehmen. Trennen Sie den Arduino vom PC und schließen Sie die Arduino-IDE, um die Umwandlung vom Arduino-Bootloader-Betrieb in einen gewöhnlichen Firmata-Rezipienten abzuschließen. Erzeugen Sie eine neue Datei namens Index.js und laden Sie im ersten Schritt die Johnny-Five-Bibliothek:

var five = require("johnny-five"); var board = new five.Board();

Der verwendete Code unterscheidet sich von Arduino zu Arduino minimal – bei der Arbeit mit dem als Standard geltenden Arduino Uno ist die aus der Arduino IDE geladene Version jedenfalls korrekt. Im nächsten Schritt müssen wir für die eigentliche Abarbeitung der Blink-Funktion sorgen. Da die Initialisierung des Boards etwas Zeit in Anspruch nimmt, nutzen wir die on-Funktion des Objekts zum Einschreiben eines Event Handlers, der beim Auftreten des ready-Ereignisses aktiviert wird.

board.on("ready", function() { var led = new five.Led(13); led.blink(500); });

Nach dem Eintreffen des Events rufen wir new five.led auf, um eine neue Instanz der LED-Klasse zu beschaffen. Der Aufruf von Blink sorgt für kontinuierliches Blinken. Im Interesse der Vollständigkeit zeige ich hier auch, wie man Johnny-Files für den Tessel konfiguriert. Er unterscheidet sich von unserem Arduino durch das Vorhandensein einer vollwertigen Linux Runtime, die das direkte Ausführen der Software auf dem Prozessrechner erlaubt:

var five = require("johnny-five"); var Tessel = require("tessel-io"); var board = new five.Board({ io: new Tessel() });

Nach dem abermals erforderlichen Laden mit require() rufen wir den Konstruktor five.board nun mit einem Parameterobjekt auf, das den Wert von io festlegt. Dieses Feld erlaubt der Runtime das Einsammeln mehr oder weniger beliebiger Treiber, die die Bibliothek zur Interaktion mit der Hardware befähigen.

Auch in der eigentlichen Payload sind kleinere Änderungen erforderlich:

board.on("ready", function() { var led = new five.Led("a1"); led.blink(500); });

Während unser Arduino Uno von Haus aus eine mit dem GPIO-Pin Nummer 13 verdrahtete LED mitbringt, beschreibt das Tessel-Team die einzelnen Pins ihrer Prozessrechner mit alphanumerischen IDs. Der restliche Code verhält sich dann so, wie man es vom Arduino Uno erwarten würden. Ein Aufruf von blink mit dem Parameter 500 sorgt auch hier für ein bequem mit bloßem Auge sichtbares Bl...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang