Satura rādītājs:

Ceļa atrašana, izmantojot GPS: 9 soļi
Ceļa atrašana, izmantojot GPS: 9 soļi

Video: Ceļa atrašana, izmantojot GPS: 9 soļi

Video: Ceļa atrašana, izmantojot GPS: 9 soļi
Video: GPSMap® 67 | Explore the Outdoors 2024, Jūlijs
Anonim
Ceļa atrašana, izmantojot GPS
Ceļa atrašana, izmantojot GPS

Ātrs vingrinājums GPS datu izpratnei un piemērošanai

  • Nepieciešamais laiks: 2 stundas
  • Izmaksas: $ 75 - $ 150

Ražotājiem ir kļuvis diezgan lēti iekļaut augstas kvalitātes ģeotelpiskos datus elektronikas projektos. Pēdējos gados GPS (globālās pozicionēšanas sistēmas) uztvērēju moduļi ir kļuvuši daudz daudzveidīgāki, jaudīgāki un viegli integrējami ar tādām izstrādes plāksnēm kā Arduino, PIC, Teensy un Raspberry Pi. Ja domājat veidot GPS, esat izvēlējies piemērotu laiku, lai sāktu darbu.

1. darbība. Kā tas darbojas

GPS modulis ir niecīgs radio uztvērējs, kas apstrādā signālus, ko satelītu parks pārraida zināmās frekvencēs. Šie satelīti griežas ap Zemi aptuveni apļveida orbītā, pārraidot ārkārtīgi precīzus atrašanās vietas un pulksteņa datus uz zemi. Ja piezemētais uztvērējs var pietiekami “redzēt” šos satelītus, tas var tos izmantot, lai aprēķinātu savu atrašanās vietu un augstumu.

Kad pienāk GPS ziņa, uztvērējs vispirms pārbauda apraides laika zīmogu, lai redzētu, kad tas tika nosūtīts. Tā kā radioviļņu ātrums telpā ir zināma konstante (c), uztvērējs var salīdzināt apraides un uztveršanas laikus, lai noteiktu signāla nobraukto attālumu. Kad tā ir noteikusi savu attālumu no četriem vai vairākiem zināmiem satelītiem, tās atrašanās vietas aprēķināšana ir diezgan vienkārša 3D trīsstūrveida problēma. Taču, lai to izdarītu ātri un precīzi, uztvērējam jāspēj veikli saspiest ciparus no līdz pat 20 datu plūsmām vienlaikus. Tā kā GPS sistēmas publicētais mērķis ir būt izmantojamam visur uz Zemes, sistēmai ir jānodrošina, ka vismaz četri satelīti - vēlams vairāk - ir redzami vienmēr no katra zemeslodes punkta. Pašlaik ir 32 GPS pavadoņi, kas veic skrupulozi horeogrāfisku deju 20 000 kilometru augstā retā mākonī.

2. darbība. Fanu fakts

GPS nevarētu darboties bez Einšteina relativitātes teorijas, jo ir jākompensē par 38 mikrosekundēm, ko orbītā esošie atomu pulksteņi iegūst katru dienu no laika paplašināšanās Zemes gravitācijas laukā.

3. darbība. Darba sākšana

Darba sākšana
Darba sākšana

Lai kāds būtu jūsu projekts, GPS ir vienkārši integrējams. Lielākā daļa uztvērēja moduļu sazinās ar vienkāršu seriālo protokolu, tādēļ, ja kontroliera panelī varat atrast rezerves seriālo portu, fiziskā savienojuma izveidei ir nepieciešami tikai daži vadi. Un pat ja nē, lielākā daļa kontrolieru atbalsta emulētu “programmatūras” sērijas režīmu, ko varat izmantot, lai izveidotu savienojumu ar patvaļīgām tapām.

Iesācējiem laba izvēle ir Adafruit Ultimate GPS Breakout modulis. Tirgū ir daudz konkurējošu produktu, taču Ultimate ir labs izpildītājs par saprātīgu cenu ar lieliem caurumiem, kurus ir viegli lodēt vai savienot ar maizes dēli.

