Der ESP32 bietet eine ganze Reihe von GPIOs. Da ich selbst beim PCB-Design nun schon mehrfach Probleme hatte weil ich eine falsche Wahl getroffen habe, möchte ich das alles mal zusammenschreiben. Grundsätzlich kann man die GPIOs recht frei verwenden, aber es gibt auch Dinge, die man beachten sollte.
Übersicht
GPIO | Input | Output | Kommentar |
---|---|---|---|
0 | pulled up | Gibt PWM-Signal während Bootvorgang aus | |
1 | TX-Pin | Debug-Output während Bootvorgang | |
2 | Wird für SDMMC verwendet bei ESPuino. Darf nicht HIGH sein, wenn man den ESP32 flashen will. | ||
3 | RX-Pin | HIGH während Bootvorgang | |
4 | Debug-Output während Bootvorgang | ||
5 | Gibt PWM-Signal während Bootvorgang aus | ||
6 | Verbunden mit internem SPI-Flash | ||
7 | Verbunden mit internem SPI-Flash | ||
8 | Verbunden mit internem SPI-Flash | ||
9 | Verbunden mit internem SPI-Flash | ||
10 | Verbunden mit internem SPI-Flash | ||
11 | Verbunden mit internem SPI-Flash | ||
12 | Bei Boot-Fehler HIGH | ||
13 | |||
14 | Gibt PWM-Signal während Bootvorgang aus | ||
15 | Gibt PWM-Signal während Bootvorgang aus | ||
16 | Nicht vorhanden bei ESP32-WROVER | ||
17 | Nicht vorhanden bei ESP32-WROVER | ||
18 | |||
19 | |||
21 | |||
22 | |||
23 | |||
25 | |||
26 | |||
27 | |||
32 | |||
33 | |||
34 | Kann nur Input, besitzt dort jedoch keinen internen PullUp | ||
35 | Kann nur Input, besitzt dort jedoch keinen internen PullUp | ||
36 (VP) | Kann nur Input, besitzt dort jedoch keinen internen PullUp | ||
35 (VN) | Kann nur Input, besitzt dort jedoch keinen internen PullUp |
Mit welchen GPIOs kann man den ESP32 aus dem Deepsleep aufwecken?
Dies geht nur mit sog. RTC-GPIOs. Diese sind: 0, 4, 12, 13, 14, 15, 25, 26, 27, 32, 33, 34, 35, 36, 39.
In ESPuino wird hierfür die Einstellung WAKEUP_BUTTON
genutzt.
Mit welchen GPIOs kann man analoge Signale messen?
Dies geht mit einer ganzen Reihe von GPIOs, jedoch sind davon nicht alle nutzbar, wenn WLAN aktiv ist. Und das ist halt mal ein Standardzustand beim ESPuino. Übrig bleiben mit WLAN also:
- ADC1_CH0 (GPIO 36)
- ADC1_CH1 (GPIO 37)
- ADC1_CH2 (GPIO 38)
- ADC1_CH3 (GPIO 39)
- ADC1_CH4 (GPIO 32)
- ADC1_CH5 (GPIO 33)
- ADC1_CH6 (GPIO 34)
- ADC1_CH7 (GPIO 35)
Weiterhin ist zu erwähnen, dass die ADC-Messung des ESP32 nicht fürchterlich genau ist. Speziell im oberen Spannungsbereich (Auflösung 0 bis 4095) wird es eher schlechter. Braucht man es genau, so benutzt man besser einen externen ADC-Chip.
Welche GPIOs sind mit Vorsicht zu genießen?
- GPIO0: Gibt beim Booten ein PWM-Signal aus. Wird beim Booten dieser GPIO auf GND gezogen, so geht der ESP32 in den Flash-Modus (den er alleine auch nicht mehr verlässt). Heißt: Sowas wie einen Button kann man schon drauflegen, aber beim Booten sollte man diesen nicht gedrückt halten. Anders gesagt: Werden die GPIOs knapp, so verwendet man ihn halt ggf. Wenn jedoch keine Not besteht, dann lässt man ihn besser unbeschaltet. GPIO0 wird ansonsten gerne verwendet, um Taktsignale zu generieren (beispielsweise MCLK).
- GPIO1/3: Diese werden für UART/Serial benötigt und bei Verwendung funktioniert unter Umständen das Flashen oder die serielle Ausgabe nicht mehr. Zumindest beim DevkitC sind diese mit PullUp-Widerständen versehen und man kann z.B. Buttons damit auslesen. Eigentlich ähnlich zu GPIO0 in der Hinsicht, dass man sie nicht permanent auf GND ziehen sollte.
- GPIO2: Wird von SD_MMC verwendet und das Problem ist, dass auf SD-Boards gerne PullUp-Widerstände eingelötet sind. Wird jener für GPIO2 nicht entfernt, so lässt sich der ESP32 nicht mehr drahtgebunden mit einer neuen Firmware flashen. Kurzum: Dieser GPIO darf beim Booten nicht auf HIGH gezogen werden. Der Trick, dass dieser dennoch mit SD_MMC funktioniert geht so, dass zwar der externe PullUp-Widerstand entfernt, der interne beim Start jedoch zugeschaltet wird. Problem gelöst
- GPIO12: ESP32 bootet nicht wenn dieser GPIO auf HIGH gezogen wird beim Bootvorgang. Normalerweise hänge ich immer den Neopixel an GPIO12, das macht keinerlei Probleme.
- GPIO13: Mir ist ehrlich gesagt unklar warum, aber es zeigt sich, dass dieser für verschiedene Sachen Probleme bereitet. Siehe hier und hier und hier. Für i2c habe ich ihn jedoch ohne Probleme im Einsatz als Datapin.
- GPIO34, 35, 36 (VP), 39 (VN): Hierbei handelt es sich eigentlich nur um GPIs, d.h. sie können nicht als Ausgänge verwendet werden. Weiterhin haben sie keine internen PullUp oder PullDown-Widerstände, die man, wie man anderen GPIOs, bei Bedarf per Software zuschalten kann. Bedeutet: Will man z.B. einen Taster anschließen, so muss man einen externen PullUp-Widerstand (10k z.B.) vorsehen, da der Eingang sonst prellt. Hinweis: Schaltet man per Software auf einem GPI einen PullUp/Down-Widerstand zu, so gibt es keine Warnung oder Fehler. Es passiert dann nur halt einfach nicht.
Ich hänge gerne den Drehencoder an 34, 36 und 39, da dieser normalerweise (Ausnahmen bestätigen die Regel) eh selbst PullUp-Widerstände für BTN, CLK und DT besitzt. 35 wird auf verschiedenen Develboards gerne zum Messen der Akkuspannung verwendet (hochohmigen Spannungsteiler dabei nicht vergessen, da die GPIOs des ESP32 nur 3,3 V vertragen!).
Weitere Hinweise
- Für SD_MMC (1 Bit) müssen immer die GPIOs 2, 14 und 15 verwendet werden, das ist nicht veränderbar. Bei SPI ist das anders. Dieses braucht dafür aber einen GPIO mehr (CS) und ist auch langsamer, was den Datendurchsatz von SD angeht.
- Beim ESP32-WROVER sind die GPIOs 16 und 17 nicht verfügbar, da diese für den PSRAM verwendet werden. Beim ESP32-WROOM stehen sie entsprechend zur Verfügung.
- Bei der Verwendung von Develboards kann es hilfreich sein, sich vorher den Schaltplan anzuschauen. Beispielsweise beim Lolin D32 pro sieht man, dass GPIO5 mit einer LED versehen wurde (in Form eines Open Collector). D.h. wenn dieser GPIO auf LOW gezogen wird, so leuchtet die LED. Dies führt einerseits zu etwas mehr Stromverbrauch und andererseits bei einem hohen Takt ggf. zu Problemen. Zur Not kann man den LED jedoch auch auslöten. Hierzu eine etwas größere Lötspitze verwenden, so dass der Hitzeübertrag gut funktioniert. Dabei nicht zu viel Druck ausüben, so dass nicht ein Teil der Leiterbahn rausreißt.
- Es gibt Develboards, die führen nicht alle verfügbaren GPIOs nach außen. Ein Beispiel: Page Not Found - Aliexpress.com, bei dem mindestens GPIO0 fehlt.
- Bedenke: Alle GPIOs vertragen nur 3,3 V.
Links
- ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials
- GPIO & RTC GPIO - ESP32 - — ESP-IDF Programming Guide latest documentation