RadarIno by Luca Castagna & Riccardo Berra

Il progetto “RadarIno” consiste in un prototipo di radar che attraverso gli ultrasuoni  identifica gli ostacoli nei 5 metri circostanti e tramite il wi-fi si ha una visuale sul pc. Questo progetto è stato realizzato da Luca Castagna e Riccardo Berra i quali prendendo spunto dai quadranti sonar dei sommergibili hanno voluto realizzare un progetto analogo.

Elenco materiale:

  • 1x Fishino Uno
  • 4x Sensore ultrasuoni HC-SR04
  • 1x Groove Hall sensor
  • 1x Servo motore a rotazione continua
  • 1x Slip ring 12 wires
  • 1x Alimentatore da 9V
  • 2x Ingranaggi
  • Plexiglass

Codice e software:
https://drive.google.com/open?id=0BxgQiEQbcms5ME1IMmxFQV9ra2s

radarino

Radarino

visualePC

Visuale via PC

Componenti Radarino

Componenti Radarino

 

Schema elettrico

Schema elettrico

 

 

Principio di funzionamento
Il RadarIno deve il suo funzionamento all’utilizzo dei Sensori a ultrasuoni HC SR04 che permettono di ottenere la distanza di un oggetto posto fino a 5m dal sensore, con la precisione teorica di 1cm. Il suo principio di funzionamento è dato dalla velocità del suono (approssimata a 340 m/s per semplicità) e dal tempo che impiega un segnale di trigger inviato dal sensore stesso a ritornare dopo essere “rimbalzato” contro una superficie. Il sensore restituisce il tempo impiegato per andare e tornare dalle onde sonore in microsecondi, inoltre è comodo avere la misura in cm, quindi bisogna convertire la velocità del suono da m/s in cm/microsecondo:
1m/s = 10^2/10^6 cm/microsec = 10^-4 cm/microsec => 340 m/s = 3,4*10^-2 cm/microsec

Il tutto va ancora diviso per 2 in quanto il tempo che abbiamo convertito è quello impiegato per andare e tornare indietro dalle onde, mentre per calcolare la distanza dall’oggetto ci basta metà di questo tempo, la formula finale, dove t è il tempo restituito dal sensore in cm/microsec è:

S = 1.7 * 10^-2 * t cm

Il sensore dispone di 4 pin: Vcc (+5V), Trigger, Echo, GND. Si invia un impulso alto sul pin Trigger per almeno 10 microsec, a questo punto il sensore invierà il ping sonoro e aspetterà il ritorno delle onde riflesse, il sensore risponderà sul pin Echo con un impulso alto della durata corrispondente a quella di viaggio delle onde sonore, dopo 38 millisec si considera che non sia stato incontrato alcun ostacolo. Per sicurezza si aspettano in genere 50 millisec per far si che non vi siano interferenze con la misura successiva.

Il RadarIno utilizza 4 sensori HC SR04 posti a croce perpendicolarmente tra di loro e rivolti verso l’esterno. In questo modo con un singolo segnale di trigger e 4 segnali di echo è possibile percepire le distanze delle superfici poste ai 4 lati del radar. A questo punto entrano in gioco altre due componenti, il servo motore rotazione continua DS04-NFC e lo slip ring. I 4 sensori ad ultrasuoni sono posti su una superficie connessa tramite due ingranaggi al servo motore. La rotazione di quest’ultimo permette a sua volta la rotazione dei 4 sensori ad ultrasuoni, in modo da ottenere quindi nel tempo le distanze delle superfici con angolazioni diverse. L’utilizzo dello slip ring si è reso necessario per evitare che i fili di echo/trigger e alimentazione/massa si intrecciassero tra loro durante la rotazione.

Infine è stato utilizzato un sensor hall posto esattamente al centro di uno dei sensori ad ultrasuoni. Questo permette di stabilire il tempo che intercorre il sensore a fare una rotazione completa di 360 gradi. Questo sistema si è reso necessario dall’impossibilità di sapere in tempo reale la posizione in gradi dei sensori ad ultrasuoni. A tal proposito quindi utilizzando il sensor hall si può sapere ogni volta che ci si trova all’angolo 0 e quindi quanto tempo è intercorso tra una passata e l’altra. Il tempo intercorso quindi ci permetterà di stabilire ad ogni intervallo di tempo trascorso l’esatta angolazione del sensore ad ultrasuoni, e conseguentemente anche l’angolazione degli altri 3, visto che sono posti rispettivamente ad angolazioni di +90 +180 e +270 gradi. La formula per sapere il grado in cui ci si trova nel tempo è data da:

g = cur_time * 360 / round_time

Dove cur_time è il tempo trascorso dall’ultima segnalazione del sensor hall, mentre round_time è il tempo intercorso fra due segnalazioni. Per avere un round_time il più preciso possibile, per il calcolo dei gradi si utilizza una media degli ultimi 5 campioni calcolati. Questo significa anche che il RadarIno raggiungerà la sua massima precisione dopo che avrà percorso almeno 5 giri.

Il tempo di rotazione è stato impostato approssimativamente intorno ai 9 secondi (impostando opportunamente la velocità di rotazione del servo motore), questo per far si che, considerando 20 letture distanza al secondo (tenendo in considerazione i 50msec tra una rilevazione e l’altra) potessimo ottenere almeno 180 letture per sensore, quindi quasi una lettura ogni 2 gradi.

La trasmissione dei dati viene effettuata tramite modulo WiFi del Fishino UNO, il quale crea una sua rete locale e si mette in ascolto su una porta specifica in modo che l’applicazione software vi si possa connettere. Si è preferito utilizzare il protocollo TCP perchè permette di evitare la perdita dei dati anche a discapito di qualche ritardo di trasmissione. Ogni 50msec i dati vengono inviati verso il client e sono:

– cur_time (msec)
– round_time (msec)
– dist_sensor1 (cm)
– dist_sensor2 (cm)
– dist_sensor3 (cm)
– dist_sensor4 (cm)

I dati vengono inviati in formato stringa secondo un formato preciso, in modo da semplificarne il parsing lato client:
#cur_time|round_time|dist_sensor1|dist_sensor2|dist_sensor3|dist_sensor4|

Ad esempio:
#100|9000|50|130|90|210|

L’applicazione
L’applicazione è stata realizzata utilizzando un compilatore Borland Builder C++ per la semplicità dei tools che offre per la gestione di finestre e altro, malgrado sia un po’ datato. E’ stata utilizzata l’interfaccia socket per la connessione TCP e la libreria OpenGL per la parte grafica. Si è deciso di utilizzare una rotazione in senso oraria proprio per simulare i sonar dei sommergibili, quindi la matrice OpenGL è stata impostata in modo che l’asse Y sia crescente verso il basso, mentre normalmente matematicamente viene inteso crescente verso l’alto. Questo perchè quando ad esempio vogliamo rappresentare l’angolo dei 90 gradi, vogliamo che esso sia posto in basso dello schermo, e non nella parte alta.

Il posizionamento dei punti viene fatto utilizzando un po’ di nozioni di trigonometria. Come detto in precedenza, avendo il tempo trascorso dall’angolo 0 ed il tempo totale di rotazione, possiamo ottenere l’angolo in cui si trova il primo sensore. Poi utilizzando le funzioni di seno e coseno, possiamo sapere la posizione Y e X da 0 a 1. Questo coefficiente verrà poi usato per calcolare l’esatta posizione del pixel in base alla distanza indicata dal radar e alla scala dello schermo impostata in quel momento. La posizione X e Y sarà pertanto data dalla formula:

X = centro_x + raggio_max * (cos(angolo) * dist_sensor / scala)
Y = centro_y + raggio_max * (sin(angolo) * dist_sensor / scala)

Dove centro_x e centro_y sono la posizione in pixel del centro, mentre raggio_max è il numero massimo del raggio in pixel del cerchio più ampio. Nel nostro caso il centro e raggio sono di 340 pixel. Pertanto con un angolo di 0 gradi e una distanza di 1m su una scala di 5m avremo:

X = 340 + 340 * (cos(0) * 100 / 500) = 340 + 340 / 5 = 408
Y = 340 + 340 * (sin(0) * 100 / 500) = 340 + 340 * 0 = 340

NB: le funzioni di seno e coseno in C++ richiedono l’angolo in radianti e non in gradi, quindi per il calcolo dei radianti basta sostituire nella formula indicata inizialmente 360 con 6.28318530718.

Per ottenere l’effetto sfumato dei vari pixel nel tempo viene utilizzata una lista di tipo FIFO, dove il primo pixel inserito è anche il primo ad essere disegnato. Ogni pixel inserito nella lista contiene anche il tempo di inserimento. Questo tempo ed il tempo corrente in cui viene disegnato permette di stabilire l’età di quest’ultimo. In base all’età assumerà un colore sempre più tenue fino a scomparire. Quando il pixel in questione risulta troppo vecchio, viene rimosso dalla lista ed eliminato.

Difficoltà riscontrate
La principale difficoltà riscontrata nella costruzione di Radarino è stata il concepire dal punto di vista hardware il modo di poter utilizzare più di un sensore ultrasuoni contemporaneamente mentre

Slip Ring

Slip Ring

ruota di 360° in un tempo prestabilito sapendo esattamente l’angolo in cui ci si trova rispetto ad uno 0. Inizialmente si è partiti dal pilotare i quattro sensori mentre erano statici e subito si è evidenziata l’impossibilità di poterli fare roteare perché ovviamente se il fishino è fermo su un piano e i sensori ruotano, dopo un giro ci si trova con i cavi che si intrecciano e rompono il tutto. L’impossibilità di non poter fare girare i fili senza che vi si intreccino ha dato sfogo all’ingegno, il quale ci ha portati ad arrivare a prendere in considerazione un componente molto valido: lo slip ring. Lo slip ring è un componente elettromeccanico che permette la trasmissione di segnali elettrici mentre si ha un moto stazionario o di rotazione. Risolto il problema della rotazione dei sensori si è presentato il problema successivo , ovvero fare in modo che essi roteino in un tempo determinato da noi. La soluzione di adottare un servo motore era chiara, ma il vero problema è stato arrivare scegliere di implementare degli ingranaggi,i quali erano gli unici che data la grandezza  dei quattro sensori sulla basetta mille fori, erano gli unici che riuscivano a dare una stabilità alla rotazione, evitando eccessive oscillazioni e di conseguenza garantendo un valore dei sensori più o meno attendibile.

 

Risolto il problema di come strutturare il moto, l’ultimo ostacolo che vi si presentava dal punto di vista hardware era l’implementazione di un sensore che permettesse di ricavare i gradi degli angoli.
La scelta più funzionale si è rivelata con l’utilizzo del sensore hall.

ingranaggi

Ingranaggi

 

Questo sensore crea una differenza di potenziale su un conduttore elettrico, ogni volta che esso si trova vicino ad un campo magnetico. L’effetto di hall è risultato proprio a caso nostro perché ponendo esattamente sotto ad un dente dell’ingranaggio più grande un piccolo magnete si è riusciti a capire quando la ruota dentata ha compiuto una rotazione di 360 gradi e di conseguenza
risalire ai gradi in base al tempo trascorso.

Effetto Hall

Effetto Hall

Clicca qui per scaricare il progetto completo

