Taula de continguts:

Trobar el camí amb el GPS: 9 passos
Trobar el camí amb el GPS: 9 passos

Vídeo: Trobar el camí amb el GPS: 9 passos

Vídeo: Trobar el camí amb el GPS: 9 passos
Vídeo: Ip Man: nace la leyenda, la vida real del maestro de Bruce Lee (1) 2024, Desembre
Anonim
Trobar el camí amb el GPS
Trobar el camí amb el GPS

Un exercici ràpid de comprensió i aplicació de dades GPS

  • Temps requerit: 2 hores
  • Cost: 75-150 dòlars

Per als fabricants, ha estat força barat incorporar dades geoespacials d’alta qualitat als projectes d’electrònica. I, en els darrers anys, els mòduls de receptor GPS (Global Positioning System) han crescut molt més, són potents i fàcils d’integrar amb plaques de desenvolupament com Arduino, PIC, Teensy i Raspberry Pi. Si heu estat pensant a construir al voltant del GPS, heu escollit un bon moment per començar.

Pas 1: Com funciona

Un mòdul GPS és un petit receptor de ràdio que processa els senyals emesos en freqüències conegudes per una flota de satèl·lits. Aquests satèl·lits donen voltes al voltant de la Terra en òrbites aproximadament circulars, transmetent dades de rellotge i posició extremadament precises cap a terra. Si el receptor terrestre pot "veure" prou d'aquests satèl·lits, els pot utilitzar per calcular la seva pròpia ubicació i altitud.

Quan arriba un missatge GPS, el receptor inspecciona primer la marca de temps d’emissió per veure quan s’ha enviat. Com que la velocitat d'una ona de ràdio a l'espai és una constant coneguda (c), el receptor pot comparar els temps d'emissió i recepció per determinar la distància que ha recorregut el senyal. Un cop establerta la distància a quatre o més satèl·lits coneguts, calcular la seva pròpia posició és un problema bastant simple de triangulació 3D. Però, per fer-ho de manera ràpida i precisa, el receptor ha de ser capaç de trencar nombres de fins a 20 fluxos de dades alhora. Com que el sistema GPS té l'objectiu publicat de ser usable a tot arreu de la Terra, el sistema ha de garantir que almenys quatre satèl·lits - preferiblement més - són visibles en tot moment des de tots els punts del planeta. Actualment hi ha 32 satèl·lits GPS que realitzen un ball meticulosament coreografiat en un núvol escàs de 20.000 quilòmetres d’alçada.

Pas 2: fet realitzat pels fans

El GPS no podria funcionar sense la teoria de la relativitat d’Einstein, ja que s’ha de compensar els 38 microsegons que els rellotges atòmics orbitants guanyen cada dia a partir de la dilatació del temps al camp gravitatori de la Terra.

Pas 3: Introducció

Començant
Començant

Sigui quin sigui el vostre projecte, el GPS és senzill d’integrar. La majoria dels mòduls de recepció es comuniquen amb un protocol serial senzill, de manera que si podeu trobar un port sèrie de recanvi a la placa del controlador, només caldrà un grapat de cables per fer la connexió física. I encara que no, la majoria dels controladors admeten un mode serial emulat de "programari" que podeu utilitzar per connectar-vos a pins arbitraris.

Per als principiants, el mòdul d’Adafruit Ultimate GPS Breakout és una bona opció. Hi ha molts productes de la competència al mercat, però l’Ultimate és un producte sòlid a un preu raonable, amb forats passants grans que són fàcils de soldar o connectar a una taula de treball.

En primer lloc, connecteu terra i alimentació. En termes Arduino, això significa connectar un dels pins GND del microcontrolador al GND del mòdul i el pin + 5V al VIN del mòdul. Per gestionar la transferència de dades, també heu de connectar els pins TX i RX del mòdul a l’Arduino. Vaig a seleccionar arbitràriament els pins Arduino 2 (TX) i 3 (RX) per a aquest propòsit, tot i que els pins 0 i 1 estan dissenyats específicament per utilitzar-los com a "port sèrie de maquinari" o UART. Per què? Perquè no vull malgastar l’única UART que tenen aquests processadors AVR de gamma baixa. L’UART d’Arduino està connectat al connector USB incorporat i m’agrada mantenir-lo connectat a l’ordinador per depurar-lo.

Pas 4: un dit del peu al Datastream

Un dit del peu al Datastream
Un dit del peu al Datastream

En el moment en què s’alimenta, un mòdul GPS comença a enviar trossos de dades de text a la seva línia TX. Potser encara no veu un sol satèl·lit i molt menys té una "solució", però l'aixeta de dades s'activa immediatament i és interessant veure què surt. El nostre primer esbós senzill (a continuació) no fa més que mostrar aquestes dades sense processar.

#include #define RXPin 2

#define TXPin 3 # define GPSBaud 4800

#define ConsoleBaud 115200

// La connexió sèrie al dispositiu GPS SoftwareSerial ss (RXPin, TXPin);

configuració nul·la () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("Exemple GPS 1");

Serial.println ("Visualització de les dades brutes NMEA transmeses pel mòdul GPS.");

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

}

bucle buit ()

{if (ss.available ()> 0) // Quan cada personatge arriba …

Serial.write (ss.read ()); // … escriviu-lo a la consola

}

NOTA: l’esbós defineix el pin de recepció (RXPin) com a 2, tot i que hem dit anteriorment que el pin de transmissió (TX) estaria connectat al pin 2. Aquesta és una font comuna de confusió. RXPin és el pin de recepció (RX) des del punt de vista d’Arduino. Naturalment, s’ha de connectar al pin de transmissió (TX) del mòdul i viceversa.

Pengeu aquest esbós i obriu el monitor sèrie a 115, 200 baud. Si tot funciona, hauríeu de veure un flux dens i infinit de cadenes de text separades per comes. Cadascun tindrà un aspecte semblant a la segona imatge al principi del paràgraf.

Aquestes cadenes distintives es coneixen com a frases NMEA, anomenades així perquè el format va ser inventat per l'Associació Nacional d'Electrònica Marítima. NMEA defineix diverses d’aquestes frases per a dades de navegació que van des de l’essencial (ubicació i hora) fins a l’esotèric (relació senyal-soroll del satèl·lit, variància magnètica, etc.). Els fabricants són incoherents quant als tipus de frases que fan servir els receptors, però GPRMC és essencial. Quan el mòdul tingui una solució, hauríeu de veure un bon nombre d’aquestes frases GPRMC.

Pas 5: trobar-se

No és trivial convertir la sortida del mòdul en brut en informació que el vostre programa pot utilitzar realment. Afortunadament, hi ha algunes biblioteques fantàstiques que ja estan disponibles per fer-ho. La popular biblioteca GPS Adafruit de Limor Fried és una opció convenient si utilitzeu la seva versió definitiva. Està escrit per habilitar funcions exclusives de l’Ultimate (com el registre de dades intern) i afegeix algunes campanes i xiulets propis. La meva biblioteca d’anàlisi preferida, però, i aquí estic completament imparcial, és la que vaig escriure anomenada TinyGPS ++. El vaig dissenyar perquè sigui complet, potent, concís i fàcil d'utilitzar. Anem a donar-li una volta.

Pas 6: Codificació amb TinyGPS ++

Des del punt de vista del programador, utilitzar TinyGPS ++ és molt senzill:

1) Creeu un objecte gps.

2) Encaminar cada caràcter que arriba del mòdul a l'objecte mitjançant gps.encode ().

3) Quan necessiteu conèixer la vostra posició, altitud o hora o data, només cal que consulteu l'objecte GPS.

#include #include

#defineix RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// La connexió sèrie al dispositiu GPS SoftwareSerial ss (RXPin, TXPin);

// L'objecte TinyGPS ++

Gps TinyGPSPlus;

configuració nul·la () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("Exemple GPS 2");

Serial.println ("Un rastrejador senzill que utilitza TinyGPS ++.");

Serial.println ("de Mikal Hart");

Serial.println ();

}

bucle buit () {

// Si ha arribat algun personatge del GPS, /

/ envieu-los a l'objecte TinyGPS ++

while (ss.available ()> 0)

gps.encode (ss.read ());

// Visualitzem la nova ubicació i altitud

// sempre que s'ha actualitzat qualsevol d'ells

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

{

Serial.print ("Ubicació:");

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

Serial.print (",");

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

Serial.print ("Altitud:");

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

}

}

La nostra segona aplicació mostra contínuament la ubicació i l’altitud del receptor, mitjançant TinyGPS ++ per ajudar-vos a analitzar. En un dispositiu real, podeu registrar aquestes dades en una targeta SD o mostrar-les en una pantalla LCD. Agafa la biblioteca i dibuixa FindingYourself.ino (a dalt). Instal·leu la biblioteca, com és habitual, a la carpeta de biblioteques Arduino. Pengeu l’esbós al vostre Arduino i obriu el monitor sèrie a 115, 200 baud. Hauríeu de veure la vostra ubicació i altitud actualitzant-se en temps real. Per veure exactament on es troba, enganxeu algunes de les coordenades de latitud / longitud resultants a Google Maps. Ara connecteu el portàtil i aneu a passejar o conduir. (Però recordeu de mantenir els ulls posats a la carretera!)

Pas 7: la "QUARTA DIMENSIÓ"

tot i que associem el GPS a la ubicació a l'espai, no oblideu que els satèl·lits també transmeten marques de temps i de dades. El rellotge GPS mitjà és precís fins a una dècima milionèsima de segon i el límit teòric és encara més alt. Fins i tot si només necessiteu el vostre projecte per fer un seguiment del temps, és possible que un mòdul GPS sigui la solució més barata i senzilla.

Per convertir FindingYourself.ino en un rellotge súper precís, només cal canviar les darreres línies així:

if (gps.time.isUpdated ()) {

char buf [80];

sprintf (buf, "El temps és% 02d:% 02d:% 02d", gps.time.hour (), gps.time.minute (), gps.time.second ()); Serial.println (buf);

}

Pas 8: trobar el camí

Trobar el teu camí
Trobar el teu camí

La nostra tercera i última aplicació és el resultat d’un desafiament personal d’escriure un esbós llegible de TinyGPS ++, en menys de 100 línies de codi, que guiarà l’usuari cap a una destinació mitjançant instruccions de text senzilles com “mantenir recte” o “girar a l’esquerra”.

#include #include

#defineix RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// La connexió sèrie al dispositiu GPS SoftwareSerial ss (RXPin, TXPin);

// L'objecte TinyGPS ++ TinyGPSPlus gps;

unsigned long lastUpdateTime = 0;

#define EIFFEL_LAT 48.85823 # define EIFFEL_LNG 2.29438

/ * Aquest exemple mostra un marc bàsic sobre com podeu utilitzar el recorregut i la distància per guiar una persona (o un dron) cap a una destinació. Aquesta destinació és la Torre Eiffel. Canvieu-lo segons sigui necessari

La forma més senzilla d'obtenir la coordenada lat / llarga és fer clic amb el botó dret a la destinació a Google Maps (maps.google.com) i triar "Què hi ha aquí?". Això posa els valors exactes al quadre de cerca

*/

configuració nul·la () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("Exemple GPS 3");

Serial.println ("Un sistema d'orientació no tan complet");

Serial.println ("de Mikal Hart");

Serial.println ();

}

bucle buit () {

// Si ha arribat algun caràcter del GPS, // envieu-los a l'objecte TinyGPS ++ mentre (ss.available ()> 0) gps.encode (ss.read ());

// Cada 5 segons, feu una actualització

if (millis () - LastUpdateTime> = 5000)

{

lastUpdateTime = millis ();

Serial.println ();

// Establir el nostre estat actual

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;

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

Serial.print (courseToDestination);

Serial.print ("CurCourse:");

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 ());

// A menys de 20 metres de la destinació? Eren aquí

if (distanceToDestination <= 20,0)

{Serial.println ("ENHORABONA: heu arribat!");

sortida (1);

}

Serial.print ("DISTÀNCIA"); Serial.print (distanceToDestination);

Serial.println ("metres per arribar");

Serial.print ("INSTRUCCIÓ:");

// Quedar-se quiet? Només cal indicar quina direcció s’ha d’anar

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

{

Serial.print ("Cap");

Serial.print (directionToDestination);

Serial.println (".");

tornar;

}

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

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

Serial.println ("Gira lleugerament cap a l'esquerra");

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

Serial.println ("Gira lleugerament cap a la dreta");

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

Serial.println ("Gireu a l'esquerra");

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

Serial.println ("Gireu a la dreta");

en cas contrari

Serial.println ("Gireu completament");

}

}

Cada 5 segons, el codi capta la ubicació i el rumb de l’usuari (direcció de desplaçament) i calcula el coixinet (direcció cap a la destinació), mitjançant el mètode TinyGPS ++ courseTo (). La comparació dels dos vectors genera un suggeriment per seguir recte o girar, com es mostra a continuació.

Copieu l'esbós FindingYourWay.ino (a sobre) i enganxeu-lo a l'IDE Arduino. Establiu una destinació a 1 km o 2 km, carregueu l’esbós al vostre Arduino, executeu-lo al vostre ordinador portàtil i vegeu si us guiarà cap allà. Però, el que és més important, estudieu el codi i enteneu-ne el funcionament.

Pas 9: anar més enllà

El potencial creatiu del GPS és ampli. Una de les coses més satisfactòries que he fet mai ha estat una caixa de trencaclosques habilitada per GPS que només s’obre en un lloc preprogramat. Si la vostra víctima vol tancar el tresor a dins, ha d’esbrinar on es troba aquest lloc secret i portar-hi la caixa físicament. Una idea popular del primer projecte és una mena de dispositiu de registre que registra la posició i l’altitud minut a minut d’un, per exemple, un excursionista que camina pel Camí Trans-Penní. O què passa amb un d’aquests rastrejadors magnètics furibunds dels agents de la DEA a Breaking Bad als cotxes dels dolents? Tots dos són totalment factibles i probablement seria divertit de construir, però us animo a pensar de manera més àmplia, més enllà de les coses que ja podeu comprar a Amazon. És un gran món per aquí. Vaga tan lluny com puguis.

Recomanat: