© Angel_AMX/Shutterstock.com
Hardwarezugriff am Raspberry Pi

Schalten und walten mit dem Bastel-PC


Der Tessel brachte Entwickler erstmals auf den Gedanken, dass man nicht echtzeitkritische Embedded-Systeme auch mit Programmiersprachen abseits von C entwickeln kann. Die hauseigene JavaScript Runtime und die Hardware haben in der Praxis allerdings keine wirkliche Massenmarktpenetration erreicht: Der Standardprozessrechner bleibt der Raspberry Pi. Der Artikel nutzt einen Raspberry Pi 3 B, um Möglichkeiten zum Zugriff auf reale Hardware zu evaluieren und einen Überblick über die Möglichkeiten zu schaffen.

Wer mit einer Webapplikation arbeitet, hat mitunter das Bedürfnis, diverse Güter der realen Welt zu steuern. Neben dem klassischen Beispiel des Ein- und Ausschaltens von Lampen über Relais oder Schaltelemente gäbe es beispielsweise auch Systeme, die Sensorinformationen – Stichwort: Temperatur – bereitstellen und auf eine grafische Art und Weise zur Verfügung stellen. Beim Entwerfen derartiger Solutions kann es vernünftig sein, auf Webtechnologien zu setzen. Ein in JavaScript gehaltenes Produkt ist vom Handling her wesentlich bequemer als ein klassischer C++-Monolith – insbesondere dann, wenn man als Entwickler bisher wenig Erfahrung mit C++ und Co. gesammelt hat.

Welches Betriebssystem?

In den folgenden Schritten wollen wir beim Betriebssystem auf eine klassische Version von Raspbian setzen. Laden Sie das Produkt wie gewohnt herunter und installieren Sie es auf Ihren Prozessrechner. Es ist empfehlenswert, einen Ethernetanschluss bereitzustellen, um benötigte Komponenten schnell herunterzuladen. Als Zielhardware soll in den folgenden Schritten ein Raspberry Pi 3B dienen – ältere und neuere Rechner sollten sich im Großen und Ganzen ohne Probleme verwenden lassen, bei nativen Codeinseln ist mitunter eine kleine Anpassung der Registeradressen und Co. erforderlich. Wie dem auch sei, Sie müssen sich im ersten Schritt für eine Arbeitsumgebung entscheiden. Unser erster Versuch soll Node.js betreffen.

Ärgerlich ist, dass die Raspberry Pi Foundation in Raspbian nur eine sehr veraltete Version von Node. js bereitstellt: Zum Zeitpunkt der Drucklegung war es Version 4.8.irgendwas. Zur Umgehung des Problems bietet es sich an, den Prozessrechner als stinknormale Workstation zu betrachten und wie gewohnt mit folgenden Kommandos aufzurüsten:

pi@raspberrypi:~ $ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - ## Installing the NodeSource Node.js v8.x LTS Carbon repo... . . . pi@raspberrypi:~ $ sudo apt-get install -y nodejs

Node.js liegt seit längerer Zeit nicht mehr nur als x86- bzw. x64-, sondern auch als ARM-Binärpaket vor. So ist sichergestellt, dass wir eine vergleichsweise aktuelle Version verwenden.

Wie steuern?

Wer Google nach Möglichkeiten des Zugriffs auf die GPIO-Pins des Raspberry Pi unter Node.js befragt, findet eine riesige Menge von Optionen. Erfreulicherweise hat sich onoff mittlerweile als Quasistandard herauskristallisiert, weshalb wir es in den folgenden Schritten verwenden wollen (Kasten: „Was passiert im Hintergrund?“). Nach dem gewöhnlichen Anlegen eines neuen Node.js-Projekts unter Nutzung des Node Package Managers müssen Sie im nächsten Schritt onoff installieren. Dies erfolgt bei bestehender Internetverbindung idealerweise unter Nutzung von npm init: pi@raspberrypi:~/rpispace/onoff1 $ npm install onoff.

Was passiert im Hintergrund?

Auch unter Linux gibt es mehrere Arten, mit den GPIO-Pins des Prozessrechners zu interagieren. onoff nutzt hierbei ein als sysfs bezeichnetes Teil des Dateisystems, in dem die einzelnen Pins als Dateien abgebildet werden. Der Zugriff auf sysfs ist einerseits zwar sehr stabil, verhindert andererseits aber die Konfiguration von Pull-ups und ist von der Performance her nicht unbedingt die beste Lösung.

Im nächsten Schritt können wir uns der Realisierung eines primitiven Beispielprogramms zuwenden: Als Klassiker bietet sich hierbei das Ausgeben einer Rechteckwelle an, deren Frequenz und Frequenzstabilität sodann mit diversen rüstungselektronischen Messgeräten näher analysiert werden können. Öffnen Sie deshalb die JavaScript-Datei unseres Node-Projekts, und beginnen Sie mit der Codeanpassung, wie in Listing 1 dargestellt.

Listing 1

const Gpio = require('onoff').Gpio; const led = new Gpio(17, 'out'); while(1==1) { led.writeSync(1); led.writeSync(0); led.writeSync(1); led.writeSync(0); led.writeSync(1); led.writeSync(0); }

onoff bietet sowohl ein synchrones als auch ein asynchrones API an: Für einen ersten Versuch wollen wir auf die synchrone Methode zurückgreifen. Von besonderem Interesse ist hier fürs Erste eigentlich nur, welche Zahl die an new Gpio() übergebenen Parameter beschreiben. onoff setzt auf die Broadcomm-Pins: Der hier verwendete Pin Numero 17 würde beispielsweise dem elften physikalischen Pin entsprechen. Als nächsten Test können Sie einen Oszillografen und einen Modulationsdomänenanalysator an den Prozessrechner anschließen, um mehr Informationen über Signalqualität und Co. zu erhalten.

Eine Messung mit dem Oszilloskop zeigt sich an dieser Stelle als wenig wertvoll. Zwischen den einzelnen Durchläufen der Schleife ist so viel Varianz, dass es nur schwer möglich ist, festzustellen, welche der Wellenformen nun für einen bestimmten Teil der Schleife verantwortlich sind. Wesentlich vernünftiger ist in diesem Zusammenhang die Nutzung des MDAs, der das in Abbildung 1 gezeigte Bild liefert.

hanna_raspberry_pi_1.tif_fmt1.jpgAbb. 1: In der Modulationsdomäne sieht man klarer

Die erreichte Hauptleistung im Bereich von 160 kHz mag im Vergleich zu nativem Code gering erscheinen, dürfte in der Praxis aber für viele Mess-, Steuer- und Regelaufgaben problemlos ausreichen. Kritisch ist in diesem Zusammenhang nur die unten links hervorgehobene Verletzung – manche Durchläufe der Runtime nehmen wesentlich mehr Zeit in Anspruch. Dies kann insofern problematisch sein, als in einer derartigen Totzeit – zwar nur selten, aber doch – ein wichtiges und zu überwachendes Ereigni...

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