15 Commenti

    • Grazie Carmelo, molto gentile, anche se chiaramente il materiale è a bassissimo costo, per l'autodrive (che immagino sia quello a cui stavi pensando) servirebbe più qualcosa al laser, ma diciamo che dal punto di vista prettamente concettuale ci hai preso. Ad ogni modo, abbiamo puntato tutto sull'originalità, spero che paghi, anche se al momento non sembra.
  1. è una implementazione dei progetti con HC-SR04 ma è una ottima realizzazione anche perché avete risolto egregiamente alcuni problemi meccanici. Ottimo, complimenti
  2. Bellissimo progetto; idea non nuova (per esempio, http://arduinobasics.blogspot.it/2013/01/arduino-basics-sonar-project-tutorial.html) ma ottima implementazione (posso sbagliarmi, ma non credo di aver visto altrove l'integrazione di quattro sensori, che puo' dare spunto a varie soluzione di analisi dei dati). Progetto ben descritto e soluzioni interessanti. Mi interessano in particolare le applicazioni robotiche di mappatura dell'ambiente, quali per esempio http://enu.kz/repository/2011/AIAA-2011-1513.pdf. Quanto a chi ha dato un punto come votazione, sinceramente sembrerebbe un colpo basso per far scendere la media.... tanto piu' che nessuno ha "rivendicato" il voto, motivandolo... Ci vorrebbero molti piu' votanti al concorso, per dare significato statistico alla votazione! Buon lavoro a tutti!
    • Grazie Giorgio per i complimenti. Abbiamo voluto descrivere per bene il progetto proprio perchè abbiamo ritenuto che il nostro lavoro avrebbe potuto giovare anche ad altri, non solo come progetto fine a sè stesso, ma anche come spunto per altri progetti con dinamiche o problematiche simili. Per quanto riguarda i voti ormai ci ho messo una pietra sopra sebbene rattristi, calcolatrice alla mano, non essere nemmeno a podio. Per il momento ci accontentiamo che il progetto sia piaciuto ed i vostri commenti lo dimostrano, grazie. :)
  3. Aggiungero' in tutta umilta' (e poi taccio, frenando la logorrea...) che forse il metodo di votazione non e' in se' il migliore. Per esserlo, i votanti dovrebbero essere "costretti" a dare un voto a tutti i progetti, in modo da stabilire la propria personale graduatoria da confrontare e far media con quelle suggerite da altri votanti, mentre evidentemente cio' non sta avvenendo (io stesso per ora ho votato solo questo progetto, sebbene ve ne siano altri molto interessanti, semplicemente perche'... il lavoro chiama e non ho il tempo di esaminarli subito!). La liberta' di votare anche un solo progetto porta all'assurdo che un solo voto dato a un concorrente, fa media esattamente quanto 25 voti dati a un altro. Per spiegarmi meglio, potrei essere un concorrente che pubblica una versione migliorata di "blink.ino", nessuno mi guarda per ovvie ragioni, tranne mia moglie che mette un 5 per favorirmi, e alla fine io vinco il premio perche' gli altri almeno un 4 l'hanno preso.... Non siamo in queste condizioni, e' ovvio, perche' tutti i progetti sono interessanti, pero' credo sia chiara l'idea. Forse il punteggio andrebbe in qualche modo pesato con il numero di votanti. Un'alternativa potrebbe essere che il votante si limita a dare sempre un solo punto (quindi, non da 1 a 5), ma solo a un concorrente, il preferito, e poi si contano i voti che ciascuno ha preso. OK, discussione accademica e inutile :-) Torno al lavoro.... Buona giornata!
    • Buongiorno, per quanto riguarda la media dei voti la tua osservazione è corretta. Però a questa situazione ci avevamo già pensato. Chiaramente per determinare il vincitore verranno tenuti in considerazione diversi parametri di valutazione: il numero di voti ricevuti e il numero di 5 stelle ottenuti. Ci sembra ovvio che chi un progetto che ha ricevuto 3 o 4 voti e ha una media del 5 non potrà avere lo steso peso di valutazione di un progetto che di voti ne ha presi 40 e ha una media più bassa. Buona giornata anche a te.
      • Alla fin fine credo che per stilare la classifica finale basti moltiplicare il numero di voti per la media. Anch'io ho ricevuto un bel po' di 1 (Pessimo) senza alcuna motivazione allegata, ma mi consolo pensando che 1 > 0, e che quindi ai fini della classifica finale meglio prendere un 1 che nessun voto. Poi è chiaro che se si guardasse soltanto la media chi riceverebbe un voto pieno (1*5) vincerebbe su chi ne riceverebbe mille equamente distribuiti (1000*2.5) e credo che questo sarebbe sbagliato sia nei confronti del partecipante al contest che dei 1000 utenti che avrebbero letto e votato il progetto
  4. Ottimo. Chiedo scusa per aver... pre-giudicato il metodo di valutazione, senza, in realta', saperne nulla. Cari saluti, buon lavoro e complimenti! Giorgio

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Main Menu