Sadržaj:

Kako pronaći svoj put s GPS -om: 9 koraka
Kako pronaći svoj put s GPS -om: 9 koraka

Video: Kako pronaći svoj put s GPS -om: 9 koraka

Video: Kako pronaći svoj put s GPS -om: 9 koraka
Video: НАБРАЛ Секретный Код На Телефоне И ОФИГЕЛ!! БАТАРЕЯ НЕ САДИТСЯ! 2024, Juli
Anonim
Traženje puta pomoću GPS -a
Traženje puta pomoću GPS -a

Brza vježba u razumijevanju i primjeni GPS podataka

  • Potrebno vrijeme: 2 sata
  • Cijena: 75-150 USD

Proizvođačima je postalo prilično jeftino uključivanje visokokvalitetnih geoprostornih podataka u elektroničke projekte. U posljednjih nekoliko godina, GPS (Global Positioning System) prijemnički moduli postali su mnogo raznovrsniji, moćniji i lakši za integraciju s razvojnim pločama poput Arduina, PIC, Teensy i Raspberry Pi. Ako ste razmišljali o izgradnji oko GPS -a, odabrali ste dobro vrijeme za početak.

Korak 1: Kako to funkcionira

GPS modul je mali radio prijemnik koji obrađuje signale koje emituje flota satelita na poznatim frekvencijama. Ovi sateliti kruže oko Zemlje po grubo kružnim orbitama, prenoseći izuzetno precizne podatke o položaju i satu na zemlju ispod. Ako zemaljski prijemnik može "vidjeti" dovoljno ovih satelita, može ih koristiti za izračunavanje vlastite lokacije i nadmorske visine.

Kada stigne GPS poruka, prijemnik prvo pregleda svoju vremensku oznaku emitiranja kako bi vidio kada je poslana. Budući da je brzina radio talasa u svemiru poznata konstanta (c), prijemnik može uporediti emitovanje i primanje kako bi odredio udaljenost koju je signal prešao. Nakon što utvrdi udaljenost od četiri ili više poznatih satelita, izračunavanje vlastite pozicije prilično je jednostavan problem 3D triangulacije. No, da bi to učinio brzo i precizno, prijemnik mora biti u stanju da okretno broji do 20 tokova podataka odjednom. Budući da GPS sistem ima objavljeni cilj da bude upotrebljiv svuda na Zemlji, sistem mora osigurati da najmanje četiri satelita - po mogućnosti više - vidljive su uvijek sa svih točaka na kugli zemaljskoj. Trenutno postoje 32 GPS satelita koji izvode pomno koreografiran ples u rijetkom oblaku visine 20 000 kilometara.

Korak 2: Činjenica o obožavateljima

GPS ne bi mogao funkcionirati bez Einsteinove teorije relativnosti, jer se mora kompenzirati 38 mikrosekundi koje atomski satovi u orbiti dobivaju svaki dan od vremenskog širenja u Zemljinom gravitacionom polju.

Korak 3: Početak

Počinjemo
Počinjemo

Bez obzira na vaš projekt, GPS je jednostavno integrirati. Većina prijemnih modula komunicira s jednostavnim serijskim protokolom, pa ako na svojoj kontrolnoj ploči možete pronaći rezervni serijski port, potrebno je samo nekoliko žica za fizičku vezu. Čak i ako nije, većina kontrolera podržava emulirani "softverski" serijski način rada koji možete koristiti za spajanje na proizvoljne pinove.

Za početnike, Adafruit -ov Ultimate GPS Breakout modul je dobar izbor. Na tržištu postoji mnogo konkurentnih proizvoda, ali Ultimate ima solidne performanse po razumnoj cijeni, s velikim otvorima koje je lako lemiti ili spojiti na matičnu ploču.

Prvo spojite uzemljenje i napajanje. U Arduino terminima, to znači povezivanje jednog od GND pinova mikrokontrolera na GND modula, a +5V pin na VIN modula. Za upravljanje prijenosom podataka također morate spojiti TX i RX pinove modula na Arduino. U tu svrhu ću proizvoljno odabrati Arduino pinove 2 (TX) i 3 (RX), iako su pinovi 0 i 1 posebno dizajnirani za upotrebu kao "hardverski serijski port" ili UART. Zašto? Zato što ne želim izgubiti jedini UART koji ovi jeftiniji AVR procesori imaju. Arduino UART je čvrsto povezan sa ugrađenim USB konektorom i volim ga držati povezanim sa računarom radi otklanjanja grešaka.

Korak 4: Prst u toku podataka

Nožni prst u toku podataka
Nožni prst u toku podataka

Čim uključite napajanje, GPS modul počinje slati komade tekstualnih podataka na svojoj TX liniji. Možda još ne vidi niti jedan satelit, a još manje ima "popravku", ali slavina za podatke se odmah uključuje i zanimljivo je vidjeti što će izaći. Naša prva jednostavna skica (ispod) ne prikazuje ništa osim prikaza ovih neobrađenih podataka.

#include #define RXPin 2

#define TXPin 3#define GPSBaud 4800

#define ConsoleBaud 115200

// serijska veza sa GPS uređajemSoftwareSerial ss (RXPin, TXPin);

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("GPS primjer 1");

Serial.println ("Prikaz sirovih NMEA podataka koje prenosi GPS modul.");

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

}

void loop ()

{if (ss.available ()> 0) // Kako svaki znak stiže …

Serial.write (ss.read ()); //… upišite ga na konzolu

}

NAPOMENA: Skica definira prijemni pin (RXPin) kao 2, iako smo ranije rekli da će prijenosni (TX) pin biti spojen na pin 2. Ovo je uobičajeni izvor zabune. RXPin je prijemni pin (RX) sa Arduinovog gledišta. Naravno, mora biti spojen na prijenosni (TX) pin modula i obrnuto.

Otpremite ovu skicu i otvorite Serijski monitor na 115, 200 bauda. Ako sve funkcionira, trebali biste vidjeti gust, beskrajan niz tekstualnih nizova odvojenih zarezima. Svaki će izgledati nešto poput druge slike na početku odlomka.

Ovi prepoznatljivi nizovi poznati su kao NMEA rečenice, tako nazvani jer je format izmislila Nacionalna udruga pomorske elektronike. NMEA definira brojne ove rečenice za navigacijske podatke, od bitnih (lokacija i vrijeme), do ezoteričnih (omjer satelitskog signala i šuma, magnetska varijansa itd.). Proizvođači se ne slažu oko toga koje vrste rečenica koriste njihovi prijemnici, ali GPRMC je bitan. Kada vaš modul dobije ispravku, trebali biste vidjeti priličan broj ovih GPRMC rečenica.

Korak 5: Pronađite sebe

Nije trivijalno pretvoriti sirovi izlaz modula u informacije koje vaš program zapravo može koristiti. Srećom, već postoje neke sjajne biblioteke koje to mogu učiniti umjesto vas. Popularna Adafruit GPS biblioteka Limor Fried -a zgodan je izbor ako koristite njihov Ultimate napredak. Napisano je kako bi omogućilo funkcije jedinstvene za Ultimate (poput internog bilježenja podataka) i dodaje neke vlastite snažne melodije. Moja omiljena biblioteka za raščlanjivanje - ali ovdje sam naravno potpuno nepristrasna - je ona koju sam napisao pod nazivom TinyGPS ++. Dizajnirao sam ga da bude sveobuhvatan, snažan, sažet i jednostavan za upotrebu. Uzmimo to za spin.

Korak 6: Kodiranje pomoću TinyGPS ++

Sa stanovišta programera, korištenje TinyGPS ++ je vrlo jednostavno:

1) Kreirajte objekt GPS.

2) Usmjerite svaki znak koji stigne iz modula do objekta pomoću gps.encode ().

3) Kada trebate znati svoj položaj ili nadmorsku visinu ili vrijeme ili datum, jednostavno upitajte gps objekt.

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// serijska veza sa GPS uređajemSoftwareSerial ss (RXPin, TXPin);

// Objekat TinyGPS ++

TinyGPSPlus gps;

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("GPS primjer 2");

Serial.println ("Jednostavan alat za praćenje koji koristi TinyGPS ++.");

Serial.println ("autor Mikal Hart");

Serial.println ();

}

void loop () {{100} {101}

// Ako su neki GPS likovi stigli, /

/ pošaljite ih na objekt TinyGPS ++

while (ss.available ()> 0)

gps.encode (ss.read ());

// Prikažimo novu lokaciju i nadmorsku visinu

// kad god je bilo koji od njih ažuriran

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

{

Serial.print ("Lokacija:");

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

Serial.print (",");

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

Serial.print ("Visina:");

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

}

}

Naša druga aplikacija stalno prikazuje lokaciju i visinu prijemnika, koristeći TinyGPS ++ za pomoć pri raščlanjivanju. Na pravom uređaju ove podatke možete zapisati na SD karticu ili prikazati na LCD -u. Uzmite biblioteku i skicirajte FindingYourself.ino (gore). Biblioteku instalirajte, kao i obično, u mapu Arduino biblioteke. Prenesite skicu na svoj Arduino i otvorite Serijski monitor na 115, 200 bauda. Trebali biste vidjeti svoju lokaciju i nadmorsku visinu u stvarnom vremenu. Da vidite točno gdje stojite, zalijepite neke od rezultirajućih koordinata zemljopisne širine/dužine u Google karte. Sada priključite laptop i idite u šetnju ili vožnju. (Ali ne zaboravite držati oči na cesti!)

Korak 7: "ČETVRTA DIMENZIJA"

Iako povezujemo GPS s lokacijom u svemiru, ne zaboravite da i ti sateliti odašilju vremenske i datumske oznake. Prosječni GPS sat je tačan do jedne milionite sekunde, a teoretsko ograničenje je još veće. Čak i ako vam je vaš projekt potreban samo za praćenje vremena, GPS modul može biti najjeftinije i najjednostavnije rješenje.

Da biste FindingYourself.ino pretvorili u super precizan sat, samo promijenite posljednjih nekoliko redaka ovako:

if (gps.time.isUpdated ()) {{100} {101}

char buf [80];

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

}

Korak 8: Pronađite svoj put

Finding Your Way
Finding Your Way

Naša treća i posljednja aplikacija rezultat je osobnog izazova da napišete čitljivu skicu TinyGPS ++, u manje od 100 redova koda, koja bi vodila korisnika do odredišta pomoću jednostavnih tekstualnih uputa poput "drži pravo" ili "skrenite lijevo".

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// serijska veza sa GPS uređajemSoftwareSerial ss (RXPin, TXPin);

// Objekat TinyGPS ++ TinyGPSPlus gps;

unsigned long lastUpdateTime = 0;

#define EIFFEL_LAT 48.85823#define EIFFEL_LNG 2.29438

/* Ovaj primjer prikazuje osnovni okvir za to kako možete koristiti kurs i udaljenost da biste vodili osobu (ili bespilotnu letjelicu) do odredišta. Ovo odredište je Ajfelov toranj. Promijenite ga prema potrebi

Najlakši način da dobijete geografsku širinu/širinu je da desnim tasterom miša kliknete na odredište u Google mapama (maps.google.com) i odaberete "Šta je ovdje?". Ovo stavlja tačne vrijednosti u okvir za pretraživanje

*/

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("GPS primjer 3");

Serial.println ("Ne tako sveobuhvatan sistem navođenja");

Serial.println ("autor Mikal Hart");

Serial.println ();

}

void loop () {{100} {101}

// Ako su neki znakovi stigli s GPS -a, // pošaljite ih objektu TinyGPS ++ while (ss.available ()> 0) gps.encode (ss.read ());

// Svakih 5 sekundi ažurirajte

if (millis () - lastUpdateTime> = 5000)

{

lastUpdateTime = millis ();

Serial.println ();

// Uspostavimo naš trenutni status

dvostruka distanceToDestination = TinyGPSPlus:: distanceBetween

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

dvostruki courseToDestination = TinyGPSPlus:: courseTo

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

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

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

// otklanjanje grešaka u 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 ());

// U krugu od 20 metara od odredišta? Ovdje smo

if (distanceToDestination <= 20.0)

{Serial.println ("ČESTITAMO: Stigli ste!");

izlaz (1);

}

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

Serial.println ("metara do kraja.");

Serial.print ("UPUTSTVO:");

// Stojite mirno? Samo naznačite u kom smjeru da idete

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

{

Serial.print ("Head");

Serial.print (directionToDestination);

Serial.println (".");

return;

}

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

inače if (courseChangeNeeded> = 315 && courseChangeNeeded <345)

Serial.println ("Skrenite malo ulijevo.");

inače if (courseChangeNeeded> = 15 && courseChangeNeeded <45)

Serial.println ("Skrenite malo udesno.");

inače if (courseChangeNeeded> = 255 && courseChangeNeeded <315)

Serial.println ("Okrenite nalijevo.");

inače if (courseChangeNeeded> = 45 && courseChangeNeeded <105)

Serial.println ("Skrenite desno.");

else

Serial.println ("Potpuno se okreni.");

}

}

Svakih 5 sekundi kôd bilježi lokaciju i kurs korisnika (smjer putovanja) i izračunava smjer (smjer do odredišta), koristeći metodu TinyGPS ++ courseTo (). Poređenje dva vektora generira prijedlog da nastavite ravno ili skrenete, kao što je prikazano u nastavku.

Kopirajte skicu FindingYourWay.ino (gore) i zalijepite je u Arduino IDE. Postavite odredište udaljeno 1 km ili 2 km, prenesite skicu na svoj Arduino, pokrenite je na prijenosnom računaru i pogledajte hoće li vas tamo odvesti. Ali što je još važnije, proučite kôd i shvatite kako radi.

Korak 9: Idite dalje

Kreativni potencijal GPS -a je ogroman. Jedna od najzadovoljnijih stvari koje sam ikad napravio bila je kutija slagalica s GPS-om koja se otvara samo na jednoj unaprijed programiranoj lokaciji. Ako vaša žrtva želi zaključati blago unutra, mora otkriti gdje se nalazi ta tajna lokacija i fizički donijeti kutiju. Popularna prva projektna ideja je neka vrsta uređaja za bilježenje koji bilježi minutu po minutu položaj i nadmorsku visinu, recimo, planinara koji hoda Trans-Peninskom stazom. Ili šta je sa jednim od onih lukavih magnetnih tragača koje su agenti DEA -e u Breaking Badu zalijepili na automobile loših momaka? Obje su potpuno izvedive i vjerojatno bi ih bilo zabavno graditi, ali ohrabrujem vas da razmišljate opsežnije, osim stvari koje već možete kupiti na Amazonu. Tamo je veliki svet. Lutajte što dalje i šire.

Preporučuje se: