XIAO ESP32S3 mit MicroPython und Thonny

Diese Anleitung erklärt die ersten Schritte mit einem Seeed Studio XIAO ESP32S3. Sie richtet sich an Schülerinnen und Schüler der 10. Klasse, die zum ersten Mal mit einem Mikrocontroller arbeiten.

Ziele:

Wichtig: Der XIAO ESP32S3 arbeitet mit 3,3 V. Niemals 5 V direkt an einen GPIO-Pin anschließen.


1. Benötigte Materialien


2. MicroPython mit Thonny flashen

Beim Flashen wird die MicroPython-Firmware auf den internen Flash-Speicher des Mikrocontrollers geschrieben. Erst danach kann der XIAO Python-Programme ausführen.

In dieser Anleitung lädt Thonny das generische ESP32-S3-MicroPython-Image selbst herunter. Wir wählen also nicht manuell eine heruntergeladene .bin-Datei aus.

2.1 Board anschließen

  1. Den XIAO mit dem USB-C-Datenkabel direkt am PC anschließen.
  2. Falls Windows einen COM-Port anlegt, diesen später merken, zum Beispiel COM5.
  3. Wenn kein Port erscheint: zuerst ein anderes USB-C-Kabel ausprobieren. Viele USB-C-Kabel übertragen nur Strom.

2.2 Flash-Modus starten

Damit eine neue Firmware geschrieben werden kann, muss der XIAO im Bootloader- oder Flash-Modus sein.

Die beiden sehr kleinen Taster liegen direkt beim USB-C-Anschluss:

Standardmethode: BOOT beim Einstecken

  1. USB-C-Kabel vom XIAO abziehen.
  2. Taste BOOT gedrückt halten.
  3. BOOT weiter gedrückt halten und das Kabel einstecken.
  4. BOOT loslassen.
textKabel ab → BOOT halten → Kabel ein → BOOT loslassen

Alternative ohne Abziehen: BOOT + RST

textBOOT halten → RST kurz drücken → BOOT loslassen

Achtung, neuer COM-Port! Im Flash-Modus meldet sich der XIAO bei Windows oft mit einer anderen COM-Nummer als später im Normalbetrieb. Das ist normal und kein Defekt.

2.3 Thonny einstellen und flashen

Voraussetzung: Thonny 4.1 oder neuer (Hilfe → Über Thonny).

  1. XIAO wie in 2.2 in den Flash-Modus bringen – erst danach weitermachen.
  2. In Thonny Ausführen → Interpreter konfigurieren… öffnen.
  3. Interpreter: MicroPython (ESP32). Noch nicht auf OK klicken!
  4. Unten rechts auf MicroPython installieren oder aktualisieren (esptool) klicken.
  5. Im Installationsfenster bei Ziel-Port den Port wählen, der jetzt neu da ist. Tipp: Die Liste einmal mit und einmal ohne eingestecktes Board ansehen – der Port, der dazukommt, ist der XIAO.
  6. Einstellungen:
Einstellung Auswahl
MicroPython-Familie ESP32-S3
Variante Espressif • ESP32-S3 (generisches Image)
Version neueste stabile Version (keine „preview“)
Flash vorher löschen aktivieren, falls die Option angeboten wird
  1. Installieren klicken und warten, bis Done erscheint.
  2. RST einmal kurz drücken (oder Kabel kurz ab- und wieder anstecken). Der XIAO startet jetzt mit MicroPython – und hat oft wieder eine neue COM-Nummer.
  3. Installationsfenster schließen. Im Interpreter-Dialog den Port neu auswählen (die Liste hat sich geändert!) und jetzt OK klicken.
  4. Kontrolle: In der Shell unten erscheint eine Zeile wie MicroPython v1.xx … ESP32S3 und darunter >>>.

Klappt es nicht?

  • Im Flash-Modus erscheint kein Port → anderes USB-C-Kabel (Datenkabel!), anderen USB-Anschluss am PC.
  • Flashen bricht ab → Board erneut in den Flash-Modus bringen, bei Schritt 4 neu beginnen.
  • Nach dem Flashen keine >>>-Zeile → RST drücken, dann den Port im Interpreter-Dialog neu wählen.

3. Erster Funktionstest

Dieser Test prüft drei Dinge:

  1. MicroPython wurde gestartet.
  2. Thonny kann über USB mit dem XIAO sprechen.
  3. Die gelbe LED auf dem Board kann geschaltet werden.

Die eingebaute gelbe LED des XIAO ESP32S3 liegt an GPIO21.

Quellcode: Onboard-LED testen

In Thonny eine neue Datei anlegen, den folgenden Code einfügen und mit dem grünen Start-Knopf ausführen:

