© Maisei Raman/Shutterstock.com
JavaScript-Code am ESP32-Board ausführen

Espruino - JavaScript ganz klein


Espruino erlaubt die Steuerung von Hardware per JavaScript. Preiswerte ESP32-Boards bekommen eine kleine Runtime zur Verfügung gestellt und lassen sich danach als MSR-Zentrale für Smarthomes und mehr verwenden.

Das Unternehmen Espressif war vom Erfolg des ESP8266 anfangs selbst überrascht – als die nur auf Chinesisch vorliegende Dokumentation des WLAN-fähigen Mikrocontrollers erstmals ins Englische übersetzt wurde, war das Interesse immens. Mittlerweile lässt sich die Chipfamilie auch in JavaScript programmieren.

Gleich zum Einstieg sei angemerkt, dass wir in den folgenden Schritten mit dem Nachfolger ESP32 arbeiten wollen – er ist insbesondere in Kleinmengen nicht teurer als sein Vorgänger, ist aber schneller und bietet bessere Hardware-Interfaces an.

Aus Sicht eines Entwicklers spricht mehreres für JavaScript: Erstens ist die Sprache objektorientiert und einfach erlernbar. Zweitens gilt, dass die Reduktion von Koppelung immer von Vorteil ist – insbesondere, wenn das Produkt sowieso mit einem Web-Frontend oder Web-Backend arbeitet, lässt sich durch Recyclen des JavaScript-Codes Robustheit gewinnen.

Außer Frage steht, dass mit JavaScript auf dem ESP32 mit Sicherheit keine Echtzeitwettbewerbe gewonnen werden, aber das ist in vielen Situationen auch gar nicht notwendig.

Auf die richtige Strategie kommt es an

Sucht man nach JavaScript für ESP32, so erschlägt einen die Suchmaschine des Vertrauens mit Dutzenden von Ergebnissen. Im Fokus steht einerseits Espruino und andererseits ein (leistungsfähigeres) Produkt namens low.js.

Wir wollen in den folgenden Schritten aus zwei Gründen auf das wegen der Interpretation des JavaScript-Codes langsamere Espruino setzen: Erstens steht es nicht nur am ESP32, sondern auch auf diversen anderen Controllern zur Verfügung. Zweitens gibt es den ESP32 in zwei Varianten – neben dem weit verbreiteten WROOM gibt es auch den von low.js vorausgesetzten WROVER, der mehr Arbeitsspeicher mitbringt und dementsprechend teurer ausfällt.

In der Praxis ist die Situation leider so, dass die bessere Variante kaum auf Evaluationsboards zu finden ist – das Unternehmen des Autors hat aufgrund eines Consultingprojekts eines thailändischen Kunden Dutzende von ESP32-Boards „in Kommission“, keines davon ist mit einem WROVER ausgestattet.

Angemerkt sei, dass Espruino in eingeschränktem Maß auch in Maschinencode vorliegende Routinen unterstützt. Wer eines der vom Espruino-Entwickler entwickelten Boards verwendet, darf seine Funktionen als „zu kompilierend“ markieren – leider steht in diesem Betriebsmodus nur ein extrem eingeschränkter Teil der JavaScript-Syntax zur Verfügung.

Eine Frage der Umgebung

Auch wenn der ESP32 in der Praxis meist mit der Arduino-IDE programmiert wird, sei angemerkt, dass Espressif auch eine narrative Programmierumgebung namens ESP-IDF anbietet. IDF funktioniert am besten unter Linux, weshalb wir die folgenden Experimente unter Ubuntu 18.04 durchführen.

Als Evaluationsboard kommt das unter anderem bei Elektor erhältliche Wemos Lolin OLED [1] zum Einsatz. Es handelt sich dabei um eine sehr interessante Platine, die einen USB-Treiber-IC, einen ESP32 und ein kleines organisches Display kombiniert und für Messaufgaben ideal geeignet ist. Sie können Espruino natürlich auch auf anderen Boards verwenden – achten Sie dabei allerdings darauf, dass die Planare einen USB-zu-UART-Konverter mitbringt, weil das Programmieren des ESP32 sonst in Arbeit ausartet.

