Skip to Content

Addestra un modello di rilevamento oggetti con Edge Impulse per ESP32-CAM

Addestra un modello di rilevamento oggetti con Edge Impulse per ESP32-CAM

In questo tutorial imparerai come addestrare un modello di rilevamento oggetti con Edge Impulse per l’ESP32-CAM. La raccolta dati, l’etichettatura e l’addestramento del modello avverranno sulla piattaforma Edge Impulse, ma il modello di rilevamento verrà eseguito direttamente sull’ESP32-CAM.

Poiché l’ESP32-CAM ha una potenza di calcolo limitata, non aspettarti alte precisioni o velocità elevate. Tuttavia, ci sono molte applicazioni TinyML in cui l’ESP32-CAM è sufficiente. Ad esempio, potresti costruire una serratura intelligente con riconoscimento facciale che concede l’accesso solo a te, un distributore di cibo per animali che rileva e nutre il tuo animale quando appare, o un sistema di riconoscimento gestuale per controllare luci o elettrodomestici con movimenti della mano.

In questa introduzione al rilevamento oggetti con Edge Impulse manterremo le cose semplici, addestrando un sistema che rileva e distingue solo due oggetti.

Componenti necessari

Ti servirà un ESP32-CAM per eseguire il rilevamento oggetti. Puoi procurarti un ESP32-CAM con uno Shield USB-TTL per la programmazione o un adattatore FTDI USB-TTL. L’adattatore FTDI USB-TTL è un po’ più scomodo da usare ma lascia i pin GPIO facilmente accessibili. Per questo tutorial, consiglio lo Shield USB-TTL, ma assicurati di prendere quello corretto (vedi il Programming the ESP32-CAM tutorial per i dettagli).

ESP32-CAM con Shield USB-TTL

Adattatore FTDI USB-TTL

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Cos’è Edge Impulse?

Edge Impulse è una piattaforma web progettata per facilitare la creazione di modelli di machine learning efficienti per dispositivi embedded e edge. Rende semplice costruire e distribuire applicazioni TinyML (Tiny Machine Learning).

Edge Impulse Workflow
Workflow di Edge Impulse (source)

Raccolta e etichettatura dati

Puoi raccogliere dati da una vasta gamma di sensori, inclusi telecamere, microfoni, accelerometri, giroscopi, sensori ambientali e altro. Ci sono diversi modi per raccogliere dati:

  1. Raccolta dati in tempo reale via USB/seriale: Le schede di sviluppo supportate (come ESP32, Arduino Nano 33 BLE Sense o schede ST) possono essere collegate direttamente a Edge Impulse Studio per trasmettere dati sensoriali in tempo reale.
  2. Raccolta dati remota usando Edge Impulse CLI: Per dispositivi headless o remoti, gli utenti possono usare la CLI per inviare dati via Wi-Fi o seriale alla piattaforma Edge Impulse.
  3. App per smartphone: L’app mobile Edge Impulse (disponibile per Android e iOS) può essere usata per catturare immagini, audio e dati di movimento direttamente dal telefono e inviarli alla dashboard del progetto.
  4. Caricamento di dataset esistenti: Gli utenti possono importare dati in formato CSV, JSON o formati personalizzati e etichettarli tramite l’interfaccia web.
  5. Raccolta dati continua: Alcuni dispositivi possono essere configurati per campionamento continuo e segmentati successivamente in finestre di dati gestibili.

Una volta raccolti i dati, Edge Impulse offre strumenti per l’etichettatura. L’interfaccia supporta il tagging di singoli campioni o l’etichettatura in batch di grandi dataset. Per dati visivi e audio, puoi zoomare, ritagliare e annotare eventi o caratteristiche di interesse. La piattaforma supporta anche l’etichettatura automatica e l’augmentazione dei dati per migliorare la qualità del dataset.

Elaborazione del segnale e addestramento del modello

Dopo l’etichettatura, i dati passano attraverso blocchi DSP (Digital Signal Processing), che trasformano i dati grezzi dei sensori in caratteristiche adatte al machine learning. Questi blocchi sono ottimizzati per ambienti a risorse limitate e specifici per il tipo di input (es. MFCC per audio, ridimensionamento e correzione colore per immagini, o FFT per dati di vibrazione).

