Un semplice circuito con GPS per consentire ad Arduino di riconoscere immediatamente latitudine e longitudine della propria posizione.
Chi come noi ha la passione del making si trova spesso a che fare con sketch di Arduino per le interconnessioni di rete: shield Ethernet, sistemi GSM/GPRS, LoRa e WiFi sono all’ordine del giorno, disponibili ovunque, e ideali per “infiocchettare” il nostro payload. Mentre tuttavia il web è pieno di circuiti per il controllo delle variabili atmosferiche, il particolato nell’aria, le distanze e persino la torbidità dell’acqua, qundo ci troviamo a dover trattare con latitudine e longitudine iniziano a sorgere problemi.
Cui prodest?
Mi si dirà: a che serve gestire le coordinate geografiche con Arduino?
Le risposte sono molte e varie, anche se occorre come sempre un pizzico di fantasia per applicarle. Intanto ricordiamo che un Arduino Nano (specie se autocostruito e privo degli orpelli legati alla sicurezza) consuma davvero molto poco, oltre ad occupare uno spazio irrisorio. Un kit composto da un Nano ed un sensore GPS (ad esempio il Neo-6M, che consuma sui 45mA quando attivato) formano una coppia interessante. Collegati ad un battery pack esterno e ad un sistema di trasmissione, e nascosto dietro al parafango di un’auto, potrebbe risultare un ottimo sistema per il tracciamento online della posizione dell’auto, ma vi sconsiglio di applicarlo senza il consenso del proprietario…
Un’altra modalità di utilizzo consiste nel dotare un drone di un apparato di localizzazzione immediato. Oppure montare il kit all’interno di una vettura radiocomandata, per consocere istante per istante velocità, accelerazione istantanea, raggio di curvatura e così via, attraverso un sistema fly-by-wire sui generis.
Un sistema miniaturizzato basato su GPS potrebbe rappresentare un toccasana per l’organizzazione di una biblioteca… o per stanare i ritardatari. Con pochi soldi è possibile creare un sofisticato sistema antirapina per i computer di un istituto.
Viste le potenzialità di un simile sistema, non indugiamo oltre, e procediamo ad analizzare il circuito.
Il materiale
Per un kit base saranno sufficienti una ventina di euro:
- Arduino Uno R3 o Arduino Nano
- Sensore GPS Neo-6M o equivalente
- Antenna per potenziare il segnale (facoltativa)
- Battery pack o alimentatore da 5V
Partiamo dal presupposto che il posizionamento del sistema sia dinamico e legato all’attrezzatura sulla quale verrà montato, quindi non occorre un display collegato. Diventa invece necessario un sistema per l’acquisizione dati basato su microSD card, tipo questo data-logger, o un sistema di trasmissione LoRa o WiFi (ma a questo punto tanto vale fare riferimento ad un Esp32 o ad un Raspberry Pico).
Vediamo di seguito i collegamenti necessari:
Il collegamento è estremamente semplice:
- Vcc va collegato al terminale 3.3V o 5Vcc di Arduino (dipende dal modello)
- GND va collegato con GND
- Tx ed Rx vanno collegati ai pin 3 e 4 di Arduino, attraverso una Software Serial
Nell’immagine di apertura possiamo vedere un esempio di collegamento.
Il software
A questo punto occorre mettere mano al nostro fido Arduino IDE, e scrivere il codice per interfacciare il dispositivo GPS. Vedrete che sarà particolarmente semplice.
Questo è il codice da utilizzare, lo commenteremo di seguito.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <SoftwareSerial.h> #include <TinyGPS.h> float lat = 0.0,lon = 0.0; // creiamo una variabile per latitudine e longitudine object SoftwareSerial gpsSerial(3,4);//rx,tx TinyGPS gps; // creiamo un oggetto gps void setup(){ Serial.begin(9600); // connessione seriale //Serial.println("The GPS Received Signal:"); gpsSerial.begin(9600); // connessione sensore gps su SoftwareSerial() } void loop(){ while(gpsSerial.available()){ // check for gps data if(gps.encode(gpsSerial.read())) { // encode gps data gps.f_get_position(&lat,&lon); // get latitude and longitude // display position //Serial.print("Position: "); //Serial.print("Latitude:"); //Serial.print(lat,6); //Serial.print(";"); //Serial.print("Longitude:"); //Serial.println(lon,6); //Serial.print(lat); //Serial.print(" "); } } String latitude = String(lat,6); String longitude = String(lon,6); Serial.println(latitude+";"+longitude); delay(1000); } |
Includiamo le librerie necessarie, SoftwareSerial e TinyGPS (dobbiamo caricarle nell’IDE di Arduino se non lo abbiamo già fatto). Quindi definiamo due variabili in virgola mobile per latitudine e longitudine restituita dal sensore, e istanziamo gli oggetti necessari: gpsSerial(3,4) è una software serial che agisce sui pin 3 e 4 di Arduino, mentre gps è un oggetto interamente definito.
Nella sezione di setup() istanziamo la seriale classica (attraverso la quale leggeremo i dati che arrivano dal GPS) e la seriale software che utilizzeremo per il trasferimento dei dati dal sensore ad Arduino.
L’intero loop() è basato su di un ciclo while() che controlla la presenza di interazione sulla seriale software: se il dato è disponibile viene letto e codificato dal metodo gps.encode(), quindi viene trasferito alle variabili lat e lon attraverso la funzione gps.f_get_position(). Notare che i parametri chiamati sono stati utilizzati per riferimento, quindi verranno modificati direttamente.
La sezione successiva… non fa nulla! Dal momento che il progetto è discrezionale, e deciderete voi come trasmettere i dati, sono state commentate le istruzioni per scrivere i valori provenienti dal GPS sulla seriale di Arduino. Potete tranquillamente decommentarli per visualizzare che le informazioni vengano correttamente decodificate.
Le righe dalla 29 alla 32 trasformano il risultato in una stringa e la stampano attraverso seriale, quindi impongono un’attesa di un secondo tra una lettura e l’altra.
Il programma e l’articolo terminano qui. Fateci conoscere le vostre implementazioni!
Occorre cancellare la riga 28, per evitare errori di compilazione
Hai ragione. Normalmente chiudo il blocco dell’IF, ma in questo caso l’ho chiuso DOPO il commento, quindi non è stato compilato.
Correggo immediatamente, grazie.