ESP32-C6 o ESP32-S3: differenze e quale scegliere

Indice
L’ESP32-C6 e l’ESP32-S3 sono oggi i due SoC Espressif più usati nei nuovi progetti, ma risolvono problemi diversi. L’ESP32-C6 è il chip della connettività: Wi-Fi 6, Bluetooth LE 5.3 e radio 802.15.4 per Thread e Zigbee, con un core RISC-V a basso consumo. L’ESP32-S3 è il chip del calcolo e delle interfacce: due core a 240 MHz, PSRAM esterna, USB OTG, touch capacitivo e interfacce per display e camera.
Se il dispositivo deve parlare Thread o Matter su Thread, la scelta è l’ESP32-C6. Se deve gestire un display grafico, una camera, l’audio o grandi buffer, serve l’ESP32-S3. Tutto il resto è una valutazione su costo, consumi e firmware, che trovi in questo articolo.
Questo è il primo articolo della serie Firmware moderno con ESP32: partiamo dalla scelta del chip, perché è la decisione che costa di più correggere dopo il primo prototipo.
Le differenze in una tabella
| Caratteristica | ESP32-C6 | ESP32-S3 |
|---|---|---|
| CPU principale | 1× RISC-V, fino a 160 MHz | 2× Xtensa LX7, fino a 240 MHz |
| Core a basso consumo | LP RISC-V, fino a 20 MHz | ULP RISC-V e ULP FSM |
| SRAM interna | 512 KB HP + 16 KB LP | 512 KB + 16 KB RTC |
| PSRAM esterna | Non supportata | Quad o octal |
| Wi-Fi | Wi-Fi 6 (802.11ax), 2,4 GHz | Wi-Fi 4 (802.11n), 2,4 GHz |
| Bluetooth | LE 5.3 | LE 5 |
| 802.15.4 (Thread, Zigbee) | Sì | No |
| GPIO | 30 (QFN40) o 22 (QFN32) | 45 |
| ADC | 1× 12 bit, 7 canali | 2× 12 bit, 20 canali |
| Touch capacitivo | No | 14 canali |
| USB | Serial/JTAG | OTG full-speed e Serial/JTAG |
| CAN (TWAI) | 2 controller | 1 controller |
| Display e camera | Solo via SPI/I2C | LCD parallelo e camera DVP |
I valori provengono dai datasheet Espressif dei due chip. Il numero di GPIO utilizzabili sulla tua scheda è sempre inferiore: flash, PSRAM e USB occupano alcuni pin.

CPU: RISC-V contro Xtensa
L’ESP32-S3 ha due core Xtensa LX7 a 240 MHz con istruzioni vettoriali (SIMD) per l’elaborazione di segnali e le reti neurali. Con FreeRTOS puoi dedicare un core allo stack Wi-Fi e l’altro all’applicazione, oppure separare l’interfaccia grafica dalla logica di controllo. Sui carichi di calcolo è nettamente più veloce.
L’ESP32-C6 ha un solo core applicativo RISC-V a 160 MHz, più un secondo core RISC-V a basso consumo (LP) a 20 MHz. Il core LP resta attivo quando il core principale dorme: può leggere un sensore su I2C o UART e svegliare il sistema solo quando serve. Per un nodo sensore è più utile di un secondo core veloce.
C’è anche un aspetto di strumenti. Le architetture RISC-V usano il compilatore standard, e il supporto di linguaggi come Rust è più semplice da installare rispetto a Xtensa, che richiede una toolchain dedicata. Le famiglie Espressif più recenti sono tutte RISC-V: se il firmware dovrà passare ad altri chip della stessa casa, il C6 è un buon punto di partenza. Tratteremo Rust in una serie dedicata.
Radio: Wi-Fi 6, Thread e Zigbee
Il Wi-Fi 6 dell’ESP32-C6 lavora solo a 2,4 GHz e, in modalità 802.11ax, con canali da 20 MHz. Non lo scegli per la velocità: un dispositivo IoT trasferisce pochi kilobyte. Lo scegli per due funzioni:
- Target Wake Time (TWT): il dispositivo concorda con l’access point quando svegliarsi, invece di ascoltare a ogni beacon. Su un nodo a batteria la differenza di consumo è concreta, ma solo se l’access point supporta TWT. Verificalo sull’impianto del cliente prima di contarci.
- OFDMA: l’access point serve più client nello stesso intervallo. In una casa o un capannone con decine di dispositivi la rete resta più stabile.
La radio IEEE 802.15.4 è la vera discriminante. Permette all’ESP32-C6 di funzionare come dispositivo Thread o Zigbee, quindi anche come dispositivo Matter su Thread. L’ESP32-S3 può usare Matter solo via Wi-Fi.
Una precisazione per chi progetta un gateway: la scheda di riferimento di Espressif per il Thread Border Router usa due chip, un ESP32-S3 per il Wi-Fi e la logica e un ESP32-H2 per la rete Thread. Un border router con un solo ESP32-C6 è possibile, ma le due radio condividono la stessa antenna a 2,4 GHz e lavorano a divisione di tempo. In un prodotto con traffico intenso conviene la soluzione a due chip.
Memoria: il vero limite dell’ESP32-C6
Entrambi i chip hanno 512 KB di SRAM interna, ma lo stack Wi-Fi, quello Bluetooth e il sistema operativo ne consumano una parte consistente. Sull’ESP32-C6 restano poche centinaia di kilobyte per l’applicazione, e non è possibile aggiungere PSRAM.
L’ESP32-S3 supporta PSRAM esterna quad o octal, e molti moduli la integrano già. Con 2 o 8 MB aggiuntivi puoi tenere un framebuffer per un display, i fotogrammi di una camera, buffer audio o un modello di machine learning.
Se il progetto prevede un’interfaccia grafica, anche semplice, valuta questo punto per primo: è il motivo più frequente per cui un prototipo con ESP32-C6 va riprogettato.
Periferiche e I/O
L’ESP32-S3 ha più di tutto: 45 GPIO, due ADC con 20 canali, 14 ingressi touch, USB OTG per realizzare dispositivi USB (tastiere, interfacce MIDI, memorie di massa) o host USB, un’interfaccia LCD parallela e una per camera DVP.
L’ESP32-C6 è più sobrio, ma ha alcune periferiche che l’S3 non offre:
- due controller TWAI compatibili con CAN 2.0, utili per un nodo che fa da ponte tra due bus o per ridondanza;
- SDIO 2.0 slave, per usarlo come coprocessore di rete collegato a un processore principale;
- periferiche LP (UART, I2C, GPIO) che lavorano insieme al core a basso consumo.
Su entrambi, l’USB Serial/JTAG integrato permette di programmare e fare debug con un semplice cavo USB, senza convertitore USB-seriale né sonda esterna.
Consumi: datasheet e scheda reale
Entrambi i datasheet riportano in deep sleep correnti dell’ordine di pochi microampere, intorno ai 7 µA, misurati sul solo chip. Le schede di sviluppo misurano spesso centinaia di microampere nelle stesse condizioni, per tre motivi:
- il regolatore di tensione ha una corrente di riposo elevata;
- il LED di alimentazione o il LED RGB restano accesi;
- il convertitore USB-seriale esterno, se presente, resta alimentato.
Il chip conta meno della scheda. In un progetto a batteria scegli un regolatore con corrente di riposo inferiore a 1 µA, rendi disattivabile ogni LED e misura il consumo reale con uno strumento adatto, non con un multimetro in serie. Dedicheremo un articolo della serie alla misura e alla riduzione dei consumi.
A parità di funzione, il vantaggio dell’ESP32-C6 sta nel core LP e nel TWT: il chip si sveglia meno spesso e per meno tempo. L’ESP32-S3 consuma di più quando è attivo, ma completa prima i calcoli pesanti.
Quale scegliere
Valuta i vincoli in quest’ordine. Il primo che si applica decide il chip.

Scegli l’ESP32-C6 per:
- sensori e attuatori smart home con Matter, Thread o Zigbee;
- nodi a batteria su reti Wi-Fi 6 con TWT;
- gateway CAN e dispositivi industriali semplici con due bus;
- coprocessore di rete collegato via SDIO a un processore principale.
Scegli l’ESP32-S3 per:
- interfacce con display grafico e touch;
- camere, riconoscimento vocale e machine learning sul dispositivo;
- dispositivi USB (HID, MIDI, CDC, mass storage);
- firmware complessi con molte attività concorrenti e grandi buffer.
E gli altri chip della famiglia?
Due alternative entrano spesso nella stessa valutazione:
- ESP32-C5: Wi-Fi 6 dual band a 2,4 e 5 GHz, Bluetooth LE e 802.15.4, con un core RISC-V a 240 MHz. È la scelta quando il dispositivo deve lavorare su reti a 5 GHz o in ambienti con la banda a 2,4 GHz satura.
- ESP32-H2: Thread, Zigbee e Bluetooth LE, senza Wi-Fi. È adatto a dispositivi Thread a batteria che non devono mai collegarsi direttamente alla rete Wi-Fi.
Riconoscere il chip sul banco
Le schede economiche hanno spesso serigrafie ambigue, e lo stesso modulo esiste con quantità di flash e PSRAM diverse. Prima di scrivere codice, verifica cosa hai davvero. Con esptool (versione 5 o successiva) basta un comando:
pip install --upgrade esptool
esptool --port /dev/ttyACM0 flash-idL’output riporta il chip, la revisione, le funzioni (Wi-Fi 6, IEEE 802.15.4, PSRAM integrata) e la dimensione della flash. Su Windows la porta è del tipo COM5. Con esptool 4 il comando è esptool.py ... flash_id.
Se preferisci l’IDE Arduino, con il core Arduino-ESP32 3.x lo stesso sketch funziona su entrambi i chip:
// Stampa modello, core, frequenza, flash e PSRAM del chip collegato.
void setup() {
Serial.begin(115200);
delay(1500); // Tempo per aprire il monitor seriale sull'USB nativo
Serial.printf("Modello: %s rev. %u\n", ESP.getChipModel(), ESP.getChipRevision());
Serial.printf("Core: %u a %lu MHz\n", ESP.getChipCores(), ESP.getCpuFreqMHz());
Serial.printf("Flash: %lu MB\n", ESP.getFlashChipSize() / (1024 * 1024));
Serial.printf("PSRAM: %lu KB\n", ESP.getPsramSize() / 1024);
Serial.printf("Heap free: %lu KB\n", ESP.getFreeHeap() / 1024);
}
void loop() {}Su un ESP32-S3 la PSRAM risulta 0 finché non la abiliti in Strumenti → PSRAM. Il valore di heap libero è un buon indicatore della memoria che resterà per l’applicazione una volta aggiunti Wi-Fi e Bluetooth.
Un firmware per due chip con ESP-IDF
Se non hai ancora deciso, o se il prodotto avrà due versioni, puoi mantenere un solo progetto ESP-IDF e cambiare il target:
idf.py set-target esp32c6
idf.py build flash monitor
idf.py set-target esp32s3
idf.py build flash monitorset-target rigenera la configurazione: le impostazioni comuni vanno in sdkconfig.defaults, quelle specifiche in un file con il nome del target, che ESP-IDF applica automaticamente. Per esempio sdkconfig.defaults.esp32s3 abilita la PSRAM octal:
# sdkconfig.defaults.esp32s3
CONFIG_SPIRAM=y
CONFIG_SPIRAM_MODE_OCT=yE sdkconfig.defaults.esp32c6 abilita la gestione dinamica dei consumi:
# sdkconfig.defaults.esp32c6
CONFIG_PM_ENABLE=y
CONFIG_FREERTOS_USE_TICKLESS_IDLE=yNel codice, le differenze tra i chip si gestiscono con le macro generate da ESP-IDF, come CONFIG_IDF_TARGET_ESP32C6 e CONFIG_SOC_IEEE802154_SUPPORTED, invece di duplicare i sorgenti. Il passaggio da Arduino a ESP-IDF è l’argomento del prossimo articolo della serie.
Errori da evitare nello schema elettrico
- Pin di strapping. Alcuni GPIO determinano la modalità di avvio: GPIO0, GPIO3, GPIO45 e GPIO46 sull’ESP32-S3; GPIO8, GPIO9 e GPIO15 sull’ESP32-C6, più GPIO4 e GPIO5 che selezionano la sorgente JTAG. Non collegarli a circuiti che ne forzano il livello all’accensione.
- PSRAM octal. Sui moduli ESP32-S3 con flash o PSRAM octal, i GPIO da 33 a 37 sono occupati dalla memoria e non vanno usati.
- Pin USB. L’USB nativo usa GPIO19 e GPIO20 sull’ESP32-S3, GPIO12 e GPIO13 sull’ESP32-C6. Se li usi come I/O, perdi la programmazione via USB.
- Antenna. Rispetta l’area libera da rame indicata nel datasheet del modulo, su tutti gli strati. Un piano di massa sotto l’antenna riduce la portata più di qualsiasi scelta tra C6 e S3.
Verifica sempre questi pin sul datasheet del modulo che usi: le assegnazioni cambiano tra chip, modulo e quantità di memoria.
Fonti
- ESP32-C6 Series Datasheet, Espressif Systems
- ESP32-S3 Series Datasheet, Espressif Systems
- Documentazione ESP-IDF, Espressif Systems
- ESP Thread Border Router: piattaforme hardware, Espressif Systems