Componente · Controller
ESP32
ESP32 è un microcontrollore veloce a doppio nucleo con Wi-Fi e Bluetooth integrati: un Arduino per comunicare senza fili. Scopri cosa fa e quando sceglierlo.
Che cos’è
ESP32 è un microcontrollore che sembra un Arduino con una radio montata e i freni rimossi. Ha un processore a 32 bit e doppio nucleo che funziona molte volte più veloce di Uno, molta più memoria e, la caratteristica principale, Wi-Fi e Bluetooth integrati. Questa combinazione è il motivo per cui domina la robotica hobbistica e l’IoT: un robot può ospitare una pagina web per controllarsi, inviare i dati dei sensori al telefono o ricevere comandi via Bluetooth, tutto da un solo chip economico.
Fondamentalmente, lo programmi con lo stesso Arduino IDE e lo stesso linguaggio che potresti già conoscere. Ciò che hai imparato su Uno si trasferisce direttamente; guadagni semplicemente connettività e spazio.
Come funziona
Al centro ci sono due nuclei CPU Xtensa operanti fino a 240 MHz. Avere due nuclei è importante per i robot: un nucleo può eseguire il ciclo di controllo con temporizzazioni stabili mentre l’altro gestisce il Wi-Fi, così la rete non blocca mai le ruote. Intorno alla CPU ci sono le consuete periferiche del microcontrollore: GPIO, canali PWM, più ADC, I²C, SPI, UART, oltre alla radio.
Il fatto pratico più importante è la tensione: ESP32 funziona con logica a 3.3 V, non con i 5 V di Uno. I suoi pin non tollerano i 5 V. L’uscita a 5 V di un sensore, come il pin Echo di un HC-SR04, deve essere ridotta a 3.3 V prima di raggiungere un pin ESP32, altrimenti rischi di danneggiarlo. Questa differenza mette in difficoltà quasi chiunque passi da Uno.
Quando usarlo
Scegli ESP32 quando il tuo robot deve essere senza fili: comando remoto, telemetria, pannello di controllo nel browser, oppure quando ha bisogno di elaborazione che una scheda a 8 bit non riesce a gestire, come elaborare più sensori o eseguire logica leggera sul dispositivo. La variante ESP32-CAM aggiunge una fotocamera e apre la strada a semplici progetti di visione.
Resta con un Arduino Uno quando stai imparando le basi, quando la tolleranza a 5 V rende il cablaggio più sicuro o quando il progetto è semplice e senza connessione: far girare un paio di motori lungo una linea non ha bisogno del Wi-Fi.
Cablaggio e trappole
- È a 3.3 V e non tollera i 5 V. Trasla il livello di qualsiasi segnale a 5 V prima che raggiunga un GPIO. È il modo più comune in cui i principianti danneggiano un ESP32.
- Wi-Fi più motori possono far andare in brownout la scheda. La radio assorbe picchi netti di corrente; condividere un’alimentazione debole con i motori provoca reset. Alimenta i motori separatamente tramite un driver del motore e fornisci a ESP32 una linea 3.3 V stabile.
- Non tutti i pin sono liberi. Diversi GPIO sono solo ingresso, collegati al comportamento di avvio o alla flash interna. Controlla la piedinatura prima di assegnare i pin, altrimenti la scheda non si avvia.
- Stranezze dell’ADC. Uno dei due ADC non è disponibile mentre il Wi-Fi è attivo e le letture sono meno lineari di quelle di Uno: calibra se ti serve precisione.
I pin che non devi usare
ESP32 ha circa 34 GPIO e questo dato è davvero ingannevole, perché un numero significativo di essi è inutilizzabile, utilizzabile solo a determinate condizioni o impedisce l’avvio della scheda. Questa tabella è l’unica cosa che vale la pena leggere prima di cablare qualcosa.
| Pin | Stato | Perché |
|---|---|---|
| GPIO 6–11 | Non usare mai | Collegati alla flash SPI interna. Usarli blocca l’avvio |
| GPIO 0 | Modalità di avvio | Deve essere HIGH al reset, altrimenti la scheda entra in modalità flash |
| GPIO 2 | Modalità di avvio | Deve essere flottante o LOW al reset |
| GPIO 12 | Modalità di avvio | Deve essere LOW al reset: una resistenza di pull-up qui impedisce l’avvio |
| GPIO 15 | Modalità di avvio | HIGH al reset silenzia il log di avvio |
| GPIO 34–39 | Solo ingresso | Nessun driver di uscita e nessuna resistenza di pull-up interna |
| GPIO 1, 3 | Seriale (TX0/RX0) | Usati dal programmatore USB |
I pin più sicuri a uso generale su una scheda di sviluppo standard a 30 pin sono GPIO 4, 5, 13, 14, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33. Inizia da questi ed eviterai tutte le trappole precedenti.
I pin della modalità di avvio causano il guasto più confuso, perché la scheda funziona perfettamente finché non colleghi qualcosa. Una resistenza di pull-up su GPIO 12, del tutto ragionevole per un pulsante, significa che la scheda semplicemente non si avvia, senza errori e senza uscita seriale.
I pin solo ingresso colpiscono in modo diverso: GPIO 34–39 non hanno né resistenza di pull-up né di pull-down interna, quindi un pulsante su uno di essi è flottante e legge valori casuali. Richiedono una resistenza esterna.
3.3 V e ciò che comporta
I pin di ESP32 non tollerano i 5 V ed è il modo più comune in cui le persone danneggiano il chip. Qualsiasi segnale a 5 V richiede gestione:
| Situazione | Soluzione |
|---|---|
| Uscita sensore 5 V → ingresso ESP32 | Divisore resistivo (1 kΩ / 2 kΩ) o un traslatore di livello |
| Uscita ESP32 → ingresso dispositivo 5 V | Di solito va bene: la maggior parte della logica a 5 V legge 3.3 V come HIGH |
| I²C bidirezionale tra 5 V e 3.3 V | Un traslatore di livello bidirezionale adeguato (basato su BSS138) |
| Dispositivo I²C a 5 V con propri pull-up a 3.3 V | Spesso funziona direttamente: controlla dove vanno i pull-up |
L’asimmetria vale la pena interiorizzare: le uscite sono di solito sicure, gli ingressi di solito no. Il pin Echo di un HC-SR04 è il caso classico: immette 5 V pieni su un pin la cui tensione massima assoluta è 3.6 V.
Il problema dell’ADC
L’ADC di ESP32 è la parte più debole del chip e fingere il contrario spreca ore.
ADC2 non funziona mentre il Wi-Fi è attivo. Lo usa la radio. Qualsiasi analogRead su un pin ADC2
restituisce spazzatura o si blocca appena il Wi-Fi si connette e, poiché un robot senza fili è l’intero
motivo per cui usi ESP32, questo esclude quasi completamente ADC2. Usa solo ADC1: GPIO 32–39.
La risposta non è lineare. L’ADC a 12 bit è notevolmente non lineare a entrambe le estremità e le
letture sotto circa 0.1 V e sopra circa 3.1 V sono compresse. Il chip contiene dati di calibrazione di
fabbrica che le funzioni esp_adc_cal dell’ESP-IDF applicano per te; analogRead di Arduino non li usa
per impostazione predefinita.
| Attenuazione | Intervallo di ingresso utilizzabile |
|---|---|
ADC_0db |
0–1.1 V |
ADC_2_5db |
0–1.5 V |
ADC_6db |
0–2.2 V |
ADC_11db (predefinita) |
0–3.3 V, meno lineare |
Se ti serve una precisione reale da un sensore analogico, la risposta pragmatica è un ADC I²C esterno come ADS1115. Costa pochi dollari ed elimina completamente il problema.
Alimentarlo senza brownout
È qui che falliscono più spesso i progetti robotici ESP32 e la causa non è ovvia.
La radio non assorbe una corrente costante: la assorbe a raffiche. Una raffica di trasmissione può
essere di 500 mA per qualche centinaio di microsecondi, contro una media di 40–80 mA. Un’alimentazione
che misura bene con un multimetro può comunque crollare su quei picchi e ESP32 risponde resetandosi con il
messaggio Brownout detector was triggered.
| Regola | Perché |
|---|---|
| Almeno 500 mA, idealmente 1 A | Conta il picco, non la media |
| Metti 100 µF o più vicino al pin 3.3 V della scheda | Carica locale per coprire la raffica |
| Non condividere mai una linea con i motori | Spunto del motore più raffica della radio garantiscono un reset |
| Usa un buon cavo USB | La resistenza di un cavo sottile trasforma una raffica in brownout |
| Preferisci il pin 5 V al pin 3.3 V | Il regolatore integrato gestisce le transizioni |
L’ultimo punto merita di essere detto chiaramente: fornisci 5 V al pin VIN/5V e lascia che il regolatore
della scheda produca 3.3 V. Iniettare direttamente 3.3 V bypassa il regolatore e il suo filtraggio, che è
proprio ciò per cui serve.
Due nuclei e come usarli davvero
Il doppio nucleo è il vero vantaggio di ESP32 per i robot e il framework Arduino lo nasconde: il tuo
loop() viene eseguito sul nucleo 1, mentre lo stack Wi-Fi viene eseguito sul nucleo 0.
Puoi assegnare esplicitamente un’attività a un nucleo:
void controlLoop(void *param) {
const TickType_t period = pdMS_TO_TICKS(10); // exactly 100 Hz
TickType_t last = xTaskGetTickCount();
for (;;) {
readSensors();
updatePid();
driveMotors();
vTaskDelayUntil(&last, period); // no drift, unlike delay()
}
}
void setup() {
xTaskCreatePinnedToCore(
controlLoop, "control", 4096, nullptr,
2, // priority above the default
nullptr,
1); // core 1 — leave core 0 for Wi-Fi
}
Questo è il modello che rende ESP32 davvero adatto ai robot, non solo connesso: un ciclo di controllo con
temporizzazioni rigide su un nucleo e un server web sull’altro che non può bloccarlo. vTaskDelayUntil è
il dettaglio importante: a differenza di delay(), compensa il tempo impiegato dal corpo del ciclo, così
il periodo resta esattamente 10 ms.
Risoluzione dei problemi
| Sintomo | Causa probabile | Soluzione |
|---|---|---|
Brownout detector was triggered |
L’alimentazione crolla durante le raffiche della radio | Alimentazione più rigida, 100 µF locali, fornisci 5 V non 3.3 V |
| La scheda non si avvia affatto | Qualcosa tira GPIO 0, 2 o 12 | Libera i pin della modalità di avvio |
analogRead restituisce spazzatura con il Wi-Fi |
Stai usando un pin ADC2 | Passa ad ADC1: GPIO 32–39 |
| Un pin non sale mai | GPIO 34–39 sono solo ingressi | Usa un pin diverso |
| Il pulsante su GPIO 35 legge valori casuali | Nessun pull-up interno su 34–39 | Aggiungi una resistenza esterna |
| Caricamento non riuscito, serve il pulsante BOOT | Manca il circuito di autoreset sul clone | Tieni premuto BOOT mentre inizia il caricamento, oppure aggiungi un condensatore da 10 µF su EN |
| Reset casuali sotto carico dei motori | Linea di alimentazione condivisa | Alimentazioni separate, massa comune |
| Sensore danneggiato dopo il cablaggio | 5 V su un pin a 3.3 V | Trasla il livello e controlla che il pin funzioni ancora |
| Il Wi-Fi cade quando i motori girano | Interferenza della radio o crollo dell’alimentazione | Allontana l’antenna dai cavi dei motori; disaccoppia l’alimentazione |
ESP32 o Arduino Uno?
| Uno | ESP32 | |
|---|---|---|
| Velocità | 16 MHz, 8 bit | Fino a 240 MHz, 32 bit a doppio nucleo |
| SRAM | 2 KB | 520 KB |
| Logica | 5 V, tollerante | 3.3 V, intransigente |
| Wireless | Nessuno | Wi-Fi e Bluetooth |
| Trappole dei pin | Quasi nessuna | Diverse che impediscono l’avvio della scheda |
| Curva di apprendimento | Tutto funziona al primo tentativo | Leggi la piedinatura prima di cablare |
Entrambe usano lo stesso linguaggio e lo stesso IDE, ed è questo il punto: il passaggio ti costa quasi niente in codice e parecchio in disciplina di cablaggio.
La raccomandazione onesta è: impara su Uno, costruisci con ESP32. La tolleranza a 5 V di Uno e l’assenza completa di trappole nei pin rendono recuperabili i tuoi primi errori. Quando sai che cos’è un ciclo di controllo e perché le masse devono essere comuni, ESP32 offre quindici volte la velocità di clock, 260 volte la memoria e una radio, per circa la stessa somma.
La variante ESP32-CAM merita una considerazione separata: aggiunge una fotocamera e uno slot SD per pochi dollari ed è di gran lunga la rotta più economica verso la visione robotica, al costo di non avere quasi più GPIO liberi.
Esplora il grafo
Usato in queste costruzioni
Progetti, percorsi di apprendimento e simulatori che includono ESP32.
Confronto
Alternative
Domande
FAQ su ESP32
Che cos'è ESP32?
ESP32 è un microcontrollore a basso costo con processore a doppio nucleo e Wi-Fi e Bluetooth integrati. Pensa a un Arduino molto più veloce, in grado di comunicare senza fili con reti e telefoni: è per questo che alimenta la maggior parte dei progetti robotici e IoT connessi.
A cosa si usa ESP32?
Si usa ogni volta che un progetto ha bisogno di connettività wireless o di più elaborazione di quanta possa offrire una scheda a 8 bit: robot controllati via Wi-Fi, pannelli di controllo nel browser, comando remoto Bluetooth, nodi sensoriali che trasmettono al cloud e progetti con fotocamera che usano la variante ESP32-CAM.
ESP32 è migliore di Arduino Uno?
Sulle specifiche grezze sì: è molto più veloce, ha più memoria e include la connettività wireless che manca a Uno. Però Uno è a 5 V e più tollerante agli errori di cablaggio, mentre ESP32 è a 3.3 V e meno tollerante. Per imparare le basi Uno è più gentile; per robot connessi o impegnativi dal punto di vista computazionale vince ESP32.
Qual è la differenza fra Arduino ed ESP32?
Arduino di solito indica una scheda a 8 bit, 5 V, mono-nucleo e senza radio. ESP32 è una scheda a 32 bit, 3.3 V, a doppio nucleo con Wi-Fi e Bluetooth integrati. Confusamente, programmi entrambe con Arduino IDE, quindi «Arduino» può indicare anche il linguaggio e gli strumenti, oltre alle schede classiche.
ESP32 usa C o C++?
ESP32 viene programmato in C++ (con molto C) usando il framework Arduino o l'ESP-IDF di Espressif. Se hai scritto sketch Arduino, linguaggio e struttura passano direttamente: guadagni soprattutto Wi-Fi, Bluetooth e più pin da usare.
Si può programmare ESP32 con Arduino IDE?
Sì. Dopo aver aggiunto il pacchetto della scheda ESP32 al gestore schede di Arduino IDE, scrivi e carichi sketch esattamente come faresti per Uno, e le librerie esistenti funzionano in gran parte. È il modo più semplice per iniziare, prima di passare a ESP-IDF per funzionalità avanzate.
Per approfondire