Pirmkārt, pievienojiet zemi un strāvu. Arduino valodā tas nozīmē savienot vienu no mikrokontrollera GND tapām ar moduļa GND un +5V tapu - moduļa VIN. Lai pārvaldītu datu pārsūtīšanu, jums arī jāpievieno moduļa TX un RX tapas Arduino. Šim nolūkam es patvaļīgi izvēlos Arduino tapas 2 (TX) un 3 (RX), lai gan 0 un 1 tapas ir īpaši paredzētas izmantošanai kā “aparatūras seriālais ports” vai UART. Kāpēc? Tā kā es nevēlos izšķērdēt vienīgo UART, kas ir šiem zemākās klases AVR procesoriem. Arduino UART ir cieši savienots ar iebūvēto USB savienotāju, un man patīk to savienot ar datoru atkļūdošanai.

4. solis: pirksts datu plūsmā

Pirksts datu plūsmā
Pirksts datu plūsmā

Tiklīdz izmantojat strāvu, GPS modulis sāk sūtīt teksta datu gabalus savā TX līnijā. Iespējams, tas vēl neredz vienu satelītu, vēl jo vairāk - tam ir “labojums”, bet datu jaucējkrāns ieslēdzas uzreiz, un ir interesanti redzēt, kas iznāks. Mūsu pirmā vienkāršā skice (zemāk) neko nedara, bet parāda šos neapstrādātos datus.

#iekļaut #definēt RXPin 2

#define TXPin 3#definēt GPSBaud 4800

#define ConsoleBaud 115200

// Sērijas savienojums ar GPS ierīciSoftwareSerial ss (RXPin, TXPin);

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("GPS 1. piemērs");

Serial.println ("Neapstrādātu NMEA datu parādīšana, izmantojot GPS moduli.");

Serial.println ("Mikal Hart"); Sērijas.println ();

}

tukša cilpa ()

{if (ss.available ()> 0) // Katrai rakstzīmei ierodoties…

Serial.write (ss.read ()); //… rakstiet to konsolē

}

PIEZĪME. Skice uztveršanas tapu (RXPin) definē kā 2, lai gan mēs jau iepriekš teicām, ka pārraides (TX) tapa ir savienota ar tapu 2. Tas ir bieži sastopams neskaidrību avots. RXPin ir uztveršanas tapa (RX) no Arduino viedokļa. Protams, tam jābūt savienotam ar moduļa pārraides (TX) tapu un otrādi.

Augšupielādējiet šo skici un atveriet sērijas monitoru ar 115, 200 bodu. Ja viss darbojas, jums vajadzētu redzēt blīvu, bezgalīgu ar komatiem atdalītu teksta virkņu plūsmu. Katrs no tiem izskatīsies kā otrais attēls rindkopas sākumā.

Šīs atšķirīgās virknes ir pazīstamas kā NMEA teikumi, tā sauktie, jo formātu izgudroja Nacionālā jūras elektronikas asociācija. NMEA definē vairākus šos teikumus navigācijas datiem, sākot no būtiskā (atrašanās vieta un laiks) līdz ezotērikai (satelīta signāla un trokšņa attiecība, magnētiskā dispersija utt.). Ražotāji nav vienisprātis par to, kādus teikumu veidus izmanto viņu uztvērēji, taču GPRMC ir būtiska. Kad jūsu modulis tiks labots, jums vajadzētu redzēt diezgan daudz šo GPRMC teikumu.

5. solis: sevis atrašana

Nav mazsvarīgi pārveidot neapstrādātu moduļa izvadi informācijā, ko jūsu programma faktiski var izmantot. Par laimi, ir pieejamas dažas lieliskas bibliotēkas, lai to paveiktu jūsu vietā. Limora Frīda populārā Adafruit GPS bibliotēka ir ērta izvēle, ja izmantojat viņu galīgo izlaušanos. Tas ir uzrakstīts, lai iespējotu Ultimate unikālās funkcijas (piemēram, iekšējo datu reģistrēšanu), un pievieno dažus aizkustinošus zvanus un svilpes. Mana mīļākā parsēšanas bibliotēka - un šeit es, protams, esmu pilnīgi objektīva - ir tā, ko es uzrakstīju ar nosaukumu TinyGPS ++. Es to izstrādāju tā, lai tas būtu visaptverošs, spēcīgs, kodolīgs un viegli lietojams. Apskatīsim to.

6. darbība. Kodēšana, izmantojot TinyGPS ++

No programmētāja viedokļa TinyGPS ++ lietošana ir ļoti vienkārša:

1) Izveidojiet gps objektu.

2) Maršrutējiet katru rakstzīmi, kas nāk no moduļa uz objektu, izmantojot gps.encode ().

3) Ja jums jāzina sava atrašanās vieta vai augstums, laiks vai datums, vienkārši vaicājiet GPS objektam.

#iekļaut #iekļaut

#definējiet RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Sērijas savienojums ar GPS ierīciSoftwareSerial ss (RXPin, TXPin);

// TinyGPS ++ objekts

TinyGPSPlus GPS;

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("GPS piemērs 2");

Serial.println ("Vienkāršs izsekotājs, izmantojot TinyGPS ++.");

Serial.println ("Mikal Hart");

Sērijas.println ();

}

void loop () {

// Ja no GPS ir atnākušas kādas rakstzīmes, /

/ nosūtīt tos uz objektu TinyGPS ++

kamēr (ss. pieejams ()> 0)

gps.encode (ss.read ());

// Parādīsim jauno atrašanās vietu un augstumu

// ikreiz, kad kāds no tiem ir atjaunināts

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

{

Serial.print ("Atrašanās vieta:");

Sērijas nospiedums (gps.location.lat (), 6);

Serial.print (",");

Sērijas nospiedums (gps.location.lng (), 6);

Serial.print ("Augstums:");

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

}

}

Mūsu otrā lietojumprogramma nepārtraukti parāda uztvērēja atrašanās vietu un augstumu, izmantojot TinyGPS ++, lai palīdzētu analizēt. Reālā ierīcē jūs varat reģistrēt šos datus SD kartē vai parādīt tos LCD. Paņemiet bibliotēku un ieskicējiet FindingYourself.ino (iepriekš). Instalējiet bibliotēku, kā parasti, mapē Arduino bibliotēkas. Augšupielādējiet skici savā Arduino un atveriet sērijas monitoru ar 115, 200 bodu. Jums vajadzētu redzēt, kā jūsu atrašanās vieta un augstums tiek atjaunināts reālā laikā. Lai redzētu, kur tieši atrodaties, ielīmējiet dažas no iegūtajām platuma/garuma koordinātām pakalpojumā Google Maps. Tagad pievienojiet savu klēpjdatoru un dodieties pastaigā vai braucienā. (Bet atcerieties, ka jātur acis uz ceļa!)

7. darbība: "CETURTĀ DIMENSIJA"

lai gan mēs saistām GPS ar atrašanās vietu kosmosā, neaizmirstiet, ka šie satelīti pārraida arī laika un datu zīmogus. Vidējais GPS pulksteņa precizitāte ir viena desmitmiljonā sekundes daļa, un teorētiskā robeža ir vēl lielāka. Pat ja jūsu projekts ir vajadzīgs tikai laika uzskaitei, GPS modulis joprojām var būt lētākais un vienkāršākais risinājums.

Lai FindingYourself.ino pārvērstu par īpaši precīzu pulksteni, vienkārši mainiet pēdējās rindiņas šādi:

if (gps.time.isUpdated ()) {

char buf [80];

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

}

8. solis: atrodiet savu ceļu

Atrodot savu ceļu
Atrodot savu ceļu

Mūsu trešais un pēdējais pieteikums ir personiska izaicinājuma rezultāts - uzrakstīt lasāmu TinyGPS ++ skici mazāk nekā 100 koda rindās, kas novirzītu lietotāju uz galamērķi, izmantojot vienkāršas teksta instrukcijas, piemēram, “turēt taisni” vai “pagriezties pa kreisi”.

#iekļaut #iekļaut

#definējiet RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Sērijas savienojums ar GPS ierīciSoftwareSerial ss (RXPin, TXPin);

// TinyGPS ++ objekts TinyGPSPlus gps;

neparakstīts garš lastUpdateTime = 0;

#definēt EIFFEL_LAT 48.85823#definēt EIFFEL_LNG 2.29438

/* Šis piemērs parāda pamata ietvaru tam, kā jūs varētu izmantot kursu un attālumu, lai vadītu personu (vai bezpilota lidaparātu) līdz galamērķim. Šis galamērķis ir Eifeļa tornis. Mainiet to pēc nepieciešamības

Vienkāršākais veids, kā iegūt lata/garās koordinātas, ir ar peles labo pogu noklikšķināt uz galamērķa pakalpojumā Google Maps (maps.google.com) un izvēlēties “Kas šeit ir?”. Tādējādi meklēšanas lodziņā tiek ievietotas precīzas vērtības

*/

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("GPS 3. piemērs");

Serial.println ("Ne tik visaptveroša vadības sistēma");

Serial.println ("Mikal Hart");

Sērijas.println ();

}

void loop () {

// Ja no GPS ir atnākušas kādas rakstzīmes, // nosūtiet tās uz objektu TinyGPS ++, kamēr (ss.available ()> 0) gps.encode (ss.read ());

// Ik pēc 5 sekundēm veiciet atjauninājumu

ja (milis () - lastUpdateTime> = 5000)

{

lastUpdateTime = milis ();

Sērijas.println ();

// Nosakiet mūsu pašreizējo statusu

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:: kardināls (courseToDestination);

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

// atkļūdot Serial.print ("DEBUG: Course2Dest:");

Serial.print (courseToDestination);

Serial.print ("CurCourse:");

Sērijas nospiedums (gps.course.deg ());

Serial.print ("Dir2Dest:");

Serial.print (directionToDestination);

Serial.print ("RelCourse:");

Serial.print (courseChangeNeeded);

Serial.print ("CurSpd:");

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

// 20 metru attālumā no galamērķa? Bija šeit

ja (distanceToDestination <= 20,0)

{Serial.println ("APSVEICU: Jūs esat ieradies!");

izeja (1);

}

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

Serial.println ("metri līdz galam.");

Serial.print ("INSTRUCTION:");

// Stāv uz vietas? Vienkārši norādiet, kurā virzienā iet

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

{

Serial.print ("Galva");

Serial.print (directionToDestination);

Sērijas.println (".");

atgriešanās;

}

if (courseChangeNeeded> = 345 || courseChangeNeeded <15) Serial.println ("Turpini taisni uz priekšu!");

citādi, ja (courseChangeNeeded> = 315 && courseChangeNeeded <345)

Serial.println ("Veers nedaudz pa kreisi.");

citādi, ja (courseChangeNeeded> = 15 && courseChangeNeeded <45)

Serial.println ("Veers nedaudz pa labi.");

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

Serial.println ("Pagriezieties pa kreisi.");

citādi, ja (courseChangeNeeded> = 45 && courseChangeNeeded <105)

Serial.println ("Pagriezieties pa labi.");

citādi

Serial.println ("Pagriezieties pilnīgi otrādi.");

}

}

Ik pēc 5 sekundēm kods fiksē lietotāja atrašanās vietu un kursu (braukšanas virzienu) un aprēķina virzienu (virzienu uz galamērķi), izmantojot TinyGPS ++ courseTo () metodi. Divu vektoru salīdzināšana rada ieteikumu turpināt taisni vai pagriezties, kā parādīts zemāk.

Kopējiet skici FindingYourWay.ino (iepriekš) un ielīmējiet to Arduino IDE. Iestatiet galamērķi 1 km vai 2 km attālumā, augšupielādējiet skici savā Arduino, palaidiet to savā klēpjdatorā un pārbaudiet, vai tā jūs tur vedīs. Bet vēl svarīgāk ir izpētīt kodu un saprast, kā tas darbojas.

9. solis: iet tālāk

GPS radošais potenciāls ir milzīgs. Viena no visvairāk apmierinošajām lietām, ko jebkad esmu izveidojis, bija mīklu kastīte ar GPS, kas atveras tikai vienā iepriekš ieprogrammētā vietā. Ja jūsu upuris vēlas, lai dārgums tiek ieslēgts iekšā, viņai ir jāizdomā, kur atrodas šī slepenā atrašanās vieta, un fiziski jānogādā kastīte. Populāra pirmā projekta ideja ir sava veida mežizstrādes ierīce, kas reģistrē, piemēram, pārgājēja, kas iet pa Trans-Pennine Trail, atrašanās vietu un augstumu minūtē. Vai kā būtu ar vienu no šiem viltīgajiem magnētiskajiem izsekotājiem, ko DEA aģenti Breaking Bad uzlīmē uz slikto puišu automašīnām? Abi ir pilnīgi realizējami, un to būvēšana, iespējams, būtu jautra, taču es aicinu jūs domāt plašāk, ne tikai par to, ko jau varat iegādāties vietnē Amazon. Tā ir liela pasaule. Klīst, cik vien iespējams.

Ieteicams: