JavaScript und das Internet of Things, Teil 2: BeagleBone Black und Arduino

Sprachen  –  1 Kommentare

Neben Espruino und Tessel gibt es noch weitere Plattformen, die JavaScript-Entwicklern den Einstieg in die hardwarenahe Programmierung erleichtern.

Nachdem die beiden schon im ersten Teil der Artikelreihe beleuchtet wurden, stehen diesmal der BeagleBone Black und der Arduino im Zentrum des Interesses. Denn auch den mittlerweile zum Klassiker avancierten Einplatinencomputer kann man dank Firmata-Protokoll und der Johnny-Five-Bibliothek mit JavaScript bedienen.

Der BeagleBone Black ist ein Singleboard-Mikrocomputer ähnlich dem Raspberry Pi und spielt demnach in einer anderen Liga als die Espruino- oder Tessel-Mikrocontroller. Er verfügt über einen ARM-Cortex-A8-Prozessor mit einem GHz aus der AM335x-Serie , USB-, HDMI- und Ethernet-Anschlüsse, vier LEDs und kommt mit 2GByte Flash-Speicher und 512MByte Arbeitsspeicher daher. Über verschiedene Erweiterungsplatinen (sogenannte Capes) lässt sich ein BeagleBone Black um zusätzliche Funktionen und Komponenten erweitern. Darunter fallen etwa LCD-Displays, eine Motorsteuerung, Breadboards für das Experimentieren mit Schaltungen und vieles mehr. Eine Capes-Übersicht ist auf der Embedded-Linux-Website zu finden.

Der BeagleBone Black ist ein vollwertiger Mikrocomputer (Abb. 1).


Prinzipiell lässt sich der BeagleBone Black auch mit anderen Sprachen wie C, Python, Java etc. programmieren, schließlich handelt es sich bei dem standardmäßig installiertem Betriebssystem um ein vollwertiges Linux (Debian). Zudem lassen sich andere Betriebssysteme (unter anderem Android) installieren. Einer Node.js-Laufzeitumgebung sei Dank kann das Board JavaScript direkt ausführen. Dazu lässt sich entweder der Befehl node auf Kommandozeile oder die Cloud9-IDE verwenden.

Die Installation und Konfiguration des BeagleBone Blacks ist relativ einfach: Nach dem Anschließen des Mikrocomputers an den PC oder Mac per USB und die anschließende Treiberinstallation gelangt man im Browser per http://192.168.7.2/ auf die Weboberfläche des BeagleBones und unter http://192.168.7.2:3000/ auf eine Installation der Cloud9-IDE (Abbildung 2).

Die Cloud9-IDE ist für die Entwicklung mit dem BeagleBone Black empfohlen (Abb. 2).


Für die Programmierung des Boards steht die vorinstallierte BoneScript-Bibliothek zur Verfügung, die sich über den Befehl require('bonescript') wie für Node.js-Module gewohnt in das jeweilige Programm einbinden lässt. Sie vereinfacht den Zugriff auf die Hardware-Komponenten des BeagleBone Black. Im Folgenden ist etwa zu sehen, wie man mit BoneScript auf die einzelnen LEDs zugreifen kann.

var b = require('bonescript');
b.pinMode('USR0', b.OUTPUT); // LED 0 auf Output-Modus
b.pinMode('USR1', b.OUTPUT); // LED 1 auf Output-Modus
b.pinMode('USR2', b.OUTPUT); // LED 2 auf Output-Modus
b.pinMode('USR3', b.OUTPUT); // LED 3 auf Output-Modus
b.digitalWrite('USR0', b.HIGH); // LED 0 anschalten
b.digitalWrite('USR1', b.HIGH); // LED 1 anschalten
b.digitalWrite('USR2', b.HIGH); // LED 2 anschalten
b.digitalWrite('USR3', b.HIGH); // LED 3 anschalten

Der Aufruf von pinMode() ist an der Stelle ratsam, um die entsprechenden LED-Pins (USR0, USR1, USR2 und USR3) explizit als Ausgänge zu definieren.

Die Methode digitalWrite() dient dem Schreiben eines Werts an den jeweils übergebenen Pin wie beim entsprechenden Code-Beispiel für den Espruino. Im Listing werden hierüber einfach alle vier LEDs auf den Wert 1 gesetzt, sprich angeschaltet.

Der folgende Codeauszug dagegen zeigt den Code für das An- und Ausschalten einer LED per angeschlossenem Drucktaster (Details zur Verkabelung für das Beispiel finden sich auf der BeagleBoard-Support-Website).

var b = require('bonescript');
b.pinMode('P8_19', b.INPUT);
b.pinMode('P8_13', b.OUTPUT);
setInterval(check, 100);
function check(){
b.digitalRead('P8_19', checkButton);
}
function checkButton(x) {
if(x.value == 1){
b.digitalWrite('P8_13', b.HIGH);
}
else{
b.digitalWrite('P8_13', b.LOW);
}
}

Der Pin mit der Nummer P8_19 (an dem der Drucktaster angeschlossen ist) wird hierbei als Eingang definiert, der Pin P8_13 (an dem die LED angeschlossen ist) als Ausgang. Über setInterval() ist im Beispiel definiert, dass die Funktion check() alle 100 Millisekunden aufzurufen ist. Sie liest per digitalRead() den Wert des Pins mit angeschlossenem Drucktaster aus beziehungsweise gibt den Wert an die Callback-Funktion checkButton() weiter. Innerhalb letzterer wird anschließend anhand des gemessenen Werts (1 für "Drucktaster gedrückt" und 0 für "Drucktaster nicht gedrückt") die LED über digitalWrite() an- oder ausgeschaltet.