Niemandem in der Szene kann verborgen geblieben sein, dass Python bei den verwendeten Programmiersprachen seit Jahren auf dem Vormarsch ist. Ich konnte und kann den Hype nicht so ganz nachvollziehen, da ich der Meinung bin, das es schon genug ähnliche Programmiersprachen gibt und Python als Interpreter sowieso nicht vollwertig ist. 🙂
Nachdem ich das Thema in Form der c’t 5/2022 aber gerade wieder auf dem Tisch liegen hatte, habe ich mich entschieden, doch einmal ein bisschen tiefer einzusteigen. Da Python in der Darreichungsform MicroPython auch für viele Mikrocontroller angeboten wird – und das irgendwie noch unverständlicher ist, denn warum sollte man einen sowieso schon leistungsschwachen (im Vergleich zu vollwertigen CPU’s wie einem Ryzen 3950) Mikroprozessor auch noch Code interpretieren, anstatt direkt auszuführen, lassen? – wollte ich meine ersten Versuche mit dem von mir sehr geschätzten Lilygo TTGO T-Display unternehmen.
Wie funktioniert Python mit einem ESP32?
Der ESP32 wird einmalig mit einer speziellen Firmware geflasht, die einen Python-Interpreter beinhaltet. Anschließend kann mit dem ESP32 über eine USB-Verbindung kommuniziert werden. Er wartet auf übertragene Befehle und führt sie direkt aus. Das macht es zum Beispiel möglich, dass ich direkt anliegende Pin-Signale abfragen kann. Es ist aber auch möglich komplette Python Programme an den ESP32 zu übertragen, die anschließend vom Interpreter ausgeführt werden.
Übrigens brauchen Umsteiger von der Arduino IDE keine Angst vor MicroPython Experimenten mit dem ESP32 zu haben. Wenn Ihr später wieder mit der Arduino IDE und C++ arbeiten wollt, so ist das problemlos ohne weitere Maßnahmen möglich!
Los geht’s:
Die Suchbegriffe ‘esp32’ und ‘micropython’ führten unter anderem zu dieser Seite:
https://micropython.org/download/esp32/
Dort finden sich direkte Verweise zum Herunterladen einer passenden Firmware für den ESP32. Zum Beispiel die bei meinem Besuch der Seite aktuelle Version:
https://micropython.org/resources/firmware/esp32-20220117-v1.18.bin
Blieb die Frage wie ich die auf meinen ESP32, also das TTGO T-Display bekomme. Weitere Recherchen führten immer wieder zu Anleitungen, die eine Python-Installation auf dem PC voraussetzen und damit das Flashen über das Tool ‘esptool.py’ lösen. Eine Python-Installation wollte ich aber nicht auf meinem PC haben. Ich wollte ja gerade Python mit dem ESP32 machen!
Andererseits hatte ich für meinen Artikel Wer ist schneller? RP2040 versus ESP32! schon einmal kurz mit Thonny gearbeitet und damit Python schon auf dem Rechner. Da muss doch was gehen?
Was ist Thonny?
Thonny ist eine einfache IDE für den Umgang mit Python bzw. MicroPython. Wie in einem Editor könnt Ihr dort Programme schreiben und anschließend mit einem Klick auf den den weißen Pfeil im grünen Kreis starten. Wenn Ihr das zum ersten Mal macht und einen ESP32 korrekt angeschlossen habt, werdet Ihr gefragt, ob Ihr das Programm auf Eurem Computer oder auf dem ESP32 speichern wollt. Habt Ihr ‘MicroPython device’ gewählt, wird es nach dem Speichern automatisch auf dem ESP32 gestartet.
Und tatsächlich, in Thonny gibt es direkt eine Funktion zum Flashen eines angeschlossenen ESP32. Ihr findet sie unter ‘Tools->Options…’ und im dann erscheinenden Fenster unter dem Tab ‘Interpreter’:
Eigentlich ist der Tab dazu da zu bestimmen, mit welchem Interpreter ihr tatsächlich arbeiten wollt und an welchem Port sich ein eventuell angeschlossener ESP32 befindet. Aber rechts unten in der Ecke ist auch ein unscheinbarer Link ‘Install or update firmware’:
Hier wählt Ihr den Port des angeschlossenen ESP32 aus und mit ‘Browse…’ die heruntergeladene Version der MicroPython Firmware. Dann noch auf ‘Install’ klicken und Ihr solltet links unten so etwas sehen:
Wenn das geklappt hat (‘Done!’) wählt Ihr im Interpreter Tab die MicroPython Variante (‘MicroPython (ESP32)’) und den Port aus. Das geht auch ganz schnell mit einem Klick auf das unscheinbare Popupmenü ganz rechts unten von Thonny! Jetzt ist alles bereit, um erste Experimente mit MicroPython zu machen.
So könnt Ihr zum Beispiel in der Shell
print (“Hello World!”)
eingeben und solltet als Ergebnis ‘Hello World!’ zurück erhalten.
Ihr könnt auch direkt mit MicroPython rechnen. Gebt einfach ‘4*5‘ in die Shell ein und bekommt als Ergebnis 20. Wenn Ihr mathematische Funktionen benötigt, tippt Ihr vorher ‘import math‘ ein und könnt anschließend Formeln berechnen:
math.sqrt(4*6)*math.log(8)+math.pow(4, 6)
Um Euch noch irgendein kleines sinnvolles Programm zum Experimentieren anzubieten, suchte ich nach einem Python Programm zur Erzeugung einer Primzahlenliste. Auf ‘stackoverflow.com’ fand ich diese.
for num in range (2,101):
prime = True
for i in range (2,num):
if (num % i == 0):
prime = False
if prime:
print (num)
Doch Primzahlen bis 100 sind heutzutage selbst für einen programmierbaren Taschenrechner kalter Kaffee. Darum gab ich in der ersten Zeile bei ‘range’ 1000000 und 10000000 ein und war anschließend nicht sicher, ob der ESP32 nicht vielleicht abgestürzt ist, denn es tat sich erst einmal nichts mehr. Nach ca. 40 Sekunden kam dann aber doch noch 1000003 als Antwort.
Ich hatte irgendwo gelesen, dass beim Verwenden der ‘range’-Funktion vor der eigentlichen Ausführung erst eine Liste mit so vielen Zahlenwerten aufgebaut wird, wie in den Parametern angegeben ist. Das würde natürlich dauern. Als Lösung stand dort die Verwendung von ‘xrange’, welches ich gleich ausprobierte, aber unter MicroPython bei mir gar nicht erst erkannt wird.
Da ich hier aber auch gleich die Endlichkeit aller Computer bei der Verarbeitung wirklich großer Zahlenmengen serviert bekam, wollte ich ausprobieren, wie lange mein PC dazu benötigt. Das geht sehr elegant, da Thonny bei den Interpretern auch ‘The same interpreter which runs Thonny (default)‘ anbietet. Und schon dauert es bis zur ersten Zahl nur noch 1 Sekunde!
Wie schnell der ESP32 sein kann, wenn er nicht mit einem Interpreter massakriert wird, könnt Ihr hier in meinem Video sehen:
Darum baute ich das Programm so um, dass es gar keine ‘range’-Funktion benötigt und statt dessen ein simpler Zähler mit ‘while’ verwendet wird:
num = 1000000
while num < 10000000:
prime = True
i = 2
while i < num:
if (num % i == 0):
prime = False
i = i + 1
if prime:
print (num)
num = num + 1
Jetzt war es aber noch langsamer! Bis zur 1000003 dauert es ca. 63 Sekunden. Ehrlich, das verstehe ich jetzt nicht. ‘range’ scheint doch nicht das Problem zu sein und Python ist einfach nur sehr langsam.
Ich habe dann noch ein bisschen herum gespielt und einfaches Herumprobieren mit einzelnen Funktionen oder der Abfrage von Pins geht natürlich schneller, als wenn ich jedesmal ein C++ Programm mit der Arduino IDE kompilieren und auf den ESP32 flashen muss. Auch einfache Programme sind schnell eingetippt, getestet und können verbessert werden.
Hier noch ein kleines Programm zum Steuern einer LED zwischen den Pins 25 und 26:
from machine import Pin
from time import sleep
ledCathode = Pin(25, Pin.OUT)
ledAnode = Pin(26, Pin.OUT)
ledCathode.on()
ledAnode.off()
while True:
ledAnode.on()
sleep(2)
ledAnode.off()
sleep(2)
Was mich wirklich geärgert hat, ist die Tatsache das es mit Thonny nicht möglich ist MicroPython zu debuggen! Denn das wäre ein echter Vorteil bei der Entwicklung gewesen. So muss ich genauso Testausgaben in meinen Code einbauen wie bei der Arbeit mit der Arduino IDE.
In der c’t steht, das der Geschwindigkeitsnachteil von Python ja gar nicht so schlimm ist, da man für die Verarbeitung großer Zahlen ja einfach die tolle Bibliothek ‘NumPy’ nehmen kann. Und diese so gut optimiert ist, dass selbst die besten Programmierer nicht so einfach an sie heran kämen. Nun ja, kann sein. Ich jedenfalls mag lieber eine Programmiersprache, mit der ich direkt schnellen Code erzeugen kann. Und ich denke es gibt da draußen viele interessante Probleme, bei denen NumPy nicht helfen kann und es einfach darauf ankommt, dass der Code einfach nur sau schnell ist.