INHOUDSOPGAWE:

Vind u pad met GPS: 9 stappe
Vind u pad met GPS: 9 stappe

Video: Vind u pad met GPS: 9 stappe

Video: Vind u pad met GPS: 9 stappe
Video: Йога для начинающих дома с Алиной Anandee #2. Здоровое гибкое тело за 40 минут. Универсальная йога. 2024, Julie
Anonim
Vind u pad met GPS
Vind u pad met GPS

'N Vinnige oefening om GPS -data te verstaan en toe te pas

  • Tyd benodig: 2 uur
  • Koste: $ 75 - $ 150

Vir vervaardigers is dit redelik goedkoop om geospatiale data van hoë gehalte in elektroniese projekte op te neem. En in die afgelope paar jaar het GPS -ontvanger -modules (Global Positioning System) baie meer divers, kragtig en maklik om te integreer met ontwikkelingsborde soos Arduino, PIC, Teensy en Raspberry Pi gegroei. As u daaraan gedink het om met GPS te bou, het u 'n goeie tyd gekies om aan die gang te kom.

Stap 1: Hoe dit werk

'N GPS -module is 'n klein radio -ontvanger wat seine verwerk wat op bekende frekwensies deur 'n vloot satelliete uitgesaai word. Hierdie satelliete wentel om die aarde in ongeveer sirkelvormige wentelbane en stuur uiters presiese posisie- en klokdata na die grond daaronder. As die aarde -ontvanger genoeg van hierdie satelliete kan "sien", kan dit dit gebruik om sy eie ligging en hoogte te bereken.

As 'n GPS -boodskap kom, inspekteer die ontvanger eers die uitsaaitydstempel om te sien wanneer dit gestuur is. Omdat die snelheid van 'n radiogolf in die ruimte 'n bekende konstante (c) is, kan die ontvanger uitsending- en ontvangstye vergelyk om die afstand wat die sein afgelê het, te bepaal. Sodra dit sy afstand van vier of meer bekende satelliete bepaal het, is die berekening van sy eie posisie 'n redelik eenvoudige probleem van 3D -triangulasie. Maar om dit vinnig en akkuraat te doen, moet die ontvanger in staat wees om getalle van tot 20 datastrome tegelyk te krimp. Aangesien die GPS -stelsel 'n gepubliseerde doelwit het om oral op aarde bruikbaar te wees, moet die stelsel verseker dat ten minste vier satelliete - verkieslik meer - is te alle tye sigbaar vanaf elke punt op die aarde. Daar is tans 32 GPS -satelliete wat 'n noukeurig gechoreografeerde dans uitvoer in 'n yl wolk van 20 000 kilometer hoog.

Stap 2: Aanhangerfeit

GPS kan nie werk sonder Einstein se relatiwiteitsteorie nie, want daar moet vergoed word vir die 38 mikrosekondes wat die atoomklokke elke dag kry weens tydsverruiming in die aarde se gravitasieveld.

Stap 3: Aan die gang

Aan die gang kom
Aan die gang kom

Wat ook al u projek, GPS is eenvoudig om te integreer. Die meeste ontvangermodules kommunikeer met 'n eenvoudige seriële protokol, dus as u 'n ekstra seriële poort op u beheerbord kan vind, moet dit net 'n handjievol drade neem om die fisiese verbinding te maak. En selfs al ondersteun dit nie, die meeste beheerders ondersteun 'n nagemaakte 'sagteware' seriële modus wat u kan gebruik om aan willekeurige penne te koppel.

Vir beginners is Adafruit se Ultimate GPS Breakout -module 'n goeie keuse. Daar is baie mededingende produkte op die mark, maar die Ultimate is 'n stewige kunstenaar teen 'n redelike prys, met groot deurgate wat maklik is om te soldeer of aan 'n broodbord te koppel.

Koppel eers grond en krag. In Arduino -terme beteken dit dat een van die GND -penne van die mikrobeheerder aan die GND van die module gekoppel word, en die +5V -pen aan die module se VIN. Om data -oordrag te bestuur, moet u ook die TX- en RX -penne van die module aan die Arduino koppel. Ek gaan willekeurig Arduino -penne 2 (TX) en 3 (RX) kies vir hierdie doel, alhoewel penne 0 en 1 spesifiek ontwerp is vir gebruik as 'n "hardeware -seriële poort" of UART. Waarom? Omdat ek nie die enigste UART wat hierdie lae-end AVR-verwerkers het, wil mors nie. Arduino se UART is met die USB-aansluiting aan boord verbind, en ek hou daarvan om dit aan my rekenaar gekoppel te hou vir ontfouting.

Stap 4: 'n Toe in die Datastream

'N Toe in die Datastream
'N Toe in die Datastream

Die oomblik dat u krag toepas, begin 'n GPS -module stukke teksdata op sy TX -lyn stuur. Dit sien moontlik nog nie 'n enkele satelliet nie, nog minder 'n 'oplossing', maar die datakraan kom dadelik aan, en dit is interessant om te sien wat uitkom. Ons eerste eenvoudige skets (hieronder) het niks anders as om hierdie onverwerkte data te vertoon nie.

#sluit #definieer RXPin 2 in

#definieer TXPin 3#definieer GPSBaud 4800

#definieer ConsoleBaud 115200

// Die reeksverbinding met die GPS -toestel SoftwareSerial ss (RXPin, TXPin);

ongeldige opstelling () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("GPS -voorbeeld 1");

Serial.println ("Wys die rou NMEA -data wat deur die GPS -module gestuur word.");

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

}

leemte lus ()

{if (ss.available ()> 0) // Soos elke karakter kom …

Serial.write (ss.read ()); // … skryf dit aan die konsole

}

LET WEL: die skets definieer die ontvangspennetjie (RXPin) as 2, alhoewel ons vroeër gesê het dat die stuurpen (TX) met pen 2 gekoppel sou word. Dit is 'n algemene bron van verwarring. RXPin is die ontvangspeld (RX) vanuit die oogpunt van die Arduino. Uiteraard moet dit gekoppel wees aan die module se stuurpen (TX), en omgekeerd.

Laai hierdie skets op en maak Serial Monitor oop op 115, 200 baud. As alles werk, moet u 'n digte, eindelose stroom met komma-geskeide teksstringe sien. Elkeen sal iets soos die tweede prent aan die begin van die paragraaf lyk.

Hierdie kenmerkende snare staan bekend as NMEA -sinne, so genoem omdat die formaat uitgevind is deur die National Maritime Electronics Association. NMEA definieer 'n aantal van hierdie sinne vir navigasie data, wat wissel van die essensiële (ligging en tyd) tot die esoteriese (satellietsein-ruisverhouding, magnetiese variansie, ens.). Vervaardigers is nie in ooreenstemming oor watter sinsoorte hulle ontvangers gebruik nie, maar GPRMC is noodsaaklik. Sodra u module herstel is, behoort u 'n redelike aantal van hierdie GPRMC -sinne te sien.

Stap 5: vind jouself

Dit is nie triviaal om die uitset van die rou module te omskep in inligting wat u program eintlik kan gebruik nie. Gelukkig is daar al 'n paar wonderlike biblioteke beskikbaar om dit vir u te doen. Limor Fried se gewilde Adafruit GPS -biblioteek is 'n maklike keuse as u hul Ultimate breakout gebruik. Dit is geskryf om funksies wat uniek is aan die Ultimate (soos interne data -aanmelding) moontlik te maak en voeg 'n paar snaakse klokke en fluitjies van sy eie by. My gunsteling ontledingsbiblioteek - en hier is ek natuurlik heeltemal onbevooroordeeld - is die een wat ek geskryf het, TinyGPS ++. Ek het dit ontwerp om omvattend, kragtig, bondig en maklik te gebruik. Kom ons vat 'n draai.

Stap 6: Kodering met TinyGPS ++

Vanuit die oogpunt van die programmeerder is die gebruik van TinyGPS ++ baie eenvoudig:

1) Skep 'n voorwerp gps.

2) Lei elke karakter wat uit die module kom na die voorwerp met behulp van gps.encode ().

3) As u u posisie of hoogte of tyd of datum moet weet, moet u eenvoudig die GPS -voorwerp navraag doen.

#include #include

#definieer RXPin 2

#definieer TXPin 3

#definieer GPSBaud 4800

#definieer ConsoleBaud 115200

// Die reeksverbinding met die GPS -toestel SoftwareSerial ss (RXPin, TXPin);

// Die TinyGPS ++ - voorwerp

TinyGPSPlus gps;

ongeldige opstelling () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("GPS -voorbeeld 2");

Serial.println ("'n Eenvoudige spoorsnyer wat TinyGPS ++ gebruik.");

Serial.println ("deur Mikal Hart");

Serial.println ();

}

leemte -lus () {

// As daar karakters van die GPS af kom, /

/ stuur dit na die TinyGPS ++ - voorwerp

terwyl (ss.available ()> 0)

gps.encode (ss.read ());

// Kom ons vertoon die nuwe ligging en hoogte

// wanneer een van hulle opgedateer is

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

{

Serial.print ("Location:");

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

Serial.print (",");

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

Serial.print ("Hoogte:");

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

}

}

Ons tweede toepassing vertoon voortdurend die ligging en hoogte van die ontvanger, met behulp van TinyGPS ++ om te help met ontleding. Op 'n regte toestel kan u hierdie data op 'n SD -kaart aanmeld of op 'n LCD vertoon. Gryp die biblioteek en skets FindingYourself.ino (bo). Installeer die biblioteek, soos gewoonlik, in die gids Arduino biblioteke. Laai die skets op na u Arduino en maak Serial Monitor oop op 115, 200 baud. U moet u ligging en hoogte in real -time opdateer. Om presies te sien waar u staan, plak 'n paar van die resulterende breedtegraad/lengte -koördinate in Google Maps. Sluit nou u skootrekenaar aan en gaan stap of ry. (Maar onthou om u oë op die pad te hou!)

Stap 7: Die "VIERDE DIMENSIE"

Alhoewel ons GPS met ligging in die ruimte assosieer, moenie vergeet dat die satelliete ook tyd- en datastempels stuur nie. Die gemiddelde GPS-klok is akkuraat tot 'n tienmiljoenste van 'n sekonde, en die teoretiese limiet is selfs hoër. Selfs as u slegs u projek nodig het om tyd by te hou, is 'n GPS -module moontlik steeds die goedkoopste en maklikste oplossing.

Om FindingYourself.ino in 'n super-akkurate klok te verander, verander net die laaste paar reëls soos volg:

as (gps.time.isUpdated ()) {

char buf [80];

sprintf (buf, "Die tyd is%02d:%02d:%02d", gps.time.hour (), gps.time.minute (), gps.time.second ()); Serial.println (buf);

}

Stap 8: Vind jou weg

Jou weg vind
Jou weg vind

Ons derde en laaste aansoek is die gevolg van 'n persoonlike uitdaging om 'n leesbare TinyGPS ++ skets in minder as 100 reëls kode te skryf, wat 'n gebruiker na 'n bestemming kan lei deur eenvoudige teksinstruksies soos 'hou reguit' of 'links weg'.

#include #include

#definieer RXPin 2

#definieer TXPin 3

#definieer GPSBaud 4800

#definieer ConsoleBaud 115200

// Die reeksverbinding met die GPS -toestel SoftwareSerial ss (RXPin, TXPin);

// Die TinyGPS ++ voorwerp TinyGPSPlus gps;

ongetekende lang lastUpdateTime = 0;

#definieer EIFFEL_LAT 48.85823#definieer EIFFEL_LNG 2.29438

/* Hierdie voorbeeld toon 'n basiese raamwerk vir hoe u koers en afstand kan gebruik om 'n persoon (of 'n hommeltuig) na 'n bestemming te lei. Hierdie bestemming is die Eiffeltoring. Verander dit soos benodig

Die maklikste manier om die lat/lang koördinaat te kry, is om met die rechtermuisknop op die bestemming in Google Maps (maps.google.com) te klik en "Wat is hier?" Te kies. Dit plaas die presiese waardes in die soekkassie

*/

ongeldige opstelling () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("GPS -voorbeeld 3");

Serial.println ("'n nie-so omvattende leidingstelsel");

Serial.println ("deur Mikal Hart");

Serial.println ();

}

leemte -lus () {

// As daar karakters van die GPS af kom, // stuur dit na die TinyGPS ++ - voorwerp terwyl (ss.available ()> 0) gps.encode (ss.read ());

// Maak elke 5 sekondes 'n opdatering

if (millis () - lastUpdateTime> = 5000)

{

lastUpdateTime = millis ();

Serial.println ();

// Stel ons huidige status vas

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;

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

// Binne 20 meter van bestemming? Was hier

as (distanceToDestination <= 20.0)

{Serial.println ("BAIE GELUK: U het gekom!");

uitgang (1);

}

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

Serial.println ("meters te gaan.");

Serial.print ("INSTRUKSIE:");

// Stilstaan? Dui net aan watter kant toe

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

{

Serial.print ("kop");

Serial.print (directionToDestination);

Serial.println (".");

terugkeer;

}

if (courseChangeNeeded> = 345 || courseChangeNeeded <15) Serial.println ("Hou reguit vorentoe!");

anders as (courseChangeNeeded> = 315 && courseChangeNeeded <345)

Serial.println ("Veer effens na links.");

anders as (courseChangeNeeded> = 15 && courseChangeNeeded <45)

Serial.println ("Veer effens na regs.");

anders as (courseChangeNeeded> = 255 && courseChangeNeeded <315)

Serial.println ("Draai na links.");

anders as (courseChangeNeeded> = 45 && courseChangeNeeded <105)

Serial.println ("Draai na regs.");

anders

Serial.println ("Draai heeltemal om.");

}

}

Elke 5 sekondes vang die kode die gebruiker se ligging en koers (rigting) en bereken die peiling (rigting na die bestemming) met behulp van die TinyGPS ++ courseTo () -metode. Die vergelyking van die twee vektore gee 'n voorstel om reguit of draai te hou, soos hieronder getoon.

Kopieer die skets FindingYourWay.ino (hierbo) en plak dit in die Arduino IDE. Stel 'n bestemming op 1 km of 2 km weg, laai die skets op na u Arduino, voer dit op u skootrekenaar en kyk of dit u daarheen kan lei. Maar nog belangriker, bestudeer die kode en verstaan hoe dit werk.

Stap 9: Gaan verder

Die kreatiewe potensiaal van GPS is groot. Een van die mees bevredigende dinge wat ek ooit gemaak het, was 'n GPS-raaiselkas wat slegs op een vooraf geprogrammeerde plek oopmaak. As u slagoffer die skat binne wil sluit, moet sy uitvind waar die geheime plek is en die boks fisies daarheen bring. 'N Gewilde eerste projekidee is 'n soort aanmeldapparaat wat die posisie van minuut vir minuut en hoogte van byvoorbeeld 'n stapper wat die Trans-Pennine-roete loop, aanteken. Of wat van een van die skelm magnetiese spoorsnyers wat die DEA -agente in Breaking Bad op die karre se motors plak? Albei is heeltemal haalbaar, en dit sal waarskynlik lekker wees om dit te bou, maar ek moedig u aan om meer uitgebreid na te dink as wat u reeds op Amazon kan koop. Dit is 'n groot wêreld daar buite. Loop so ver as wat jy kan.

Aanbeveel: