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

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.

Schema a blocchi che confronta ESP32-C6 ed ESP32-S3: CPU, memoria, radio e periferiche, con punti di forza e limiti di ciascun chip
Architettura a confronto: in azzurro i punti di forza, tratteggiati i limiti.

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:

  1. il regolatore di tensione ha una corrente di riposo elevata;
  2. il LED di alimentazione o il LED RGB restano accesi;
  3. 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.

Diagramma di scelta in cinque domande tra ESP32-C6, ESP32-S3 ed ESP32-C5: Thread, PSRAM, USB e touch, Wi-Fi a 5 GHz, CAN e batteria
Percorso di scelta: il primo vincolo rigido 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:

Terminale
pip install --upgrade esptool
esptool --port /dev/ttyACM0 flash-id

L’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:

Arduino
// 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:

Terminale
idf.py set-target esp32c6
idf.py build flash monitor

idf.py set-target esp32s3
idf.py build flash monitor

set-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:

Configurazione
# sdkconfig.defaults.esp32s3
CONFIG_SPIRAM=y
CONFIG_SPIRAM_MODE_OCT=y

E sdkconfig.defaults.esp32c6 abilita la gestione dinamica dei consumi:

Configurazione
# sdkconfig.defaults.esp32c6
CONFIG_PM_ENABLE=y
CONFIG_FREERTOS_USE_TICKLESS_IDLE=y

Nel 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