JavaScript an Arduino: Es werde Licht

Der Pragmatische Architekt  –  1 Kommentare

Im vorherigen Teil der IoT-Serie kam das Shiftregister 74HC595 zur Sprache, mit dessen Hilfe sich viele LEDs steuern lassen, ohne diese direkt am Arduino anschließen zu müssen. Dieses Projekt wird nun modifiziert, um die Schaltung über JavaScript und Node.js fernzusteuern.

Bisher stand hauptsächlich Elektronik im Vordergrund. Für das Internet der Dinge brauchen wir allerdings zusätzlich den Aspekt Kommunikation. Auf der Serverseite ist bekanntlich JavaScript das Mittel der Wahl. Wie aber lässt sich mit JavaScript ein Arduino ansteuern? In diesem Beitrag wollen wir mit einem entsprechenden Programm die am Shiftregister angeschlossenen LEDs steuern. Ausgangsbasis dafür ist die Schaltung der letzten Episode.

Ergänzung der Schaltung

Wir nutzen die Schaltung der vorangegangenen Episode

Um den Arduino vom Computer fernsteuern zu können, verwenden wir ein standardisiertes Protokoll für die serielle Kommunikation. Genau das bietet Firmata, ein Protokoll, das unterschiedliche Boards und unterschiedliche Programmiersprachen unterstützt. Bevor wir Arduino über Firmata ansprechen können, müssen wir das Firmata-Protokoll auf unser Board übertragen. Zum Glück gestaltet sich dies sehr einfach.

  • In der Arduino IDE finden Sie unter dem Menü-Pfad File/Examples/Firmata den Sketch StandardFirmata.
  • Laden Sie den Sketch über die IDE auf Ihr Board.

Installation von Node.js

Als Schnittstelle zwischen Internet und Arduino kommt Node.js zum Einsatz. Bei Node.js handelt es sich um eine skalierbare Laufzeitumgebung für asynchrone, ereignisgetriebene Kommunikation. Da es HTTP unterstützt, kann es als Basis für IoT-Anwendungen dienen. Holen Sie sich die aktuelle Version von Node.js. Es stehen Versionen für Windows, OS X, Linux und weitere Betriebssysteme zur Verfügung. Auch den Quellcode können Sie von dort beziehen, wenn Sie sich das Framework einmal näher ansehen wollen. Installieren Sie das Paket auf ihrem Zielrechner. Damit steht Ihnen ein serverseitiges Framework zur Verfügung.

johnny-five is alive

Wie aber lässt sich die Kommunikation mit dem Arduino über Firmata ergänzen? Das funktioniert mit johnny-five, einem JavaScript-Framework für IoT und Robotik. Unter Node.js ist die Ergänzung durch Johnny-five recht einfach, wenn man den Node Package Manager (npm) nutzt.

Einfach als Kommandozeile

npm install johnny-five

aufrufen, und schon erfolgen Download und Installation.

In der API-Dokumentation von johnny-five finden Sie Informationen zum Ansteuern von Shiftregistern. Auf der Website finden sich auch etliche Dokumente und Beispielprogramme.

Ein simples Lauflicht

In unserem Beispiel soll ein Lauflicht realisiert werden, das jede halbe Sekunde abläuft. Der Ausdruck 1 << i schiebt einfach 1 an die i-te Stelle. Beispiel: 1 << 3 ergibt binär 00001000. Wir schalten damit die LED ein, die sich am Ausgang 3 des Schieberegisters befindet. Mittels 1 << 0, 1 << 1, 1<< 2, 1 << 3, ... erzeugen wir folglich ein Lauflicht.

// Program: j5-lauflicht-demo.js

var five = require("johnny-five"); // Einbinden der Bibliothek
var board = new five.Board(); // Board initialisieren
board.on("ready", function() { // function() => auszuführender Code
var register = new five.ShiftRegister({ // Shiftregister initialisieren
pins: {
data: 11, // Arduino Pin 11 an Data-Pin des Shiftregisters
clock: 12, // Arduino Pin 12 an Takt-Pin des Shiftregisters
latch: 8, // Arduino-Pin 8 an Latch-Pin des Shiftregisters
reset: 9 // wird hier nicht verwendet
}
}); // end ShiftRegister

this.loop(500, function() { // alle 500 msecs wird der Block aufgerufen
for (i = 0; i < 8; i++) register.send(1 << i); // Lauflicht erzeugen
}); // end loop
}); // end board.on

Im Programmcode findet sich unter dem JSON-Typ pins die Konfiguration der Anschlüsse des 74HC595. Das Datenfeld reset verwendet der Code nicht. Dieses ist allerdings nützlich, falls Sie das Register über JavaScript reset-en wollen. Im Programm habe ich einfach angenommen, dass am digitalen Ausgang 9 des Arduino ein Verbindungsdraht zum RESET-Pin des Shiftregisters führt. Wie gesagt, ist diese Verbindung für das vorliegende Programm eigentlich nicht notwendig.

Zum Starten des obigen Programmes rufen Sie auf der Kommandozeile einfach folgendes auf:

node j5-lauflicht-demo.js

Hinweis: Wie oben erwähnt, muss zur erfolgreichen Kommunikation auf dem Arduino-Board der Sketch StandardFirmata geladen sein. Ist dies nicht der Fall, kommt es zu einer Exception bei der JavaScript-Ausführung.

Grenzen

Wie @josefx in den Kommentaren zum letzten Post richtig bemerkt, hat der Anschluss von Schaltungen an ein Microcontroller-System physikalische Grenzen. Ein Arduino-Board kann maximal etwa 200 mA Stromstärke liefern und an einzelnen digitalen Pins 20 mA Verbrauch tolerieren. Daher ist es essenziell, in einer Schaltung darauf zu achten, dass diese Grenzen eingehalten werden. Das Studium der Datenblätter verwendeter Bausteine ist für diesen Zweck wichtig.

Eine LED verbraucht grob 20 mA. Wir liegen wir daher unter den erwähnten Grenzen, falls wir die LEDs direkt am Arduino betreiben. Das Shiftregister verträgt allerdings maximal 70 mA für alle Ausgänge. Im obigen Programm ist das kein Problem, da wir immer nur eine LED leuchten lassen. Für größere Lasten benötigen wir eine separate Versorgung über Batterie oder Netzteil. Diese muss vom Arduino-Schaltkreis getrennt sein. Dazu wird es eine eigene Folge geben.

@MeinPseudonym1234 hat auf einen interessanten Link zu diesem Thema verwiesen.

Vielen Dank an @josefx und @MeinPseudonym1234 für die wertvollen Hinweise.

Zusammenfassung

Damit haben wir den Arduino erfolgreich über JavaScript mit dem Hostrechner verbunden und können mit ihm dank Node.js, johnny-five und StandardFirmata kommunizieren. Mittels serverseitigem JavaScript lässt sich das IoT-Gerät nun auch über Webseiten steuern, etwa mit jQuery Mobile auf einem Smartphone. Ebenfalls ist es mit Node.js möglich, mit wenigen Programmzeilen einen – zugegeben sehr simplen – Webserver auf die Beine zu stellen.

Für die ersten Experimente sind Sie gerüstet. In der gezeigten Schaltung steuern wir Aktoren über digitale Arduino-Ausgänge. Ab dem nächsten Blog-Posting wende ich mich dem Thema Sensoren zu.