Segue l’addestramento del modello. Edge Impulse offre:

  • Classificazione, per rilevare presenza/assenza o identificare classi (es. tipi di oggetti, parole pronunciate).
  • Regressione, per prevedere valori continui (es. stimare angoli, temperatura o posizione di un oggetto).
  • Rilevamento oggetti, per rilevare e localizzare più oggetti nelle immagini.
  • Rilevamento anomalie, per identificare outlier o pattern insoliti senza dati etichettati.

Puoi usare architetture di modelli predefinite dalla Model Zoo di Edge Impulse, che include versioni ottimizzate di MobileNet, ResNet e SqueezeNet tra gli altri, oppure definire modelli personalizzati usando Keras e TensorFlow Lite. Puoi anche importare modelli ONNX o TensorFlow.

Ottimizzazione e distribuzione del modello

Una volta addestrato, Edge Impulse aiuta a ottimizzare il modello per il deployment su edge usando tecniche come quantizzazione (riduzione della dimensione del modello e miglioramento della velocità di inferenza) e fusione degli operatori.

La distribuzione è molto flessibile, con opzioni che includono:

  • SDK C++: Un SDK completamente autonomo che può essere integrato in qualsiasi progetto C++. Ideale per microcontrollori e firmware bare-metal.
  • Libreria Arduino: Genera automaticamente una libreria compatibile Arduino per eseguire il modello su schede come ESP32, Arduino Portenta e Nano 33 BLE.
  • Firmware precompilato: Per dispositivi supportati, Edge Impulse fornisce firmware binari con il modello addestrato integrato, pronti per essere flashati ed eseguiti.
  • WebAssembly: Esegui modelli nel browser o su qualsiasi sistema che supporti WebAssembly.
  • Distribuzione su Linux: Per dispositivi come Raspberry Pi, BeagleBone o Nvidia Jetson, puoi distribuire usando SDK Python o container Docker.

Model Zoo e Transfer Learning

Edge Impulse offre anche un piccolo Model Zoo contenente modelli leggeri e pre-ottimizzati per casi d’uso edge. Questi modelli includono:

  • Varianti di MobileNet per classificazione immagini
  • FOMO (Fast Object Detection for Microcontrollers), un modello di rilevamento oggetti molto piccolo adatto ad applicazioni in tempo reale
  • Classificatori audio compatibili con Syntiant
  • Modelli personalizzati per keyword spotting
  • Esempi di regressione e rilevamento anomalie

Molti di questi modelli possono essere affinati tramite transfer learning, permettendoti di ottenere alta precisione anche con dataset relativamente piccoli sfruttando pesi pre-addestrati esistenti.

Registrazione a Edge Impulse

Prima di poter usare Edge Impulse devi registrarti. La buona notizia è che il piano Developer è gratuito. Sarai limitato a tre progetti privati, ma è sufficiente per fare prove. Vai su https://studio.edgeimpulse.com/signup e inserisci i tuoi dati nel modulo:

Edge Impulse signing-up form
Modulo di registrazione Edge Impulse

Dopo la registrazione puoi creare un progetto, di cui parleremo nella sezione successiva. Se hai problemi, il Edge Impulse Documentation può aiutarti.

Creare un progetto su Edge Impulse

Per creare un progetto vai su https://studio.edgeimpulse.com/studio/profile/projects, clicca sul pulsante “+ Create new project” a destra. Si aprirà una finestra dove potrai inserire un nome per il progetto, ad esempio “esp32-cam-object-detection” e impostare alcune proprietà del progetto, come mostrato sotto:

Creare un progetto Edge Impulse

Per il tipo di progetto seleziona “Personal” e rendilo privato. Poi premi semplicemente il pulsante verde “Create new project” in basso.

Dashboard di Edge Impulse

Dopo aver creato un progetto verrai reindirizzato alla Dashboard. Ci sono alcune sezioni che voglio evidenziare per te:

Edge Impulse Dashboard
Dashboard di Edge Impulse

Al centro appare il nome del tuo progetto, ad esempio esp32-cam-object-detection, che puoi modificare. In alto a destra puoi selezionare la piattaforma target.

La scheda AI Thinker ESP32-CAM non appare come supportata, ma c’è l’Espressif ESP-EYE, che dovresti scegliere per questo tutorial. Con una piccola modifica il codice generato funzionerà anche per l’ESP32-CAM.

