Mit MicroPython läuft ein und dasselbe Programm problemlos auf unterschiedlichen Mikrocontrollern.
In der Programmierung dient nahezu immer das gute alte “Hello World” als erstes Programm. Äquivalent dazu gibt es in der Welt der Mikrocontroller das Blink-Beispiel: Es zeigt, wie ein Programm grundsätzlich aufgebaut sein sollte. Außerdem können Sie damit testen, ob die Programmierung des Controllers selbst klappt.
Wir setzen in dieser Artikelserie viele unterschiedliche Controller mit wechselnden IDEs ein, um eine möglichst große Bandbreite abzudecken. Auf diese Weise lassen sich die Vor- und Nachteile sowie die Unterschiede verschiedener Konfigurationen aufzeigen. Im aktuellen Teil verwenden wir den Editor Mu [1] mit dem Raspberry Pi Pico und dem ESP32. Nachdem der erste Artikel [2] das Installieren von Mu beschrieben hat, starten wir nun direkt mit dem Setup von MicroPython auf den Controllern. Anschließend testen wir die beiden Controller mit dem Blink-Beispiel.
ESP32
Im ersten Schritt benötigen Sie ein ESP32 NodeMCU Development Board [3] für 11 Euro. Montieren Sie es wie in Abbildung 1 auf zwei Breadboards [4], die mit je 6 Euro zu Buche schlagen. Stecken Sie eine LED [5] mit einem 1-kOhm-Vorwiderstand an den Port mit der Nummer 14 an und spendieren Sie zusätzlich einen 10-µF-Kondensator zwischen 3,3V und dem Eingang EN, um Probleme beim Flashen des ESP32 zu vermeiden.
Um MicroPython auf dem ESP32 zu nutzen, benötigen Sie zunächst die passende Firmware für den Mikrocontroller. Laden Sie dazu die Standardvariante ohne Besonderheiten von der Webseite des Projekts herunter [6]. Zum Einrichten des Editors für MicroPython auf dem ESP32 genügen drei Mausklicks auf Modus, ESP MicroPython und OK (Abbildung 2). Klicken Sie dann auf das Zahnradsymbol unten rechts und wechseln Sie in den Reiter ESP Firmware flasher, um den ESP32 und die dazu passende Firmware einzustellen.
Die Option Erase**&**Write Firmware installiert die Firmware auf dem ESP32. Der Vorgang dauert ungefähr zwei Minuten, beim Schritt Connecting… ist etwas Geduld gefragt. Sobald die Firmware geschrieben ist, schließen Sie den Dialog mit OK. Nun können Sie direkt damit beginnen, MicroPython zu programmieren.
Blink-Beispiel
Das Beispielprogramm aus Listing 1 lässt die LED am Pin 14 im Sekundentakt blinken und beschränkt sich dabei auf 30 Wiederholungen. Um bei fehlerhafter Hardware sehen zu können, was das Programm macht, sind Textausgaben auf der Konsole eingebaut (Abbildung 3).
Wichtig für das Verständnis des Codes: Das Bilden von Codeblöcken funktioniert in Python über Einrückungen. Achten Sie deswegen penibel auf die korrekte Einrückung, sonst kommt es zu Fehlern. Starten Sie schließlich das Programm über den Schalter Ausführen.

Abbildung 3: Für den Fall, dass die Hardware nicht richtig funktioniert, verfügt das Beispielprogramm über eine Textausgabe zur Diagnose.
Listing 1
Blink auf dem ESP32
from machine import Pin
from time import sleep
LED = Pin(14,Pin.OUT)
for i in range(30):
LED.on()
print("on")
sleep(1)
LED.off()
print("off")
sleep(1)
Pico
Der Hardwareaufbau für den Raspberry Pi Pico [7] ähnelt dem für den ESP32. Preislich kommen Sie mit dem Pico etwas günstiger weg: 4,60 Euro kostet das Standardmodell, 6,90 Euro das mit Wi-Fi. Erneut greifen Sie auf zwei Breadboards zurück, die Sie etwas anders verbinden als beim ESP32 (Abbildung 4). Die LED mit dem 1-kOhm-Vorwiderstand jedoch platzieren Sie ebenfalls am Pin 14.
Den Editor stellen Sie analog wie beim ESP32 auf den Betrieb mit dem Raspberry Pi Pico um, nur dass Sie diesmal den RP2040 auswählen. Anschließend laden Sie die passende Firmware [8] herunter. Da der Pico ein anderes Verfahren zum Flashen der Firmware anwendet, können Sie diesen Schritt nicht wie beim ESP32 ausführen. Trennen Sie den Pico zuerst vom USB-Port, drücken Sie den Taster auf dem Controller, und verbinden Sie ihn wieder mit dem Port. Daraufhin sollten Sie ein Laufwerk RPI-RP2 vorfinden, auf dem Sie die Firmware ablegen. Kurz darauf verschwindet das Laufwerk, und Sie können via Mu auf den Pico zugreifen. Auf dem Pico läuft dasselbe Programm wie auf dem ESP32 (Listing 1).
Digitaler Input
Grundlegend bei der digitalen Eingabe ist, dass nicht beschaltete digitale Eingänge keinen definierten Wert besitzen. Daher arbeitet man mit Pull-up- und Pull-down-Widerständen, die Eingänge auf einen definierten Spannungspegel legen. Üblicherweise sind sie sehr hochohmig und beeinflussen so das zu verarbeitende Signal nicht. Pull-up zieht dabei den Eingang auf die positive Betriebsspannung, Pull-down dagegen auf Masse (GND). Moderne Mikrocontroller wie der ESP32 und der RP2040 bringen die passenden Widerstände bereits mit, Sie müssen sie nur noch per Software aktivieren.
Taster an digitalen Eingängen neigen erfahrungsgemäß zum Prellen. Das bedeutet, dass ein Übergang von offen zu geschlossen (0 zu 1) und umgekehrt nicht in einem Schritt erfolgt. Der Taster pendelt beim Schalten viel mehr einige Male zwischen den beiden Zuständen hin und her. Diese Tatsache müssen Sie bei den Programmen beachten.
Anhand des Beispielprogramms in Listing 2 lässt sich gut zeigen, wie oft der Taster beim Schalten schwingt. Mithilfe eines Interrupt-Handlers zählt es die einzelnen Schaltvorgänge (Zeile 3). Mehr zum Thema Interrupt erfahren Sie im Kasten “Interrupt-Verarbeitung”. Das Beispielprogramm zeigt zudem, wie Sie die Pull-up- und Pull-down-Widerstände per Software aktivieren (Zeile 7). Das eigentliche Hauptprogramm besteht aus einer Endlosschleife, die nichts tut.
Interrupt-Verarbeitung
Grundsätzlich steckt hinter einem Interrupt eine Unterbrechung des aktuellen Programmablaufs, um auf besondere Ereignisse zu reagieren, beispielsweise sich ändernde Signalpegel an einem Pin (Hardware-Interrupt) oder das Anklicken eines Schalters in einer GUI (Software-Interrupt). Bei den hardwareseitig ausgelösten Interrupts unterscheidet man in MicroPython vier Typen:
Pin.IRQ_FALLING: fallende Flanke, Übergang von 1 nach 0Pin.IRQ_RISING: steigende Flanke, Übergang von 0 nach 1Pin.IRQ_LOW_LEVEL: logischer Zustand 0 (selten)Pin.IRQ_HIGH_LEVEL: logischer Zustand 1 (selten)
Sobald ein Interrupt auftritt, stoppt das aktuelle Programm, und ein Interrupt-Handler springt an. Dahinter verbirgt sich oft eine Funktion, die auf das aufgetretene Ereignis reagiert und sich wieder beendet, woraufhin das ursprüngliche Programm weiterläuft. Da Interrupts den normalen Programmablauf stören, versucht man möglichst wenig Code innerhalb des Interrupt-Handlers auszuführen.
Listing 2
Tastaturprellen erkennen
from machine import Pin count = 0 def handler_button(pin): global count count=count+1 print (count) button = Pin(16, Pin.IN, Pin.PULL_UP) button.irq(trigger=Pin.IRQ_FALLING,handler=handler_button) while True: pass









