Tutti gli articoli

ESP32 – Programmazione e reset automatici

La procedura di caricamento del firmware sulle schede ESP32 è leggermente diversa da quella di un normale Arduino. La maggior parte delle schede Arduino si resetta automaticamente quando viene caricato un nuovo programma ed entra da sola in modalità di programmazione. Su alcune schede ESP bisogna entrare manualmente in modalità di programmazione, mentre sui moduli "nudi" è necessario anche il reset manuale. Esistono però alcuni semplici circuiti che permettono di automatizzare il caricamento.

ESP32

I moduli sono basati su una piccola scheda con l'antenna in alto e piazzole SMD lungo i lati e a un'estremità. Le piazzole hanno un passo in millimetri, quindi non sono compatibili con i comuni pin header, le breadboard e così via. Se non si salda il modulo su un PCB personalizzato, la soluzione migliore è usarlo con una breakout board, che lo dota di header standard. Per farlo, basta acquistare il modulo in kit con la breakout board, disponibile anche già saldato e testato. I pin della breakout si inseriscono in una breadboard oppure si collegano con cavetti Dupont.

Se il convertitore USB-Seriale che usi dispone di una linea di controllo di flusso DTR, come un modulo FTDI, puoi automatizzare il segnale di reset. Quando si inviano dati all'ESP, la linea DTR passa a livello basso e ci resta per un certo tempo. Per resettare l'ESP serve un impulso basso sul pin RST. Questo vale solo per le schede senza convertitore USB-Seriale integrato.

Trasferimento dati e caricamento

Il caricamento dei dati sull'ESP32 avviene tramite comunicazione seriale. Per collegarlo al computer serve quindi un modulo USB-Seriale, come una breakout board FTDI.

Nota: FTDI non è l'unico chip per la conversione da seriale a USB: ne esistono altri, come il CH340G, e potrebbe essere necessario installare i driver se non vengono riconosciuti automaticamente.

Per programmare l'ESP32 occorre metterlo in modalità di programmazione UART. Questo richiede di portare a livello basso il pin GPIO 0, collegandolo a massa tramite una resistenza. Durante il caricamento il modulo deve resettarsi, passare in modalità di programmazione e poi tornare al normale funzionamento. Si può fare manualmente con un paio di pulsanti, oppure in automatico usando i collegamenti dell'adattatore USB-Seriale e qualche componente aggiuntivo.

Per caricare i dati, collega RX a TX e TX a RX tra le due schede. Collega inoltre il GND del modulo di programmazione al GND dell'ESP32. Per la programmazione con reset automatico, collega RTS e DTR del programmatore all'ESP32 come mostrato nel circuito qui sotto; se non sono disponibili, dovrai usare il circuito e il metodo di reset manuale. Qualunque metodo tu scelga, conviene collegare anche un pulsante di reset, così puoi riavviare il programma in esecuzione quando serve.

Programmazione e reset automatici

Esiste anche un metodo automatico per il caricamento e il reset. Per usarlo servono alcuni componenti aggiuntivi, in particolare un paio di piccoli MOSFET NPN.

2N7002DW

Un chip a 6 pin con due MOSFET a canale N. In alcuni vecchi moduli il chip riporta la sigla 702, mentre in molti moduli recenti è un chip diverso, marcato K27. In realtà si tratta rispettivamente dei chip 2N7002DW (702) e 2N7002KDW (K27); quest'ultimo integra una protezione ESD.

DTR (G2)RTS (G1)EN (D2)GPIO0 (D1)
1111
0011
1001
0110

Circuito

Un circuito elettronico è composto da singoli componenti elettronici, come resistenze, transistor, condensatori, induttori e diodi, collegati tramite fili o piste conduttive nelle quali può scorrere la corrente. È un tipo di circuito elettrico e, per essere definito elettronico anziché elettrico, deve contenere in genere almeno un componente attivo.

Schema

Test della configurazione

Ho realizzato lo schema qui sopra. Poi ho usato esptool.py per flashare il dispositivo. Per prima cosa, cancella la flash:

esptool.py erase_flash

Normalmente la porta dell'ESP sarà qualcosa come /dev/cu.usbserial-A50285BI. Quindi rimetti il dispositivo in modalità flash e carica il nuovo firmware:

esptool.py -p /dev/cu.usbserial-A50285BI --baud 115200 write_flash -fs 1MB -fm dout -ff 40m 0x0 rboot.bin 0x1000 blank_config.bin 0x2000 otaboot.binsptool.py --chip esp32 --port /dev/tty.usbserial-01FD1166 --baud 460800 --before default_reset --after hard_reset \
write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect \
0x01000 bootloader.bin \
0x08000 partition-table.bin \
0xf0000 otaboot.bin