Cuprins:

Găsirea drumului cu GPS: 9 pași
Găsirea drumului cu GPS: 9 pași

Video: Găsirea drumului cu GPS: 9 pași

Video: Găsirea drumului cu GPS: 9 pași
Video: TUTORIAL, Cum cauți parcare pe GPS! 2024, Noiembrie
Anonim
Căutarea drumului cu GPS
Căutarea drumului cu GPS

Un exercițiu rapid de înțelegere și aplicare a datelor GPS

  • Timp necesar: 2 ore
  • Cost: 75 - 150 USD

Pentru producători, a devenit destul de ieftin să încorporeze date geospațiale de înaltă calitate în proiectele electronice. Și în ultimii ani, modulele de recepție GPS (Global Positioning System) au crescut mult mai diverse, mai puternice și mai ușor de integrat cu plăci de dezvoltare precum Arduino, PIC, Teensy și Raspberry Pi. Dacă v-ați gândit să construiți în jurul GPS-ului, ați ales un moment bun pentru a începe.

Pasul 1: Cum funcționează

Un modul GPS este un mic receptor radio care procesează semnale difuzate pe frecvențe cunoscute de o flotă de sateliți. Acești sateliți se învârt în jurul Pământului pe orbite aproximativ circulare, transmitând date de poziție și ceas extrem de precise către solul de dedesubt. Dacă receptorul legat de pământ poate „vedea” suficient din acești sateliți, îi poate folosi pentru a-și calcula propria locație și altitudine.

Când sosește un mesaj GPS, receptorul își verifică mai întâi marca de timp de difuzare pentru a vedea când a fost trimis. Deoarece viteza unei unde radio în spațiu este o constantă cunoscută (c), receptorul poate compara timpii de difuzare și de recepție pentru a determina distanța parcursă de semnal. Odată ce și-a stabilit distanța față de patru sau mai mulți sateliți cunoscuți, calcularea propriei poziții este o problemă destul de simplă a triangulației 3D. Dar, pentru a face acest lucru rapid și cu precizie, receptorul trebuie să fie capabil să scârțâie cu ușurință numerele de până la 20 de fluxuri de date simultan. Deoarece sistemul GPS are scopul publicat de a fi utilizabil peste tot pe Pământ, sistemul trebuie să se asigure că cel puțin patru sateliți - de preferință mai multe - sunt vizibile în orice moment din orice punct de pe glob. În prezent, există 32 de sateliți GPS care efectuează un dans meticulos coregrafiat într-un nor rar de 20 000 de kilometri înălțime.

Pasul 2: Fapt despre fan

GPS-ul nu ar putea funcționa fără teoria relativității a lui Einstein, deoarece trebuie făcută o compensare pentru cele 38 de microsecunde pe care ceasurile atomice orbitante le câștigă în fiecare zi din dilatarea timpului în câmpul gravitațional al Pământului.

Pasul 3: Introducere

Noțiuni de bază
Noțiuni de bază

Indiferent de proiectul dvs., GPS-ul este simplu de integrat. Majoritatea modulelor receptorului comunică cu un protocol serial simplu, deci dacă puteți găsi un port serial de rezervă pe placa controlerului, ar trebui să fie necesare doar câteva mână de fire pentru a face conexiunea fizică. Și chiar dacă nu, majoritatea controlerelor acceptă un mod serial emulat „software” pe care îl puteți utiliza pentru a vă conecta la pini arbitrari.

Pentru începători, modulul Adafruit Ultimate GPS Breakout este o alegere bună. Există o mulțime de produse concurente pe piață, dar Ultimate este un performant solid la un preț rezonabil, cu găuri mari care sunt ușor de lipit sau conectate la o placă de măsurare.

Mai întâi, conectați masa și alimentarea. În termeni Arduino, aceasta înseamnă conectarea unuia dintre pinii GND ai microcontrolerului la GND-ul modulului și pinul + 5V la VIN-ul modulului. Pentru a gestiona transferul de date, trebuie să conectați pinii TX și RX ai modulului la Arduino. Voi selecta în mod arbitrar pinii Arduino 2 (TX) și 3 (RX) în acest scop, chiar dacă pinii 0 și 1 sunt proiectați special pentru a fi folosiți ca „port serial hardware” sau UART. De ce? Pentru că nu vreau să risipesc singurul UART pe care îl au aceste procesoare AVR low-end. UART-ul Arduino este conectat la conectorul USB de la bord și îmi place să îl păstrez conectat la computer pentru depanare.

Pasul 4: Un deget de la picior în Datastream

Un deget de la picior în Datastream
Un deget de la picior în Datastream

În momentul în care aplicați energie, un modul GPS începe să trimită bucăți de date text pe linia sa TX. Este posibil să nu vadă încă un singur satelit, cu atât mai puțin să aibă o „remediere”, dar robinetul de date apare imediat și este interesant să vedem ce iese. Prima noastră schiță simplă (de mai jos) nu face altceva decât să afișeze aceste date neprelucrate.

#include #define RXPin 2

#define TXPin 3 # define GPSBaud 4800

#define ConsoleBaud 115200

// Conexiunea serială la dispozitivul GPS SoftwareSerial ss (RXPin, TXPin);

configurare nulă () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("Exemplul GPS 1");

Serial.println ("Afișarea datelor brute NMEA transmise prin modulul GPS.");

Serial.println („de Mikal Hart”); Serial.println ();

}

bucla nulă ()

{if (ss.available ()> 0) // Pe măsură ce ajunge fiecare personaj …

Serial.write (ss.read ()); // … scrie-l pe consolă

}

NOTĂ: Schița definește pinul de primire (RXPin) ca 2, chiar dacă am spus mai devreme că pinul de transmisie (TX) ar fi conectat la pinul 2. Aceasta este o sursă obișnuită de confuzie. RXPin este pinul de primire (RX) din punctul de vedere al Arduino. Bineînțeles, trebuie conectat la pinul de transmisie (TX) al modulului și invers.

Încărcați această schiță și deschideți Serial Monitor la 115, 200 baud. Dacă totul funcționează, ar trebui să vedeți un flux dens și nesfârșit de șiruri de text separate prin virgulă. Fiecare va arăta ca a doua imagine la începutul paragrafului.

Aceste șiruri distinctive sunt cunoscute sub numele de propoziții NMEA, așa-numitele pentru că formatul a fost inventat de Asociația Națională de Electronică Maritimă. NMEA definește o serie de astfel de propoziții pentru date de navigație, de la esențial (locație și timp) la esoteric (raportul semnal-zgomot prin satelit, varianța magnetică etc.). Producătorii sunt incompatibili cu privire la tipurile de propoziții pe care le folosesc receptorii, dar GPRMC este esențial. Odată ce modulul dvs. a fost remediat, ar trebui să vedeți un număr destul de ridicat de aceste propoziții GPRMC.

Pasul 5: Să te regăsești

Nu este banal să convertiți rezultatul brut al modulului în informații pe care programul dvs. le poate folosi de fapt. Din fericire, există deja câteva biblioteci excelente pentru a face acest lucru pentru dvs. Populara bibliotecă GPS Adafruit de la Limor Fried este o alegere convenabilă dacă folosiți breakout-ul lor final. Este scris pentru a permite caracteristici unice pentru Ultimate (cum ar fi înregistrarea internă a datelor) și adaugă câteva clopote și fluiere proprii. Biblioteca mea preferată de analiză, totuși - și aici sunt, desigur, complet imparțială - este cea pe care am scris-o numită TinyGPS ++. L-am proiectat pentru a fi cuprinzător, puternic, concis și ușor de utilizat. Să o luăm la întoarcere.

Pasul 6: Codificare cu TinyGPS ++

Din punctul de vedere al programatorului, utilizarea TinyGPS ++ este foarte simplă:

1) Creați un obiect GPS.

2) Trageți fiecare caracter care ajunge de la modul la obiect folosind gps.encode ().

3) Când trebuie să vă cunoașteți poziția sau altitudinea sau ora sau data, pur și simplu interogați obiectul GPS.

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Conexiunea serială la dispozitivul GPS SoftwareSerial ss (RXPin, TXPin);

// Obiectul TinyGPS ++

GPS TinyGPSPlus;

configurare nulă () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("Exemplul GPS 2");

Serial.println („Un tracker simplu care utilizează TinyGPS ++.”);

Serial.println („de Mikal Hart”);

Serial.println ();

}

bucla nulă () {

// Dacă au sosit caractere de pe GPS, /

/ trimiteți-le la obiectul TinyGPS ++

while (ss.available ()> 0)

gps.encode (ss.read ());

// Să afișăm noua locație și altitudine

// ori de câte ori oricare dintre ele a fost actualizată

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

{

Serial.print ("Locație:");

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

Serial.print (",");

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

Serial.print ("Altitudine:");

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

}

}

A doua noastră aplicație afișează continuu locația și altitudinea receptorului, utilizând TinyGPS ++ pentru a ajuta la analiza. Pe un dispozitiv real, este posibil să înregistrați aceste date pe un card SD sau să le afișați pe un ecran LCD. Luați biblioteca și schițați FindingYourself.ino (mai sus). Instalați biblioteca, ca de obicei, în folderul Arduino biblioteci. Încărcați schița pe Arduino și deschideți Serial Monitor la 115, 200 baud. Ar trebui să vă vedeți actualizarea locației și a altitudinii în timp real. Pentru a vedea exact locul în care vă aflați, lipiți unele dintre coordonatele de latitudine / longitudine rezultate în Google Maps. Acum conectați-vă laptopul și mergeți la plimbare sau cu mașina. (Dar nu uitați să țineți ochii pe drum!)

Pasul 7: „A PATRA DIMENSIUNE”

cu toate că asociem GPS-ul cu locația în spațiu, nu uitați că acești sateliți transmit și timbre și date. Ceasul GPS mediu este precis la o zecimilionime de secundă, iar limita teoretică este chiar mai mare. Chiar dacă aveți nevoie doar de proiectul dvs. pentru a ține evidența timpului, un modul GPS poate fi în continuare cea mai ieftină și mai ușoară soluție.

Pentru a transforma FindingYourself.ino într-un ceas foarte precis, schimbați ultimele rânduri astfel:

if (gps.time.isUpdated ()) {

char buf [80];

sprintf (buf, "Timpul este% 02d:% 02d:% 02d", gps.time.hour (), gps.time.minute (), gps.time.second ()); Serial.println (buf);

}

Pasul 8: Căutați-vă drumul

Găsindu-ți drumul
Găsindu-ți drumul

A treia și ultima noastră aplicație este rezultatul unei provocări personale de a scrie o schiță TinyGPS ++ lizibilă, în mai puțin de 100 de linii de cod, care să ghideze utilizatorul către o destinație folosind instrucțiuni text simple, cum ar fi „păstrați drept” sau „virează la stânga”.

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Conexiunea serială la dispozitivul GPS SoftwareSerial ss (RXPin, TXPin);

// Obiectul TinyGPS ++ TinyGPSPlus gps;

unsigned long lastUpdateTime = 0;

#define EIFFEL_LAT 48.85823 # define EIFFEL_LNG 2.29438

/ * Acest exemplu arată un cadru de bază pentru modul în care ați putea folosi cursa și distanța pentru a ghida o persoană (sau o dronă) către o destinație. Această destinație este Turnul Eiffel. Schimbați-l după cum este necesar

Cel mai simplu mod de a obține coordonata lat / lungă este să faceți clic dreapta pe destinație în Google Maps (maps.google.com) și să alegeți „Ce este aici?”. Aceasta plasează valorile exacte în caseta de căutare

*/

configurare nulă () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("Exemplul GPS 3");

Serial.println („Un sistem de orientare care nu este atât de cuprinzător”);

Serial.println („de Mikal Hart”);

Serial.println ();

}

bucla nulă () {

// Dacă au sosit caractere de pe GPS, // trimiteți-le la obiectul TinyGPS ++ în timp ce (ss.available ()> 0) gps.encode (ss.read ());

// La fiecare 5 secunde, faceți o actualizare

if (milis () - lastUpdateTime> = 5000)

{

lastUpdateTime = millis ();

Serial.println ();

// Stabilește starea noastră 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;

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

// La 20 de metri de destinație? Au fost aici

if (distanceToDestination <= 20.0)

{Serial.println ("FELICITĂRI: Ai ajuns!");

ieșire (1);

}

Serial.print ("DISTANȚĂ:"); Serial.print (distanceToDestination);

Serial.println („metri de parcurs”);

Serial.print ("INSTRUCȚIUNE:");

// Stai nemișcat? Indicați doar ce direcție să mergeți

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

{

Serial.print („Cap”);

Serial.print (directionToDestination);

Serial.println (".");

întoarcere;

}

if (courseChangeNeeded> = 345 || courseChangeNeeded <15) Serial.println ("Continuă drept înainte!");

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

Serial.println ("Virați ușor spre stânga.");

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

Serial.println ("Virați ușor spre dreapta.");

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

Serial.println ("Întoarceți-vă spre stânga.");

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

Serial.println („Virați la dreapta.”);

altceva

Serial.println ("Întoarce-te complet.");

}

}

La fiecare 5 secunde, codul captează locația și cursul utilizatorului (direcția de deplasare) și calculează rulmentul (direcția către destinație), utilizând metoda TinyGPS ++ courseTo (). Compararea celor doi vectori generează o sugestie de a continua să mergeți drept sau să vă întoarceți, așa cum se arată mai jos.

Copiați schița FindingYourWay.ino (mai sus) și lipiți-o în IDE Arduino. Setați o destinație la 1 km sau 2 km distanță, încărcați schița pe Arduino, rulați-o pe laptop și vedeți dacă vă va ghida acolo. Dar, mai important, studiați codul și înțelegeți cum funcționează.

Pasul 9: Mergeți mai departe

Potențialul creativ al GPS-ului este vast. Unul dintre cele mai satisfăcătoare lucruri pe care le-am făcut vreodată a fost o casetă de puzzle cu GPS care se deschide doar într-o singură locație preprogramată. Dacă victima ta dorește să blocheze comoara înăuntru, trebuie să-și dea seama unde se află acea locație secretă și să aducă fizic cutia acolo. O idee populară de prim proiect este un fel de dispozitiv de înregistrare care înregistrează poziția minut cu minut și altitudinea, de exemplu, a unui excursionist care merge pe Traseul Trans-Pennine. Sau ce zici de unul dintre acele urme de urmărire magnetică ale agenților DEA din stick-ul Breaking Bad de pe mașinile băieților răi? Ambele sunt total fezabile și probabil ar fi distractiv de construit, dar vă încurajez să gândiți mai mult, dincolo de lucrurile pe care le puteți cumpăra deja pe Amazon. Este o lume mare acolo. Mergeți cât mai departe posibil.

Recomandat: