Turinys:

Kelio paieška naudojant GPS: 9 žingsniai
Kelio paieška naudojant GPS: 9 žingsniai

Video: Kelio paieška naudojant GPS: 9 žingsniai

Video: Kelio paieška naudojant GPS: 9 žingsniai
Video: MANE UŽPUOLĖ PIKTAS ŠUO |VLOG #3 2024, Lapkritis
Anonim
Raskite savo kelią su GPS
Raskite savo kelią su GPS

Greitas pratimas suprasti ir pritaikyti GPS duomenis

  • Reikalingas laikas: 2 valandos
  • Kaina: 75–150 USD

Gamintojams tapo gana pigu į elektronikos projektus įtraukti aukštos kokybės geoerdvinius duomenis. Ir per pastaruosius kelerius metus GPS (Global Positioning System) imtuvų moduliai tapo daug įvairesni, galingesni ir lengvai integruojami su tokiomis kūrimo plokštėmis kaip „Arduino“, PIC, „Teensy“ir „Raspberry Pi“. Jei galvojate kurti GPS, pasirinkote tinkamą laiką pradėti.

1 žingsnis: kaip tai veikia

GPS modulis yra mažas radijo imtuvas, kuris apdoroja signalus, kuriuos žinomu dažniu transliuoja palydovų parkas. Šie palydovai sukasi aplink Žemę maždaug apskritomis orbitomis, perduodami itin tikslius padėties ir laikrodžio duomenis į žemę. Jei įžemintas imtuvas gali „matyti“pakankamai šių palydovų, jis gali juos panaudoti savo vietai ir aukščiui apskaičiuoti.

Kai gaunamas GPS pranešimas, imtuvas pirmiausia patikrina transliacijos laiko žymę, kad sužinotų, kada ji buvo išsiųsta. Kadangi radijo bangos greitis erdvėje yra žinoma konstanta (c), imtuvas gali palyginti transliacijos ir priėmimo laiką, kad nustatytų signalo nuvažiuotą atstumą. Nustačius atstumą nuo keturių ar daugiau žinomų palydovų, savo padėties apskaičiavimas yra gana paprasta 3D trikampio problema. Tačiau norėdamas tai padaryti greitai ir tiksliai, imtuvas turi sugebėti mikliai sutraiškyti skaičius iki 20 duomenų srautų vienu metu. Kadangi GPS sistemos paskelbtas tikslas yra būti naudojamas visur Žemėje, sistema turi užtikrinti, kad bent keturi palydovai - pageidautina daugiau - matomi bet kuriuo metu iš bet kurio pasaulio taško. Šiuo metu yra 32 GPS palydovai, atliekantys kruopščiai choreografuotą šokį retame 20 000 kilometrų aukščio debesyje.

2 žingsnis: gerbėjų faktas

GPS negalėtų veikti be Einšteino reliatyvumo teorijos, nes reikia kompensuoti už 38 mikrosekundes, kurias orbitiniai atominiai laikrodžiai įgyja kiekvieną dieną dėl laiko išsiplėtimo Žemės gravitaciniame lauke.

3 žingsnis: Darbo pradžia

Darbo pradžia
Darbo pradžia

Kad ir koks būtų jūsų projektas, GPS integruoti paprasta. Dauguma imtuvų modulių palaiko paprastą nuoseklųjį protokolą, taigi, jei galite rasti atsarginį nuoseklųjį prievadą savo valdiklio plokštėje, norint užmegzti fizinį ryšį, prireiks vos kelių laidų. Ir net jei ne, dauguma valdiklių palaiko emuliuotą „programinės įrangos“nuoseklųjį režimą, kurį galite naudoti norėdami prisijungti prie savavališkų kaiščių.

Pradedantiesiems „Adafruit“„Ultimate GPS Breakout“modulis yra geras pasirinkimas. Rinkoje yra daug konkuruojančių produktų, tačiau „Ultimate“yra tvirtas atlikėjas už priimtiną kainą, su didelėmis skylėmis, kurias lengva lituoti arba prijungti prie lentos.

Pirmiausia prijunkite žemę ir maitinimą. Arduino terminais tai reiškia, kad vieną iš mikrovaldiklio GND kaiščių reikia prijungti prie modulio GND, o +5 V kaištį - prie modulio VIN. Norėdami valdyti duomenų perdavimą, taip pat turite prijungti modulio TX ir RX kaiščius prie „Arduino“. Šiuo tikslu savavališkai pasirinksiu „Arduino“kaiščius 2 (TX) ir 3 (RX), nors 0 ir 1 kaiščiai yra specialiai sukurti naudoti kaip „aparatūros nuoseklusis prievadas“arba UART. Kodėl? Nes nenoriu švaistyti vienintelio UART, kurį turi šie žemos klasės AVR procesoriai. „Arduino“UART yra prijungtas prie įmontuotos USB jungties, ir man patinka jį prijungti prie kompiuterio, kad būtų galima atlikti derinimą.

4 žingsnis: pirštas duomenų sraute

Pirštas duomenų sraute
Pirštas duomenų sraute

Kai tik įjungiate maitinimą, GPS modulis pradeda siųsti teksto duomenų gabalus savo TX linijoje. Gali būti, kad jis dar nemato vieno palydovo, o tuo labiau turi „pataisymą“, tačiau duomenų maišytuvas įsijungia iš karto ir įdomu pamatyti, kas išeina. Mūsų pirmasis paprastas eskizas (žemiau) nieko nedaro, tik parodo šiuos neapdorotus duomenis.

#įtraukti #apibrėžti RXPin 2

#define TXPin 3#apibrėžti GPSBaud 4800

#define ConsoleBaud 115200

// Serijinis ryšys su GPS įrenginiuSoftwareSerial ss (RXPin, TXPin);

void setup () {

Serial.begin („ConsoleBaud“);

ss.begin (GPSBaud);

Serial.println ("GPS pavyzdys 1");

Serial.println ("Rodyti neapdorotus NMEA duomenis, perduodamus GPS moduliu.");

Serial.println („Mikal Hart“); Serial.println ();

}

tuštumos kilpa ()

{if (ss.available ()> 0) // Kiekvienam simboliui atėjus …

Serial.write (ss.read ()); //… parašykite jį konsolėje

}

PASTABA: eskizas priėmimo kaištį (RXPin) apibrėžia kaip 2, nors anksčiau sakėme, kad perdavimo (TX) kaištis bus prijungtas prie 2 kaiščio. Tai yra bendras painiavos šaltinis. „Arduino“požiūriu „RXPin“yra priėmimo kaištis (RX). Natūralu, kad jis turi būti prijungtas prie modulio perdavimo (TX) kaiščio ir atvirkščiai.

Įkelkite šį eskizą ir atidarykite „Serial Monitor“115, 200 baudų greičiu. Jei viskas veikia, turėtumėte pamatyti tankų, nesibaigiantį kableliais atskirtų teksto eilučių srautą. Kiekvienas iš jų bus panašus į antrąjį paveikslėlį pastraipos pradžioje.

Šios išskirtinės eilutės žinomos kaip NMEA sakiniai, taip vadinama todėl, kad formatą sugalvojo Nacionalinė jūrų elektronikos asociacija. NMEA apibrėžia keletą šių sakinių navigacijos duomenims, pradedant nuo esminio (vieta ir laikas) iki ezoterikos (palydovo signalo ir triukšmo santykis, magnetinė dispersija ir kt.). Gamintojai nesutaria, kokius sakinių tipus naudoja jų imtuvai, tačiau GPRMC yra būtina. Kai jūsų modulis bus pataisytas, turėtumėte pamatyti nemažai šių GPRMC sakinių.

5 žingsnis: atraskite save

Neįprasta modulio išvestį paversti informacija, kurią jūsų programa iš tikrųjų gali naudoti. Laimei, jau yra keletas puikių bibliotekų, kurios gali tai padaryti už jus. Populiarioji „Limor Fried“GPS biblioteka „Adafruit“yra patogus pasirinkimas, jei naudojate „Ultimate Breakout“. Jis parašytas taip, kad įgalintų „Ultimate“unikalias funkcijas (pvz., Vidinį duomenų registravimą), ir prideda keletą kvapų varpų ir švilpukų. Tačiau mano mėgstamiausia analizavimo biblioteka - ir čia aš, žinoma, esu visiškai nešališka - yra ta, kurią parašiau pavadinimu „TinyGPS ++“. Sukūriau jį išsamų, galingą, glaustą ir lengvai naudojamą. Paimkime tai.

6 veiksmas: kodavimas naudojant „TinyGPS ++“

Programuotojo požiūriu, „TinyGPS ++“naudojimas yra labai paprastas:

1) Sukurkite GPS objektą.

2) Maršrutuokite kiekvieną simbolį, kuris atkeliauja iš modulio į objektą, naudodami gps.encode ().

3) Kai jums reikia žinoti savo buvimo vietą, aukštį, laiką ar datą, tiesiog paklauskite GPS objekto.

#įtraukti #įtraukti

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Serijinis ryšys su GPS įrenginiuSoftwareSerial ss (RXPin, TXPin);

// „TinyGPS ++“objektas

„TinyGPSPlus GPS“;

void setup () {

Serial.begin („ConsoleBaud“);

ss.begin (GPSBaud);

Serial.println ("GPS pavyzdys 2");

Serial.println („Paprastas stebėjimo įrankis naudojant„ TinyGPS ++ “.“);

Serial.println („Mikal Hart“);

Serial.println ();

}

void loop () {

// Jei iš GPS atsirado simbolių, /

/ nusiųskite juos į „TinyGPS ++“objektą

o (ss. prieinama ()> 0)

gps.encode (ss.read ());

// Parodykime naują vietą ir aukštį

// kai bet kuris iš jų buvo atnaujintas

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

{

Serial.print ("Vieta:");

Serijinis spaudinys (gps.location.lat (), 6);

Serial.print (",");

Serijinis spaudinys (gps.location.lng (), 6);

Serial.print ("Aukščio aukštis:");

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

}

}

Mūsų antroji programa nuolat rodo imtuvo vietą ir aukštį, naudojant „TinyGPS ++“, kad būtų lengviau analizuoti. Tikrame įrenginyje šiuos duomenis galite įrašyti į SD kortelę arba rodyti LCD ekrane. Paimkite biblioteką ir eskizuokite „FindingYourself.ino“(aukščiau). Įdiekite biblioteką, kaip įprasta, „Arduino“bibliotekų aplanke. Įkelkite eskizą į „Arduino“ir atidarykite „Serial Monitor“115, 200 baudų greičiu. Turėtumėte matyti savo vietos ir aukščio atnaujinimą realiu laiku. Norėdami tiksliai pamatyti, kur stovite, įklijuokite kai kurias gautas platumos ir ilgumos koordinates į „Google“žemėlapius. Dabar prijunkite nešiojamąjį kompiuterį ir eikite pasivaikščioti ar pasivažinėti. (Tačiau nepamirškite žiūrėti į kelią!)

7 žingsnis: „KETVIRTASIS DIMENSIJA“

nors mes susiejame GPS su vieta erdvėje, nepamirškite, kad tie palydovai taip pat siunčia laiko ir datų žymes. Vidutinis GPS laikrodžio tikslumas yra dešimt milijonų sekundžių, o teorinė riba yra dar didesnė. Net jei jūsų projektas reikalingas tik norint sekti laiką, GPS modulis vis tiek gali būti pigiausias ir lengviausias sprendimas.

Norėdami „FindingYourself.ino“paversti itin tiksliu laikrodžiu, tiesiog pakeiskite paskutines kelias eilutes taip:

if (gps.time.isUpdated ()) {

char buf [80];

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

}

8 žingsnis: Raskite savo kelią

Rasti savo kelią
Rasti savo kelią

Trečioji ir paskutinė mūsų programa yra asmeninio iššūkio rezultatas - parašyti skaitomą „TinyGPS ++“eskizą, kuriame yra mažiau nei 100 kodo eilučių, ir kuris nukreiptų vartotoją į paskirties vietą, naudojant paprastas tekstines instrukcijas, pvz., „Laikykis tiesiai“arba „pasuk į kairę“.

#įtraukti #įtraukti

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Serijinis ryšys su GPS įrenginiuSoftwareSerial ss (RXPin, TXPin);

// TinyGPS ++ objektas TinyGPSPlus gps;

unsigned long lastUpdateTime = 0;

#define EIFFEL_LAT 48.85823#define EIFFEL_LNG 2.29438

/* Šiame pavyzdyje parodyta pagrindinė sistema, kaip galite naudoti kursą ir atstumą, kad nukreiptumėte žmogų (ar bepilotį orlaivį) į paskirties vietą. Šis tikslas yra Eifelio bokštas. Pakeiskite jį pagal poreikį

Lengviausias būdas gauti lato/ilgio koordinatę-dešiniuoju pelės mygtuku spustelėkite kelionės tikslą „Google“žemėlapiuose (maps.google.com) ir pasirinkite „Kas čia?“. Taip paieškos laukelyje pateikiamos tikslios vertės

*/

void setup () {

Serial.begin („ConsoleBaud“);

ss.begin (GPSBaud);

Serial.println ("3 GPS pavyzdys");

Serial.println („Nelabai išsami orientavimo sistema“);

Serial.println („Mikal Hart“);

Serial.println ();

}

void loop () {

// Jei iš GPS atėjo kokių nors simbolių, // nusiųskite juos į „TinyGPS ++“objektą, o (ss.available ()> 0) gps.encode (ss.read ());

// Kas 5 sekundes atlikite atnaujinimą

if (milis () - lastUpdateTime> = 5000)

{

lastUpdateTime = milis ();

Serial.println ();

// Nustatykite dabartinę mūsų būseną

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;

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

Serial.print (courseToDestination);

Serial.print ("CurCourse:");

Serijinis atspaudas (gps.course.deg ());

Serial.print ("Dir2Dest:");

Serial.print (directionToDestination);

Serial.print ("RelCourse:");

Serial.print (courseChangeNeeded);

Serial.print ("CurSpd:");

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

// Per 20 metrų nuo kelionės tikslo? Buvo čia

if (distanceToDestination <= 20,0)

{Serial.println ("SVEIKINAME: Jūs atvykote!");

išėjimas (1);

}

Serial.print („DISTANCE:“); Serial.print (distanceToDestination);

Serial.println („metrai iki galo“);

Serial.print ("INSTRUKCIJA:");

// Stovi vietoje? Tiesiog nurodykite, kuria kryptimi eiti

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

{

Serial.print („Galva“);

Serial.print (directionToDestination);

Serial.println (".");

grįžti;

}

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

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

Serial.println („Veeris šiek tiek į kairę“);

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

Serial.println („Pasukite šiek tiek į dešinę“);

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

Serial.println („Pasukite į kairę“.);

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

Serial.println („Pasukite į dešinę“.);

Kitas

Serial.println („Visiškai apsisukti“);

}

}

Kas 5 sekundes kodas fiksuoja vartotojo buvimo vietą ir eigą (važiavimo kryptį) ir apskaičiuoja kryptį (kryptį į tikslą), naudodamas „TinyGPS ++ courseTo“() metodą. Palyginus du vektorius, siūloma eiti tiesiai arba pasukti, kaip parodyta žemiau.

Nukopijuokite eskizą FindingYourWay.ino (aukščiau) ir įklijuokite jį į „Arduino IDE“. Nustatykite tikslą už 1 km ar 2 km, įkelkite eskizą į „Arduino“, paleiskite jį nešiojamajame kompiuteryje ir pažiūrėkite, ar jis jus ten nuves. Bet dar svarbiau - išstudijuokite kodą ir supraskite, kaip jis veikia.

9 žingsnis: Eikite toliau

GPS kūrybinis potencialas yra didžiulis. Vienas iš labiausiai patenkinamų dalykų, kuriuos aš kada nors sukūriau, buvo galvosūkių dėžutė su GPS, kuri atidaroma tik vienoje iš anksto užprogramuotoje vietoje. Jei jūsų auka nori užrakinti lobį viduje, ji turi išsiaiškinti, kur yra ta slapta vieta, ir fiziškai atnešti dėžę ten. Populiari pirmojo projekto idėja yra tam tikras registravimo įrenginys, kuris fiksuoja minutę po minutės, pavyzdžiui, žygeivio, einančio Trans-Pennine taku, padėtį ir aukštį. Arba ką daryti su vienu iš tų klastingų magnetinių sekėjų, kuriuos DEA agentai „Breaking Bad“prilimpa prie blogų vaikinų automobilių? Abu yra visiškai įmanomi ir tikriausiai būtų smagu juos kurti, tačiau raginu jus mąstyti plačiau, ne tik apie tai, ką jau galite nusipirkti „Amazon“. Ten didelis pasaulis. Keliaukite kuo toliau ir plačiau.

Rekomenduojamas: