Sommario:

Trovare la strada con il GPS: 9 passaggi
Trovare la strada con il GPS: 9 passaggi

Video: Trovare la strada con il GPS: 9 passaggi

Video: Trovare la strada con il GPS: 9 passaggi
Video: Come trovare un mappale catastale con il GPS del telefono 2024, Novembre
Anonim
Trovare la strada con il GPS
Trovare la strada con il GPS

Un rapido esercizio per comprendere e applicare i dati GPS

  • Tempo richiesto: 2 ore
  • Costo: $75–$150

Per i produttori, è diventato abbastanza economico incorporare dati geospaziali di alta qualità nei progetti di elettronica. E negli ultimi anni, i moduli ricevitori GPS (Global Positioning System) sono diventati molto più diversificati, potenti e facili da integrare con schede di sviluppo come Arduino, PIC, Teensy e Raspberry Pi. Se hai pensato di costruire intorno al GPS, hai scelto un buon momento per iniziare.

Passaggio 1: come funziona

Un modulo GPS è un minuscolo ricevitore radio che elabora i segnali trasmessi su frequenze note da una flotta di satelliti. Questi satelliti ruotano intorno alla Terra in orbite approssimativamente circolari, trasmettendo dati di posizione e clock estremamente precisi al suolo sottostante. Se il ricevitore terrestre può "vedere" abbastanza di questi satelliti, può usarli per calcolare la propria posizione e altitudine.

Quando arriva un messaggio GPS, il ricevitore controlla prima il suo timestamp di trasmissione per vedere quando è stato inviato. Poiché la velocità di un'onda radio nello spazio è una costante nota (c), il ricevitore può confrontare i tempi di trasmissione e ricezione per determinare la distanza percorsa dal segnale. Una volta stabilita la sua distanza da quattro o più satelliti conosciuti, calcolare la propria posizione è un problema abbastanza semplice di triangolazione 3D. Ma per farlo in modo rapido e preciso, il ricevitore deve essere in grado di elaborare agilmente numeri da un massimo di 20 flussi di dati contemporaneamente. Poiché il sistema GPS ha l'obiettivo pubblicato di essere utilizzabile ovunque sulla Terra, il sistema deve garantire che almeno quattro satelliti - preferibilmente di più - sono sempre visibili da ogni punto del globo. Attualmente ci sono 32 satelliti GPS che eseguono una danza meticolosamente coreografata in una nuvola sparsa alta 20.000 chilometri.

Passaggio 2: fatti dei fan

Il GPS non potrebbe funzionare senza la teoria della relatività di Einstein, poiché è necessario compensare i 38 microsecondi che gli orologi atomici orbitanti guadagnano ogni giorno dalla dilatazione del tempo nel campo gravitazionale terrestre.

Passaggio 3: iniziare

Iniziare
Iniziare

Qualunque sia il tuo progetto, il GPS è semplice da integrare. La maggior parte dei moduli del ricevitore comunica con un protocollo seriale semplice, quindi se riesci a trovare una porta seriale di riserva sulla scheda del controller, dovrebbero essere necessari solo una manciata di cavi per effettuare la connessione fisica. E anche in caso contrario, la maggior parte dei controller supporta una modalità seriale "software" emulata che è possibile utilizzare per connettersi a pin arbitrari.

Per i principianti, il modulo Ultimate GPS Breakout di Adafruit è una buona scelta. Ci sono molti prodotti concorrenti sul mercato, ma Ultimate è un prodotto solido a un prezzo ragionevole, con grandi fori passanti facili da saldare o collegare a una breadboard.

Innanzitutto, collega la terra e l'alimentazione. In termini Arduino, questo significa collegare uno dei pin GND del microcontrollore al GND del modulo e il pin +5V al VIN del modulo. Per gestire il trasferimento dei dati, è inoltre necessario collegare i pin TX e RX del modulo ad Arduino. Selezionerò arbitrariamente i pin 2 (TX) e 3 (RX) di Arduino per questo scopo, anche se i pin 0 e 1 sono progettati specificamente per essere utilizzati come "porta seriale hardware" o UART. Perché? Perché non voglio sprecare l'unico UART che questi processori AVR di fascia bassa hanno. L'UART di Arduino è cablato al connettore USB integrato e mi piace tenerlo collegato al mio computer per il debug.

