ESP32, PlatformIO

luca 21/05/2018 11

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:

  • un sistema di compilazione cross-platform
  • un gestore di librerie e di dipendenze
  • un monitor seriale

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:

pio-001

cerchiamo il package PlatformIO IDE, quindi clicchiamo Install:

pio-002

attendiamo il termine dell’installazione:

pio-003

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:

pio-004

quindi selezioniamo New Project:

pio-005

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:

pio-006

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:

pio-007

chiamiamo il file main.c e inseriamo il nostro semplice programma:

pio-008

proviamo a compilare il programma con il pulsante nella barra inferiore:

pio-009

viene correttamente visualizzato un errore… infatti stiamo utilizzando al funzione printf() senza avere incluso la libreria corrispondente:

pio-010

aggiungiamo la riga mancante, ora il programma viene correttamente compilato:

pio-011

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:

pio-012

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:

pio-013

Apriamo ora il monitor seriale; in questo modo possiamo visualizzare l’output del programma:

pio-014

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!

 

11 Comments »

  1. Samuele 22/05/2018 at 17:07 - Reply

    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.

    • luca 03/06/2018 at 20:12 - Reply

      Ciao Samuele. Per velocizzare la compilazione lancia “make -j4″. L’output che vedi è quello del bootloader, tramite menuconfig puoi “silenziarlo”

  2. Lorenzo 15/06/2018 at 10:51 - Reply

    Grazie mille per l’articolo! non conoscevo platformio e devo dire che è molto meglio dell’IDE base di Arduino.

    grazie :)

    • luca 17/06/2018 at 13:58 - Reply

      grazie a te Lorenzo per il commento! Ormai PlatformIO è diventato il mio IDE di riferimento…

  3. Claduio 15/07/2018 at 15:51 - Reply

    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!

    • Ivan 29/09/2018 at 20:31 - Reply

      Ciao Claudio, poi hai trovato risposta alle tue domande? Interessavano anche a me.

  4. Ivan Marquez 20/08/2018 at 14:05 - Reply

    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?

    • luca 21/08/2018 at 12:54 - Reply

      Hi! Which errors do you get?

  5. Marco 24/08/2018 at 16:05 - Reply

    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

    • luca 27/08/2018 at 08:40 - Reply

      Ciao Marco… l’output si ferma a quella riga? Strano, sembra tutto ok…

  6. Marco 31/08/2018 at 15:07 - Reply

    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

Leave A Response »

Questo sito usa i cookie per poterti offrire una migliore esperienza di navigazione maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi