Seit dem Erscheinen im Jahre 1991 hat die Programmiersprache Python viel Akzeptanz erfahren. Heute ist sie das bevorzugte Werkzeug vieler Programmierer. Auch wenn sie ursprünglich für PC-Applikationen konzipiert war, wurde Python doch noch auf Embedded-Systeme portiert. uPy bzw. MicroPython ist ein Subset von Python für Plattformen wie BBC micro:bit und ESP8266 sowie für das pyboard, dem offiziellen uPy-Demo-Board.

Das Projekt „Micro Python“ – damals noch in zwei Worten geschrieben – tauchte zusammen mit dem pyboard Ende 2013 auf Kickstarter auf, wo es mehr als sechsfach gegenüber dem Ziel von 15.000 £ überzeichnet wurde. Dieser Erfolg brachte das Entwickler-Team dazu, eine Unterstützung für das WLAN-Modul CC3000, das Ethernet-Modul WIZ820io und das Low-power-Funk-Modul NRF24L01+ einzubauen. Fast vier Jahre später wird es jetzt Zeit zu schauen, wie sich das weiterentwickelt hat. Zeit für Experimente mit dem pyboard und uPy...

pyboard: getting started
Ausgepackt hat man ein pyboard v1.1 (PYBv1.1, wirklich schön verpackt!), ein microUSB-Kabel vor sich. Jetzt noch ein Computer als Zutat (bei mir ein Laptop unter Windows 10). Beim Anschluss des Boards an den PC poppt sofort ein Fenster mit dem Inhalt von Laufwerk E mit der Bezeichnung PYBFLASH auf. Das OS sollte jetzt auch über eine neue serielle Schnittstelle verfügen. Stellt man auf diesen Port ein Terminal-Programm wie Tera Term ein und betätigt eine Taste, sollte man einen Python-Prompt zu sehen bekommen.
MicroPython v1.8.2 on 2016-07-13; PYBv1.1 with STM32F405RG
Type "help()" for more information.
>>> 
>>> 
Das ging fix! Weniger als eine Minute nach dem Anstecken des Boards – dabei wurde diese Minute hauptsächlich mit der Navigation durch OS-Menüs etc. verbracht. Jetzt kann es losgehen.

REPL
Gesucht wird eine einfache, interaktive Programmierumgebung, die einfache Ausdrücke entgegennimmt, sie auswertet und das Ergebnis zurückgibt. So eine Umgebung ist Read–Evaluate–Print Loop, abgekürzt REPL. Dieses Akronym sollte man sich merken, denn man braucht es bei Python ziemlich häufig.

LED-Blinken
Wie der Prompt vorschlägt, tippt man ‘help()’ und betätigt die Eingabetaste. Jetzt erscheint eine Übersicht über etliche Befehle. Schaut man genauer auf die Liste, bekommt man einen ersten Eindruck davon, was mit diesem Board möglich ist. Auf der Basis des ARM-Cortex-M4F-Mikrocontrollers STM32F405RG ist das Board auch mit einer RTC, einem ADC, einem DAC, vier LEDs, einem Taster, einem Accelerometer, einem Zufallszahlengenerator (RNG) sowie I²C, SPI, UART und zugänglichen I/O-Pins bestückt. Außerdem unterstützt es Servos. Einige Funktionen zur Peripherie-Steuerung sind ebenfalls aufgeführt, was die Hilfe durchaus nützlich macht. Beim Blick auf das Board entdeckt man auch einen Slot für eine SD-Karte.

Nach dem Prompt tippt man den folgenden Befehl und dann ein <Enter>.
>>> pyb.LED(1).on()
Jetzt sollte die rote LED neben dem Taster aufleuchten. Wiederholt man den Befehl, diesmal aber mit der „1“ ersetzt durch eine „2“ (mit den Pfeiltasten kommt man zum vorhergehenden Befehl zurück und kann ihn editieren), dann leuchtet jetzt die nebenan gelegene grüne LED auf. Bei „3“ leuchtet es gelb und bei „4“ dann blau. Mit Ausnahme des gelben Exemplars leuchten die LEDs extrem hell. Man schaut besser nicht direkt drauf. Für die weiteren Schritte wird deshalb LED(3) genutzt. Sie müssen jetzt noch herausfinden, wie man die anderen LEDs wieder ausschaltet.

Damit eine LED blinkt, braucht es eine Schleife. Damit die verwendete „while“-Schleife dauerhaft läuft, muss ihre Bedingung dauerhaft „true“ sein – ganz wie bei der boolschen Konstanten True. Also los, den Befehl eingeben (und das „:“ am Ende nicht vergessen):
>>> while True:
Jetzt braucht es noch den Befehl toggle LED. Das Terminal wird den Code eingerückt anzeigen (symbolisiert durch die drei Punkte am Anfang), denn das ist bei Python zwingend. Jetzt noch eine Verzögerung von z. B. 250 ms für die Blinkfrequenz. Das Resultat sollte etwa so aussehen:
>>> while True:
...     pyb.LED(3).toggle()
...     pyb.delay(250)
...     
Damit diese Schleife ausgeführt wird, muss zuerst der Einfüge-Modus verlassen werden, indem man die Rückschritt-Taste betätigt. Dann noch ein „Enter“. Jetzt sollte LED3 angemessen blinken.

Jetzt werden Sie merken, dass das Terminal keine weiteren Befehle entgegennimmt, solange die Schleife läuft. Um die Ausführung abzubrechen, geht man zum Command-Prompt und betätigt Ctrl-C („interrupt a running Programm“). Aber Achtung: Jetzt werden plötzlich alle Befehle ausgeführt, die man während der Schleifenaktivität eingegeben hatte. Also Vorsicht beim Tippen während der Programmausführung

Accelerometer
Nachfolgend ein Experiment, das zeigt, ob der auf dem Board befindliche Accelerometer korrekt funktioniert.
>>> while True:
...     print(pyb.Accel().x(),pyb.Accel().y(),pyb.Accel().z())
Es sollte sich eine endlose Liste der drei Werte für x, y und z zeigen:
-1 -2 21
-1 -2 20
-2 -1 20
…
Wie zuvor beendet auch hier ein Ctrl-C den Spuk. Dieser Test ist aufschlussreich, denn er gibt einen Eindruck vom Tempo der Programmausführung bei einer einfachen Schleife. Es werden ja lediglich bei jedem Durchlauf ein Sensor ausgelesen und drei Werte ausgegeben. Meine Messung ergab etwa drei Zeilen pro Sekunde. Wirklich schnell ist das nicht.

Der Grund für das eher gemächliche Tempo ist, dass der Code interpretiert wird, statt auf einmal vor der Ausführung kompiliert zu werden und dann den reinen Maschinen-Code auszuführen. Auch wenn es sich abgesehen von der Schleife um nur eine einzige Code-Zeile handelt, ist das Interpreterverhalten doch schon überaus komplex und zeitraubend. Mit einem sogenannten „frozen module“ kann man die Angelegenheit deutlich beschleunigen, doch dies erfordert ein komplettes Rekompilieren der Firmware des pyboard, was außer Reichweite für diesen Artikel liegt.

Ein erstes Programm
Nach dem Herumspielen mit REPL stellt sich berechtigt die Frage, wie man das eine oder andere Experiment in einen etwas stabileren Status überführt. Das geht ganz einfach, denn man braucht dazu lediglich einen (guten) Text-Editor.



Das pyboard kann wie ein USB-Speicher-Stick angesprochen werden. Wenn man die darauf abgelegten Dateien inspiziert, findet man auch die Datei main.py. Dies ist die Python-Datei, die nach einem Reset des pyboard („hard“ mit dem RS-Taster – „soft“ mit Ctrl-D) zuerst ausgeführt wird. Man öffnet diese Datei einfach und fügt die gewünschten Befehle ein. Nach dem Sichern braucht es nur noch ein Reset und schon wird das Programm gestartet.

Aus dem (schwarzen) Loch klettern
Sie sollten nicht allzu ängstlich sein. Im Zweifelsfall einfach ausprobieren. Wenn nichts mehr gehen sollte – also wenn nichts mehr läuft – gibt es noch zwei Rettungsprotokolle, die aus der Patsche helfen: Den „safe mode“ und die Wiederherstellung des Auslieferungszustands. Im safe mode werden die Dateien boot.py und main.py nicht ausgeführt. Stattdessen zeigen sich die Dateien auf dem virtuellen Stick. Jetzt kann man boot.py und/oder main.py editieren und die Bugs fixen.

Die Wiederherstellung geht da einen Schritt weiter. Es werden alle Dateien auf dem pyboard-Speicher (nicht der SD-Karte) gelöscht und die originalen Versionen von boot.py, main.py, README.txt und pybcdc.inf wiederhergestellt. Ein folgender Druck auf RST bedeutet: Zurück ganz zum Anfang (dieses Artikels).

Mehr Stoff!
Auf der MicroPython-Website finden sich nette Tutorials, die in die Verwendung der pyboard-Peripherie einführen. Es ist sehr zu empfehlen, dieses Material zu lesen, denn das spart viel Zeit. Außerdem werden einige besondere Techniken wie etwa die Kombination von Assembler mit uPy erläutert. Diese Angaben beziehen sich rein auf das pyboard und funktionieren vermutlich nicht so einfach ohne Änderungen auf anderen Boards.

Sie sind nicht immer selbst schuld
Wenn man gerade lernt, wie man uPy-Programme schreibt, wird man vermutlich eine Menge Fehler machen und Irrtümern aufsitzen. Besonders beliebt und ebenso frustrierend ist das Ignorieren der Tabulator-Taste. Oder man glaubt, dass man Tabs eingefügt hätte und hat das doch nicht getan. Python erzwingt das Einrücken. Das geht hier nur mit Tabs. Daher sollte der Editor auch mit Tabs umgehen können und sie nicht etwa durch Leerzeichen ersetzen. Die Freeware Notepad++ ist sehr gut geeignet, denn dieser Editor unterstützt das Python-Syntax-Highlighting und lässt die Tabs in Ruhe.

Neben Problemen beim Einrücken kann es auch noch Stress mit der Python-Kompatibilität geben. MicroPython ist eine Portierung von Python, aber leider keine perfekte Portierung. Auf der uPy-Website gibt es eine Liste mit Unterschieden zwischen CPython (der Python-Referenz-Implementation) und uPy. Falls also einmal ein merkwürdiger Fehler bei Code auftritt, der eigentlich funktionieren müsste, dann empfiehlt sich ein Blick auf diese Liste.

Fazit
MicroPython und das pyboard sind eine interessante und preiswerte Kombination zum Erlernen der Programmierung von Embedded-Systemen mit Python. So gut wie alle Versprechen der damaligen Kickstarter-Kampagne wurden eingehalten, sogar die zukünftigen Vorhaben. Die uPy-Website mit ihren netten Tutorials mag zwar nicht immer aktuell sein, doch im Zweifelsfall gibt es ja immer noch Projektseiten auf GitHub.