Passaggio 4: una punta nel flusso di dati

Una punta nel flusso di dati
Una punta nel flusso di dati

Nell'istante in cui si applica l'alimentazione, un modulo GPS inizia a inviare blocchi di dati di testo sulla sua linea TX. Potrebbe non vedere ancora un singolo satellite, tanto meno avere una "correzione", ma il rubinetto dei dati si accende subito ed è interessante vedere cosa esce. Il nostro primo semplice schizzo (sotto) non fa altro che visualizzare questi dati non elaborati.

#include #define RXPin 2

#define TXPin 3#define GPSBaud 4800

#define ConsoleBaud 115200

// La connessione seriale al dispositivo GPSSoftwareSerial ss(RXPin, TXPin);

void setup(){

Serial.begin(ConsoleBaud);

ss.begin(GPSBaud);

Serial.println("Esempio GPS 1");

Serial.println("Visualizzazione dei dati NMEA grezzi trasmessi dal modulo GPS.");

Serial.println("di Mikal Hart"); Serial.println();

}

ciclo vuoto()

{ if (ss.available() > 0) // All'arrivo di ogni carattere…

Serial.write(ss.read()); // … scrivilo sulla console

}

NOTA: Lo schizzo definisce il pin di ricezione (RXPin) come 2, anche se abbiamo detto in precedenza che il pin di trasmissione (TX) sarebbe stato collegato al pin 2. Questa è una fonte comune di confusione. RXPin è il pin di ricezione (RX) dal punto di vista di Arduino. Naturalmente deve essere collegato al pin di trasmissione (TX) del modulo e viceversa.

Carica questo schizzo e apri Serial Monitor a 115, 200 baud. Se tutto funziona, dovresti vedere un flusso denso e infinito di stringhe di testo separate da virgole. Ciascuno assomiglierà alla seconda immagine all'inizio del paragrafo.

Queste stringhe distintive sono note come frasi NMEA, così chiamate perché il formato è stato inventato dalla National Maritime Electronics Association. NMEA definisce una serie di queste frasi per i dati di navigazione che vanno dall'essenziale (posizione e tempo), all'esoterico (rapporto segnale-rumore satellitare, varianza magnetica, ecc.). I produttori sono incoerenti sui tipi di frase utilizzati dai loro ricevitori, ma GPRMC è essenziale. Una volta che il tuo modulo ottiene una correzione, dovresti vedere un discreto numero di queste frasi GPRMC.

Passaggio 5: trovare te stesso

Non è banale convertire l'output del modulo non elaborato in informazioni che il tuo programma può effettivamente utilizzare. Fortunatamente, ci sono già alcune ottime librerie disponibili per farlo per te. La famosa libreria GPS Adafruit di Limor Fried è una scelta conveniente se stai usando il loro ultimo breakout. È scritto per abilitare funzionalità uniche di Ultimate (come la registrazione dei dati interni) e aggiunge alcune campane e fischietti sgargianti. La mia libreria di analisi preferita, tuttavia - e qui sono ovviamente completamente imparziale - è quella che ho scritto chiamata TinyGPS++. L'ho progettato per essere completo, potente, conciso e facile da usare. Facciamo un giro.

Passaggio 6: codifica con TinyGPS++

Dal punto di vista del programmatore, usare TinyGPS++ è molto semplice:

1) Creare un oggetto gps.

2) Instradare ogni carattere che arriva dal modulo all'oggetto utilizzando gps.encode().

3) Quando è necessario conoscere la propria posizione o altitudine o ora o data, è sufficiente interrogare l'oggetto gps.

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// La connessione seriale al dispositivo GPSSoftwareSerial ss(RXPin, TXPin);

// L'oggetto TinyGPS++

GPS TinyGPSPlus;

void setup(){

Serial.begin(ConsoleBaud);

ss.begin(GPSBaud);

Serial.println("Esempio GPS 2");

Serial.println("Un semplice tracker che usa TinyGPS++.");

Serial.println("di Mikal Hart");

Serial.println();

}

ciclo vuoto(){

// Se sono arrivati dei caratteri dal GPS, /

/ inviali all'oggetto TinyGPS++

mentre (ss.disponibile() > 0)

gps.encode(ss.read());

// Mostriamo la nuova posizione e l'altitudine

// ogni volta che uno di essi è stato aggiornato

if (gps.location.isUpdated() || gps.altitude.isUpdated())

{

Serial.print("Posizione: ");

Serial.print(gps.location.lat(), 6);

Serial.print(", ");

Serial.print(gps.location.lng(), 6);

Serial.print(" Altitudine: ");

Serial.println(gps.altitude.meters());

}

}

La nostra seconda applicazione mostra continuamente la posizione e l'altitudine del ricevitore, utilizzando TinyGPS++ per aiutare con l'analisi. In un dispositivo reale, potresti registrare questi dati su una scheda SD o visualizzarli su un display LCD. Prendi la libreria e disegna FindingYourself.ino (sopra). Installa la libreria, come al solito, nella cartella delle librerie di Arduino. Carica lo schizzo sul tuo Arduino e apri Serial Monitor a 115, 200 baud. Dovresti vedere la tua posizione e l'altitudine che si aggiornano in tempo reale. Per vedere esattamente dove ti trovi, incolla alcune delle coordinate di latitudine/longitudine risultanti in Google Maps. Ora collega il tuo laptop e vai a fare una passeggiata o un giro in macchina. (Ma ricordati di tenere gli occhi sulla strada!)

Step 7: La "QUARTA DIMENSIONE"

anche se associamo il GPS alla posizione nello spazio, non dimenticare che anche quei satelliti stanno trasmettendo data e ora. L'orologio GPS medio è preciso a un decimilionesimo di secondo e il limite teorico è ancora più alto. Anche se hai solo bisogno del tuo progetto per tenere traccia del tempo, un modulo GPS potrebbe comunque essere la soluzione più economica e semplice.

Per trasformare FindingYourself.ino in un orologio super preciso, basta modificare le ultime righe in questo modo:

if (gps.time.isUpdated()) {

char buf[80];

sprintf(buf, "Il tempo è %02d:%02d:%02d", gps.time.hour(), gps.time.minute(), gps.time.second()); Serial.println(buf);

}

Passaggio 8: trovare la tua strada

Cercando la tua strada
Cercando la tua strada

La nostra terza e ultima applicazione è il risultato di una sfida personale per scrivere uno schizzo TinyGPS++ leggibile, in meno di 100 righe di codice, che guidi un utente a una destinazione utilizzando semplici istruzioni di testo come "mantieni dritto" o "vira a sinistra".

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// La connessione seriale al dispositivo GPSSoftwareSerial ss(RXPin, TXPin);

// L'oggetto TinyGPS++ TinyGPSPlus gps;

unsigned long lastUpdateTime = 0;

#define EIFFEL_LAT 48.85823#define EIFFEL_LNG 2.29438

/* Questo esempio mostra una struttura di base su come potresti usare la rotta e la distanza per guidare una persona (o un drone) verso una destinazione. Questa destinazione è la Torre Eiffel. Modificalo come richiesto

Il modo più semplice per ottenere la coordinata lat/long è fare clic con il pulsante destro del mouse sulla destinazione in Google Maps (maps.google.com) e scegliere "Cosa c'è qui?". Questo inserisce i valori esatti nella casella di ricerca

*/

void setup(){

Serial.begin(ConsoleBaud);

ss.begin(GPSBaud);

Serial.println("Esempio GPS 3");

Serial.println("Un sistema di guida non così completo");

Serial.println("di Mikal Hart");

Serial.println();

}

ciclo vuoto(){

// Se sono arrivati dei caratteri dal GPS, // li invia all'oggetto TinyGPS++ while (ss.available() > 0) gps.encode(ss.read());

// Ogni 5 secondi, esegue un aggiornamento

if (millis() - lastUpdateTime >= 5000)

{

lastUpdateTime = millis();

Serial.println();

// Stabilire il nostro stato attuale

double distanceToDestination = TinyGPSPlus::distanceBetween

gps.location.lat(), gps.location.lng(), EIFFEL_LAT, EIFFEL_LNG);

double courseToDestination = TinyGPSPlus::courseTo

gps.location.lat(), gps.location.lng(), EIFFEL_LAT, EIFFEL_LNG);

const char *directionToDestination = TinyGPSPlus::cardinal(courseToDestination);

int courseChangeNeeded = (int)(360 + courseToDestination - gps.course.deg()) % 360;

// debug Serial.print("DEBUG: Course2Dest: ");

Serial.print(courseToDestination);

Serial.print("CorsoCorso: ");

Serial.print(gps.course.deg());

Serial.print(" Dir2Dest: ");

Serial.print(directionToDestination);

Serial.print(" RelCourse: ");

Serial.print(courseChangeNeeded);

Serial.print(" CurSpd: ");

Serial.println(gps.speed.kmph());

// Entro 20 metri dalla destinazione? Erano qui

if (distanza a destinazione <= 20,0)

{ Serial.println("CONGRATULAZIONI: sei arrivato!");

uscita(1);

}

Serial.print("DISTANZA: "); Serial.print(distanceToDestination);

Serial.println(" metri da percorrere.");

Serial.print("ISTRUZIONI: ");

// Stai fermo? Basta indicare in quale direzione andare

if (gps.speed.kmph() < 2.0)

{

Serial.print("Testa");

Serial.print(directionToDestination);

Serial.println(".");

Restituzione;

}

if (courseChangeNeeded >= 345 || courseChangeNeeded < 15) Serial.println("Continua dritto!");

else if (courseChangeNeeded >= 315 && courseChangeNeeded < 345)

Serial.println("Svolta leggermente a sinistra.");

else if (courseChangeNeeded >= 15 && courseChangeNeeded < 45)

Serial.println("Svolta leggermente a destra.");

else if (courseChangeNeeded >= 255 && courseChangeNeeded < 315)

Serial.println("Svolta a sinistra.");

else if (courseChangeNeeded >= 45 && courseChangeNeeded < 105)

Serial.println("Svolta a destra.");

altro

Serial.println("Girati completamente.");

}

}

Ogni 5 secondi il codice acquisisce la posizione e la rotta dell'utente (direzione di viaggio) e calcola il rilevamento (direzione verso la destinazione), utilizzando il metodo TinyGPS++ courseTo(). Il confronto dei due vettori genera un suggerimento per proseguire dritto o svoltare, come mostrato di seguito.

Copia lo schizzo FindingYourWay.ino (sopra) e incollalo nell'IDE di Arduino. Imposta una destinazione a 1 km o 2 km di distanza, carica lo schizzo sul tuo Arduino, eseguilo sul tuo laptop e vedi se ti guiderà lì. Ma soprattutto, studia il codice e capisci come funziona.

Passaggio 9: andare oltre

Il potenziale creativo del GPS è vasto. Una delle cose più soddisfacenti che abbia mai realizzato è stata una scatola di puzzle abilitata per GPS che si apre solo in una posizione preprogrammata. Se la tua vittima vuole rinchiudere il tesoro all'interno, deve capire dove si trova quel luogo segreto e portarci fisicamente la scatola. Un'idea popolare del primo progetto è una sorta di dispositivo di registrazione che registra minuto per minuto la posizione e l'altitudine di, ad esempio, un escursionista che percorre il Trans-Pennine Trail. O che dire di uno di quei subdoli localizzatori magnetici che gli agenti della DEA in Breaking Bad attaccano sulle auto dei cattivi? Entrambi sono totalmente fattibili e probabilmente sarebbero divertenti da costruire, ma ti incoraggio a pensare in modo più ampio, al di là delle cose che puoi già acquistare su Amazon. È un grande mondo là fuori. Vagare in lungo e in largo possibile.

Consigliato: