Indholdsfortegnelse:

Find vej med GPS: 9 trin
Find vej med GPS: 9 trin

Video: Find vej med GPS: 9 trin

Video: Find vej med GPS: 9 trin
Video: Simplify your drive with DriveSmart™ 66/76/86 GPS navigators – Garmin® Retail Training 2024, November
Anonim
Find vej med GPS
Find vej med GPS

En hurtig øvelse i at forstå og anvende GPS -data

  • Påkrævet tid: 2 timer
  • Omkostninger: $ 75 - $ 150

For beslutningstagere er det blevet ret billigt at indarbejde geospatiale data af høj kvalitet i elektronikprojekter. Og i de sidste par år er GPS -modtagermoduler (Global Positioning System) vokset meget mere forskelligartede, kraftfulde og lette at integrere med udviklingstavler som Arduino, PIC, Teensy og Raspberry Pi. Hvis du har tænkt på at bygge omkring GPS, har du valgt et godt tidspunkt til at komme i gang.

Trin 1: Sådan fungerer det

Et GPS -modul er en lille radiomodtager, der behandler signaler, der udsendes på kendte frekvenser af en flåde af satellitter. Disse satellitter hvirvler rundt om jorden i groft cirkulære kredsløb og sender ekstremt præcise positions- og urdata til jorden nedenfor. Hvis den jordbundne modtager kan "se" nok af disse satellitter, kan den bruge dem til at beregne sin egen placering og højde.

Når der kommer en GPS -besked, inspicerer modtageren først sit tidsstempel for udsendelse for at se, hvornår den blev sendt. Fordi hastigheden af en radiobølge i rummet er en kendt konstant (c), kan modtageren sammenligne udsendelses- og modtagelsestider for at bestemme den afstand, signalet har tilbagelagt. Når den først har fundet sin afstand til fire eller flere kendte satellitter, er beregning af sin egen position et ret simpelt problem med 3D -triangulering. Men for at gøre dette hurtigt og præcist skal modtageren være i stand til hurtigt at knuse tal fra op til 20 datastrømme på én gang. Da GPS -systemet har et offentliggjort mål om at være brugbart overalt på Jorden, skal systemet sikre, at mindst fire satellitter - helst flere - er til enhver tid synlige fra alle punkter på kloden. Der er i øjeblikket 32 GPS -satellitter, der udfører en omhyggeligt koreograferet dans i en sparsom sky på 20.000 kilometer høj.

Trin 2: Fan Fact

GPS kunne ikke fungere uden Einsteins relativitetsteori, da der skal kompenseres for de 38 mikrosekunder, de atomiske ure får i kreds hver dag fra tidsudvidelse i Jordens tyngdefelt.

Trin 3: Kom godt i gang

Kom godt i gang
Kom godt i gang

Uanset dit projekt er GPS let at integrere. De fleste modtagermoduler kommunikerer med en ligetil seriel protokol, så hvis du kan finde en ekstra seriel port på dit controllerkort, skulle det tage kun en håndfuld ledninger for at oprette den fysiske forbindelse. Og selvom ikke, understøtter de fleste controllere en emuleret "software" seriel tilstand, som du kan bruge til at oprette forbindelse til vilkårlige pins.

For begyndere er Adafruit Ultimate GPS Breakout -modul et godt valg. Der er mange konkurrerende produkter på markedet, men Ultimate er en solid performer til en rimelig pris med store gennemgående huller, der er lette at lodde eller forbinde til et brødbræt.

Tilslut først jord og strøm. I Arduino -termer betyder det, at man forbinder en af mikrokontroller -GND -benene til modulets GND og +5V -stiften til modulets VIN. For at styre dataoverførsel skal du også forbinde modulets TX- og RX -ben til Arduino. Jeg vil vilkårligt vælge Arduino pins 2 (TX) og 3 (RX) til dette formål, selvom ben 0 og 1 specifikt er designet til brug som en "hardware seriel port" eller UART. Hvorfor? Fordi jeg ikke vil spilde den eneste UART, disse low-end AVR-processorer har. Arduinos UART er kablet til det indbyggede USB-stik, og jeg kan godt lide at holde det forbundet til min computer til fejlfinding.

Trin 4: En tå i Datastream

En tå i datastrømmen
En tå i datastrømmen

I det øjeblik du bruger strøm, begynder et GPS -modul at sende klumper med tekstdata på sin TX -linje. Det ser måske endnu ikke en enkelt satellit, langt mindre har en "rettelse", men datahanen tændes med det samme, og det er interessant at se, hvad der kommer ud. Vores første enkle skitse (herunder) gør ikke andet end at vise disse ubehandlede data.

#include #define RXPin 2

#define TXPin 3#definere GPSBaud 4800

#define ConsoleBaud 115200

// Den serielle forbindelse til GPS -enhedenSoftwareSerial ss (RXPin, TXPin);

ugyldig opsætning () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

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

Serial.println ("Visning af de rå NMEA -data, der overføres af GPS -modul.");

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

}

hulrum ()

{if (ss.available ()> 0) // Når hvert tegn ankommer …

Serial.write (ss.read ()); // … skriv det til konsollen

}

BEMÆRK: Skitsen definerer modtagelsesnålen (RXPin) som 2, selvom vi tidligere sagde, at sende- (TX) -stiften ville blive forbundet til stift 2. Dette er en almindelig kilde til forvirring. RXPin er modtagelsesnålen (RX) fra Arduinos synspunkt. Naturligvis skal det tilsluttes modulets transmitter (TX) pin og omvendt.

Upload denne skitse, og åbn Serial Monitor ved 115, 200 baud. Hvis alt fungerer, bør du se en tæt, endeløs strøm af kommaadskilte tekststrenge. Hver vil ligne det andet billede i begyndelsen af afsnittet.

Disse særprægede strenge er kendt som NMEA -sætninger, såkaldte, fordi formatet blev opfundet af National Maritime Electronics Association. NMEA definerer et antal af disse sætninger til navigationsdata lige fra det væsentlige (sted og tid) til det esoteriske (satellitsignal-til-støj-forhold, magnetisk varians osv.). Producenter er inkonsekvente om, hvilke sætningstyper deres modtagere bruger, men GPRMC er afgørende. Når dit modul får en rettelse, bør du se et rimeligt antal af disse GPRMC -sætninger.

Trin 5: Find dig selv

Det er ikke trivielt at konvertere råmodulets output til oplysninger, dit program rent faktisk kan bruge. Heldigvis er der allerede nogle store biblioteker til rådighed til at gøre dette for dig. Limor Freds populære Adafruit GPS -bibliotek er et bekvemt valg, hvis du bruger deres Ultimate breakout. Det er skrevet for at muliggøre funktioner, der er unikke for Ultimate (som intern datalogning) og tilføjer nogle egne sjove klokker og fløjter. Mit foretrukne parsingsbibliotek er dog - og her er jeg selvfølgelig helt upartisk - det, jeg skrev, kaldet TinyGPS ++. Jeg designet den til at være omfattende, kraftfuld, kortfattet og let at bruge. Lad os tage det en omgang.

Trin 6: Kodning med TinyGPS ++

Fra programmørens synspunkt er det meget enkelt at bruge TinyGPS ++:

1) Opret et objekt gps.

2) Før hvert tegn, der ankommer fra modulet, til objektet ved hjælp af gps.encode ().

3) Når du skal kende din position eller højde eller tid eller dato, skal du blot forespørge gps -objektet.

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Den serielle forbindelse til GPS -enhedenSoftwareSerial ss (RXPin, TXPin);

// TinyGPS ++ - objektet

TinyGPSPlus gps;

ugyldig opsætning () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

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

Serial.println ("En simpel tracker, der bruger TinyGPS ++.");

Serial.println ("af Mikal Hart");

Serial.println ();

}

void loop () {

// Hvis der er kommet tegn fra GPS'en, /

/ send dem til TinyGPS ++ - objektet

mens (ss.available ()> 0)

gps.encode (ss.read ());

// Lad os vise den nye placering og højde

// når en af dem er blevet opdateret

hvis (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 ("Højde:");

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

}

}

Vores anden applikation viser konstant modtagerens placering og højde ved hjælp af TinyGPS ++ til at hjælpe med parsing. I en rigtig enhed logger du muligvis disse data til et SD -kort eller viser dem på en LCD. Grib biblioteket og skits FindingYourself.ino (ovenfor). Installer biblioteket som sædvanlig i mappen Arduino biblioteker. Upload skitsen til din Arduino, og åbn Serial Monitor ved 115, 200 baud. Du skal se din placering og højde opdateres i realtid. For at se præcis, hvor du står, skal du indsætte nogle af de resulterende koordinater for breddegrad/længdegrad i Google Maps. Tilslut nu din bærbare computer og gå en tur eller et drev. (Men husk at holde øje med vejen!)

Trin 7: "FJERDE DIMENSION"

Selvom vi forbinder GPS med placering i rummet, så glem ikke, at disse satellitter også sender tids- og datastempler. Det gennemsnitlige GPS-ur er nøjagtigt til en ti-milliontedel af et sekund, og den teoretiske grænse er endnu højere. Selvom du kun har brug for dit projekt for at holde styr på tiden, kan et GPS -modul stadig være den billigste og letteste løsning.

For at gøre FindingYourself.ino til et superpræcist ur skal du bare ændre de sidste få linjer sådan:

hvis (gps.time.isUpdated ()) {

char buf [80];

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

}

Trin 8: Find din vej

Find din vej
Find din vej

Vores tredje og sidste ansøgning er resultatet af en personlig udfordring med at skrive en læselig TinyGPS ++ skitse i færre end 100 linjer med kode, der ville guide en bruger til en destination ved hjælp af enkle tekstinstruktioner som "hold lige" eller "veer til venstre."

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Den serielle forbindelse til GPS -enhedenSoftwareSerial ss (RXPin, TXPin);

// TinyGPS ++ - objektet TinyGPSPlus gps;

unsigned long lastUpdateTime = 0;

#define EIFFEL_LAT 48.85823#definere EIFFEL_LNG 2.29438

/* Dette eksempel viser en grundlæggende ramme for, hvordan du kan bruge kurs og afstand til at guide en person (eller en drone) til en destination. Denne destination er Eiffeltårnet. Skift det efter behov

Den nemmeste måde at få den lat/lange koordinat på er at højreklikke på destinationen i Google Maps (maps.google.com) og vælge "Hvad er her?". Dette sætter de nøjagtige værdier i søgefeltet

*/

ugyldig opsætning () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

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

Serial.println ("Et ikke så omfattende vejledningssystem");

Serial.println ("af Mikal Hart");

Serial.println ();

}

void loop () {

// Hvis der er ankommet tegn fra GPS'en, // send dem til TinyGPS ++ -objektet, mens (ss.available ()> 0) gps.encode (ss.read ());

// Foretag en opdatering hvert 5. sekund

hvis (millis () - lastUpdateTime> = 5000)

{

lastUpdateTime = millis ();

Serial.println ();

// Etablere vores nuværende status

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;

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

// Inden for 20 meter fra destinationen? Var her

hvis (distanceToDestination <= 20,0)

{Serial.println ("TILLYKKE: Du er ankommet!");

exit (1);

}

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

Serial.println ("meter at gå.");

Serial.print ("INSTRUKTION:");

// Stå stille? Angiv bare hvilken retning du skal gå

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

{

Serial.print ("hoved");

Serial.print (directionToDestination);

Serial.println (".");

Vend tilbage;

}

if (courseChangeNeeded> = 345 || courseChangeNeeded <15) Serial.println ("Fortsæt ligeud!");

ellers hvis (courseChangeNeeded> = 315 && courseChangeNeeded <345)

Serial.println ("Veer lidt til venstre.");

ellers hvis (courseChangeNeeded> = 15 && courseChangeNeeded <45)

Serial.println ("Veer lidt til højre.");

ellers hvis (courseChangeNeeded> = 255 && courseChangeNeeded <315)

Serial.println ("Drej til venstre.");

ellers hvis (courseChangeNeeded> = 45 && courseChangeNeeded <105)

Serial.println ("Drej til højre.");

andet

Serial.println ("Vend helt rundt.");

}

}

Hvert 5. sekund registrerer koden brugerens placering og kurs (kørselsretning) og beregner peilingen (retning til destinationen) ved hjælp af TinyGPS ++ courseTo () -metoden. Sammenligning af de to vektorer genererer et forslag om at fortsætte ligeud eller dreje, som vist nedenfor.

Kopier skitsen FindingYourWay.ino (ovenfor) og indsæt den i Arduino IDE. Indstil en destination 1 km eller 2 km væk, upload skitsen til din Arduino, kør den på din bærbare computer, og se om den vil guide dig dertil. Men endnu vigtigere, studer koden og forstå, hvordan den fungerer.

Trin 9: Gå videre

Det kreative potentiale i GPS er stort. En af de mest tilfredsstillende ting, jeg nogensinde har lavet, var en GPS-aktiveret puslespilskasse, der kun åbner på et forprogrammeret sted. Hvis dit offer vil låse skatten inde, skal hun finde ud af, hvor den hemmelige placering er og fysisk bringe kassen dertil. En populær første projektidé er en slags logningsenhed, der registrerer minut for minut position og højde for f.eks. En vandrer, der går på Trans-Pennine Trail. Eller hvad med en af de luskede magnetiske trackere, DEA -agenterne i Breaking Bad holder på de onde biler? Begge dele er fuldstændig gennemførlige og ville sandsynligvis være sjove at bygge, men jeg opfordrer dig til at tænke mere ekspansivt, ud over ting du allerede kan købe på Amazon. Det er en stor verden derude. Gå rundt så vidt og bredt som du kan.

Anbefalede: