Abbiamo visto negli articoli precedenti come Platform.IO sia un tool che ci permette lo sviluppo di software per migliaia di microcontrollers di tutti i generi.

Al momento della stesura di questo articolo (maggio 2022), sulla homepage di Platform.IO i numeri dicono ben 1340 boards! :open_mouth:

Per poter “domare” un numero così elevato (ed in continua e costante crescita) di sistemi anche molto diversi tra loro, PlO utilizza diverse piattaforme, che a loro volta si appoggiano a diversi frameworks.

La prima cosa da fare quendo iniziamo un nuovo progetto è dunque quello di specificare la piattaforma, la board ed il framework che intendiamo utilizzare, ed ovviamente lo facciamo nel file di configurazione platformio.ini. PlatformIO si occuperà di scaricare in automatico tutto il necessario per far funzionare a dovere il nostro codice su quel determinato hardware che abbiamo tra le mani.

Per sviluppare su ESP32, la piattaforma da utilizzare è espressif32 . Per il framework invece abbiamo due possibilità di scelta: arduino o espidf.

ESP-IDF : è il framework ufficiale fornito da espressif per i chip che produce, e sta per ESP IOT Development framework. E’ un framework di basso livello, che permette la massima customizzazione ed è rivolto ad un pubblico professionale ed altamente specializzato.

Sulla base di ESP-IDF è stato inoltre realizzato il framework arduino-esp32 che spalanca le porte del mondo arduino all’esp32: questo ci permette di scrivere il nostro codice come probabilmente siamo già abituati a fare con altre board, ma soprattutto ci mette a disposizione una infinità di librerie, esempi e progetti già pronti realizzati dall’enorme community.

Per semplificare, con arduino è possibile ottenere degli ottimi risultati con un tempo infinitamente minore; con esp-idf abbiamo invece un maggiore controllo sul codice sorgente a fronte però di uno sbattimento enormemente superiore :smile:

Scelti piattaforma e framework, è necessario specificare la board utilizzata. Nella maggior parte dei casi è sufficiente utilizzare esp32dev, ma Platform.IO ci permette comunque di scegliere tra molte varianti di esp32 (al momento 135). L’elenco completo delle boards compatibili con espressif32 lo trovi qui .

Nei progetti del laboratorio che abbiamo visto finora abbiamo utilizzato il framework arduino, ma dedicheremo degli articoli anche ad ESP-IDF prossimamente.

Nel caso dell’ESP32 wroom abbiamo quindi:

platform      = espressif32
framework     = arduino
board         = esp32dev

Facendo la build del progetto nella console vediamo che PlatForm.IO si è occupato di scaricare i tool necessari che gli abbiamo specificato:

PLATFORM: Espressif 32 (4.2.0) > Espressif ESP32 Dev Module
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
...
PACKAGES: 
 - framework-arduinoespressif32 @ 3.20002.220503 (2.0.2) 
 - tool-esptoolpy @ 1.30300.0 (3.3.0) 
 - toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch3

Può capitare però che a volte si presenti la necessità di dover compilare il sorgente con una specifica versione della piattaforma o del framework, ed è quello che sta capitando a me (e probabilmente a tantissimi altri sviluppatori) in questo periodo.

Siamo infatti in questo momento (maggio 2022) nel bel mezzo del passaggio dalla versione 1.xx alla 2.xx del framework arduino e qualcosa potrebbe non funzionare più, vuoi per delle breacking changes volute, oppure per dei bugs sorti ed in via di risoluzione.

La versione 4.2.0 di espressif32 è stata rilasciata il 29 Aprile 2022 ed utilizza il framework arduino 2.0.2. Tralasciando la 4.0.0 e la 4.1.0 che sono uscite solo pochi giorni prima (evidentemente con dei problemi abbastanza gravi per aver avuto una vita cosi breve), la precedente versione era la 3.5.0 che si appoggiava ad arduino 1.0.6.

Il passaggio non è banale e molti progetti che si trovano oggi in rete potrebbero avere problemi con la nuova versione. Cosa fare? Le strade sono diverse: compilare il codice con una versione precedente, provare a compilare con la versione attualmente in fase di sviluppo e non ancora rilalsciata ufficialmente** (che chiameremo **upstream) (nella speranza che alcuni problemi nel frattempo sono stati risolti), oppure modificare il codice in modo da renderlo compatibile con la nuova versione.

Molto semplice:

; utilizzo della versione 3.5.0 di espressif32
platform      = espressif32@3.5.0

; utilizzo della versione upstream:
platform      = https://github.com/platformio/platform-espressif32.git

Ecco il risultato della compilazione nel primo caso con platform 3.5.0 e framework 1.0.6:

Platform Manager: Installing espressif32 @ 3.5.0
Downloading  [####################################]  100%
Unpacking  [####################################]  100%
Platform Manager: espressif32@3.5.0 has been installed!
...
PLATFORM: Espressif 32 (3.5.0) > Espressif ESP32 Dev Module
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
...
PACKAGES:
 - framework-arduinoespressif32 @ 3.10006.210326 (1.0.6)
 - tool-esptoolpy @ 1.30100.210531 (3.1.0)
 - toolchain-xtensa32 @ 2.50200.97 (5.2.0)

Ed eccolo nel secondo caso, con la upstream platform ed il framework 2.0.3:

Tool Manager: Installing platformio/framework-arduinoespressif32 @ ~3.20003.0
Downloading  [####################################]  100%
Unpacking  [####################################]  100%
Tool Manager: framework-arduinoespressif32@3.20003.0 has been installed!
...
PLATFORM: Espressif 32 (4.2.0+sha.6f5b79f) > Espressif ESP32 Dev Module
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
...
PACKAGES:
 - framework-arduinoespressif32 @ 3.20003.0 (2.0.3)
 - tool-esptoolpy @ 1.30300.0 (3.3.0)
 - toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch3

Come vedi, la prima volta Platform.IO effettua il download e l’installazione della piattaforma e/o del framework se non sono già presenti nel tuo sistema (operazione che richiederà un paio di minuti in più del solito).

Possiamo sempre vedere le versioni installate (e rimuoverle/aggiornarle) dalla PIO Home sotto la voce Platforms:

Ma c’è di più: possiamo anche voler utilizzare una specifica versione del framework oltre a quella della piattaforma:

platform      = https://github.com/platformio/platform-espressif32.git
framework     = arduino
board         = esp32dev
platform_packages = framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32

questa configurazione, grazie alla nuova direttiva platform_packages, compilerà il codice con le versioni upstream sia della piattaforma che del framework (attualmente basate su 4.2.0 e 2.0.4):

PLATFORM: Espressif 32 (4.2.0+sha.6f5b79f) > Espressif ESP32 Dev Module
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash    
PACKAGES:
 - framework-arduinoespressif32 @ 2.0.4+sha.ba6e82c
 - tool-esptoolpy @ 1.30300.0 (3.3.0)
 - tool-mkfatfs @ 2.0.1
 - tool-mklittlefs @ 1.203.210628 (2.3)
 - tool-mkspiffs @ 2.230.0 (2.30)

Dicevo in precedenza che ultimamente mi sono trovato in questa situazione ed è per questo che sto scrivendo questo articolo, che mi tornerà sicuramente utile in futuro.

Il problema si è presentato su alcuni progetti presenti nel laboratorio che fanno uso di display ed in particolare è relativo alla gestione pwm del pin che gestisce la luminosità. E’ un problema che è subentrato con la versione 2.xx del framework ed in pratica il display resta spento :smile: Ho trovato qualche discussione online sul’argomento ed ho visto che il problema è stato poi risolto nella versione upstream.

Se prendiamo ad esempio il progetto TFT_eSPI - Hello World il codice incriminato è il seguente:

ledcAttachPin(TFT_BL, 1);      // assign TFT_BL pin to channel 1
ledcSetup(1, 12000, 8);        // 12 kHz PWM, 8-bit resolution
ledcWrite(1, TFT_BRIGHTNESS);  // brightness 0 - 255

Come ho già detto, nella versione upstream il problema è già stato risolto, non mi resta che attendere l’uscita della 4.3.0. Nel frattempo, le soluzioni sono appunto quella di compilare il codice con la 3.5.0, oppure con la upstream, oppure modificarlo in modo da accendere il display alla luminosità massima con il classico:

pinMode(TFT_BL, OUTPUT);
digitalWrite(TFT_BL, HIGH);

Bel casino vero? ma se non fosse così, che divertimento c’è? :sunglasses:

Per concludere, segnalo che nelle versioni upstream di platform+framework, hanno finalmento aggiunto il supporto all’ESP32-S3!! Ne ho già qualcuno tra le mani, chiudo un paio di progetti e poi sotto con gli smanettamenti! :smile:

UPDATE: dopo aver scritto questo articolo, mi sono imbattuto in un’altra breaking change subentrata con il passaggio dal framework Arduino 1.x al 2.x che riguarda la gestione degli eventi e l’ho documentata in un successivo articolo: ESP32 Arduino events.

Alla prossima!