Die Erfolgsstory von JavaScript geht seit geraumer Zeit weiter über den Browser hinaus- JavaScript auf dem Server ist längst nichts mehr neues, mobile Endgeräte wurden über HTML5 zur Plattform für JavaScript. Und auch die Spielzeug-Welt ist nicht vor JavaScript sicher, QuadroCopter lassen sich bequem mit JavaScript steuern (Stichwort NodeCopter). Doch was ist mit dem Rest der elektronischen Welt? Dieser Artikel zeigt, dass man auch mit JavaScript ein Arduino-Bord steuern kann.
Was wird alles benötigt um mit JavaScript ein Mikrocontroller-Board zu steuern? Nun, die Kernkomponten sind an einer Hand abzuzählen. Da wären zum einen einmal ein Arduino-Board, in meinem Fall das Arduino Uno R2 (aktuell gibt es das dritte Release (R3) des Boards zu kaufen), ein USB-Kabel sowie einen Rechner mit installiertem node.js. Mehr wird für den Anfang nicht benötigt.
Hardware
Das Arduino Uno R3 ist einfaches I/O-Board mit einem Mikrocontroller und 14 analogen und digitalen Ein- und Ausgängen. Von den vorhandenen digitalen Ein- / Ausgänge können 6 davon als PWM Kanäle genutzt werden, 6 weitere als analoge Eingänge. Des weiteren verfügt das Board über eine USB-Schnittstelle, einen 6 poligen ISP Anschluss und einen Reset Taster. Es enthält alles nötige zum Start, man kann es einfach mit einem USB Kabel mit dem Rechner verbinden oder über ein Netzteil/ Akku/ 9V Blockbatterie betreiben, zum Betrieb reichen 7-12 Volt.
Software
Ein Programm für das Arduino-Board, im Arduino Sprachgebrauch Sketch genannt, kann mittels der eigenen Entwicklungsumgebung erstellt, verifiziert und auf das Board übertragen werden. Die IDE steht über die Webseite zum Download bereit. Dabei handelt es sich um eine plattformunabhängige Java-Anwendung. Obwohl die Programmierung des Arduino-Boards mit JavaScript erfolgen soll, wird die IDE benötigt um ein bereits vorgefertigtes Sketch auf das Board zu laden, denn die Kommunikation mit IDE funktioniert über das Firmata Protokoll. Dazu muss auf dem Board das Sketch StandardFirmata Version 2.2 hochgeladen werden, welches bereits als Beispiel-Sketch vorhanden ist und auch genutzt werden kann.
File > Examples > Firmata > StandardFirmata (anschl. Upload starten)
An dieser Stelle sei angemerkt, dass die aktuelle Version der IDE das Sketch StandardFirmata in der Version 2.3 mitliefert. Diese Version kann nicht verwendet werden, es kommt zu unschönen Fehlermeldungen. Ich habe für diesen Artikel die IDE in der Version 0023 verwendet um diesen Problemen aus dem Weg zu gehen. Nachdem der Upload erfolgreich war, kann die IDE wieder geschlossen werden.
Nummer 5 lebt! Installation von johnny-five
Nachdem die Vorbereitungen nun endgültig abschlossen sind, kommen wir endlich zum eigentlichen Gegenstand dieses Artikels, der JavaScript Library johnny-five. Der Quellcode für die Library wird auf Github gehostet und die Installation des npm-Packages geht erfreulich einfach von der Hand:
git clone git://github.com/rwldrn/johnny-five.git && cd johnny-five
npm install johnny-five -g
Die Installation umfasst die notwendigen Pakete firmata, welches einer Implementierung des gleichnahmigen I/O Protokolls in JavaScript entspricht, das Paket serialport zum Senden der Daten an das Arduino Board sowie einige mehr.
Um nun im einfachsten Anwendungsfall eine Leuchtdiode (LED) via JavaScript zum blinken zu bringen, werden nur wenige Zeilen Code benötigt:
var five = require("../johnny-five.js"); // Abhängig vom Speicherort der Datei
var board = new five.Board();
var redLed;
board.on("ready", function() {
redLed = new five.Led(13);
redLed.strobe(200);
});
In Zeile vier wird abgewartet, bis das Board seine Bereitschaft singalisiert, erst ab diesem Zeitpunkt ist der Zugriff auf die Pins möglich. Und genau dieser Zugriff erfolgt eine Zeile darunter. Als Übergabewert erwartet das LED Objekt den zu schaltenden Pin, der damit als Output definiert wird. Dem Aufruf von strobe() kann die Zeit der Ein- bzw. Ausphasen mitgegeben werden, dieser Parameter ist aber optional. Bereits hier zeigt sich die große Stärke der johnny-five Library, viele Komponenten die sich über das Arduino-Board ansteuern lassen wurden zu logischen Einheiten zusammengefasst und mit charakteristischen Funktionen verknüpft, z.B. Led und die Funktion strobe(). Nun sollte noch eine LED an die Pins 13 und GND (für Groud- also der Minuspol) angeschlossen werden. An dieser Stelle sei wieder Vorsicht geboten, die älteren Arduino-Boards (kleiner Arduino Uno R3) haben in Pin 13 einen integrierten Vorwiderstand, für das aktuelle Release muss extra einen Vorwiderstand in die Schaltung integriert werden.
Ausführen des Codes
Nun wird es spannend! Der geschriebene Code muss nun irgendwie auf das Arduino-Board gelangen. Um diese Anweisungen auszuführen, genügt es, die eben gezeigten sieben Zeilen in einer Datei zu speichern, in meinem Fall example.js, und diese dann Node.js beim Aufruf als Parameter zu übergeben:
node example.js
So sieht das Ergebnis aus. Die Verbindung wird hergestellt und die Daten werden über Serialport im Format des Firmata-Protokolls übertragen:
Die LED blinkt!
Farbwechsel einer RGB-LED per Taster
In meinem Arduino Starter-Kit befindet sich neben einem kleinen Steckboard auch eine RGB-LED sowie ein Taster und Verbindungsdrähte. Ich möchte nun zeigen, wie einfach es ist die Grundfarben dieser RGB-LED per Taster durchzuschalten.
Neben dem bereits bekannten LED Objekt nutzte ich nun ein weiteres Objekt aus der johnny-five Library, den Button. Auch hier wird bei der Initalisierung ein Pin (Nr.8) angegeben, in diesem Fall ist das der Pin vom Taster kommenend, also der Steuerimpuls bzw. die Steuerspannung. Im Anschluss daran wird auf das „down“-Event reagiert, in meinem Fall stelle ich zum einem sicher, dass die LED auch gewiss aus ist und anschließend schalte ich die LED wieder durch- mehr wird nicht gemacht. Der Aufbau der Schaltung sieht so aus:
Die von mir verwendete RGB-LED benötigt pro „Fuß“ einen Vorwiderstand sowie einen Anschluss an Ground, der Taster benötigt noch zusätzlich einen Vorwiderstand. Das Ergebnis habe ich in diesem Video festgehalten:
Fazit
Ist der ganze Aufbau der Kommunikation einmal eingerichtet, macht es richtig Spaß mit der johnny-five Libray zu experimentieren. Nach anfänglicher Spielerei kommt man schnell auf den Genuss und sucht nach Anwendungsfällen um noch mehr de bereitsgestellten APIs zu nutzen. Auf der anderen Seite muss man sich im klaren sein, dass nicht nur Kenntnisse in JavaScript notwendig sind, sondern auch Grundkenntnisse in der Elektrotechnik (z.B. zur Berechnung von Vorwiderständen).
Links:
- https://github.com/rwldrn/johnny-five
- Bestimmen von Widerständen
- Getting startet with Arduino
- Robotic JavaScript Talk JSConf2010
Lesenswert: Nummer 5 lebt! Oder wie mein Arduino Board mit JavaScript gesteuert werden kann http://t.co/5dAPTrwx
Nummer 5 lebt! Oder wie mein Arduino Board mit JavaScript gesteuert werden kann | Mayflower Blog: http://t.co/Z7Vv6qvG
Interessant, damit hätte sich unser kleines Büroprojekt – eine kleine RGB-LED Matrix, deren Farbe man mit einem kleinen Webservice online steuern kann – sicherlich schneller umsetzen lassen. Besten Dank für den interessanten Beitrag.
Übrigens, wenn es interessiert, wir haben der Service kann (mit Videostream :-) unter http://lamp.ventoo.ch/ angeschaut werden. Ein Arbeitskollege hat die Umsetzung dazu in einem kurzen Blog-Beitrag festgehalten: http://www.ventoo.ch/arduino-fun/ .