Nella barra laterale a sinistra ci sono le funzioni per l’acquisizione dati e la progettazione dell’Impulse. Un “Impulse” è una breve pipeline di elaborazione dati, che contiene il preprocessing (es. scaling) e il modello di rete neurale.

Acquisizione dati in Edge Impulse

Edge Impulse supporta vari metodi per raccogliere dati. Useremo il più semplice, cioè raccogliere immagini con il tuo smartphone.

Clicca su “Data acquisition” nella barra laterale, si aprirà un nuovo pannello. A destra, sotto “Collect data” clicca sul link “Connect a device”:

Edge Impulse Connect a Device
Edge Impulse Connessione dispositivo

Si aprirà una finestra con tre opzioni. Usa il codice QR a sinistra con il tuo telefono per aprire un’app che ti permette di scattare foto come campioni di dati con il telefono:

Connect Device via QR code
Connessione dispositivo via codice QR

Ecco come apparirà l’app sul tuo telefono dopo aver concesso i permessi per eseguirla e scattare foto:

Edge Impulse Data Collection App
App per raccolta dati Edge Impulse

Premi il pulsante blu “Capture” per scattare foto, che verranno inviate alla piattaforma Edge Impulse. Le etichetteremo in un secondo momento.

Makkuro Kurosuke e Auto

Per questo tutorial userò due oggetti da rilevare, un Makkuro Kurosuke e un’auto:

Makkuro Kurosuke and Car
Makkuro Kurosuke e Auto

Nel caso non lo sapessi, Makkuro Kurosuke (o Susuwatari) è un personaggio immaginario del film dello Studio Ghibli Il mio vicino Totoro, e può essere tradotto liberamente come “Piccolo Spirito della fuliggine”. Per l’etichettatura lo chiamerò semplicemente “Kurosuke”.

Questi due oggetti sono interessanti per provare il rilevamento oggetti. Il Kurosuke è quasi privo di caratteristiche, solo una palla nera che può essere facilmente confusa con altri oggetti neri. L’auto invece ha una forma complessa e il modello deve imparare una buona rappresentazione per rilevarla in modo affidabile.

Se raccogli i dati, assicurati di farlo nelle stesse condizioni in cui il modello dovrà rilevare. Altrimenti il rilevatore farà molti errori.

Ad esempio, copri angolazioni, distanze, sfondi e livelli di illuminazione diversi per rendere la rilevazione robusta. Qui sotto alcuni esempi di dati che ho raccolto (e etichettato):

Example Captures
Esempi di immagini catturate

Nota però che più cambiano le condizioni ambientali, più difficile sarà il compito per il rilevatore e più dati dovrai raccogliere. Se vuoi semplificare, usa lo stesso sfondo, angolo e luce – in altre parole: controlla l’ambiente il più possibile.

Etichettatura dati

Una volta raccolte abbastanza immagini per entrambi gli oggetti – mira ad almeno 30 immagini per oggetto – puoi iniziare a etichettare i dati. Le immagini (campioni) appariranno a sinistra e cliccando su una vedrai un ingrandimento in basso a destra:

Selecting pictures for labelling
Selezione immagini per etichettatura

Qui puoi usare il mouse per disegnare un riquadro intorno all’oggetto da rilevare e assegnargli un’etichetta, nel mio caso “Car” o “Kurosuke”:

Labelling the Car in a picture
Etichettatura dell’auto in un’immagine

Dovrai fare questo per tutte le immagini e mantenere coerenza nell’etichettatura dei due (o più) oggetti da rilevare.

La buona notizia è che la piattaforma Edge Impulse propone un bounding box dopo la prima etichettatura, rendendo il processo molto più veloce. Puoi modificare dimensione e posizione del riquadro proposto cliccando sulle icone di trascinamento o ridimensionamento agli angoli.

Creare un Impulse in Edge Impulse

Una volta completata la raccolta e l’etichettatura, clicca su “Create Impulse” sotto “Impulse Design” nella barra laterale della Dashboard:

Create Impulse
Creare Impulse

Si aprirà il pannello con alcuni blocchi di elaborazione come mostrato sotto:

Object Detection Impulse
Impulse per rilevamento oggetti

Inizialmente i blocchi nel pannello potrebbero essere diversi, ma puoi eliminarli cliccando sull’icona del cestino in basso a destra di ogni blocco. Poi aggiungi nuovi blocchi cliccando su “Add … block” e seleziona e configura quelli necessari:

In particolare, ti serve un blocco “Image data” (input) con dimensione immagine 96×96 pixel e modalità Resize “Fit longer axis”.

Segue un blocco “Image” (elaborazione) e poi un blocco Object Detection (apprendimento). L’ultimo blocco sono le Output features. Puoi vedere che mostra già i due oggetti (Car, Kurosuke) che vogliamo rilevare.

Una volta fatto, hai creato un “Impulse”, che è essenzialmente una breve pipeline di elaborazione dati composta da un blocco di elaborazione caratteristiche e un blocco di rete neurale (modello).

Caratteristiche di Edge Impulse

Ora puoi regolare e analizzare le caratteristiche estratte dal blocco di elaborazione immagini. Clicca su “Image” sotto “Impulse Design” nella barra laterale della Dashboard:

Si aprirà un nuovo pannello, dove dovresti selezionare “Grayscale” per il parametro Color depth:

Questo significa che convertiremo l’immagine in scala di grigi, che sono più veloci da processare e consumano meno memoria. Di conseguenza, il rilevamento sarà più veloce ma la precisione potrebbe risentirne un po’, poiché perdiamo l’informazione del colore.

Feature Explorer

Premi il pulsante blu “Save parameters” e poi potresti dover premere “Generate Features” per avviare il Feature explorer:

Feature Explorer for grayscale images
Feature Explorer per immagini in scala di grigi

Il feature explorer converte ciascuna delle nostre immagini in scala di grigi in vettori con 96×96 = 9216 dimensioni. Poi li proietta in due dimensioni e li rappresenta su un piano. Ogni punto nel grafico rappresenta un’immagine e il colore indica quale oggetto contiene.

Quello che vuoi vedere è che i punti dello stesso colore siano raggruppati strettamente e che i due gruppi di colori diversi siano ben separati. Questo indica che le caratteristiche sono adatte a distinguere le due classi di oggetti. Qui sotto un esempio inventato di clustering molto buono che indicherebbe caratteristiche quasi perfette:

Clustering for near-perfect features
Clustering per caratteristiche quasi perfette

Nel mio caso, puoi vedere che i punti sono abbastanza raggruppati ma la separazione tra i gruppi non è ottimale ma accettabile. Questo significa che non è un problema di rilevamento banale e la precisione probabilmente non sarà perfetta.

Tuttavia, il feature explorer guarda solo i pixel grezzi e il modello di rilevamento non è ancora stato addestrato e valutato. Ma il feature explorer ti permette di provare diverse caratteristiche. Ad esempio, qui sotto il grafico delle caratteristiche per immagini RGB (invece che in scala di grigi):

Feature Explorer for RGB images
Feature Explorer per immagini RGB

Come vedi, il clustering non è molto migliore, quindi restiamo con le immagini in scala di grigi, poiché il tempo di inferenza sarà più veloce. Nelle sezioni successive ti mostro come addestrare e valutare il modello. Avremo così una migliore comprensione delle prestazioni di rilevamento.

Addestrare il modello in Edge Impulse

Per addestrare il modello di rilevamento clicca su “Object detection” nella barra laterale:

Si aprirà un pannello a destra con le impostazioni per l’addestramento e un pulsante blu in fondo “Save & train”:

Settings for model training
Impostazioni per l’addestramento del modello

Puoi lasciare le impostazioni così come sono e funzionerà bene. Io stesso ho aumentato il Learning rate da 0.001 a 0.01, dato che il dataset è piccolo e il problema di rilevamento non è molto difficile.

Un learning rate più alto accelera la convergenza dell’addestramento (l’errore/loss diminuisce più velocemente) e potresti ottenere una precisione maggiore con lo stesso numero di cicli di addestramento. Tuttavia, se il learning rate è troppo alto l’addestramento non converge e il modello non impara.

Output dell’addestramento

Puoi monitorare l’addestramento nella finestra console chiamata Training output. Dovresti vedere un valore in diminuzione continua per il Train LOSS:

Training output
Output dell’addestramento

