utilità

MARS ROVER CON RASPBERRY – IL PROGETTO INNOVATIVO CHE HA ENTUSIASMATO GLI STUDENTI

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.

mars rover raspberry smart car

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.

Smart Car to assemble

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.

mars rover raspberry smart car batteries

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.

BME280

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 :

progetto innovativo raspberry

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.

progetto innovativo raspberry

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

2 switches

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

RPI Desktop

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)

Putty - mars rover raspberry smart car
Command window

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.

RPI Camera

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 :

progetto innovativo raspberry

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.