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.
Hinweis: Von Belang (fĂŒr ESPuino) sind die nachfolgenden Beschreibungen nur, wenn man sich an ein eigenes Platinenlayout heranwagen möchte. Nutzt man ESPuino-mini 4Layer oder ESPuino complete, so ist alles schon passend miteinander verbunden und in den Settings-Files konfiguriert. Dann könnte höchstens noch die Information relevant sein, was man mit den noch freien GPIOs 0, 5 und 32 anstellen kann. So oder so: Es wird nur fĂŒr wenige Leute von Belang sein.
Ă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 |
39 (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: ESP32 ESP32S esp32 DEVKIT V1 Wireless WiFi Bluetooth Development Board Micro/Type-C USB Dual Core CP2102 CH340 Chip optional - AliExpress 44, 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