Kazalo:

Iskanje poti z GPS: 9 korakov
Iskanje poti z GPS: 9 korakov

Video: Iskanje poti z GPS: 9 korakov

Video: Iskanje poti z GPS: 9 korakov
Video: Garmin Support | RV 895/1095 | Getting Started 2024, November
Anonim
Iskanje poti z GPS -om
Iskanje poti z GPS -om

Hitra vaja pri razumevanju in uporabi podatkov GPS

  • Potreben čas: 2 uri
  • Cena: 75-150 USD

Za proizvajalce je postalo precej poceni vključevanje visokokakovostnih geoprostorskih podatkov v elektronske projekte. In v zadnjih nekaj letih so sprejemniški moduli GPS (Global Positioning System) postali veliko bolj raznoliki, močni in enostavni za integracijo z razvojnimi ploščami, kot so Arduino, PIC, Teensy in Raspberry Pi. Če ste razmišljali o gradnji okoli GPS -a, ste za začetek izbrali pravi čas.

1. korak: Kako deluje

Modul GPS je majhen radijski sprejemnik, ki obdeluje signale, ki jih na znanih frekvencah oddaja flota satelitov. Ti sateliti se vrtijo okoli Zemlje po približno krožnih orbitah in na tla spodaj prenašajo izredno natančne podatke o položaju in uri. Če zemeljski sprejemnik lahko "vidi" dovolj teh satelitov, jih lahko uporabi za izračun lastne lokacije in nadmorske višine.

Ko prispe sporočilo GPS, sprejemnik najprej pregleda časovni žig oddaje, da ugotovi, kdaj je bilo poslano. Ker je hitrost radijskega vala v vesolju znana konstanta (c), lahko sprejemnik primerja čas oddajanja in sprejema, da določi razdaljo, ki jo je signal prehodil. Ko določi svojo razdaljo od štirih ali več znanih satelitov, je izračun lastnega položaja dokaj preprost problem 3D triangulacije. Če pa želite to narediti hitro in natančno, mora sprejemnik hitro spremeniti številke iz največ 20 podatkovnih tokov hkrati. Ker ima sistem GPS objavljen cilj, da je uporaben povsod na Zemlji, mora sistem zagotoviti, da imajo vsaj štirje sateliti - po možnosti več - so vedno vidne z vseh točk na svetu. Trenutno obstaja 32 satelitov GPS, ki izvajajo natančno koreografiran ples v redkem oblaku, visokem 20 000 kilometrov.

2. korak: Fan Fact

GPS ne bi mogel delovati brez Einsteinove teorije relativnosti, saj je treba kompenzirati 38 mikrosekund, ki jih atomske ure v orbiti vsak dan pridobijo zaradi časovnega razmika v gravitacijskem polju Zemlje.

3. korak: Začnite

Začetek
Začetek

Ne glede na vaš projekt je GPS preprosto integrirati. Večina sprejemnih modulov komunicira z enostavnim serijskim protokolom, zato, če na nadzorni plošči najdete rezervna serijska vrata, bo za vzpostavitev fizične povezave potrebnih le nekaj žic. Tudi če ne, večina krmilnikov podpira emuliran "programski" serijski način, ki ga lahko uporabite za povezavo z poljubnimi zatiči.

Za začetnike je Adafruitov modul Ultimate GPS Breakout dobra izbira. Na trgu je veliko konkurenčnih izdelkov, vendar je Ultimate trden izvajalec po razumni ceni, z velikimi luknjami, ki jih je enostavno spajkati ali povezati na ploščo.

Najprej priključite ozemljitev in napajanje. V smislu Arduina to pomeni priključitev enega od nožic GND mikrokrmilnika na GND modula in +5V pin na VIN modula. Za upravljanje prenosa podatkov morate na Arduino povezati tudi zatiče TX in RX modula. V ta namen bom poljubno izbral nožice Arduino 2 (TX) in 3 (RX), čeprav sta nožici 0 in 1 posebej zasnovani za uporabo kot "serijska vrata strojne opreme" ali UART. Zakaj? Ker nočem zapraviti edinega UART-a, ki ga imajo ti nizko kakovostni AVR procesorji. Arduinov UART je trdno povezan z vgrajenim USB priključkom in rad bi bil povezan z računalnikom za odpravljanje napak.

4. korak: Prst v toku podatkov

Prst v toku podatkov
Prst v toku podatkov

Takoj, ko vključite napajanje, začne modul GPS pošiljati kose besedilnih podatkov v liniji TX. Morda še ne vidi niti enega satelita, še manj pa ima "popravilo", vendar se pipa za podatke takoj vklopi in zanimivo je videti, kaj pride ven. Naša prva preprosta skica (spodaj) ne prikazuje nič drugega kot prikaz teh neobdelanih podatkov.

#include #define RXPin 2

#define TXPin 3#define GPSBaud 4800

#define ConsoleBaud 115200

// Zaporedna povezava z napravo GPSSoftwareSerial ss (RXPin, TXPin);

void setup () {

Serial.begin (ConsoleBaud);

ss.začetek (GPSBaud);

Serial.println ("Primer GPS 1");

Serial.println ("Prikaz surovih podatkov NMEA, ki jih posreduje modul GPS.");

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

}

void loop ()

{if (ss.available ()> 0) // Ko pride vsak znak …

Serial.write (ss.read ()); //… zapišite v konzolo

}

OPOMBA: Skica definira sprejemni pin (RXPin) kot 2, čeprav smo že povedali, da bo oddajni (TX) pin priključen na pin 2. To je pogost vir zmede. RXPin je sprejemni pin (RX) z vidika Arduina. Seveda mora biti povezan z oddajnikom (TX) modula in obratno.

Naložite to skico in odprite serijski monitor pri 115, 200 baud. Če vse deluje, bi morali videti gost, neskončen tok besedilnih nizov, ločenih z vejicami. Vsak bo videti kot druga slika na začetku odstavka.

Ti značilni nizi so znani kot stavki NMEA, tako imenovani, ker je obliko izumilo Nacionalno združenje za pomorsko elektroniko. NMEA opredeljuje številne te stavke za navigacijske podatke, od bistvenih (lokacija in čas) do ezoteričnih (razmerje med satelitskim signalom in šumom, magnetno variacijo itd.). Proizvajalci niso dosledni glede vrst stavkov, ki jih uporabljajo njihovi sprejemniki, vendar je GPRMC bistvenega pomena. Ko bo vaš modul popravljen, bi morali videti precej število teh stavkov GPRMC.

5. korak: Najti sebe

Pretvoriti izhod surovega modula v informacije, ki jih program dejansko lahko uporablja, ni nepomembno. Na srečo je za to že na voljo nekaj odličnih knjižnic. Priljubljena knjižnica Adafruit GPS Limorja Frieda je priročna izbira, če uporabljate njihov Ultimate breakdown. Napisano je za omogočanje edinstvenih funkcij za Ultimate (na primer notranje beleženje podatkov) in dodaja nekaj lastnih zvokov in piščal. Moja najljubša knjižnica za razčlenjevanje - in tukaj sem seveda popolnoma nepristranska - je tista, ki sem jo napisal z imenom TinyGPS ++. Oblikoval sem ga tako, da je celovit, zmogljiv, jedrnat in enostaven za uporabo. Vzemimo za spin.

6. korak: Kodiranje s programom TinyGPS ++

Z vidika programerja je uporaba TinyGPS ++ zelo preprosta:

1) Ustvarite objekt GPS.

2) Vsak znak, ki prispe iz modula, preusmerite v objekt s pomočjo gps.encode ().

3) Ko morate vedeti svoj položaj ali nadmorsko višino ali čas ali datum, preprosto poizvedite predmet GPS.

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Zaporedna povezava z napravo GPSSoftwareSerial ss (RXPin, TXPin);

// Objekt TinyGPS ++

TinyGPSPlus gps;

void setup () {

Serial.begin (ConsoleBaud);

ss.začetek (GPSBaud);

Serial.println ("Primer 2 GPS");

Serial.println ("Preprost sledilnik, ki uporablja TinyGPS ++.");

Serial.println ("avtor Mikal Hart");

Serial.println ();

}

void loop () {

// Če so iz GPS prispeli znaki, /

/ jih pošljite v objekt TinyGPS ++

medtem ko (ss.available ()> 0)

gps.encode (ss.read ());

// Prikažimo novo lokacijo in nadmorsko višino

// kadar koli je bil kateri od njih posodobljen

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

{

Serial.print ("Lokacija:");

Serijski.tisk (gps.location.lat (), 6);

Serial.print (",");

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

Serial.print ("Nadmorska višina:");

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

}

}

Naša druga aplikacija nenehno prikazuje lokacijo in nadmorsko višino sprejemnika z uporabo TinyGPS ++ za pomoč pri razčlenjevanju. V resnični napravi lahko te podatke zabeležite na kartico SD ali jih prikažete na LCD -prikazovalniku. Zgrabi knjižnico in skiciraj FindingYourself.ino (zgoraj). Knjižnico, kot običajno, namestite v mapo knjižnic Arduino. Skico naložite v svoj Arduino in odprite Serijski monitor pri 115, 200 baud. V realnem času bi morali videti svojo lokacijo in nadmorsko višino. Če želite natančno videti, kje stojite, prilepite nekaj nastalih koordinat zemljepisne širine/dolžine v Google Zemljevide. Zdaj priključite prenosni računalnik in pojdite na sprehod ali vožnjo. (Ampak ne pozabite, da bodite pozorni na cesto!)

7. korak: "ČETRTA DIMENZIJA"

Čeprav GPS povezujemo z lokacijo v vesolju, ne pozabite, da tudi ti sateliti oddajajo časovni in datumski žig. Povprečna ura GPS je natančna do ene desetmilijone sekunde, teoretična meja pa je še višja. Tudi če vaš projekt potrebujete le za spremljanje časa, je lahko modul GPS še vedno najcenejša in najlažja rešitev.

Če želite FindingYourself.ino spremeniti v zelo natančno uro, samo spremenite zadnjih nekaj vrstic:

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

char buf [80];

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

}

8. korak: Iskanje poti

Iskanje svoje poti
Iskanje svoje poti

Naša tretja in zadnja aplikacija je rezultat osebnega izziva pisanja berljive skice TinyGPS ++ v manj kot 100 vrsticah kode, ki bi uporabnika vodila do cilja s preprostimi besedilnimi navodili, kot sta »drži naravnost« ali »zavij levo«.

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Zaporedna povezava z napravo GPSSoftwareSerial ss (RXPin, TXPin);

// objekt TinyGPS ++ TinyGPSPlus gps;

unsigned long lastUpdateTime = 0;

#define EIFFEL_LAT 48.85823#define EIFFEL_LNG 2.29438

/* Ta primer prikazuje osnovni okvir, kako lahko uporabite smer in razdaljo za vodenje osebe (ali drona) do cilja. Ta cilj je Eifflov stolp. Po potrebi ga spremenite

Najlažji način, da dobite koordinato širine/dolžine, je, da z desno miškino tipko kliknete cilj v Google Zemljevidih (maps.google.com) in izberete »Kaj je tukaj?«. To vnese iskalne vrednosti v iskalno polje

*/

void setup () {

Serial.begin (ConsoleBaud);

ss.začetek (GPSBaud);

Serial.println ("Primer GPS 3");

Serial.println ("Ne tako celovit sistem vodenja");

Serial.println ("avtor Mikal Hart");

Serial.println ();

}

void loop () {

// Če so iz GPS prispeli znaki, jih // pošljite v objekt TinyGPS ++, medtem ko (ss.available ()> 0) gps.encode (ss.read ());

// Posodobi vsakih 5 sekund

if (millis () - lastUpdateTime> = 5000)

{

lastUpdateTime = millis ();

Serial.println ();

// Vzpostavimo trenutno stanje

dvojna distanceToDestination = TinyGPSPlus:: distanceBetween

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

dvojni 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;

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

// V 20 metrih od cilja? So bili tukaj

če (distanceToDestination <= 20,0)

{Serial.println ("ČESTITKE: Prispeli ste!");

izhod (1);

}

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

Serial.println ("meter to go.");

Serial.print ("NAVODILO:");

// Stojiš pri miru? Samo navedite, v katero smer morate iti

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

{

Serial.print ("glava");

Serial.print (directionToDestination);

Serial.println (".");

vrnitev;

}

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

sicer če (courseChangeNeeded> = 315 && courseChangeNeeded <345)

Serial.println ("Rahlo v levo.");

sicer če (courseChangeNeeded> = 15 && courseChangeNeeded <45)

Serial.println ("Zavijte malo desno".);

sicer če (courseChangeNeeded> = 255 && courseChangeNeeded <315)

Serial.println ("Zavijte levo.");

sicer če (courseChangeNeeded> = 45 && courseChangeNeeded <105)

Serial.println ("Zavijte na desno.");

drugače

Serial.println ("Popolnoma se obrni.");

}

}

Koda vsakih 5 sekund zajame lokacijo in smer uporabnika (smer vožnje) ter izračuna metodo (smer do cilja) z uporabo metode TinyGPS ++ courseTo (). Primerjava obeh vektorjev daje predlog, da nadaljujete naravnost ali zavijete, kot je prikazano spodaj.

Kopirajte skico FindingYourWay.ino (zgoraj) in jo prilepite v Arduino IDE. Določite cilj 1 km ali 2 km stran, naložite skico v svoj Arduino, jo zaženite na prenosnem računalniku in preverite, ali vas bo tja vodila. Še pomembneje pa je, da preučite kodo in razumete, kako deluje.

9. korak: Nadaljujte

Ustvarjalni potencial GPS -a je ogromen. Ena najbolj zadovoljujočih stvari, ki sem jih kdaj naredil, je bila uganka z GPS-om, ki se odpre samo na enem vnaprej programiranem mestu. Če želi vaša žrtev zaklad zakleniti, mora ugotoviti, kje je ta skrivna lokacija, in fizično prinesti škatlo tja. Priljubljena prva zamisel o projektu je nekakšna naprava za beleženje, ki beleži iz minute v minuto položaj in nadmorsko višino, recimo, pohodnika, ki hodi po Transpeninski poti. Ali kaj pa eden od teh podlih magnetnih sledilcev, ki so jih agenti DEA v Breaking Bad prilepili na avtomobile slabih fantov? Oboje je povsem izvedljivo in verjetno bi bilo zabavno graditi, vendar vas spodbujam, da razmišljate bolj obsežno, poleg stvari, ki jih že lahko kupite na Amazonu. Zunaj je velik svet. Potujte čim dlje in širše.

Priporočena: