Unser Plan für diesen Sonnabend war es, die Raspberry Pi Kamera mit Python zu programmieren. Die Python Bibliothek picamera sieht sehr interessant. Allerdings haben wir kaum Erfahrung mit Python und noch weniger auf dem Raspberry Pi. Hinzu kam, dass nicht jeder einen herumliegen hat. Also wollten wir gleich auch noch Micropython für den ESP32 ausprobieren.

Eine Entwicklungsumgebung für Python

Zunächst brauchen wir eine Entwicklungsumgebung (IDE: Integrated Development Environment), die es uns einfacher macht, Python-Programme zu bearbeiten und auszuführen. Für das C/C++ auf den Arduino-Minicomputern gibt es die Arduino IDE. Diese versteht jedoch kein Python. Wir haben uns Visual Studio Code mit dem Pymakr MicroPython Plug, PyCharm Edu, uPyCraft und Thonny angeschaut und dann für Thonny entschieden.

Thonny hat eine gute Unterstützung für die Raspberry Pis, weil die RaspberryPi-Stiftung die Entwicklung unterstützt. Mit Thonny kann man sich sehr einfach über das Netzwerk mit einem Raspberry Pi verbinden und aus der Ferne programme darauf entwickeln und ausprobieren. Man kann es auch direkt auf dem Raspberry Pi ausführen, falls man dort eine grafische Benutzeroberfläche installiert hat. Zudem unterstützt Thonny auch das Micropython für den ESP32. Das macht es einfacher, eigene Python-Programme auf den ESP32 hochzuladen und auszuführen.

Thonny installieren

Auf der Webseite von Thonny gibt es Installer für Windows und MacOS. Für Linux ist die offizielle Empfehlung, das thonny Paket von seinem Linux zu installieren, z.B. sudo apt install thonny. Diese Version ist aber im Moment noch zu alt für Micropython. Deswegen haben wir Thonny über die pip Paketverwaltung von Python installiert.

sudo apt remove thonny
pip3 install thonny
python3 -m thonny

Die letzte Zeile startet den Editor. Man kann sich einen Starter im anlegen für python3 -m thonny.

Im den Einstellungen unter Tools => Options => General kann die Sprache der Entwicklungsumgebung von Englisch auf Deutsch umgestellt werden.

MicroPython auf dem ESP32

MicroPython ist ein Interpreter, der Python-Programme ausführt. Der Interpreter ist so klein, dass er auf einigen Minicomputern, wie z.B. den ESP32, installiert werden kann. Zum Lieferumfang gehören auch Bibliotheken, die den Zugriff auf die IO-Pins und Hardware-Schnittstellen wie I2C und SPI bereitstellen.

Der ESP32 ist ein kleiner Prozessor mit zwei Rechenkernen, 512kB Arbeitsspeicher, integriertem Flash-Speicher. Uns gefällt daran, dass er WLAN und Bluetooth unterstütz. Um Programme auf den ESP32 laden zu können muss zunächst der Treiber für den USB-zu-Seriell Adapter installiert werden. Als nächstes haben wir das fertig übersetzte Micropython für den ESP32 heruntergeladen, z.B. die Datei esp32-idf4-20210202-v1.14.bin.

Option 1) Thonny installiert MicroPython für uns

Die IDE bringt schon ein Werkzeug mit, um MicroPython bequem und automatisiert zu installieren. Das haben wir aber erst entdeckt, nachdem wir es umständlich per Hand gemacht haben – siehe nächster Abschnitt.

Damit dies funktioniert muss man zuerst über die Paketveraltung von Thonny die esptool Bibliothek installieren. Danach kann man in Menü Extras, Optionen, im Tab Interpreterauswahl die Aktion „Installieren oder Aktualisieren Sie die Firmware“ anklicken. Das gewünschte MicroPython Abbild lädt man vorher selber der Webseite herunter.

Option 2) MicroPython über das esptool installieren

In Thonny im Menü Extras das System Konsole öffnen… anklicken. Dies liefert uns eine Kommandozeile von der aus das in Thonny integrierte Python erreichbar ist.

Mit dem Befehl pip install esptool installieren wir eine Python-Bibliothek mit der wir dann das Micropython auf den ESP32 hochladen.

Mit dem esptool setzen wir dann den kompletten Flash-Speicher des ESP32 zurück. Dieser Schritt ist wichtig, damit später das Speichern unserer Python-Programme funktioniert.

Als letzter Schritt wird das MicroPython Abbild mit Hilfe des esptool hochgeladen.

pip install esptool
python -m esptool --chip esp32 chip_id
esptool.py v3.0
Found 4 serial ports...
Chip is ESP32-D0WD (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
...
MAC: 98:f4:ab:06:eb:44

python -m esptool --chip esp32 erase_flash
...
Erasing flash (this may take a while)…
Chip erase completed successfully in 8.7s
Hard resetting via RTS pin…

python -m esptool --chip esp32 write_flash -z 0x1000 Downloads/esp32-idf4-20210202-v1.14.bin 
...
Configuring flash size…
Compressed 1484624 bytes to 951640…
Wrote 1484624 bytes (951640 compressed) at 0x00001000 in 83.8 seconds (effective 141.8 kbit/s)…
Hash of data verified.

Thonny mit MicroPython verbinden

Nachdem MicroPython auf dem ESP32 installiert ist, kann man nun die Thonny IDE mit dem MicroPython verbinden. Dazu im Menü Extras auf Optionen… klicken. Dort gibt es einen Tab Interpreter. Hier kann nun in der Auswahlbox das MicroPython (ESP32) ausgewählt werden. Unter MacOS war es notwendig, auch den USB-Serial Port manuell auszuwählen. Unter Window ging dies automatisch.

Dies wäre auch der Ort, um Thonny mit einem RaspberryPi übers Netzwerk zu verbinden.

Erste Schritte mit Python

Einmal Blinken bitte

Unser erstes Programm lässt die integrierte Leuchtdiode (LED) auf dem ESP32-Board einmal aufleuchten. Dazu importieren wir aus der Bibliothek machine die Definiton für Pin, sowie aus der Bibliothek time die Definiton für sleep.

Die Leuchtdiode ist am IO-Pin Nr. 2 angeschlossen. Um den als digitalen Ausgang ansteuern zu können, erzeugen wir uns ein Objekt vom Typ Pin und speichern dieses Objekt in der Variable led. Dieses Objekt stellt Unterprogramme bereit. Mit dem Aufruf led.value(1) wird z.B. der Pin Nr. 2 auf HIGH, also 3.3V Spannung gesetzt.

from machine import Pin
from time import sleep

led = Pin(2, Pin.OUT)

led.value(1)
sleep(1)
led.value(0)
sleep(1)

Wiederholt blinken

Unser zweites Programm läßt die Leuchtdiode 10 mal schnell blinken. Dies erreichen wir mit einer Zählschleife. Eine Variable c wird zunächst auf 0 gesetzt. Solange c kleiner 10 ist, wird der Befehlsblock wiederholt ausgeführt. In dem Befehlsblock erhöhen wir die Zahl in der Variable c um 1 und lassen dann die Leuchdiode einmal blinken.

In Python werden diese Befehlsblöcke durch Einrückung festgelegt – es gibt kein BEGIN und END oder { und }. Der Befehlsblock beginnt durch den Doppelpunkt am Ende der Zeile while c < 10:

from machine import Pin
from time import sleep

led = Pin(2, Pin.OUT)

c = 0
while c < 10:
    c = c+1    
    led.value(1)
    sleep(0.5)
    led.value(0)
    sleep(0.5)

Und etwas Text produzieren

Um das Verhalten des Befehlsblocks und der Wiederholung besser sehen zu können, haben wir ein paar Textausgaben eingefügt. Dafür gibt es das vordefinierte Unterprogramm print. Diese Ausgaben sind dann in Thonny unten in dem Komandozeilen-Fenster zu sehen.

Um Zahlen und ähnliche Werte aus Variablen in eine Zeichenkette einzufügen gibt es den Formatierungsoperator % in Python. Auf der linken Seite etwartet er eine Zeichenkette und auf der rechten Seite eine Liste von Variablen. Der aktuelle Wert der Variable wird an der Markierung %d in die Zeichenkette eingefügt.

from machine import Pin
from time import sleep

print("ich starte")
led = Pin(2, Pin.OUT)

c = 0
while c < 10:
    c = c+1
    print("aktuelle Zahl: %d" % (c))
    
    led.value(1)
    sleep(0.5)
    led.value(0)
    sleep(0.5)

print("ich bin fertig")

Ein ungenauer Zeitzähler

Unser finales Programm sollte Sekunden zählen und in der Form Stunden:Minuten:Sekunden ausgeben. Da wir keine Pins ansteuern sollte dieses Programm auch ohne ESP32, MicroPython oder RaspberryPi laufen.

Wir benutzen nun drei Variablen, die am Anfang auf 0 gesetzt werden. Die Wiederholung mit while True: stoppt niemals. Wenn der Sekundenzähler bei 60 angekommen ist, erhöhen wir den Minutenzählen und setzen die Sekunden wieder auf 0 zurück. Für den Minutenzähler wird dies analog gemacht.

Der Formatierungsmarker %02d sagt, dass der Wert als Dezimalzahl dargestellt werden soll mit 2 Dezimalstellen und links mit Nullen statt Lehrzeichen aufgefüllt.

from time import sleep

sekunden = 0
minuten = 0
stunden = 0

while True:
    sleep(0.25)

    sekunden = sekunden + 1
    if sekunden == 60:
        minuten = minuten + 1
        sekunden = 0

    if minuten == 60:
        stunden = stunden + 1
        minuten = 0

    print( "vergangene Zeit: %02d:%02d:%02d" % (stunden,minuten,sekunden) )
    

Weitere MicroPython Bibliotheken installieren

Am Nachmittag haben wir probiert, zusätzliche Treiber für interessante Hardware hinzuzufügen. Zum Beispiel haben wir viele Beschleunigungssensoren vom Typ MPU9250 herumliegen. Die Verbindung vom ESP32 zum Sensor erfolgt über I2C. Allerdings ist der Sensor nicht trivial zu benutzen. Zum Glück gibt es dafür Treiber-Bibliotheken, z.B. https://github.com/tuupola/micropython-mpu9250.

Aber wie bekommt man diese Bibliotheken auf den ESP32? Dazu gab es leider wenige Anleitungen im Internet. Der Weg zu Fuß bestand für uns daraus, den ESP32 mit dem lokalen WLAN zu verbinden und dann mit der upip Bibliothek vom ESP32 aus weitere Bibliotheken aus dem Internet herunterzuladen. Das geht, ist aber unschön wegen der notwendigen WLAN-Verbindung. Es gibt einen besseren Weg mit Thonny, siehe unten!

Option 1) WLAN und upip auf dem ESP32

wifi_ssid = "meinWLAN"
wifi_pass = "meinPasswort"

import network

print("verbinde zum WLAN")
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(wifi_ssid, wifi_pass)
while not wifi.isconnected():
    print(".", end="")

Nach anpassen des Namens und Passworts, das Programm auf den ESP32 hochladen und ausführen. Dadurch verbindet er sich mit dem WLAN. Anschließend kann man unten in der Kommandozeile interaktiv Bibliotheken installieren:

import upip
upip.install("micropython-mpu9250")

Option 2) Paketverwaltung von Thonny

Und nun wie versprochen der einfache Weg. Es ist vielleicht zu offensichtlich: Im Menü Extras auf Verwalte Pakete… klicken. Dort nach der Bibliotkek suchen, die gewünsche auswählen und dann installieren lassen. Thonny kümmert sich dann darum, die Dateien aus dem Internet herunter zu laden und auf den ESP32 zu übertragen.

Hilfreiche Literatur


1 Kommentar

Torsten · 21. März 2021 um 15:34

Tolle Seite! Danke für die Gute Anleitung zu Thonny.

Die Kommentarfunktion ist deaktiviert.