ESP32 Pinout – welcher Pin kann eigentlich was?

Als ich das erste Mal einen ESP32 vor mir liegen hatte, war mein erster Gedanke ungefähr: Warum braucht so ein kleines Board bitte so viele Pins? Und noch besser: Warum steht an manchen Pins GPIO, an anderen ADC, daneben SPI oder UART und irgendwo liest man dann noch etwas von Boot-Strapping-Pins?

Genau deshalb lohnt es sich meiner Meinung nach, sich das ESP32 Pinout einmal genauer anzuschauen. Denn die Pins sehen zwar ähnlich aus, sind aber keineswegs alle für denselben Zweck gedacht.

ESP32 Pinout – Das Wichtigste zuerst:

Eine Bezeichnung wie GPIO23 beschreibt den eigentlichen GPIO des ESP32. Die Beschriftung auf dem Entwicklungsboard kann allerdings anders aussehen. Bei einem typischen ESP32-DevKit findet man beispielsweise Pins wie GPIO4, GPIO5, GPIO18, GPIO19, GPIO21, GPIO22 oder GPIO23.

Ein GPIO kann grundsätzlich als digitaler Eingang oder Ausgang verwendet werden. Genau damit fangen die meisten Projekte an. Eine LED einschalten, einen Taster abfragen oder einen Sensor über ein digitales Signal auslesen – dafür sind GPIOs da.

Zum Beispiel:

pinMode(2, OUTPUT);
digitalWrite(2, HIGH);

Damit wird GPIO 2 als Ausgang verwendet und anschließend auf HIGH gesetzt. Aber genau hier beginnt schon die erste Falle: Nur weil ein Pin als GPIO vorhanden ist, bedeutet das nicht automatisch, dass er für jeden Zweck ideal ist.

Einige GPIOs haben nämlich zusätzliche Funktionen. Dazu gehören beispielsweise ADC, PWM, UART, I²C oder SPI.

ADC bedeutet Analog-to-Digital Converter. Damit kann der ESP32 eine analoge Spannung messen. Ein Potentiometer oder ein analoger Sensor kann beispielsweise an einen ADC-fähigen Pin angeschlossen werden.

Bei einem ESP32 ist dabei ein Detail wichtig, das gerne übersehen wird: Es gibt unterschiedliche ADC-Einheiten, und insbesondere die ADC2-Pins können beim klassischen ESP32 problematisch sein, wenn gleichzeitig Wi-Fi verwendet wird. Deshalb sollte man bei analogen Messungen genau auf das Pinout und das verwendete ESP32-Modell achten.

Auch PWM ist interessant. Damit kann beispielsweise die Helligkeit einer LED verändert oder ein Motor angesteuert werden. Beim ESP32 wird PWM über die LEDC-Hardware realisiert und ist nicht auf wenige fest verdrahtete Pins beschränkt wie bei manchen anderen Mikrocontrollern.

Dann gibt es die seriellen Schnittstellen.

Der ESP32 besitzt mehrere UARTs, die für serielle Kommunikation verwendet werden können. Damit kann man beispielsweise mit einem GPS-Modul, einem anderen Mikrocontroller oder einem seriellen Gerät kommunizieren.

Für I²C werden häufig GPIO21 als SDA und GPIO22 als SCL verwendet. Das ist bei vielen ESP32-Entwicklungsboards eine praktische Standardbelegung. Wichtig ist aber: I²C ist beim ESP32 grundsätzlich flexibel routbar. Man ist also nicht zwangsläufig auf diese beiden Pins festgelegt.

Ähnlich sieht es bei SPI aus. Häufig begegnen einem beim klassischen ESP32 beispielsweise GPIO18 für SCK, GPIO19 für MISO, GPIO23 für MOSI und GPIO5 als CS. Auch hier kann die tatsächliche Belegung je nach Board und Anwendung anders sein.

Und dann kommen die Pins, bei denen ich inzwischen etwas vorsichtiger bin: die sogenannten Strapping Pins.

Diese Pins haben beim Start des ESP32 eine besondere Bedeutung. Ihr Pegel kann beeinflussen, in welchem Boot-Modus der Chip startet. Deshalb sollte man sie nicht einfach bedenkenlos mit irgendwelchen Schaltungen verbinden.

Ein Klassiker ist GPIO0. Dieser Pin spielt beim Bootloader-Modus eine Rolle. Bei vielen ESP32-Boards befindet sich deshalb ein BOOT-Taster, der GPIO0 beim Programmieren entsprechend auf einen bestimmten Pegel zieht.

Das erklärt auch ein Verhalten, das am Anfang ziemlich mysteriös wirken kann: Eine Schaltung funktioniert plötzlich nicht mehr richtig, sobald man einen bestimmten Pin beschaltet. Manchmal liegt es nicht am Programm, sondern daran, dass die externe Beschaltung den ESP32 bereits beim Start beeinflusst.

Auch GPIO12 sollte man beim klassischen ESP32 nicht einfach gedankenlos verwenden. Dieser Pin gehört ebenfalls zu den Strapping-Pins und kann beim Booten eine wichtige Rolle spielen.

Dann gibt es noch die Pins, die man besser nicht für normale eigene Schaltungen verwendet. Beim klassischen ESP32 gehören dazu unter anderem GPIO6 bis GPIO11, da sie normalerweise mit dem internen SPI-Flash verbunden sind.

Ein weiterer wichtiger Punkt ist die Spannung. Die GPIOs des ESP32 arbeiten grundsätzlich mit 3,3 Volt. Das bedeutet insbesondere: Ein Signal mit 5 Volt sollte nicht einfach auf einen GPIO gegeben werden, nur weil ein angeschlossenes Modul ebenfalls mit 5 Volt betrieben wird.

Das ist ein Unterschied, den man sich wirklich merken sollte:

Versorgung des Moduls ≠ automatisch Signalpegel des ESP32

Ein Sensor kann beispielsweise mit 5 Volt versorgt werden und trotzdem ein 3,3-Volt-kompatibles Signal liefern. Bei einem anderen Modul können dagegen tatsächlich 5 Volt am Ausgang anliegen. Im Zweifel muss man das Datenblatt anschauen oder einen geeigneten Pegelwandler verwenden.

Auch GND darf natürlich nicht vergessen werden. Wenn zwei Geräte miteinander kommunizieren, brauchen sie bei einer normalen gemeinsamen elektrischen Verbindung in der Regel ein gemeinsames Bezugspotential.

Ein typischer Aufbau könnte beispielsweise so aussehen:

ESP32                I²C-Sensor

3.3V  -------------- VCC
GND   -------------- GND
GPIO21 ------------- SDA
GPIO22 ------------- SCL

Und plötzlich wird aus dem scheinbar komplizierten Pinout eine ziemlich überschaubare Sache.

Was ich beim ESP32 besonders praktisch finde, ist die große Flexibilität. Viele Funktionen können verschiedenen GPIOs zugeordnet werden. Trotzdem würde ich nicht einfach irgendeinen Pin auswählen, nur weil er gerade frei aussieht.

Ich schaue inzwischen zuerst: Ist dieser GPIO beim Booten kritisch? Ist er bereits für den Flash-Speicher reserviert? Ist er input-only? Kann er ADC? Brauche ich PWM? Gibt es Einschränkungen bei Wi-Fi? Und welche Pins verwendet mein konkretes Board möglicherweise schon für USB-zu-Seriell oder andere Funktionen?

Gerade der letzte Punkt ist wichtig, weil ESP32 nicht gleich ESP32 ist. Ein klassischer ESP32, ein ESP32-S2, ESP32-S3, ESP32-C3 oder ESP32-C6 haben teilweise deutlich unterschiedliche GPIOs und Eigenschaften. Auch verschiedene DevBoards führen Pins unterschiedlich heraus.

Deshalb würde ich mich nie ausschließlich auf irgendeine allgemeine ESP32-Pinout-Grafik verlassen. Erst das genaue Board identifizieren und dann das dazugehörige Pinout anschauen.

Eine kleine persönliche Merkhilfe habe ich mir trotzdem angewöhnt: Für einfache digitale Ein- und Ausgänge gibt es viele Möglichkeiten. Bei speziellen Funktionen sollte man genauer hinschauen. Und bei Boot-Strapping-Pins lasse ich lieber etwas Vorsicht walten.

Wenn man diese paar Grundlagen verstanden hat, verliert das Pinout seinen Schrecken ziemlich schnell. Dann ist ein Pin nicht mehr einfach nur „dieses Loch links neben dem anderen“, sondern man weiß, welche Aufgabe er übernehmen kann und welche Stolperfallen möglicherweise dahinterstecken.

Und genau das macht den ESP32 meiner Meinung nach so interessant: Auf diesem kleinen Board steckt unglaublich viel Funktionalität. GPIOs, ADC, PWM, UART, I²C, SPI, WLAN und Bluetooth – und trotzdem passt das Ganze auf eine Platine, die kaum größer als ein Finger ist.

Mich würde interessieren, welche Pins ihr beim ESP32 bevorzugt. Gibt es bei euch eine feste Standardbelegung für I²C, SPI, Sensoren und Ausgänge? Oder schaut ihr bei jedem Projekt wieder ins Pinout und entscheidet von Fall zu Fall?

1 comment

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert