Der Beitrag ist auch als PDF-Dokument verfügbar.
Was kann man tun, wenn ein Projekt, zum Beispiel TCS3472 - Farberkennungssensor mit I2C in MicroPython - Teil 1, immer umfangreicher wird und die Programmteile schließlich nicht mehr auf dem ESP32/ESP8266 Platz haben? Nun, ganz einfach, man kann zum Beispiel die Module compilieren. Dadurch werden sie auf gut die Hälfte zusammengeschrumpft. Ein weiterer Aspekt könnte auch interessant sein: compilierte Programme liegen nicht mehr im Klartext vor und so kann man auch die ursprüngliche Programmstruktur nicht mehr erkennen. Die Ausgabe eines Listings ist nicht mehr möglich. Wie man ein Programm compiliert, wollen Sie wissen? In dieser Blogfolge zeige ich Ihnen in kleinen Schritten das Vorgehen auf Windows und Linux. Willkommen zu
MicroPython auf dem ESP32 und ESP8266
heute
mpy-cross – Compilereinsatz für die ESP-Family
Abbildung 1: Die Schaltung zum Projekt
Eines vorweg: bewahren Sie Ihre Originaldateien mit der Endung .py stets gut auf, denn wenn Sie nachträglich doch noch etwas ändern wollen, dann geht das nur in der Textdatei. Am Compilat können keine Änderungen mehr durchgeführt werden. Der Versuch, eine .mpy-Datei in Thonny zu öffnen, führt zu folgender Ausgabe:
Abbildung 2: Thonny kann tcs3472.mpy nicht öffnen
Durch das Compilieren, kann ich also auch dafür sorgen, dass an meinem Programm keiner mehr rumpfriemeln kann.
Kommen wir zur Hardware. Als Chef des Projekts setze ich einen ESP32 ein, ein ESP8266 tut es aber auch, brauche ich doch für diesen Beitrag sonst nur noch mein Farberkennungsmodul und ein OLED-Display. Aufgebaut wird die Schaltung wie immer auf einem Breadboard mit etlichen Jumperkabeln.
Hardware
Die Software
Fürs Flashen und die Programmierung des ESP32:
Thonny oder
Verwendete Firmware für einen ESP32:
Verwendete Firmware für einen ESP8266:
Die MicroPython-Programme zum Projekt:
ssd1306.py Hardwaretreiber für das OLED-Display
oled.py API für das OLED-Display
tcs3472.py Hardwaretreiber für das Farbmodul
tcs3472.mpy compilierter Hardwaretreiber für das Farbmodul
colorcheck.py Demo-Programm
mpy-cross MicroPython-Cross-Compiler (Windows und Linux)
Angaben zur Installation folgen weiter unten.
Hilfsprogramme
HXD Hexeditor zum Anzeigen des Inhalts von Binärdateien (Freeware)
MicroPython - Sprache - Module und Programme
Zur Installation von Thonny finden Sie hier eine ausführliche Anleitung (english version). Darin gibt es auch eine Beschreibung, wie die Micropython-Firmware (Stand 18.06.2022) auf den ESP-Chip gebrannt wird.
MicroPython ist eine Interpretersprache. Der Hauptunterschied zur Arduino-IDE, wo Sie stets und ausschließlich ganze Programme flashen, ist der, dass Sie die MicroPython-Firmware nur einmal zu Beginn auf den ESP32 flashen müssen, damit der Controller MicroPython-Anweisungen versteht. Sie können dazu Thonny, µPyCraft oder esptool.py benutzen. Für Thonny habe ich den Vorgang hier beschrieben.
Sobald die Firmware geflasht ist, können Sie sich zwanglos mit Ihrem Controller im Zwiegespräch unterhalten, einzelne Befehle testen und sofort die Antwort sehen, ohne vorher ein ganzes Programm kompilieren und übertragen zu müssen. Genau das stört mich nämlich an der Arduino-IDE. Man spart einfach enorm Zeit, wenn man einfache Tests der Syntax und der Hardware bis hin zum Ausprobieren und Verfeinern von Funktionen und ganzen Programmteilen über die Kommandozeile vorab prüfen kann, bevor man ein Programm daraus strickt. Zu diesem Zweck erstelle ich auch gerne immer wieder kleine Testprogramme. Als eine Art Makro fassen sie wiederkehrende Befehle zusammen. Aus solchen Programmfragmenten entwickeln sich dann mitunter ganze Anwendungen.
Autostart
Soll das Programm autonom mit dem Einschalten des Controllers starten, kopieren Sie den Programmtext in eine neu angelegte Blankodatei. Speichern Sie diese Datei unter boot.py im Workspace ab und laden Sie sie zum ESP-Chip hoch. Beim nächsten Reset oder Einschalten startet das Programm automatisch.
Programme testen
Manuell werden Programme aus dem aktuellen Editorfenster in der Thonny-IDE über die Taste F5 gestartet. Das geht schneller als der Mausklick auf den Startbutton, oder über das Menü Run. Lediglich die im Programm verwendeten Module müssen sich im Flash des ESP32 befinden.
Zwischendurch doch mal wieder Arduino-IDE?
Sollten Sie den Controller später wieder zusammen mit der Arduino-IDE verwenden wollen, flashen Sie das Programm einfach in gewohnter Weise. Allerdings hat der ESP32/ESP8266 dann vergessen, dass er jemals MicroPython gesprochen hat. Umgekehrt kann jeder Espressif-Chip, der ein kompiliertes Programm aus der Arduino-IDE oder die AT-Firmware oder LUA oder … enthält, problemlos mit der MicroPython-Firmware versehen werden. Der Vorgang ist immer so, wie hier beschrieben.
Signale auf dem I2C-Bus
Wie eine Übertragung auf dem I2C-Bus abläuft und wie die Signalfolge ausschaut, das können Sie in meinem Beitrag Mammut-Matrix Display Teil 2 nachlesen. Ich verwende dort ein interessantes kleines Tool, mit dem Sie die I2C-Bus-Signale auf Ihren PC holen und analysieren können.
Compilieren auf der Windows-Kiste
Wenn Sie auf Ihrem Windows-Rechner Thonny installiert haben, muss wohl auch Python 3.7 oder höher bereits vorhanden sein, denn Thonny ist in Python geschrieben und daher benötigt es die Laufzeitumgebung von Python. Das ist vergleichbar mit der MicroPython-Firmware auf dem ESP32/ESP8266. In diesem Fall sollte sich auch bereits mpy-cross auf Ihrem Rechner befinden.
Öffnen Sie einfach einmal die Eingabeaufforderung, geben Sie die folgende Zeile ein und drücken Sie ENTER.
Pip install mpy-cross
Als Ergebnis erhalten Sie eine der beiden Rückmeldungen von pip.
Abbildung 3: mpy-cross ist bereits installiert
So sieht es aus, wenn mpy-cross bereits auf Ihrem System installiert ist. Sie finden die exe-Datei im angegebenen Verzeichnis.
War mpy-cross vor der Ausführung des pip-Befehls noch nicht installiert, dann ist das jetzt der Fall.
Abbildung 4: mpy-cross wurde installiert
Um zu erfahren, wo sich mpy-cross.exe befindet, geben Sie den pip-Befehl noch einmal ein, worauf Sie die obere Rückmeldung mit dem Zielverzeichnis erhalten.
Warum ist die Position der Datei so wichtig? Um ein mcp-File zu compilieren, also in Bytecode zu übersetzen, müssen Sie mpy-cross aufrufen und zwar mit dem Namen der MicroPython-Datei als Argument. Hierzu haben Sie drei verschiedene Optionen mit stark unterschiedlichem Komfort. Die ersten beiden stelle ich bereits teiloptimiert vor.
- Sie befinden sich im Workspace ihres Projekts von Thonny und wollen die Datei py compilieren. Dann lautet der Aufruf etwa so.
C:\Users\root\AppData\Roaming\Python\Python38\site-packages\mpy_cross\mpy-cross.exe painted_sky.py
- Sie befinden sich im Verzeichnis C:\Users\root\AppData\Roaming\Python\Python38\site-packages\mpy_cross\mpy-cross. Dann müssen Sie den Pfad zu Ihrer Quelldatei angeben und der kann auch eine etwas längliche Gestalt haben.
mpy-cross F:\P_programmieren\az-blog\___Farberkennung mit TCS3472\_workspace\painted_sky.py
- Ich habe mich für den bequemsten Weg entschieden, und der geht so: Ich trage den Pfad zu mpy-cross.exe in die Pfadvariable PATH meines Windowssystems ein und kann dann das Programm aus jedem beliebigen Verzeichnis heraus starten. Einfach nur mit mpy-cross, ohne Verzeichnisangabe. Den Eintrag in die Pfadvariable muss ich auch nur einmal durchführen. Dann wechsle ich auf meine Arbeitsfestplatte und gebe folgende Befehle ein, um ins Arbeitsverzeichnis zu kommen.
Abbildung 5: Compilieren im Arbeitsverzeichnis
Den Pfad zum Workspace kopiere ich mir aus dem Explorerfenster und füge ihn in die Eingabeaufforderung ein. Nach dem Wechsel in das Arbeitsverzeichnis kann ich alle dort befindlichen *.py - Dateien in Kurzform compilieren.
Zur Pfaderweiterung führen ein paar einfache Schritte.
- Rechtsklick auf das Windows-Symbol - System.
Abbildung 6: Start - System
- Im rechten Fenster ganz nach unten rollen - Erweiterte Systemeinstellungen
Abbildung 7: Erweiterte Systemeinstellungen
- Umgebungsvariablen
Abbildung 8: Umgebungsvariablen
- Path markieren und Bearbeiten
Abbildung 9: Systemvariablen - Pfad - Bearbeiten
- Neu und in der Eingabezeile den Pfad zu mpy-cross.exe eintragen.
Abbildung 10: Neu - Pfad aus Explorer Kopfzeile einfügen
- OK – OK – OK – fertig!
Da gibt es aber noch eine Kleinigkeit zu beachten, wenn Sie die erste Compilierung starten. Die Mainversionsnummer von mpy-cross muss der Version des MicroPython-Interpreters entsprechen. Weil pip immer die letzte Version installiert, muss auch die entsprechende MicroPython-Version installiert sein. Deswegen habe ich oben bei der Firmware bereits darauf hingewiesen, die dort angegebenen bin-Dateien zu brennen.
Die Syntax für den Compiler-Aufruf kennen Sie ja schon, es steht also nichts mehr im Wege, Ihre erste MicroPython-Datei zu übersetzen. Sie werden erstaunt sein, dass das Compilat nur noch halb so groß ist, wie die Ausgangsdatei.
Eine andere Möglichkeit, die Version von mpy-cross abzufragen ist
mpy-cross --version
MicroPython v1.19.1 on 2022-06-18; mpy-cross emitting mpy v6
Falls eine frühere Version gebraucht wird, weil die MicroPython-Firmware ein besonderes Release sein muss, dann kann man auf https://pypi.org/project/mpy-cross/#history nachschauen, die whl-Datei herunterladen und manuell installieren. Alternativ kann auch die URL des Repositories mit in die pip-Zeile geschrieben werden.
Pip install -i
Die URL wurde direkt von der Seite https://pypi.org/project/mpy-cross/1.17/#files kopiert, das erspart langes Tippen und Fruckdehler.
Wie stelle ich aber die Versionsnummer einer bereits übersetzten MicroPython-Datei fest, wenn man die gar nicht auflisten kann? Nun, dafür gibt es Tools, mit denen ich Binärdateien darstellen und sogar editieren kann. HXD ist zum Beispiel ein solches Programm. Laden Sie die Freeware herunter und entpacken Sie diese. Dann Doppelklick auf hxdsetup.exe. Folgen Sie nun einfach dem Installationsassistenten.
Starten Sie HxD und ziehen Sie eine *.mpy-Datei auf das Arbeitsfenster. Das erste Zeichen ist ein großes "M", das zweite Byte ist die mpy-Versionsnummer. Diese entspricht nun nicht der Version des MicroPython-Release, sondern ist aus folgender Tabelle zu entnehmen:
MicroPython release |
.mpy version |
v1.19 and up |
6 |
v1.12 - v1.18 |
5 |
v1.11 |
4 |
v1.9.3 - v1.10 |
3 |
v1.9 - v1.9.2 |
2 |
v1.5.1 - v1.8.7 |
0 |
Tabelle 1
So sieht das in HxD aus:
Abbildung 11: HxD-Plot
Kommen wir zu Linux
Auch der mpy-cross-Befehl in Linux arbeitet auf der Kommandozeile. Wir holen uns das ganze MicroPython-Paket von
https://github.com/micropython/micropython/archive/refs/heads/micropython-master.zip
in ein beliebiges Verzeichnis. Ich habe hierzu /mcp neu angelegt. Dann entpacke ich die Zip-Datei. Das von unzip angelegte Verzeichnis /mcp/micropython-master taufe ich um in mcp damit die Pfadnamen nicht so lang werden.
Gegebenenfalls müssen Sie dazu unzip installieren.
sudo apt-get install unzip
sudo unzip master.zip
sudo mv micropython-master mcp
Wechseln Sie jetzt in das Verzeichnis mpy_cross
cd mpy-cross
Geben Sie dort den Befehl
make
ein. Eine ganze Latte von Bildschirmausgaben rollt herunter und am Ende befindet sich im Verzeichnis /mcp/mcp/mpy-cross/build die lauffähige Datei mpy-cross. Verschieben Sie diese Datei nun ins Verzeichnis /usr/bin.
sudo cp mpy-cross/build/mpy-cross /usr/bin/mpc
Unter Linux müssen Sie den Programmsuchpfad nicht erweitern, weil der sowieso bereits den Eintrag /usr/bin enthält.
Wie Sie sehen, geht manches unter Linux bisweilen einfacher als in Windows.
Ein kleiner Wermutstropfen bleibt dennoch, Thonny müssen Sie mit Adminrechten starten, sonst kann es nicht auf das USB-Device zugreifen.
sudo thonny
Mit der Verwendung von mpy-cross können Sie jetzt größere Programme, gesichert auf einen ESP-Controller unterbringen. Viel Spaß damit!