PlatformIO è un ecosistema opensource (come è definito nella homepage ufficiale) per lo sviluppo di progetti IoT.
Il cuore della piattaforma è un componente software chiamato PlatformIO Core. Questo componente integra:
[checklist]
- un sistema di compilazione cross-platform
- un gestore di librerie e di dipendenze
- un monitor seriale
[/checklist]
PlatformIO Core è sviluppato in Python ed è quindi in grado di girare sui diversi S.O. (Windows, Linux, MacOS).
Sebbene sia possibile utilizzare direttamente il componente Core, la forza di PlatformIO sta nel proprio IDE, che consente lo sviluppo di progetti multi piattaforma e si integra direttamente con il Core.
In questo articolo vi mostrerò come utilizzare PlatformIO per sviluppare progetti per il chip esp32.
Installazione
PlatformIO IDE è fornito come plugin per due ambienti di sviluppo: Atom e VisualStudio Code. Ho provato entrambe le soluzioni e ho preferito VSCode: sia l’installazione che l’utilizzo risultano più semplici e immediati.
Installiamo quindi VSCode scaricandolo dal sito Microsoft (sono disponibili gli installer sia per Windows che per Linux e MacOS).
Apriamo il Package Manager:
cerchiamo il package PlatformIO IDE, quindi clicchiamo Install:
attendiamo il termine dell’installazione:
Hello world
Vediamo ora come sviluppare il nostro primo programma, che per tradizione visualizzerà la scritta Hello world! su terminale.
Se non si apre in automatico, apriamo la homepage di PlatformIO:
quindi selezioniamo New Project:
diamo un nome al progetto e scegliamo una scheda con chip esp32 (nel mio caso utilizzerò una Lolin32 di Wemos). PlatformIO supporta sia il framework esp-idf, sia arduino-esp32. Tutti i miei tutorial sono basati sul primo:
PlatformIO crea automaticamente alcune cartelle per il nostro progetto. Selezioniamo la cartella chiamata src (source, ovvero dove sarà memorizzato il codice sorgente del progetto) e creiamo un nuovo file:
chiamiamo il file main.c e inseriamo il nostro semplice programma:
proviamo a compilare il programma con il pulsante nella barra inferiore:
viene correttamente visualizzato un errore… infatti stiamo utilizzando al funzione printf() senza avere incluso la libreria corrispondente:
aggiungiamo la riga mancante, ora il programma viene correttamente compilato:
PlatformIO è in grado di effettuare direttamente l’upload del programma compilato sulla scheda. Grazie alla funzione di auto-detect spesso non è neppure necessario indicare la porta seriale alla quale è collegata:
Monitor seriale
PlatformIO include anche un monitor seriale che possiamo utilizzare per verificare il funzionamento del nostro programma. Di default, tale monitor seriale utilizza una velocità di 9600 baud. Il chip esp32 però utilizza normalmente la velocità di 115200 baud; dobbiamo quindi modificare il file platformio.ini del nostro progetto:
Apriamo ora il monitor seriale; in questo modo possiamo visualizzare l’output del programma:
Conclusioni
Ho trovato l’utilizzo di PlatformIO davvero immediato: dopo pochi minuti sono stato in grado di sviluppare, compilare, caricare e testare un programma. Provatelo e lasciatemi un commento con le vostre impressioni!
Ciao, grazie e complimenti per gli articoli, sempre molto interessanti.
Ho provato con un modulo ESP-wroom-32, ma ci ha messo ben 135 secondi per compilare queste 3 righe di codice, e non 12 come vedo nel tuo caso, ogni volta ricompilato una lunga sequela di file che non so spiegarmi, se vuoi ti posto il log di compilazione, però è molto lungo. Quale potrebbe essere il motivo ?
Poi ho caricato il codice sulla scheda, e questo è l’output sul terminale “Attività – Monitor” :
> Executing task: C:\Users\User\.platformio\penv\Scripts\platformio.exe device monitor <
— Miniterm on COM10 115200,8,N,1 —
— Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H —
2016 00:22B��J␂␒���� SPI Mode : DIO␛[0m
␛[0;32mI (89) boot: SPI Flash Size : 4MB␛[0m
␛[0;32mI (102) boot: Partition Table:␛[0m
␛[0;32mI (113) boot: ## Label Usage Type ST Offset Length␛[0m
␛[0;32mI (136) boot: 0 nvs WiFi data 01 02 00009000 00006000␛[0m
␛[0;32mI (159) boot: 1 phy_init RF data 01 01 0000f000 00001000␛[0m
␛[0;32mI (182) boot: 2 factory factory app 00 00 00010000 00100000␛[0m
␛[0;32mI (206) boot: End of partition table␛[0m
␛[0;32mI (219) boot: Disabling RNG early entropy source…␛[0m
␛[0;32mI (236) boot: Loading app partition at offset 00010000␛[0m
␛[0;32mI (509) boot: segment 0: paddr=0x00010018 vaddr=0x3ffc0000 size=0x01b98 ( 7064) load␛[0m
␛[0;32mI (513) boot: segment 1: paddr=0x00011bb8 vaddr=0x40080000 size=0x00400 ( 1024) load␛[0m
␛[0;32mI (527) boot: segment 2: paddr=0x00011fc0 vaddr=0x40080400 size=0x0714c ( 29004) load␛[0m
␛[0;32mI (567) boot: segment 3: paddr=0x00019114 vaddr=0x400c0000 size=0x00000 ( 0) load␛[0m
␛[0;32mI (579) boot: segment 4: paddr=0x0001911c vaddr=0x00000000 size=0x06ee4 ( 28388) ␛[0m
␛[0;32mI (604) boot: segment 5: paddr=0x00020008 vaddr=0x3f400010 size=0x02d34 ( 11572) map␛[0m
␛[0;32mI (630) boot: segment 6: paddr=0x00022d44 vaddr=0x00000000 size=0x0d2c4 ( 53956) ␛[0m
␛[0;32mI (655) boot: segment 7: paddr=0x00030010 vaddr=0x400d0018 size=0x0c6b8 ( 50872) map␛[0m
␛[0;32mI (681) cpu_start: Pro cpu up.␛[0m
␛[0;32mI (692) cpu_start: Starting app cpu, entry point is 0x40080cf8␛[0m
␛[0;32mI (0) cpu_start: App cpu up.␛[0m
␛[0;32mI (725) heap_alloc_caps: Initializing. RAM available for dynamic allocation:␛[0m
␛[0;32mI (747) heap_alloc_caps: At 3FFAFF10 len 000000F0 (0 KiB): DRAM␛[0m
␛[0;32mI (767) heap_alloc_caps: At 3FFC2350 len 0001DCB0 (119 KiB): DRAM␛[0m
␛[0;32mI (788) heap_alloc_caps: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM␛[0m
␛[0;32mI (809) heap_alloc_caps: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM␛[0m
␛[0;32mI (831) heap_alloc_caps: At 4008754C len 00018AB4 (98 KiB): IRAM␛[0m
␛[0;32mI (851) cpu_start: Pro cpu start user code␛[0m
␛[0;32mI (908) cpu_start: Starting scheduler on PRO CPU.␛[0m
Hello World!
␛[0;32mI (200) cpu_start: Starting scheduler on APP CPU.␛[0m
è normale che sia così ? Non si possono eleimnare tutte le righe che non c'entrano con l'utput che mi aspetto ?
Cordiali saluti.
Ciao Samuele. Per velocizzare la compilazione lancia “make -j4”. L’output che vedi è quello del bootloader, tramite menuconfig puoi “silenziarlo”
Grazie mille per l’articolo! non conoscevo platformio e devo dire che è molto meglio dell’IDE base di Arduino.
grazie 🙂
grazie a te Lorenzo per il commento! Ormai PlatformIO è diventato il mio IDE di riferimento…
Ciao Luca,
ho provato PlatformIO e devo dire che la prima sensazione è davvero positiva.
Mi chiedevo tuttavia se mi potevi gentilmente indicare qualche link per poter comprendere come “importare” progetti già sviluppati secondo il framework esp-idf.
Ad esempio:
– come si mappa il Kconfig.projbuild in PlatformIO?
– Si usa ancora il make menu-config, per impostare i vari parametri di customizzazione che il framework esp-idf mette a disposizione?
– Riferendomi ad uno dei tuoi esempi (i.e. ESP32 (20) – Webserver) come si implementa ora l’embedding binary data (in component.mk)?
– Come si implementa ora l’utilizzo del componente spiffs di Boris Lovosevic (loboris) che hai utilizzato nel tuo tutorial ESP32 (22) – SPIFFS?
Inoltre mi sapresti dire se Platformio è allineato all’ultima versione del esp-idf? Ho notato che alcuni componenti (Es: mdns) sono cambiati ad una certa release di esp-idf. Sarebbe bello capire dunque anche il grado di l’utilizzabilità della documentazione aggiornata del framework esp-idf in PlatformIO.
Grazie mille!
Ciao Claudio, poi hai trovato risposta alle tue domande? Interessavano anche a me.
Purtroppo no. Tu hai avuto più fortuna?
Hi, I’m currently working on a project with ESP-IDF and Eclipse, I tryed migrating to plataformIO but it did not compile… is there a way to painlessly do this?
Hi! Which errors do you get?
Ciao Luca, ho seguito passo passo le tue indicazioni ma nell’output seriale non ho il tanto sperato “Hello World!” quale potrebbe essere il motivo? Grazie Marco
— Miniterm on COM3 115200,8,N,1 —
— Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H —
en:12488
entry 0x40078f␂␂␂�␙�data 01 01 0000f000 00001000␛[0m
␛[0;32mI (71) boot: 2 factory factory app 00 00 00010000 00100000␛[0m
␛[0;32mI (78) boot: End of partition table␛[0m
␛[0;32mI (82) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x04aa8 ( 19112) map␛[0m
␛[0;32mI (98) esp_image: segment 1: paddr=0x00014ad0 vaddr=0x3ffc0000 size=0x01eec ( 7916) load␛[0m
␛[0;32mI (103) esp_image: segment 2: paddr=0x000169c4 vaddr=0x40080000 size=0x00400 ( 1024) load␛[0m
␛[0;32mI (109) esp_image: segment 3: paddr=0x00016dcc vaddr=0x40080400 size=0x075e8 ( 30184) load␛[0m
␛[0;32mI (130) esp_image: segment 4: paddr=0x0001e3bc vaddr=0x400c0000 size=0x00000 ( 0) load␛[0m
␛[0;32mI (130) esp_image: segment 5: paddr=0x0001e3c4 vaddr=0x00000000 size=0x01c4c ( 7244) ␛[0m
␛[0;32mI (140) esp_image: segment 6: paddr=0x00020018 vaddr=0x400d0018 size=0x12bc4 ( 76740) map␛[0m
␛[0;32mI (178) boot: Loaded app from partition at offset 0x10000␛[0m
␛[0;32mI (178) boot: Disabling RNG early entropy source…␛[0m
␛[0;32mI (178) cpu_start: Pro cpu up.␛[0m
␛[0;32mI (182) cpu_start: Starting app cpu, entry point is 0x40080e30␛[0m
␛[0;32mI (0) cpu_start: App cpu up.␛[0m
␛[0;32mI (193) heap_init: Initializing. RAM available for dynamic allocation:␛[0m
␛[0;32mI (199) heap_init: At 3FFAFF10 len 000000F0 (0 KiB): DRAM␛[0m
␛[0;32mI (205) heap_init: At 3FFC26F8 len 0001D908 (118 KiB): DRAM␛[0m
␛[0;32mI (212) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM␛[0m
␛[0;32mI (218) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM␛[0m
␛[0;32mI (224) heap_init: At 400879E8 len 00018618 (97 KiB): IRAM␛[0m
␛[0;32mI (231) cpu_start: Pro cpu start user code␛[0m
␛[0;32mI (249) cpu_start: Starting scheduler on PRO CPU.␛[0m
␛[0;32mI (0) cpu_start: Starting scheduler on APP CPU.␛[0m
Ciao Marco… l’output si ferma a quella riga? Strano, sembra tutto ok…
Si, non c’è altro dopo.
Mi sembra che anche gli altri log finiscano come il mio tranne che per la riga “Hello World”.
Una cosa che devo fare con la mia scheda ESP32 è premere il pulsante BOOT quando devo fare l’upload altrimenti ho un errore sulla seriale.
Per ora lavoro con l’arduino ide li ho visto che gli esempi girano correttamente
Hello Luca. I would like to consult you if all your tutorials are exclusively for the Wemos Lolin 32 card. I currently have an ESP-WROOM-32 WiFi / Bluetooth Classic / BLE card, but I do not know if it is compatible with your tutorials or I need to acquire another card, but this time a Lolin 32 compatible with PlatformIO?
Hi Manuel, my tutorials are “generic”, they can be applied to almost all the dev boards based on the esp32 chip