pythonfrom machine import Pin
import time
import sys

print("MicroPython läuft auf dem XIAO ESP32S3.")
print("MicroPython-Version:", sys.implementation.version)

# Gelbe LED auf dem XIAO ESP32S3 (GPIO21).
# Besonderheit: Diese LED leuchtet bei 0 und ist bei 1 aus ("active-low").
led = Pin(21, Pin.OUT, value=1)   # startet ausgeschaltet

for nummer in range(1, 7):
    led.value(0)                  # an
    print("Blink", nummer)
    time.sleep(0.5)
    led.value(1)                  # aus
    time.sleep(0.5)

print("Test erfolgreich.")

Erwartetes Ergebnis

Wenn die Textausgabe erscheint, ist die MicroPython-Verbindung grundsätzlich erfolgreich – auch wenn die LED ausnahmsweise nicht sichtbar blinkt.


4. Programme auf dem XIAO speichern

Ein Programm kann auf zwei verschiedene Arten ausgeführt werden:

Art Was passiert? Wann geeignet?
Nur ausführen Thonny sendet den Code zum Testen an den XIAO. Nach Reset oder Ausschalten ist der Code nicht automatisch aktiv. Beim Ausprobieren und Fehlersuchen
Auf MicroPython device speichern Die Datei wird im Flash-Dateisystem des XIAO gespeichert. Wenn das Programm später ohne PC verfügbar sein soll

So speicherst du eine Datei auf dem Board

  1. In Thonny Datei → Speichern unter… wählen.
  2. Im Dateidialog MicroPython device auswählen, nicht Dieser Computer.
  3. Einen Dateinamen vergeben, zum Beispiel led_test.py.
  4. Speichern.

Im Dateibrowser von Thonny sollte die Datei anschließend im Bereich MicroPython device erscheinen.

Automatischer Programmstart: main.py

Soll dein Programm nach einem Reset oder nach dem Einschalten automatisch starten, muss es auf dem Board genau so heißen:

textmain.py

MicroPython startet zuerst – falls vorhanden – boot.py und danach main.py.

Wichtige Vorsichtsregeln


5. Pinbelegung des XIAO ESP32S3

Auf dem Board stehen Beschriftungen wie D0, D1 oder D10. Im MicroPython-Code braucht man jedoch normalerweise die GPIO-Nummer.

Beispiel:

Pinout in Draufsicht

Pinout des XIAO ESP32S3 in Draufsicht
Abb. 1: Pinout des XIAO ESP32S3 in Draufsicht

So liest du das Pinout: Direkt am Board steht der Aufdruck (zum Beispiel D1). Daneben folgt die blaue GPIO-Nummer – die brauchst du im Code. Die farbigen Etiketten weiter außen zeigen, was der Pin zusätzlich kann. Grün hinterlegt sind die beiden Anschlüsse für den LED-Versuch in Abschnitt 6.

Pin-Tabelle

Beschriftung auf dem XIAO GPIO im ESP32-S3 Typische Funktion Für eine LED geeignet?
D0 / A0 GPIO1 GPIO, ADC, Touch Ja
D1 / A1 GPIO2 GPIO, ADC, Touch Ja – Empfehlung
D2 / A2 GPIO3 GPIO, ADC, Touch Möglich, für den ersten Versuch lieber vermeiden
D3 / A3 GPIO4 GPIO, ADC, Touch Ja
D4 / A4 GPIO5 GPIO, ADC, I²C-SDA Ja, wenn kein I²C benutzt wird
D5 / A5 GPIO6 GPIO, ADC, I²C-SCL Ja, wenn kein I²C benutzt wird
D6 GPIO43 GPIO, UART-TX Möglich, besser für UART freihalten
D7 GPIO44 GPIO, UART-RX Möglich, besser für UART freihalten
D8 GPIO7 GPIO, ADC, SPI-SCK Ja, wenn kein SPI benutzt wird
D9 GPIO8 GPIO, ADC, SPI-MISO Ja, wenn kein SPI benutzt wird
D10 GPIO9 GPIO, ADC, SPI-MOSI Ja, wenn kein SPI benutzt wird
3V3 — geregelte 3,3-V-Versorgung Nicht als GPIO verwenden
GND — Masse / Rückleitung Für die Schaltung erforderlich
VIN / 5V — Versorgungseingang Nicht mit GPIO verwechseln

Einfacher Merksatz: Für den ersten LED-Versuch nimm D1. Im MicroPython-Code ist das GPIO2 und damit Pin(2, ...).

Abbildung und vollständige Übersicht

Die offizielle, vollständige Pin-Multiplexing-Übersicht von Seeed Studio enthält eine Abbildung sowie weitere Spezialfunktionen der Pins:

