Digi-Dot-Booster am Raspberry Pi mit JavaScript ansteuern

Nach Python und Lua hat mich die Neugier gepackt und ich habe mir die Frage gestellt, wie der SPI Bus mit JavaScript gesteuert werden kann. Auch hier war die Voraussetzung, dass es bereits eine passende Bibliothek dafür geben muss. Von JavaScript sollte schon mal jeder im Zusammenhang mit seinem Browser auf dem Rechner gehört haben. JavaScript eignet sich aber nicht nur zum Erstellen hochdynamischer interaktiver Webseiten, sondern auch für den Einsatz im Backend auf der Serverseite und muss sich bei Performance-Messungen nicht hinter den nativen Implementierungen verstecken. Auch für die Hardwaresteuerungen existiert eine Vielzahl an Modulen.

Als Laufzeitumgebung kommt Node.js zum Einsatz. Es hat bereits einen integrierten Paketmanager und erlaubt die Suche und Installation von zusätzlichen Modulen auf einfache Weise. So ergab auch die Suche nach dem passenden Modul für die SPI Steuerung mehrere Treffer. Das Projekt node-rpio verspricht dabei 1000x schneller als seine Alternativen zu sein, weil es kein einfacher Wrapper für die Zugriffe auf die jeweiligen Treiber ist, sondern direkt mit den GPIO Schnittstelle arbeitet. Außerdem kann sie auch GPIO, PWM und i2c. Das klang vielversprechend, also habe ich mir die Bibliothek angeschaut. Dabei kam heraus, dass eben wegen ihrer “Direktheit” die Programme Root Rechten benötigen und die Ansteuerung vom ChipSelect manuell durchgeführt werden muss. Im Normalfall übernimmt das der Linux SPI-Treiber selbst. Ich wollte die Einfachheit des Codes der anderen Beispiele beibehalten und habe mir dann noch pi-spi und node-spi angeschaut, die als Wrapper um /dev/spidev implementiert sind. Beide haben eine ähnliche API, wobei pi-spi asynchron und node-spi blockierend funktioniert. Mit beiden konnte ich den Digi-Dot-Booster steuern, für das Beispiel habe ich mich für node-spi entschieden, weil die write Funktion keine Callback Funktion erwartet.

Installation:

Die Installation unter Raspbian ist etwas umfangreicher als bei Python und Lua. Das hängt damit zusammen, dass die Debian Pakete teilweise veraltet sind und es später zu Problemen bei der Installation der SPI Bibliothek kommt.

sudo apt-get update
sudo apt-get install nodejs npm nodejs-legacy
sudo npm -g install npm

Nachdem Node.js und sein Paketmanager installiert sind, wird über npm als Erstes npm selbst auf den aktuellen Stand gebracht. Das Paket nodejs-legacy in der Liste oben erstellt einen symbolischen Link für nodejs, damit es per node aufgerufen werden kann. Ohne den Link hatte ich Fehler bei der Installation von Node.js Modulen.

Mit dem Paketmanager werden nun die Bibliothek node-spi zur SPI Ansteuerung und das sleep Modul für das blockierende Warten mittels sleep und usleep installiert. node-spi wird in der Version 0.1.2 installiert, da das installierte Node.js aus dem Raspbian Repository in der Version 0.10.29 vorliegt,  node-spi in der aktuellen Version jedoch erst ab 0.12.x funktioniert. Die Module werden bewusst lokal und nicht global installiert – da gab es im Laufe der Tests auch etliche Probleme.

npm install spi@0.1.2
npm install sleep

Nachdem die Vorbereitungen nun endlich abgeschlossen sind, kommt der Spaß am Programmieren – der obligatorische Regenbogen…

 

Fazit: Als ich mit Lua nach den Erfahrungen mit Python bereits innerhalb weniger Stunden ein Erfolgserlebnis hatte, hatte ich bei JavaScript keine größeren Probleme erwartet. Es hat sich jedoch gezeigt, dass allein die Einrichtung von Node.js unter Raspbian viele Stunden kosten kann. Die Suche und Tests der geeigneten SPI Bibliothek hat ebenfalls einige Zeit in Anspruch genommen. Der Code selbst hat mir dagegen keine großen Probleme bereitet.

Schreibe einen Kommentar