Bangle.js 2: Smartwatch mit eigenen Apps

Der Smartwatch- sowie der dazugehörende App-Markt ist fest in den Händen von Apple und Co. Die Bangle.js 2 von Gordon Williams will da eine Alternative bieten.

In Pocket speichern vorlesen Druckansicht 102 Kommentare lesen

(Bild: espruino.com)

Lesezeit: 14 Min.
Von
  • Maik Schmidt
Inhaltsverzeichnis

Für Smartwatch-Alternativen außerhalb der Apple- und Android-Welt scheint kaum Platz zu sein. Aber Gordon Williams hat schon 2019 mit seiner Bangle.js versucht, eine preisgünstige Smartwatch anzubieten, die sich besonders einfach programmieren lässt.

Die Hardware-Spezifikationen stehen für Williams überhaupt nicht im Fokus, denn mit Riesen wie Apple oder Samsung kann und will er nicht konkurrieren. Ihm geht es um den Zugang zur Maschine und darum, dass Menschen leistungsstarke Hardware günstig erwerben und möglichst einfach programmieren können. Dazu arbeitet er seit vielen Jahren an einem ganzen Ökosystem aus Hard- und Software und mit der Bangle.js 2 schickt er dessen neuestes Mitglied ins Rennen.

Die Hardware der Bangle.js 2 hat gegenüber dem Vorgängermodell deutliche Verbesserungen erfahren, denn in ihr steckt ein Nordic nRF52840-SoC (System-on-Chip). Der beinhaltet 256 KB RAM und eine ARM Cortex-M4-CPU, die mit 64 MHz taktet. Für Programme stehen insgesamt 9 MB Flash-Speicher zur Verfügung, von denen 1 MB auf dem Chip liegen und 8 MB extern angebunden werden.

Die Bluetooth 5.2-Einheit implementiert sowohl Bluetooth Low Energy (BLE) als auch Bluetooth Mesh. Unterstützt wird das Nordic-SoC von einer Reihe von Komponenten, wie sie größtenteils auch schon in der ersten Version der Bangle.js zu finden waren. Den aktuellen Luftdruck und die Temperatur misst zum Beispiel ein BMP280 von Bosch. Die aktuelle Position berechnet der GPS/Glonass-Empfänger AT6558 und den Puls des Trägers ermittelt ein Vcare VC31.

Die Platine der Bangle.js 2

Schließlich enthält die Bangle.js 2 noch den 3-Achsen-Beschleunigungssensor Kionix KX023 und ein 3-Achsen Magnetometer. Zur Kommunikation mit der Außenwelt dient in erster Linie ein LC-Touch-Display (LPM013M126) mit einer Bildschirm-Diagonale von 1,3" und 176x176 Pixeln und einer Farbtiefe von drei Bit. Eine dimmbare Hintergrundbeleuchtung verhilft auch bei schlechten Lichtverhältnissen zu einem klaren Bild.

Subtilere Ausgaben erzeugen ein Vibrationsmotor und ein Piezo-Pieper. Der 200 mAh-Akku wird per USB aufgeladen und hält im Stand-By für bis zu vier Wochen. Das gilt natürlich nur, wenn Stromfresser wie GPS und der Bildschirm nicht permanent eingeschaltet sind.

Ein besonderes Schmankerl für Hardware-Hacker ist der SWD-Port (Full Serial Wire Debug) auf der Rückseite der Uhr. Damit können Entwicklerinnen und Entwickler Programme auch in anderen Sprachen als JavaScript entwickeln und ohne Zusatzhardware aufs Gerät transferieren.

Rein äußerlich unterscheidet sich die Bangle.js 2 übrigens deutlich von der Bangle.js. Sie ist merklich kleiner (36mm x 43mm x 12mm) und in den Farben Schwarz, Blau und Pink erhältlich. Wasserdicht ist sie weiterhin, aber nur noch für maximal 30 Minuten in einer Tiefe von bis zu einem Meter.

Die Bangle.js 2 ist bis zu einer Tiefe von 30m wasserdicht.

Für die meisten Menschen dürfte sich die Uhr damit besser für den alltäglichen Gebrauch eignen als der Erstling. Die Hardware kann aber mehr als nur schick die Zeit anzeigen und schreit geradezu nach ein paar praktischen Apps.

Die können Anwender mit dem Bangle.js App-Loader installieren.

Der App-Loader spielt neue Apps direkt vom Browser auf die Bangle.js 2.

Die Installation erfolgt drahtlos über den Browser, indem man den Browser zunächst mit dem Connect-Button rechts oben mit der Uhr verbindet. Daraufhin öffnet der Browser einen Dialog, der die Geräte in der Nähe anzeigt. Sobald die Verbindung hergestellt wurde, können Apps über das Upload-Icon auf die Uhr geladen werden.

Momentan ist die Auswahl nicht sonderlich üppig, aber einen Taschenrechner und ein paar Spiele gibt es schon. Ferner gibt es Uhren in verschiedenen Designs und Lokalisierungsinformationen, mit denen man die englischen Menüs zum Beispiel eindeutschen kann.

Teilweise stammen diese Apps von der Bangle.js, denn viele von deren Apps sind kompatibel mit der neuen Hardware. Wer eigene Apps veröffentlichen möchte, kann dies in Form von Merge-Requests auf das Github-Repository des App-Loaders tun. Geld verdienen kann man mit eigenen Anwendungen allerdings nicht.

Das Angebot an Apps ist erwartungsgemäß überschaubar und der Reiz eines Produkts wie der Bangle.js 2 liegt ja auch eher in der einfachen Programmierung. Die ermöglicht im Wesentlichen der JavaScript-Interpreter Espruino.

Gordon Williams hat den Espruino-Interpreter gezielt für Mikrocontroller entwickelt. Er implementiert trotz seiner Genügsamkeit einen überraschend großen Teil des aktuellen JavaScript-Standards und lässt in der Regel nur die Aspekte aus, die auf Mikrocontrollern ohnehin keine große Rolle spielen. Espruino bietet aber unter anderem reguläre Ausdrücke, Promises, Lambda-Funktionen und Template-Literale an.

Die Kompatibilität ist also sehr gut, aber nicht perfekt. Beispielsweise unterstützt der Interpreter Schlüsselwörter wie ´const´ und ´let´, wandelt sie intern aber in ´var´ um, was zu subtilen Missverständnissen führen kann. Plötzlich sind nämlich vermeintliche Konstanten nicht konstant.

In der Praxis ist das weniger schlimm, als es klingt, weil die Programme auf Mikrocontrollern laufen und naturgemäß eher klein und wenig komplex sind. Trotzdem ist es wichtig, sich mit den Unterschieden vertraut zu machen und im Zweifelsfall auf top-aktuelle Features lieber zu verzichten.

Der Grund für die meisten Abweichungen vom Standard liegt schlichtweg in der Performanz. Espruino begnügt sich mit erstaunlich wenigen Ressourcen und läuft selbst auf sehr kleinen Plattformen flott und stabil. Von den 256 KB RAM der Bangle.js 2 können JavaScript-Programme beispielsweise ganze 200 KB frei nutzen.

Dass mit Espruino ein mächtiger JavaScript-Interpreter für Mikrocontroller existiert, ist an sich schon eine feine Sache. Zum Ökosystem gehört aber mehr als die reine Programmiersprache, und hier können Espruino und die Bangle.js 2 durchaus glänzen.

Zunächst einmal gibt es mit der Espruino-IDE eine kleine, aber feine Entwicklungsumgebung, die in den Web-Browsern Chrome, Edge und Opera funktioniert. Mit ihr lassen sich schnell JavaScript-Programme erstellen und drahtlos auf Espruino-kompatible Geräte übertragen. Sogar das Debugging funktioniert via Bluetooth.

Mit der Espruino-IDE kann man Programme auch grafisch entwerfen.

Für eine jüngere Zielgruppe bietet die IDE nicht nur eine textuelle sondern auch eine graphische Darstellung von Programmen an. Auf diese Weise können angehende Hardware-Experten ihre ersten Programme mit der Maus zusammenklicken.

Erfahrene Entwickler werden schnell auf Kommandozeilen-Werkzeuge zurückgreifen, die mithilfe von Node.js implementiert wurden und eine einfache Automatisierung von Build-Prozessen ermöglichen.

Ein weiteres Sahnehäubchen ist die API (Application Programming Interface). Sie ist in modernem JavaScript verfasst, gut dokumentiert und bietet einen denkbar einfachen Zugriff auf die gesamte Hardware. Jeder Sensor und jeder Aktor wird durch eigene Klassen oder zumindest einen Satz einfacher Funktionen repräsentiert.

Darauf aufbauend existieren weitere Bibliotheken, wie zum Beispiel eine Grafik-Bibliothek, die neben grundlegenden Grafik-Primitiven auch Vektor-Zeichensätze und Funktionen zur Manipulation von Bitmaps bereitstellt.

Für fortgeschrittene Programmiertechniken, wie zum Beispiel die Erkennung von Gesten, eignet sich Tensorflow Lite for Microcontrollers. Damit kann die Bangle.js-2-Machine-Learning-Modelle, die auf einem PC oder Mac erstellt wurden, in Anwendungen verwenden.

Ausgezeichnete Unterstützung bietet die Plattform auch für verschiedene Spielarten von Bluetooth, wie zum Beispiel das Bluetooth 5 Advertising und den Central- beziehungsweise Peripheral-Modus. Damit kann die Uhr in BLE-Anwendungen sowohl als Server als auch als Client dienen.

Zu guter Letzt kann das Gerät als drahtloses VT100-Terminal fungieren und wenn es unbedingt sein muss, kann der JavaScript-Code auch mit C- und ARM-Assembler-Routinen aufgepeppt werden.

Die Programmierung der Uhr ist sehr einfach und bedarf keinerlei Zusatzhardware, wie zum Beispiel eines Programmiergeräts. Nicht einmal ein Kabel ist notwendig, denn Programme werden drahtlos per Bluetooth ins Gerät gespielt.

Genauer gesagt passiert das mit Web Bluetooth, einer Technologie, die es Web-Applikationen ermöglicht, per Bluetooth mit der Außenwelt zu kommunizieren. Zurzeit unterstützen noch nicht alle Browser diesen Standard, aber Chrome, Edge und Opera haben ihn bereits integriert.

In diesen Browsern funktioniert daher die Espruino-IDE und mit einem Klick auf das gelbe Connect-Icon in der linken oberen Ecke sucht der Browser nach Bluetooth-Geräten in der Umgebung.

Hier hat der Chrome-Browser gleich zwei Bangle.js gefunden.

Sobald die Verbindung hergestellt wurde, können auf der linken Seite der IDE direkt JavaScript-Anweisungen ausgeführt werden. Das ist völlig analog zu den JavaScript-Konsolen gängiger Browser und eine perfekte Umgebung für Experimente.

Die Espruino-IDE ist einfach aber nützlich.

Auf der rechten Seite gibt es einen Editor für umfangreichere Quelltexte, die mit den Icons in der Mitte entweder ins lokale Dateisystem, ins RAM des verbundenen Geräts oder in dessen Dateisystem transferiert werden können.

Dank der hervorragenden Dokumentation des Espruino-Projekts sind erste Experimente ein Kinderspiel. Wer sich mit JavaScript ein wenig auskennt, kann in ein paar Stunden durchaus nützliche Apps erstellen.

Insbesondere ist die Interaktion mit den Sensoren und Aktoren schon beinahe trivial. Vor allen Dingen, weil die API größtenteils auf Ereignissen (Events) basiert und somit alle Messdaten asynchron bereitstellt.

Wer dieses Programmiermodell nicht kennt, wird aber anfangs so seine Schwierigkeiten haben. Beispielsweise liefert die Funktion Bangle.getPressure() nicht wie erwartet den aktuellen Luftdruck zurück. Vielmehr ist ihr Rückgabewert ein Promise-Objekt, wie es heute in der JavaScript-Programmierung häufig verwendet wird. Ein solches Objekt kann entweder einen Wert oder aber einen Fehler enthalten und der Wert wird in der Regel asynchron berechnet.

Das bedeutet, dass die Funktion getPressure immer sofort zurückkehrt, im Hintergrund aber noch einiges an Arbeit erledigt. Um an das Ergebnis zu kommen, muss man das Promise-Objekt noch auswerten und zum Beispiel über die then-Methode definieren, was mit dem Rückgabewert zu tun ist. Bangle.getPressure().then(print) gibt daher den gemessenen Wert aus, sobald er ermittelt wurde. Genauer gesagt gibt diese Anweisung nicht nur den Luftdruck sondern alle Messwerte des BMP280 aus.

So gut wie alle Funktionen basieren auf Ereignissen.

Oft ist es aber gar nicht nötig, sich mit den Details von Promise-Objekten zu beschäftigen, denn die Bangle-Klasse erlaubt die Definition von Event-Handlern mittels der on-Methode. Das ist exakt so, wie in der Programmierung von Web-Anwendungen im Browser. Die folgenden Anweisungen reichen, um den Kompass der Bangle.js 2 zu aktivieren und die aktuellen Messwerte kontinuierlich in der Konsole auszugeben:

Bangle.setCompassPower(true, 'myapp');
Bangle.on('mag', print);

Die erste Anweisung schaltet den Kompass ein, weil er per Voreinstellung ausgeschaltet ist, um Strom zu sparen. Der String 'myapp' steht für den Namen der App, die den Kompass benötigt und auf diese Weise stellt Espruino sicher, dass keine App einer anderen aus Versehen irgendeinen benötigten Sensor abschaltet.

Mit der zweiten Anweisung verknüpft Espruino das Ereignis 'mag' ("Der Magnetometer hat einen neuen Messwert erhalten") mit der Funktion `print` und gibt so jeden Messwert automatisch aus.

Diese kurzen Beispiele demonstrieren schon die wesentlichen Techniken, die bei der Programmierung der Bangle.js 2 zum Einsatz kommen. Zusammen mit der Dokumentation des Projekts dürften auch weniger erfahrene Entwickler – gute Englischkenntnisse vorausgesetzt – schnell erste Erfolgserlebnisse feiern.

Die Hardware ist zwar schon fertig und Tester können mit dem Produkt bereits experimentieren, aber dank eines Emulators kommen alle interessierten Entwickler schon jetzt in den Genuss, Apps für die Bangle.js 2 zu entwickeln.

Der Emulator spielt perfekt mit der Espruino-IDE zusammen und weil er kein Web Bluetooth benötigt, klappt er auch im Firefox-Browser.

Der Emulator funktioniert auch im Firefox-Browser.

Nach einem Klick auf das Connect-Icon fragt die IDE nach dem zu emulierenden Gerät. Momentan stehen lediglich Bangle.js und Bangle.js 2 zur Auswahl. Anschließend öffnet die IDE ein weiteres Fenster, welches das zu emulierende Gerät darstellt.

Es ist zwar nicht das Original, aber für erste Tests besser als nichts.

Ab diesem Zeitpunkt erfolgt die Entwicklung genauso wie mit echter Hardware. Anweisungen in der Konsole auf der linken Seite führt der Emulator sofort aus und darüber hinaus können Quell-Texte sowohl direkt ins RAM als auch ins Dateisystem übertragen werden.

Natürlich ist die Emulation nie völlig kompatibel mit dem Original und die jetzige Version emuliert nur den Touch-Screen, den Button der Uhr und das Datei-System. Damit kann man schon eine ganze Menge machen, aber Bluetooth, GPS oder die anderen Sensoren werden nicht emuliert. Der Aufruf der entsprechenden Funktionen führt zwar nicht zu Fehlern, liefert aber auch keine sinnvollen Ergebnisse.

Wie bei seinen vorherigen Projekten nutzt Gordon Williams auch für die zweite Bangle.js Kickstarter als Finanzierungsplattform.

Die Uhr selbst ist eine SMA Q3, für die Williams eine passende Espruino-Firmware entwickelt hat. Er sammelt also kein Geld für die Entwicklung der Hardware, sondern nur für deren Einkauf, den Austausch der Firmware und für die Weiterentwicklung der Software und des Ökosystems.

Zum jetzigen Zeitpunkt hat die Kampagne schon so viel Geld eingespielt, dass damit fast alle Stretch-Goals realisiert werden können. Unter anderem wird damit eine Android-App realisiert, mit der Bangle.js-Apps die Internet-Verbindung des Smartphones nutzen können. Ferner ist ein JIT-Compiler für Espruino geplant und eine automatische Gesten-Erkennung.

Wegen der weltweiten Chipkrise hat Gordon Williams sich bereits 2500 Uhren gesichert, so dass die ersten Unterstützer bereits Mitte November ihre Uhr erhalten dürften.

Die Bangle.js 2 ist eine konsequente Weiterentwicklung des Vorgängers. Sie ist kompakter, etwas üppiger ausgestattet und besser für den Alltag geeignet. Dank des Espruino-Projekts wird die Programmierung für Menschen mit JavaScript-Kenntnissen zum Vergnügen und so ist die Uhr eine perfekte Spielwiese für Maker.

(hgb)