I pin da evitare o da usare con cautela
L’ESP32 ha 34 GPIO, ma su una DevKit solo due terzi circa si comportano come pin qualsiasi. Quattro gruppi richiedono attenzione.
GPIO da 6 a 11: occupati dalla flash
Questi sei pin collegano il chip alla flash SPI dentro il modulo. Le DevKitC li portano fuori come CLK, SD0, SD1, SD2, SD3 e CMD, ma usarli blocca il programma o impedisce l’avvio della scheda.
GPIO 0, 2, 5, 12 e 15: pin di strapping
Il chip legge questi pin al reset per decidere come avviarsi. Quando il programma gira sono GPIO normali, quindi vanno bene come uscite o per i pulsanti. I problemi nascono da tutto ciò che impone il livello sbagliato all’accensione, come una resistenza di pull-up, un modulo che pilota la linea o un sensore che la tiene.
| GPIO | Valore al reset | Cosa sceglie | In pratica |
|---|---|---|---|
| 0 | Pull-up (ALTO) | Modo di avvio: ALTO esegue il programma, BASSO entra in modalità download | Niente deve tenerlo BASSO all’accensione |
| 2 | Pull-down (BASSO) | Deve essere BASSO o scollegato per la modalità download | Niente pull-up; spesso è il LED della scheda |
| 5 | Pull-up (ALTO) | Temporizzazione SDIO slave, insieme a GPIO15 | Va bene per quasi tutto |
| 12 | Pull-down (BASSO) | Tensione della flash: BASSO 3,3 V, ALTO 1,8 V | Mai ALTO al reset |
| 15 | Pull-up (ALTO) | Log di avvio su UART0: ALTO lo stampa, BASSO lo silenzia | Sicuro; BASSO nasconde solo il log |
GPIO da 34 a 39: solo ingresso
Questi pin non hanno stadio di uscita né pull-up o pull-down interni. Sono ottimi per le letture analogiche e per i pulsanti con una resistenza esterna, ma non possono accendere un LED, un relè o una linea di bus. GPIO 37 e 38 esistono nel chip ma non sono portati fuori sui moduli WROOM.
GPIO 1 e 3: la porta seriale USB
La UART0 va al convertitore USB-seriale e porta sia il caricamento dei programmi sia Serial. In un progetto finito puoi riusare questi pin, ma perdi il monitor seriale e il caricamento può fallire mentre è collegato qualcosa.
L’ADC2 smette di funzionare con il WiFi acceso
L’ESP32 ha due ADC. L’ADC1 è sui GPIO da 32 a 39, l’ADC2 sui GPIO 0, 2, 4, da 12 a 15 e da 25 a 27. Il driver WiFi usa l’ADC2, quindi appena il WiFi parte le letture su quei pin falliscono o danno valori senza senso. In un progetto connesso metti tutti gli ingressi analogici sull’ADC1. Per misurare la batteria la scelta abituale è GPIO 34 o 35 con un partitore resistivo.
Anche sull’ADC1 le letture non sono lineari vicino agli estremi. Con l’attenuazione da 12 dB Espressif consiglia di restare all’incirca tra 0,15 V e 2,45 V per risultati precisi, quindi dimensiona il partitore per tenere il segnale in quella finestra.
Tabella completa dei GPIO dell’ESP32
| GPIO | Stato | ADC | Touch | RTC | Note |
|---|---|---|---|---|---|
| GPIO0 | Con cautela | ADC2_CH1 | T1 | RTC_GPIO11 | strapping |
| GPIO1 (TX) | Con cautela | — | — | — | seriale USB, UART0 TX |
| GPIO2 | Con cautela | ADC2_CH2 | T2 | RTC_GPIO12 | strapping, LED su alcune schede |
| GPIO3 (RX) | Con cautela | — | — | — | seriale USB, UART0 RX |
| GPIO4 | Libero | ADC2_CH0 | T0 | RTC_GPIO10 | — |
| GPIO5 | Con cautela | — | — | — | strapping, VSPI SS |
| GPIO6 (CLK) | Da non usare | — | — | — | flash SPI |
| GPIO7 (SD0) | Da non usare | — | — | — | flash SPI |
| GPIO8 (SD1) | Da non usare | — | — | — | flash SPI |
| GPIO9 (SD2) | Da non usare | — | — | — | flash SPI |
| GPIO10 (SD3) | Da non usare | — | — | — | flash SPI |
| GPIO11 (CMD) | Da non usare | — | — | — | flash SPI |
| GPIO12 | Con cautela | ADC2_CH5 | T5 | RTC_GPIO15 | strapping, HSPI MISO |
| GPIO13 | Libero | ADC2_CH4 | T4 | RTC_GPIO14 | HSPI MOSI |
| GPIO14 | Libero | ADC2_CH6 | T6 | RTC_GPIO16 | possibile attività all’avvio, HSPI SCK |
| GPIO15 | Con cautela | ADC2_CH3 | T3 | RTC_GPIO13 | strapping, HSPI SS |
| GPIO16 | Libero | — | — | — | PSRAM sui WROVER, RX2/TX2 su alcune schede |
| GPIO17 | Libero | — | — | — | PSRAM sui WROVER, RX2/TX2 su alcune schede |
| GPIO18 | Libero | — | — | — | VSPI SCK |
| GPIO19 | Libero | — | — | — | VSPI MISO |
| GPIO21 | Libero | — | — | — | I2C SDA |
| GPIO22 | Libero | — | — | — | I2C SCL |
| GPIO23 | Libero | — | — | — | VSPI MOSI |
| GPIO25 | Libero | ADC2_CH8 | — | RTC_GPIO6 | — |
| GPIO26 | Libero | ADC2_CH9 | — | RTC_GPIO7 | — |
| GPIO27 | Libero | ADC2_CH7 | T7 | RTC_GPIO17 | — |
| GPIO32 | Libero | ADC1_CH4 | T9 | RTC_GPIO9 | quarzo 32 kHz |
| GPIO33 | Libero | ADC1_CH5 | T8 | RTC_GPIO8 | quarzo 32 kHz |
| GPIO34 | Solo ingresso | ADC1_CH6 | — | RTC_GPIO4 | solo ingresso |
| GPIO35 | Solo ingresso | ADC1_CH7 | — | RTC_GPIO5 | solo ingresso |
| GPIO36 (VP) | Solo ingresso | ADC1_CH0 | — | RTC_GPIO0 | solo ingresso |
| GPIO39 (VN) | Solo ingresso | ADC1_CH3 | — | RTC_GPIO3 | solo ingresso |
I pin RTC possono svegliare il chip dal deep sleep (ext0 per un pin, ext1 per un gruppo), i pin touch possono svegliarlo con un tocco. I ruoli predefiniti sono quelli di Arduino-ESP32: Wire su 21/22, SPI (VSPI) su 18/19/23/5. I pin predefiniti di Serial2 sono cambiati con il core 3.x, quindi indicali sempre.
Domande frequenti
Quali pin dell’ESP32 si possono usare senza problemi?
Su una DevKit i GPIO senza limitazioni sono 4, 13, 14, da 16 a 19, da 21 a 23, da 25 a 27, 32 e 33. I GPIO da 34 a 39 vanno bene come ingressi. I GPIO 0, 2, 5, 12 e 15 funzionano quando il programma gira ma decidono come si avvia il chip, mentre i GPIO da 6 a 11 appartengono alla flash. Sui moduli WROVER i GPIO 16 e 17 sono occupati dalla PSRAM.
Posso usare i pin ADC2 con il WiFi?
No. Il driver WiFi usa l’ADC2, quindi le letture analogiche sui GPIO 0, 2, 4, da 12 a 15 e da 25 a 27 falliscono con il WiFi acceso. Usa i pin dell’ADC1, i GPIO da 32 a 39. L’ADC2 torna a funzionare solo a WiFi spento.
Perché il mio ESP32 non si avvia dopo che ho collegato qualcosa al GPIO12?
Il GPIO12 sceglie la tensione della flash al reset. Se un pull-up o un modulo collegato lo tiene ALTO, il chip alimenta la flash a 1,8 V e i moduli con flash a 3,3 V non partono. Sposta il collegamento su un altro pin, oppure scrivi la tensione della flash negli eFuse con espefuse set-flash-voltage 3.3V. Quest’ultimo passo è permanente e non si può annullare.
Quali pin possono svegliare l’ESP32 dal deep sleep?
I GPIO RTC: 0, 2, 4, da 12 a 15, da 25 a 27 e da 32 a 39. Con ext0 il risveglio avviene su un pin, con ext1 su un gruppo di pin. Anche i pin touch possono svegliare il chip con un tocco.
Quali sono i pin I2C e SPI predefiniti dell’ESP32?
In Arduino-ESP32 Wire usa il GPIO 21 per SDA e il 22 per SCL, mentre SPI usa i pin VSPI: 18 SCK, 19 MISO, 23 MOSI e 5 SS. Grazie alla GPIO matrix puoi spostarli su quasi tutti i pin che supportano l’uscita, passando i pin a Wire.begin() o SPI.begin().
I pin dell’ESP32 tollerano i 5 V?
No. I GPIO lavorano a 3,3 V ed Espressif non li garantisce per i 5 V. Collega i segnali a 5 V tramite un traslatore di livello o un partitore resistivo.