Se il Train LOSS aumenta o oscilla, il learning rate è troppo alto. Anche il Validation LOSS dovrebbe diminuire continuamente. Se aumenta, hai addestrato per troppe epoche e dovresti ridurre il numero di cicli.

Al termine dell’addestramento, la piattaforma mostra la matrice di confusione e altre metriche di valutazione basate sul set di validazione:

Model evaluation
Valutazione del modello

Nel mio caso ottengo una matrice di confusione perfetta e un F1 SCORE del 100%. Nella matrice si vede che il modello distingue perfettamente (100%) tra BACKGROUND, CAR e KUROSUKE.

Tuttavia, questo è un po’ fuorviante e non rappresenta la vera performance su dati nuovi. La valutazione è fatta sul set di validazione e se i dati di addestramento e validazione sono molto pochi (come nel mio caso), la valutazione tende a essere troppo ottimistica. Per una stima più accurata, dovresti raccogliere più dati.

Puoi anche andare su “Model testing” e valutare le prestazioni del modello sui dati di test:

Come vedi, la precisione sul test set è solo del 75%

Model evaluation on test data
Valutazione del modello su dati di test

Ma anche qui il test set è molto piccolo (12 campioni) e la stima della precisione non sarà molto affidabile.

Distribuire il modello con Edge Impulse

Ora siamo pronti a distribuire il modello sull’ESP32-CAM. Clicca su “Deployment” sotto “Impulse Design” nella barra laterale della Dashboard:

Si aprirà un pannello con le opzioni di distribuzione:

Deployment options
Opzioni di distribuzione

Puoi lasciare le opzioni di default, che dovrebbero essere “Arduino library”, “TensorFlow Lite” e “Quantized (int8)” come mostrato sopra. Cliccando sul pulsante blu “Build” in basso, la piattaforma genererà una libreria Arduino .ZIP che potrai scaricare:

Il nome di questa libreria deriva dal nome del progetto e dal numero di distribuzioni. Nel mio caso è ei-esp32-cam-object-detection-arduino-1.0.13.zip

Installare il modello di rilevamento su ESP32-CAM

Infine, possiamo installare il modello addestrato sull’ESP32-CAM. Basta installare la libreria scaricata (ei-esp32-...zip) come al solito nell’IDE Arduino tramite Sketch -> Include Library -> Add .ZIP library.

Se l’installazione ha successo, puoi aprire uno sketch chiamato “esp32_camera” che si trova sotto File -> Examples -> esp32-cam-object-detection_inferencing -> esp32:

Il nome dell’esempio sarà il nome del tuo progetto (nel mio caso esp32-cam-object-detection) con il suffisso “_inferencing”.

Definire il modello della fotocamera

Ora, prima di poter eseguire il modello ci sono due modifiche importanti da fare! Prima, se guardi il codice dello sketch esp32_camera troverai costanti definite per le schede ESP-EYE e AI-THINKER. Devi commentare o cancellare la costante CAMERA_MODEL_ESP_EYE e decommentare la costante CAMERA_MODEL_AI_THINKER come mostrato sotto:

Se ora esegui lo sketch probabilmente non funzionerà ancora! Richiede la ESP32 Core Version 2.0.4 installata! Ne parleremo nella sezione successiva.

Installare ESP32 Core 2.0.4

Ad agosto 2025, la versione dell’ESP32 Core è 3.3.0. Ma se provi a eseguire lo sketch esp32_camera con questa versione, otterrai un errore “cam_hal: DMA overflow“!

Per installare ESP32 Core 2.0.4 apri il BOARDS MANAGER e seleziona la versione 2.0.4 per il core esp32. Una volta installato, dovrebbe apparire così:

ESP32 Core 2.0.4 installato

Ora dovresti poter eseguire il modello di rilevamento senza errori. L’IDE Arduino ti segnalerà che ci sono aggiornamenti disponibili per le tue schede:

ma non vuoi installarli, perché sostituirebbero la versione ESP32 Core 2.0.4 con una più recente.

Compilare ed eseguire il modello di rilevamento su ESP32-CAM

Nota che la prima compilazione richiederà molto tempo, 15 minuti o più a seconda del sistema! Le compilazioni successive saranno più veloci.

Una volta compilato e flashato, puoi puntare l’ESP32-CAM su alcuni oggetti e i risultati del rilevamento verranno stampati sul Monitor Seriale:

