Arduino mit PHP und Javascript programmieren
Seit geraumer Zeit besitze ich ein Arduino UNO, habe damit aber noch nicht viel mehr gemacht als ein paar LEDs zum Blinken zu bringen oder einen Servomotor anzusteuern. Vielleicht sollte ich mir endlich ein Ethernet-Shield dazukaufen, denn so völlig offline kann ich gar nicht mehr denken, weswegen mir da teilweise die Ideen fehlen O_o Außerdem werden die Arduino-Boards üblicherweise in einem vereinfachten C-Dialekt programmiert, der zwar einfach zu erlernen ist, aber auch nur bedingt Spaß macht (vor allem mit der offiziellen IDE) Zum Glück gibt es aber, wie bei Open Source-Projekten nicht ungewöhnlich, schöne Alternativen.
Firmata
Firmata ist ein Programm, welches - einmal auf das Arduino-Board übertragen - die Kommunikation mit Software auf einem anderen Computer ermöglicht. Firmata definiert gleichzeitig also auch das Protokoll, über welches mit dem Arduino (in beide Richtungen) kommuniziert werden kann. Wenn ich das richtig sehe, wurde Firmata zunächst für den Einsatz mit Processing entwickelt. Mittlerweile gibt es aber eine ganze Reihe von Client-Bibliotheken für verschiedene Sprachen.
Das Arduino-Board kann also von einem Host, auf dem die Software läuft, angesteuert werden; es können aber auch Sensoren oder z.B. ein Potentiometer ausgelesen werden. Für mich persönlich ergibt diese Kommunikation mehr Sinn als das pure Aufspielen eines Sketches, der dann auf dem Arduino-Board autonom vor sich hinläuft.
Javascript
Ein Javascript-Framework für Firmata ist Johnny-Five. Johnny-Five wird als node.js-Modul installiert: npm install johnny-five
und ermöglicht es, in nur wenigen Zeilen eine blinkende LED an PIN 13 zu erzeugen. Das ist maximal cool, wie ich finde. Wer sich schon ein wenig mit node.js beschäftigt hat, kann ohne Probleme loslegen und mit dem Arduino „sprechen“.
board = new five.Board();
board.on("ready", function() {
(new five.Led(13)).strobe();
});
Einen weiteren Ansatz, Firmata mittels Javascript anzusprechen, liefert Breakout. Kommt auf meine Todo-Liste.
PHP
Für PHP gab es bis vor kurzem meines Wissens nach keine einfache Möglichkeit, das Firmata-API anzusprechen. Thomas Weinert hat sich nun aber mit Carica Io dessen angenommen und vor kurzem dieses Video gepostet. Nachdem mein Arduino sowieso schon wegen meiner Johnny-Five-Experimente auf dem Tisch lag, musste ich das natürlich auch sofort ausprobieren, klar. Das Beispielskript, das Thomas mitliefert, ist nicht ganz so kurz wie das von Johnny-Five, daher habe ich die Datei led.php hier nur verlinkt.
Allerdings befindet sich Carica Io noch mitten in der Entwicklung, so dass alles hier Beschriebene mit Vorsicht zu genießen („It's a learning project not a product. Use it at your own risk.“) und möglicherweise aufgrund von Weiterentwicklungen bald kaum noch nachzuvollziehen sein wird. Dennoch in aller Kürze hier meine Erfahrung. Ich musste zwei kleine Änderungen vornehmen. Zum einen wollte ich SerialPort
statt Tcp
nutzen:
10 new Io\Stream\SerialPort(3)
11 //new Io\Stream\Tcp('127.0.0.1', 5333)
12 );
Zum anderen musste ich die Klasse \Carica\Io\Stream\SerialPort
anpassen, da mein Arduino an /dev/ttyACM0
hängt (folglich ist der oben angegebene Port in Z. 10 auch erst mal egal):
52 //$device = '/dev/ttyS'.((int)$this->_number);
53 $device = '/dev/ttyACM0';
54 $prepare = sprintf('stty -F %s', $device);
Danach reichte aber der Aufruf php led.php
, damit … ach, seht selbst:
Der Code von Carica Io ist auch deswegen besonders interessant, weil wir es hier mit einem Event-Loop in PHP zu tun haben, weil Entwurfsmuster wie Promises und Deferred Objects angewendet werden, die bislang in PHP kaum anzutreffen waren. Wer sich dafür interessiert, sollte auch einen Blick auf ReactPHP werfen. Wirklich spannend!
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt
powtac am :
Coole Sache, dass mir PHP muss ich mal antesten.
Matthias Gutjahr am :
Mach das, dank Firmata ist es wirklich einfach. Wirklich tief eingestiegen bin ich noch nicht, aber das Interesse an meinem Arduino wurde dadurch wieder geweckt.
powtac am :
Hab' ein Mini-Projekt https://github.com/powtac/Autarc_LAN_User_Stats für User Statistiken gestartet. Für Co-Working Spaces u.ä.: Soll via (W)LAN Pings die Frage beantworten "Wer ist gerade dort?".
Mit Ethernetshield und Arduino, soll einfacheres Setup als z.B. https://status.raumzeitlabor.de/ bieten...