https://wiki.seeedstudio.com/xiao_esp32s3_pin_multiplexing/

Zusätzliche Übersicht des Boards mit Pinout:

https://wiki.seeedstudio.com/xiao_esp32s3_getting_started/


6. Externe rote LED anschließen

Geeigneter Pin

Wir verwenden:

LED richtig herum anschließen

Eine LED hat eine feste Richtung:

Steckplan

Steckplan: rote LED mit 1-kΩ-Vorwiderstand an D1
Abb. 2: Steckplan: rote LED mit 1-kΩ-Vorwiderstand an D1

So liest du den Plan: Die Zahlen unten sind die Spalten, die Buchstaben links die Reihen des Breadboards. a4 heißt also: Spalte 4, Reihe a. Felder mit gleicher Hintergrundfarbe sind elektrisch verbunden – in der oberen Hälfte (a–e) jeweils eine Spalte, auf der blauen Schiene die ganze Zeile. Unten rechts siehst du dieselbe Schaltung als Schaltplan mit Symbolen.

Vereinfacht als Text:

textXIAO D1 / GPIO2 ── Widerstand 1 kΩ ── Anode (+) LED Kathode (−) ── XIAO GND

Die Reihenfolge von Widerstand und LED darf auch vertauscht werden. Entscheidend ist: Widerstand und LED liegen in Reihe, und die LED ist richtig gepolt.

Niemals eine LED ohne Widerstand direkt an einen GPIO-Pin anschließen. Zu hoher Strom kann LED oder Mikrocontroller beschädigen.


7. Schutzwiderstand berechnen

Der Widerstand begrenzt den Strom durch die LED. Für eine rote LED nehmen wir näherungsweise an:

Formel nach dem Ohmschen Gesetz:

R=UGPIO−UFILEDR = \frac{U_{\mathrm{GPIO}} - U_{\mathrm{F}}}{I_{\mathrm{LED}}}

Einsetzen:

R=3,3 V−2,0 V0,001 A=1,3 V0,001 A=1300 ΩR = \frac{3{,}3\,\text{V} - 2{,}0\,\text{V}}{0{,}001\,\text{A}} = \frac{1{,}3\,\text{V}}{0{,}001\,\text{A}} = 1300\,\Omega

Das rechnerische Ergebnis ist also ungefähr 1,3 kΩ1{,}3\,\text{k}\Omega. In der Praxis sind Widerstände mit festen Normwerten verfügbar. Gute Werte sind:

Widerstand ungefährer Strom Beurteilung
1,5 kΩ 0,9 mA Sehr sparsam, bei Low-Current-LED meist gut sichtbar
1 kΩ 1,3 mA Empfohlener Standardwert für diesen Versuch
680 Ω 1,9 mA Heller, weiterhin gut geeignet
220 Ω ca. 6 mA Nicht nötig für eine Low-Current-LED

Für den ersten Versuch verwenden wir 1 kΩ. Das ist sicher, einfach und die rote LED ist in normalem Raumlicht meist gut zu sehen.


8. MicroPython-Programm für die externe LED

Dieses Programm ist absichtlich ähnlich aufgebaut wie der erste Test mit der eingebauten LED. Es blinkt die externe rote LED sechs Mal.

pythonfrom machine import Pin
import time

print("Test der externen LED an D1 / GPIO2")

# D1 auf dem XIAO entspricht GPIO2 im ESP32-S3
led = Pin(2, Pin.OUT)

for nummer in range(1, 7):
    led.on()
    print("LED an: ", nummer)
    time.sleep(0.5)

    led.off()
    print("LED aus:", nummer)
    time.sleep(0.5)

print("LED-Test beendet.")

Ablauf

  1. Verdrahtung mit der Steckliste in Abschnitt 6 vergleichen: D1 → 1 kΩ → LED-Anode, LED-Kathode → GND.
  2. Code in Thonny einfügen.
  3. Grünen Start-Knopf drücken.
  4. Die LED sollte sechs Mal blinken.
  5. Wenn sie nicht leuchtet:
    • LED umdrehen (Polung prüfen).
    • Prüfen, ob wirklich D1 / GPIO2 benutzt wurde.
    • Prüfen, ob der Widerstand in Reihe geschaltet ist.
    • Prüfen, ob das Kabel von der LED-Kathode wirklich zu GND führt.

Programm automatisch beim Einschalten starten

Wenn die LED nach jedem Einschalten automatisch blinken soll:

  1. Das Programm zuerst erfolgreich testen.
  2. Datei → Speichern unter… wählen.
  3. Ziel: MicroPython device.
  4. Als Dateiname exakt main.py eingeben.
  5. Reset-Taste RST kurz drücken oder USB kurz trennen und wieder verbinden.