Auf Ubuntu ist unsere erste Amtshandlung jedenfalls das Prüfen des „Mount-Punkts“:

tamhan@TAMHAN18:~$ dmesg | grep "tty" . . . [ 272.181221] usb 1-6.5: cp210x converter now attached to ttyUSB0

Das dmesg-Kommando liefert den gesamten Inhalt des Kernel-Logbuchs zurück. Wir leiten die Ausgabe unter Nutzung des Pipe-Symbols in Richtung von grep weiter, um nur jene Zeilen am Bildschirm auszugeben, die den magischen String TTY enthalten. Er steht für TeleTYpe, und beschreibt in der Welt von Linux ein serielles Terminal.

Espruino wendet sich explizit an Entwickler, die nur wenig Embedded-Erfahrung haben. Deshalb stellen sie einen Assistenten zur Verfügung, der die oft komplizierte Installation der nativen Kompilationsumgebung erleichtert. Wundern Sie sich nicht darüber, wenn das per Source zur Konfiguration der Umgebungsvariablen geladene Skript nach Ihrem Superuser-Passwort fragt – das Werkzeug muss einige Komponenten herunterladen und im Betriebssystem verankern:

tamhan@TAMHAN18:~/espjsspace$ git clone https://github.com/espruino/Espruino.git tamhan@TAMHAN18:~/espjsspace$ cd Espruino/ tamhan@TAMHAN18:~/espjsspace/Espruino$ source scripts/provision.sh ESP32 . . . GCC is /home/tamhan/espjsspace/Espruino/xtensa-esp32-elf/bin//xtensa-esp32-elf-gcc

Nach getaner Arbeit können wir einen make-Lauf anweisen, der die Zusammenstellung der ESP32-Firmware bewerkstelligt. Das Herumspielen mit Parallelisierung lohnt sich nicht sonderlich – auf der Workstation des Autors war die Arbeit binnen weniger als einer Minute getan, die Ausgabedatei hörte auf den Namen espruino_2v01.108_esp32.bin:

tamhan@TAMHAN18:~/espjsspace/Espruino$ make clean && BOARD=ESP32 make

Die eigentliche Kommunikation mit angeschlossenen Boards erfolgt über ein als esptool.py bezeichnetes Programmierwerkzeug, das von Seiten Espressifs in Python gehalten ist. Zu seiner Bereitstellung müssen wir folgendes Kommando eingeben:

tamhan@TAMHAN18:~/espjsspace/Espruino$ sudo pip3 install esptool

ESP32-Firmwarepakete bestehen normalerweise nicht nur aus der .bin-Datei, sondern auch aus einer Gruppe zusätzlicher Files mit Konfigurationsinformationen. Im Fall unserer Firmware finden sie sich im Archiv espruino_2v01.108_esp32.tgz, aus dem Sie die Dateien bootloader.bin and partitions_espruino.bin in den Ordner extrahieren, in dem sich die kompilierte .bin-Datei befindet.

Im nächsten Schritt dürfen Sie die gesamte Software auf den ESP32 schicken. Das hier gezeigte Kommando funktioniert mit dem Wemos Lolin OLED des Autors problemlos – wenn Sie ein anderes Board verwenden, müssen Sie mitunter die Baudrate oder die Schreibgeschwindigkeit anpassen (Listing 1).

Listing 1

tamhan@TAMHAN18:~/espjsspace/Espruino$ sudo esptool.py \ > --chip esp32 \ > --port /dev/ttyUSB0 \ > --baud 921600 \ > --after hard_reset write_flash \ > -z \ > --flash_mode dio \ > --flash_freq 40m \ > --flash_size detect \ > 0x1000 bootloader.bin \ > 0x8000 partitions_espruino.bin \ > 0x10000 espruino_2v01.108_esp32.bin

Wichtig ist zudem, im Parameter port den Port anzugeben, die Sie weiter oben aus dmesg ermittelt haben. Ins...

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