📗 Die GPIOs des ESP32: Welche eignen sich fĂŒr was?

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.

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.
  • 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 den SD-Boards 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 :slight_smile:
  • 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 Drahtlose WiFi Bluetooth Entwicklung Bord Micro USB Dual Core CP2102|Replacement Parts & Accessories| - AliExpress, bei dem mindestens GPIO0 fehlt.
  • Bedenke: Alle GPIOs vertragen nur 3,3 V.

Links

DatenblÀtter

3 „GefĂ€llt mir“

Ich wĂŒrde hier noch die GPIOs 1 und 3 ergĂ€nzen (TX und RX). 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 pull-up 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.

@biologist Vielen Dank fĂŒr die hilfreichen Hinweise zu den verwendbaren GPIOs!
Eine gute Übersicht auch noch hier mit vielen Details.

Scheinbar hatte ich vorhin vergessen, diese Seite selbst zu verlinken. Genau diese hatte ich auch offen und auch schon sehr oft besucht.
@SZenglein Ich muss ja zugeben, dass ich noch nie auf die Idee kam, diese beiden GPIOs fĂŒr was Anderes zu verwenden als Serial. Aber nehme das gerne morgen noch auf. Danke fĂŒr den Hinweis.

Wenn es noch weitere Hinweise gibt, nehme ich gerne noch weitere Fakten/Punkte auf.