Arduino gps ottenere coordinate geografiche e orario

Come utilizzare un ricevitore gps con Arduino

Il ricevitore GPS (Global Positioning System) è oggi un dispositivo alla portata di tutti, dal costo contenuto e dal semplice utilizzo. Questo articolo vuole essere una guida introduttiva all’interpretazione dei dati di posizione forniti dal ricevitore gps, senza utilizzare librerie esterne. Ho utilizzato una scheda Arduino/Genuino UNO e il modulo Adafruit Ultimate GPS Breakout v3 (vedi l’articolo su Amazon).

arduino Gps

Il modulo ha una sensibilità di ben -165dBm (in tracking), questo significa che riesce a rilevare segnali di 1.25nVolt, ha un refresh di 10 Hz e permette di ‘inseguire’ 22 satelliti.

Questo dispositivo rende semplice la gestione del tracking dei satelliti ed del calcolo della posizione. I dati vengono restituiti sul canale seriale TTL, alla frequenza di 1Hz. E’ sufficiente collegarsi alla seriale per poter leggere i dati. I dati principali sono quelli di posizione (espressa in Latitudine e Longitudine) la quota e l’orario zulu ma sono presenti anche altre informazioni relative ai satelliti utilizzati per il fix.

Lo schema elettrico seguente mostra i collegamenti da effettuare tra una UNO e la Adafruit Ultimate GPS Breakout v3:

Schema elettrico arduino uno gps

Questo schema serve per inviare direttamente sul Serial Monitor i dati restituiti dal modulo gps. Il segnale trasmesso dal dispositivo viene convogliato sulla linea di trasmissione seriale della UNO affinché possa raggiungere il pc attraverso la porta usb. Carichiamo sulla UNO uno sketch vuoto:

Terminato l’upload del programma lanciamo il Serial Monitor e settiamo il bps a 9600. La schermata seguente illustra le stringhe generate dal ricevitore GPS.

gps data restitution

Nel mio caso il sensore gps non aveva ancora agganciato i satelliti, i dati ricevuti indicano una latitudine e una longitudine pari a zero. Il led posto sul pcb indica quando avviene il fix dei satelliti, se il led lampeggia ogni secondo il gps sta cercando di agganciare i segnali dei satelliti, quando vengono agganciati il led lampeggia ogni 15 secondi. Il fix dei satelliti è funzione della posizione dell’antenna del sensore, in campo aperto, senza nessun ostacolo, avviene entro il minuto mentre se ci troviamo in posizioni a bassa copertura (ad esempio dentro casa) il sensore impiegherà molto più tempo e nei casi peggiori non riuscirà ad elaborare il segnale.

Per interpretare i dati è necessario conoscere quali informazioni vengono prodotte dal ricevitore gps. Sul Serial Monitor notiamo quattro righe con informazioni differenti che si ripetono ogni secondo. Queste stringhe iniziano tutte con il simbolo del dollaro e con un codice di cinque caratteri. Il codice specifica quali dati sono  presenti nella relativa stringa, in ogni stringa i dati vengono separati dalle virgole (campi), ulteriori informazioni possono essere apprese in seguendo questo link.

Le quattro stringhe sono riassunte nel box seguente:

La stringa che inizia con $GPGGA (Global Positioning System Fix Data), contiene le informazioni della latitudine, della longitudine, della quota e del tempo.
La stringa che inizia con $GPGSA, contiene dati relativi al DOP (Diluizione della precisione) e al prn (pseudo random noise) dei satelliti utilizzati per il fix.
La stringa che inizia con $GPRMC indica il valore minimo raccomandato dei dati di tempo, velocità e posizione.
La stringa che inizia con $GPVTG indica il Track made good e il valore di Groud Speed.

La stringa che ci interessa maggiormente è quella che inizia con $GPGGA perché contiene i dati di posizione ed il tempo. Il codice che andremo a scrivere recupererà i dati separandoli dalle virgole.

Modifichiamo il circuito precedente perché ci serve sia la seriale hardware sia quella software. La seriale software la useremmo per ricevere i dati dal sensore gps mentre la seriale hardware la useremmo per inviare i dati al pc:

Adafruit ultimate gps breakout

Verifichiamo con questo codice che i dati ricevuti dalla seriale software (attivata sul pi 2 e 3) vengano ritrasmessi al pc impiegando la seriale hardware:

Con questo codice otterremmo sul Serial Monitor gli stessi dati ottenuti col primo esempio.
Naturalmente se è avvenuto il fix del segnale, i campi delle stringhe viste in precedenza conterranno i dati di posizione e orario, inoltre ne otterremmo anche una quinta  che inizierà per $GPGSV (indica nel dettaglio i parametri dei satelliti agganciati), quindi il risultato sarà qualcosa del genere:

Ora cercherò di isolare la stringa che inizia con $GPGGA. Per prima cosa ho modificato il codice per concatenare i caratteri ricevuti sulla seriale software in un oggetto stringa in questo modo potrò elaborarla usando i metodi della classe String:

Ottenute solo le stringhe ho la possibilità di capire come inizia la stringa, ad esempio il metodo subString restituisce una sotto stringa in funzione degli argomenti passati nei parametri. Il codice seguente invia al Serial Monitor solo le stringhe che iniziano con $GPGGA:

Ho così isolato la stringa che mi interessa maggiormente. Continuo la scrittura del codice con alcune istruzioni che mi permettono di estrapolare i dati separati dalle virgole, quindi utilizzerò il metodo indexOf per passare i parametri al metodo subString:

Il risultato sarà qualcosa del genere:

Il codice suddivide correttamente tutti i campi. Molti di questi dati possono essere ulteriormente filtrati, ad esempio a me interessa ottenere il dato di tempo, la latitudine, la longitudine e la quota. Il codice seguente invia al Serial Monitor solo questi campi:

Abbiamo cosi ottenuto il recupero dei dati di posizione e tempo senza utilizzare una libreria esterna. Le librerie rendono tutto più semplice e veloce ma credo che sia altrettanto importante capire cosa avviene dietro le quinte.

I dati ottenuti sono pronti per l’utilizzo in tutti quei progetti cui è necessario recuperare la posizione geografica e il tempo corrente.

Una risposta a Arduino gps ottenere coordinate geografiche e orario

  • Finalmente una spiegazione chiara e completa, per leggere ed interpretare correttamente e stringhe, senza usare librerie esterne! Grazie!

Rimani aggiornato

La mia lista dei prodotti
Compra su Amazon Italia

Compra su Amazon Italia
Sondaggi

Arduino.cc vs Arduino.org

Visualizza risultati

Loading ... Loading ...
Seguimi su Twitter