ESP32-CAM with objects to detect
ESP32-CAM con oggetti da rilevare

Vedrai l’etichetta (classe) dell’oggetto rilevato, es. “car”, la confidenza del rilevamento, es. 0.726, e le coordinate del bounding box:

Detection Results printed in Serial Monitor
Risultati del rilevamento stampati nel Monitor Seriale

Il sistema ti dice anche quanto tempo impiega un rilevamento. Nel mio caso sono 714ms. Nota che il tempo di rilevamento (inferenza) è indipendente dal numero di campioni di addestramento e poco influenzato dal numero di oggetti da rilevare. Quindi, sentiti libero di migliorare le prestazioni del modello raccogliendo più dati.

Conclusioni e commenti

In questo tutorial hai imparato come addestrare un modello di rilevamento oggetti con Edge Impulse e distribuirlo su un ESP32-CAM.

Nota che Edge Impulse offre molto più di quanto trattato in questo tutorial e ti consiglio di leggere il Edge Impulse Documentation. Ad esempio, è possibile testare il modello in tempo reale nel browser o sul telefono – molto interessante. Oltre all’ESP32-CAM ci sono molti altri target e opzioni di distribuzione supportati. E mentre abbiamo raccolto i dati di addestramento con un telefono, puoi anche raccoglierli direttamente dal dispositivo.

Quest’ultima è l’opzione migliore ma un po’ più complessa (nel caso dell’ESP32-CAM). Perché è meglio? Perché i dati di addestramento vengono raccolti dalla stessa fotocamera che usa il modello di rilevamento. Noterai, se provi la classificazione live via telefono, che la precisione è migliore rispetto a quella ottenuta sull’ESP32-CAM.

Limiti di Edge Impulse con ESP32-CAM

Sebbene Edge Impulse renda facile addestrare e distribuire un modello di visione, ci sono alcuni limiti. L’ESP32-CAM non è supportato direttamente ma richiede solo una piccola modifica al codice. Il problema più grande è che il codice funziona solo con la versione obsoleta ESP32 Core 2.0.4 (agosto 2025), altrimenti si ottiene l’errore “cam_hal: DMA overflow” quando si prova a eseguirlo.

Inoltre, sebbene l’installazione tramite libreria .ZIP sia comoda, significa anche che la cartella delle librerie si riempirà se costruisci più progetti. Sarebbe meglio copiare il codice direttamente nello sketch per mantenerlo locale. Ho provato ma non ha funzionato e probabilmente richiede modifiche ai percorsi. Comunque puoi distribuire anche il codice C++, ma non funzionerà subito nell’IDE Arduino.

Rilevamento oggetti su PC

La potenza di calcolo dell’ESP32-CAM è piuttosto limitata, quindi il tempo di rilevamento è abbastanza lento e il modello non è molto preciso. Se ti serve un rilevamento più veloce e accurato, puoi trasmettere il video dall’ESP32-CAM al PC ed eseguire lì il modello. Vedi il Object Detection with ESP32-CAM and YOLO tutorial per i dettagli.

SenseCraft e XIAO ESP32-S3-Sense

Se vuoi solo eseguire un modello di rilevamento facciale o di persone su un microcontrollore piccolo, dai un’occhiata ai Face Detection with XIAO ESP32-S3-Sense and SenseCraft AI e ai Edge AI Room Occupancy Sensor with ESP32 and Person Detection tutorial. Lì usiamo la piattaforma SenseCraft e un microcontrollore XIAO ESP32-S3-Sense. La distribuzione è più semplice ma ti serve un secondo microcontrollore. Dai un’occhiata.

Alimentazione a batteria

Eseguire un modello di rilevamento su un microcontrollore apre la porta a un sistema di rilevamento alimentato a batteria. Tuttavia, far funzionare l’ESP32-CAM continuamente consuma ancora molta batteria. Potresti usare un sensore PIR per attivare il sistema solo se viene rilevato movimento. Per dettagli, vedi il nostro Motion Activated ESP32-CAM tutorial. E, se sei completamente nuovo all’ESP32-CAM, ti consiglio anche il Programming the ESP32-CAM tutorial.

Se hai domande, sentiti libero di lasciarle nella sezione commenti.

Buon divertimento con il tinkering 😉