Un progetto innovativo realizzato nell’ambito del PCTO (ex alternanza scuola lavoro) ha visto coinvolti alcuni ragazzi delle scuole superiori dell’hinteland milanese lo scorso giugno. Obiettivo: la realizzazione di un prototipo di Mars Rover tramite smart car. Cuore del progetto, ancora una volta, l’ineguagliabile Raspberry PI.
Troverete in questo articolo tutti i dettagli per la realizzazione, chissà che a qualcun altro non venga in mente di proporlo in altre aziende o a scuola.
OBIETTIVI DEL PROGETTO
L’attività si è svolta nell’arco di una settimana, nella quale i ragazzi sono stati impegnati dalle 9:00 alle 17:00 tutti i giorni. Lo scopo era quello di fornire un’idea di come si sviluppa un progetto in ambito aziendale, quali sono le fasi da quella progettuale alla commercializzazione.
Nel caso specifico l’obiettivo del progetto era creare un propotipo in miniatura di un Mars Rover con Raspberry e smart car, per evidenziare le criticità di cui tenere conto nella fase di sviluppo del prodotto finale. Il rover doveva muoversi comandato da remoto, acquisire immagini video e dati rilevanti come temperatura, pressione, umidità, stato delle batterie, che dovevano essere memorizzati in opportuni database e quindi visualizzati in tempo reale.
Diciamo innanzi tutto che non siamo partiti da zero, il modellino SmartCar della Freenove ci ha dato la meccanica di base per i movimenti. Tutto il resto, vale a dire software di controllo e raccolta dati nonché i sensori, è stato realizzato dai ragazzi.
Ok, sento già le critiche … pensare che questo oggettino possa andare su Marte è un po’ troppo quindi il nome Mars Rover è un filino esagerato. Siamo d’accordo, però dai fatemelo passare, era per rendere la cosa più intrigante.
L’ultimo giorno c’è stata la presentazione al pubblico di quello che voleva essere un progetto innovativo tramite Raspberry. Pubblico composto dai ragazzi stessi, genitori, studenti e dal personale aziendale che li ha seguiti.
RIASSUNTO DELLE OPERAZIONI DA ESEGUIRE PER METTERE IN FUNZIONE IL ROVER
Queste le operazioni da fare per mettere in funzione il Rover, che vedremo passo passo nei prossimi paragrafi.
- Assemblare la Smart Car che d’ora in poi chiamaremo Rover;
- Caricare nel Raspberry l’immagine del sistema operativo già prediposta con il software necessario che trovate qui
- Configurare il database InfluxDb
- Aprire l’app di controllo nel vostro smartphone con Mit App Inventor
- Collegare lo smartphone con il Mars Rover e farlo muovere
- Visualizzare in tempo reale i dati di temperatura, pressione, umidità e stato della batteria con Grafana
Procediamo quindi un passo alla volta e vediamo ocme mettere in funzione il Rover
VISTA D’INSIEME
Vediamo nel suo insieme gli elementi di cui è composto il Mars Rover e come viene comandato.
Smart Car
Il prodotto è abbastanza conoscito tra gli hobbisti, lo abbiamo chiamato Mars Rover e si tratta della Smart Car con Raspberry. Un kid di montaggio molto semplice, le istruzioni sono fornite dal costruttore.
ATTENZIONE: il Raspberry non è presente nel kit, dovrete acquistarlo a parte, consiglio di prendere il più economico che trovate, le prestazioni richieste sono veramente minime pertanto anche un Raspberry PI 3 va più che bene, il PI4 e PI5 pur andando ovviamente benissimo a mio parere sono sovradimensionati per quello che serve.
Dovrete anche dotarvi di 2 batterie al litio da 3,7V ricaricabili, modello ICR18650, con relativo caricabatterie. Sono indispensabili per l’alimentazione dei motori e del Raspberry in quanto vorrete ovviamente evitare di tenere il rover collegato ad un cavo di alimentazione finché si muove.
Il kit della smartcar arriva fornito di vari sensori come gli ultrasuoni per rilevare la distanza degli oggetti che stanno di fronte (i due occhietti frontali), una telecamera, e degli IR per il line tracking vale a dire il rilevamento di una linea nera su sfondo bianco da tracciare sul pavimento, non utilizzata in questo contesto.
Altri componenti
Abbiamo dotato la smartcar di un sensore BME280. Si tratta di un piccolo integrato che rileva dati climatici come la temperatura, la pressione atmosferica e l’umidità, inviandoli con un protocollo seriale al Raspberry.
Lo trovate online e costa veramente pochissimo.
ASSEMBLAGGIO
L’assemblaggio del rover, come dicevamo sopra, è semplice e aggiungerei anche divertente. Vi terrà impegnati per un’oretta circa. Consiglio di prestare particolare attenzione al montaggio dei motori, seguite attentamente le figure per orientarli correttamente, vi eviterete la seccatura di doverli smontare e girare se doveste scoprire troppo tardi che ruotano al contrario. Un occhio di riguardo anche per la telecamera, il cavo flat e il relativo connettore sono piuttosto delicati, attenzione al verso di inserimento del cavo e serrate il connettore con delicatezza.
Per quanto riguarda il BME280, va collegato al connettore a pettine del Raspberry in questo modo :
La connessione può essere fatta con dei fili dupont, noi abbiamo optato per far fare un po’ di bricolage ai ragazzi con una basetta multiforo e lo stagnatore. Ne è uscito questo accrocchio, che non è molto elegante ma è sicuramente funzionale.
IL SOFTWARE
Il Raspberry va predisposto con il sistema operativo e il software necessario per far muovere il Rover.
Scaricarvi l’immagine contenente il sistema operativo e tutto il software già configurato e funzionante da qui, sono circa 8GB;
- Utilizzando il programma Win32DiskImager flashate una memory card con l’immagine che vi siete scaricati;
- Inserite la memory card nel Raspberry;
FUNZIONAMENTO DEL MARS ROVER E DEL SOFTWARE
Accensione e connessione della smart car
La prima cosa da notare è che sulla scheda principale avete 2 pulsanti, denominati S1 Power Switch e S2 Load Switch
S1 Power Switch alimenta solo il Raspberry, tramite le batterie, ma non alimenta i motori. Se dovete solo accendere il Raspberry senza far muovere i motori del Rover il mio consiglio è di utilizzare un alimentatore esterno da connettere alla porta micro USB di alimentazione.
S2 Load Switch alimenta i motori. Dovete premere sia S1 che S2 ed avere le batterie cariche se volete che i motori ruotino e il Rover si muova.
Quindi, per riassumere:
Se dovete solo accendere il Raspberry premete S1, in alternativa collegate un alimentatore esterno al Raspberry.
Se invece dovete far muovere il Rover e non volete cavi collegati, premete sia S1 che S2.
4 Led posizionati nella parte posteriore della scheda indicano lo stato di carica delle batterie.
Il sistema operativo installato è il classico Raspberry PI OS (ex Raspbian) con il suo bel desktop ed interfaccia grafica …. che tuttavia non vi serve in quanto i due comandi in croce che dovete dare per far partire i programmi e mettere in movimento il Rover li darete via shell. Quindi potete collegare un monitor ed aprire una finestra di comando
oppure, meglio ancora, collegatevi via SSH al Raspberry da un altro PC utilizzando un client come PuTTY.
Lanciate PuTTY e connettetevi all’indirizzo del Raspberry (nell’esempio qui sotto 192.168.1.31)
Utente: pi
Password: raspberry
Bene, siete connessi.
Fate subito un primo veloce test per vedere se la telecamera funziona.
Da un PC collegato alla stessa rete WiFi alla quale si è agganciato il Raspberry, aprite il browser e digitate l’indirizzo :
http://<IP raspberry>:8000 ad esempio : http://192.168.1.31:8000
Vi dovrebbe comparire l’immagine della telecamera.
Il software – semplici script per muovere il Mars Rover
Dalla shell alla quale vi siete connessi al Raspberry date il comando
cd MarsRover
per andare nella cartella contenente i programmi
Assicuratevi che entrambi i pulsanti S1 e in particolare S2 siano premuti e quindi i motori siano alimentati.
Date il comando python Motor.py seguito da invio
I motori inizieranno a ruotare e il Rover a muoversi: 3 secondi in avanti, 3 secondi indietro, 3 secondi a sinistra, 3 a destra quindi si fermerà.
Potete anche analizzare il programma Python, è abbastanza intuitivo. Questa la parte di codice che fa muovere i motori.
def loop():
PWM.setMotorModel(2000,2000,2000,2000) #Forward
time.sleep(3)
PWM.setMotorModel(-2000,-2000,-2000,-2000) #Back
time.sleep(3)
PWM.setMotorModel(-900,-900,900,900) #Left
time.sleep(3)
PWM.setMotorModel(900,900,-900,-900) #Right
time.sleep(3)
PWM.setMotorModel(0,0,0,0) #Stop
Per provare il funzionamento del buzzer:
python Buzzer.py
Nella stessa cartella trovate alcuni script che sono descritti anche nel manuale della smart car.
Consiglio di provarne qualcuno e dare un’occhiata al codice per capire come funziona. Quindi passare al paragrafo successivo.
Struttura generale del progetto Mars Rover
Fin qui si è trattato di assemblare una smart car con Raspberry e farla muovere, quindi niente di particolarmente complesso o di nuovo rispetto a quanto già previsto dai produttori della smart car.
La parte più divertente e coinvolgente di questo progetto è stata lo sviluppo di un’app per smartphone che comunicasse con il Rover e lo facesse muovere. In contemporanea il Rover doveva raccogliere i dati di temperatura, pressione e umidità e inviarli ad un database. Questo schema riassume il tutto :
La comunicazione tra il Raspberry del Rover e lo smartphone avviene tramite tramite un’applicazione scritta in python nel Raspberry, la quale apre una connessione socket e resta in ascolto. Contemporaneamente viene fatta partire un’app nello smartphone connesso alla stessa rete, questa app a sua volta si connette al socket. A questo punto l’app dello smartphone e il Raspberry possono comunicare.
Abbiamo quindi definito un protocollo, cioè cosa deve fare il Rover al ricevimento di determinati messaggi da parte dell’app.
Inoltre, l’applicazione python invia periodicamente i dati letti dal sensore BME280 ad un database su cloud chiamato Influxdb.
Infine, i dati vengono letti dal database Influxdb e presentati tramite il tool Grafana.
Come mettere in funzione il tutto – step by step
Vediamo di realizzare quanto scritto sopra, passo per passo.
Verifica della connessione del sensore BME280
Se il sensore è stato collegato come riportato in precedenza allora trasmetterà i dati attraverso la porta seriale I2C numero 4. Verificate l’indirizzo esadecimale del BME280 tramite il comando
sudo i2cdetect -y 4
Dovrebbe essere 0x76 come si vede dalla figura sopra. Qualora fosse differente segnatevi il numero. Se non dovesse comparire alcun indirizzon controllate di aver connesso il BME280 correttamente.
Creazione di un account InfluxDB
InfluxDB è il database cloud nel quale caricheremo i dati di temperatura, pressione, umidità e stato della batteria rilevati dal sensore.
Andate all’indirizzo di InfluxDB, createvi un account ed eseguite il login.
Click su Load Data e quindi selezionare Buckets. Un Bucket è un contenitore di dati.
Premere il pulsante +CREATE BUCKET per creare un nuovo Bucket. Chiamatelo ad esempio Rover2024 e lasciate gli altri parametri di default. Premere CREATE per terminare l’operazione.
Tornate al menu sulla sinistra e selezionate stavolta API Tokens.
Quindi +GENERATE API TOKEN e poi All Access API Token
Date un nome al Token e premete SAVE
Nella schermata successiva vi comparirà il token. Attenzione perché è l’unica volta che lo potrete vedere, premete il tasto COPY TO CLIPBOARD e salvatelo da qualche parte.
Andate nuovamente al menu di sinistra Load Data e stavolta selezionate Sources
Quindi nella parte centrale dello schermo, sotto Client Libraries, selezionate Python
andate alla sezione Inizialize Client e copiatevi l’indirizzo dell’host
Per quanto riguarda la configurazione di InfluxDb è tutto.
Impostazioni del programma di connessione socket
L’applicazione Python che garantisce la connessione socket con l’app dello smartphone si trova nella cartella MarsRover, entrate nella cartella ed aprite il file socket3.py con un editor
nano socket3.py
Andate alla sezione #Influxdb code
Inserite il token che vi siete copiati in precedenza. Come org inserite la mail con la quale vi siete iscritti a InfluxDb. Come url l’indirizzo dell’host che vi siete copiati in precedenza.
Andate quindi nella sezione TEMPERATURE, PRESSION AND HUMIDITY FROM BME280 e modificate l’indirizzo esadecimale del sensore qualora sia diverso da 0x76. Il resto lasciatelo invariato.
Infine andate nella sezione MAIN e cambiate l’indirizzo IP del Raspberry, mettendo quello acquisito nella vostra rete WiFi. Nell’esempio qui sotto 192.168.1.31 ma nel vostro caso potrebbe essere differente. La porta 7000 resta invariata.
L’app per smartphone per pilotare il Rover
Passiamo adesso all’app per smartphone che comanda il Mars Rover che, assieme alla memorizzazoine dei dati un un database cloud, rappresenta l’aspetto innovativo di questo progetto con Raspberry.
E’ stata scritta con Mit App Inventor.
Dal browser del vostro PC andate nel sito Mit App Inventor ed importate il progetto, si tratta di un file denominato Rover130523.aia che potete scaricare da qui.
Questa l’interfaccia che vi si presenterà :
Nel vostro smartphone installatevi l’app MIT AI2 Companion ed apritela. Quindi selezionate scan QR code. Dal browser del PC selezionate Connect –> AI Companion
Inquadrate il QR Code. A questo punto l’app dovrebbe aprirsi sul vostro smartphone.
Connessione tra app e Rover
Tornate alla shell con la quale siete connessi al Raspberry.
Andate nella cartella /home/pi/MarsRover in cui si trova il programma socket3.py ed eseguitelo con il comando python socket3.py
Andate all’app sullo smartphone, assicuratevi che l’indirizzo IP che compare in alto sul campo Address corrisponda a quello del vostro Raspberry, quindi premete Connect
Nella shell vi comparirà il messaggio Connection Established
Smartphone e Mars Rover sono ora connessi.
Premento i pulsanti Forward, Bw, Left e Right dovrebbe iniziare a muoversi.
Noterete anche che sta iniziando ad inviare i dati del BME280 ad InfluxDb
Se fin qui ha funzionato tutto correttamente, dovreste riuscire a muovere il Rover e vedere l’immagine della telecamera sullo smartphone.
Analisi dei dati del BME280
Tornate alla vostra pagina in InfluxDb, stavolta selezionate Data Explorer.
Nella finestra centrale vedrete del codice in linguaggio flux che serve per filtrare i dati.
Selezionate tutto e cancellatelo.
Premete il pulsante + NEW SCRIPT
Quindi abilitate il selettore Flux Sync, in questo modo qualsiasi selezione farete da ora in poi verrà automaticamente tradotta in linguaggio Flux.
Selezionate quindi come Bucket quello chiamato Rover2024, come measurement rover ed infine i 4 fields battery, humidity, pression, temperature
Il codice Flux che comparirà al centro sarà simile a questo :
from(bucket: "Rover2024")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r._measurement == "rover")
|> filter(
fn: (r) =>
r._field == "battery" or (r._field == "humidity" or (r._field == "pression" or r._field
==
"temperature")),
)
Premeter RUN. Nella tabella vi compariranno i valori finora trasmessi dal BME280.
Visualizzazione dei dati con Grafana
Ora che avete i dati nel database InfluxDb, potete utilizzare un tool come Grafana per visualizzarli.
Andate nel sito Grafana: The open observability platform | Grafana Labs e createvi un account gratuito.
Quindi selezionate MyAccount e nella pagin che si aprirà cliccate sul pulsante Launch per aprire Grafana
Comparirà la finestra di loading e dopo qualche istante il pannello di controllo
Premete il pulsante Connect Data
e quindi selezionate InfluxDb
Nella finestra che si apre selezionate Add new data source
Nella finestra successiva date un nome a questa sessione.
Come Query language selezionate Flux
URL : https://eu-central-1-1.aws.cloud2.influxdata.com/orgs/1571cd2f28adf333/data-explorer?fluxScriptEditor oppure quello precedentemente ricavato da InfluxDb
Continuate a scorrere verso il basso.
Nella sezione Basic Auth Details inserite le vostre credenziali di InfluxDb
Organization: la mail di login in InfluxDb
Token: il token ricavato in precedenza
Dafault bucket: Rover2024 o quello che avete impostato in InfluxDb
Premete il pulsante SAVE & TEST
Se tutto ha funzoinato correttamente avrete il messaggio
Ora tornate nella parte superiore della stessa pagina e premete il pulsante Build a dashboard
Quindi Add Visualization
ed infine selezionate il data source RoverTest che avete appena creato
A questo punto potete sbizzarrirvi nella creazione della dashboard.
Ad esempio, selezionate in alto a destra come visualizzazione Gauge.
Ora nella parte in basso copiate il codice Flux lasciando il filtro solo per i dati della batteria, come da figura qui sotto
Premete Apply
La tensione della batteria sarà visualizzata sulla dashboard.
In maniera del tutto analoga potete aggiungere altri pannelli con dati differenti e con altre tipologie di visualizzazione
Conclusioni
L’attività è stata svolta con gli studenti nell’arco di una settimana, anche se di fatto lo sviluppo vero e proprio li ha impegnati per tre giorni.
Come potete constatare, quello che abbiamo un po’ pomposamente chiamato Mars Rover e che voleva in qualche modo essere un progetto innovativo con Raspberry, spazia vari ambiti: lo sviluppo in Python, le connessioni socket, lo sviluppo di un protocollo, lo sviluppo di un’app per smartphone, la memorizzazione dei dati in un database cloud ed infine la visualizzazione con un tool ad alto impatto visivo come Grafana. Sta ovviamente a chi coordina il gruppo di studenti fornire le dovute spiegazioni per guidarli opportunamente nelle varie fasi dello sviluppo del progetto.
Altro aspetto importante, che poi era tra gli obiettivi del progetto, l’individuazione delle problematiche emerse e quindi i limiti del Rover per definire quelle che si chiamano “lessons learnt” di cui il team che svilupperà il prototipo dovrà tenere conto.
Il risultato è stato più che soddisfacente, anche se i tempi erano ristretti l’esperienza ha reso l’idea di come si sviluppa un progetto in ambito aziendale.