Innholdsfortegnelse:

Finne veien med GPS: 9 trinn
Finne veien med GPS: 9 trinn

Video: Finne veien med GPS: 9 trinn

Video: Finne veien med GPS: 9 trinn
Video: 20 товаров для автомобиля с Алиэкспресс, автотовары №30 2024, November
Anonim
Finne veien med GPS
Finne veien med GPS

En rask øvelse i å forstå og bruke GPS -data

  • Påkrevd tid: 2 timer
  • Kostnad: $ 75– $ 150

For produsenter har det blitt ganske billig å inkorporere geospatial data av høy kvalitet i elektronikkprosjekter. Og de siste årene har GPS -mottakermoduler blitt mye mer mangfoldige, kraftige og enkle å integrere med utviklingskort som Arduino, PIC, Teensy og Raspberry Pi. Hvis du har tenkt på å bygge rundt GPS, har du valgt et godt tidspunkt å komme i gang.

Trinn 1: Slik fungerer det

En GPS -modul er en liten radiomottaker som behandler signaler som sendes på kjente frekvenser fra en flåte av satellitter. Disse satellittene virvler rundt jorden i omtrent sirkulære baner og overfører ekstremt presise posisjons- og klokkedata til bakken nedenfor. Hvis den jordbundne mottakeren kan "se" nok av disse satellittene, kan den bruke dem til å beregne sin egen plassering og høyde.

Når en GPS -melding kommer, inspiserer mottakeren først tidsstempelet for kringkasting for å se når den ble sendt. Fordi hastigheten til en radiobølge i rommet er en kjent konstant (c), kan mottakeren sammenligne kringkastings- og mottakstider for å bestemme avstanden signalet har tilbakelagt. Når den har funnet sin avstand fra fire eller flere kjente satellitter, er beregning av sin egen posisjon et ganske enkelt problem med 3D -triangulering. Men for å gjøre dette raskt og nøyaktig må mottakeren kunne knuse tall fra opptil 20 datastrømmer samtidig. Siden GPS -systemet har et publisert mål om å være brukbart overalt på jorden, må systemet sikre at minst fire satellitter - helst flere - er synlige til enhver tid fra alle punkter på kloden. Det er for tiden 32 GPS -satellitter som utfører en omhyggelig koreografert dans i en sparsom sky på 20 000 kilometer høy.

Trinn 2: Fan Fact

GPS kunne ikke fungere uten Einsteins relativitetsteori, ettersom kompensasjon må gjøres for de 38 mikrosekundene atomurene i bane får hver dag etter tidsutvidelse i jordens gravitasjonsfelt.

Trinn 3: Komme i gang

Starter
Starter

Uansett prosjekt, GPS er enkel å integrere. De fleste mottakermoduler kommuniserer med en enkel seriell protokoll, så hvis du finner en ledig seriell port på kontrollerkortet, bør det bare ta en håndfull ledninger for å opprette den fysiske tilkoblingen. Og selv om ikke, støtter de fleste kontrollere en emulert "programvare" seriell modus som du kan bruke til å koble til vilkårlige pins.

For nybegynnere er Adafruit Ultimate GPS Breakout -modul et godt valg. Det er mange konkurrerende produkter på markedet, men Ultimate er en solid utøver til en fornuftig pris, med store gjennomgående hull som er enkle å lodde eller koble til et brødbrett.

Koble først jord og strøm. I Arduino -termer betyr dette å koble en av mikrokontroller -GND -pinnene til modulens GND, og +5V -pinnen til modulens VIN. For å administrere dataoverføring må du også koble modulens TX- og RX -pinner til Arduino. Jeg skal vilkårlig velge Arduino -pinner 2 (TX) og 3 (RX) for dette formålet, selv om pinne 0 og 1 er spesielt designet for bruk som en "maskinvareseriell port" eller UART. Hvorfor? Fordi jeg ikke vil kaste bort den eneste UART som disse avanserte AVR-prosessorene har. Arduinos UART er kablet til USB-kontakten ombord, og jeg liker å beholde den koblet til datamaskinen min for feilsøking.

Trinn 4: En tå i datastrømmen

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

I det øyeblikket du bruker strøm, begynner en GPS -modul å sende biter med tekstdata på TX -linjen. Den ser kanskje ikke en eneste satellitt ennå, langt mindre har en "løsning", men datakranen tennes med en gang, og det er interessant å se hva som kommer ut. Vår første enkle skisse (nedenfor) gjør ingenting annet enn å vise disse ubehandlede dataene.

#include #define RXPin 2

#define TXPin 3#definere GPSBaud 4800

#define ConsoleBaud 115200

// Den serielle tilkoblingen til GPS -enheten SoftwareSerial ss (RXPin, TXPin);

ugyldig oppsett () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

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

Serial.println ("Viser rå NMEA -data overført av GPS -modul.");

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

}

hulrom ()

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

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

}

MERK: Skissen definerer mottakspinnen (RXPin) som 2, selv om vi tidligere sa at sendepinnen (TX) ville være koblet til pinne 2. Dette er en vanlig kilde til forvirring. RXPin er mottakspinnen (RX) fra Arduinos synspunkt. Naturligvis må den være koblet til modulens sendepinne (TX), og omvendt.

Last opp denne skissen og åpne Serial Monitor på 115, 200 baud. Hvis alt fungerer, bør du se en tett, endeløs strøm av kommaadskilte tekststrenger. Hver vil se ut som det andre bildet i begynnelsen av avsnittet.

Disse særegne strengene er kjent som NMEA -setninger, såkalt fordi formatet ble oppfunnet av National Maritime Electronics Association. NMEA definerer en rekke av disse setningene for navigasjonsdata som spenner fra det essensielle (sted og tid) til det esoteriske (satellitt-signal-til-støy-forhold, magnetisk varians, etc.). Produsenter er inkonsekvente om hvilke setningstyper mottakerne bruker, men GPRMC er viktig. Når modulen din er fikset, bør du se et rimelig antall av disse GPRMC -setningene.

Trinn 5: Finne deg selv

Det er ikke trivielt å konvertere råmodulutgangen til informasjon programmet ditt faktisk kan bruke. Heldigvis er det noen flotte biblioteker som allerede er tilgjengelige for å gjøre dette for deg. Limor Freds populære Adafruit GPS -bibliotek er et praktisk valg hvis du bruker deres Ultimate breakout. Den er skrevet for å aktivere funksjoner som er unike for Ultimate (som intern datalogging) og legger til noen flotte, bjelker og egne fløyter. Mitt favoritt analysebibliotek - og her er jeg selvfølgelig helt upartisk - er det jeg skrev som heter TinyGPS ++. Jeg designet den for å være omfattende, kraftig, kortfattet og enkel å bruke. La oss ta det en tur.

Trinn 6: Koding med TinyGPS ++

Fra programmererens synspunkt er bruk av TinyGPS ++ veldig enkelt:

1) Lag et objekt gps.

2) Før hvert tegn som kommer fra modulen til objektet ved hjelp av gps.encode ().

3) Når du trenger å vite din posisjon eller høyde eller tid eller dato, bare spør GPS -objektet.

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Den serielle tilkoblingen til GPS -enheten SoftwareSerial ss (RXPin, TXPin);

// TinyGPS ++ - objektet

TinyGPSPlus gps;

ugyldig oppsett () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

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

Serial.println ("En enkel tracker som bruker TinyGPS ++.");

Serial.println ("av Mikal Hart");

Serial.println ();

}

void loop () {

// Hvis det har kommet noen tegn fra GPS -en, /

/ send dem til TinyGPS ++ - objektet

mens (ss.available ()> 0)

gps.encode (ss.read ());

// La oss vise den nye plasseringen og høyden

// når en av dem er oppdatert

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øyde:");

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

}

}

Vår andre applikasjon viser kontinuerlig mottakerens plassering og høyde, ved hjelp av TinyGPS ++ for å hjelpe med parsing. I en ekte enhet kan du logge disse dataene til et SD -kort eller vise dem på en LCD -skjerm. Ta tak i biblioteket og skiss FindingYourself.ino (ovenfor). Installer biblioteket som vanlig i mappen Arduino biblioteker. Last opp skissen til Arduino og åpne Serial Monitor på 115, 200 baud. Du bør se posisjonen din og høyden oppdateres i sanntid. For å se nøyaktig hvor du står, lim inn noen av de resulterende bredde-/lengdegradskoordinatene i Google Maps. Koble til den bærbare datamaskinen og gå en spasertur eller en kjøretur. (Men husk å holde øynene på veien!)

Trinn 7: "FJERDE DIMENSJON"

Selv om vi forbinder GPS med plassering i verdensrommet, så ikke glem at satellittene sender tids- og datastempler også. Den gjennomsnittlige GPS-klokken er nøyaktig til en ti-milliontedel av et sekund, og den teoretiske grensen er enda høyere. Selv om du bare trenger prosjektet ditt for å holde oversikt over tid, kan en GPS -modul fortsatt være den billigste og enkleste løsningen.

For å gjøre FindingYourself.ino til en supernøyaktig klokke, bare endre de siste linjene slik:

if (gps.time.isUpdated ()) {

røye buf [80];

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

}

Trinn 8: Finne veien

Å finne veien
Å finne veien

Vår tredje og siste søknad er resultatet av en personlig utfordring for å skrive en lesbar TinyGPS ++ skisse, på færre enn 100 linjer med kode, som vil lede en bruker til en destinasjon ved hjelp av enkle tekstinstruksjoner som "hold rett" eller "veer til venstre."

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Den serielle tilkoblingen til GPS -enheten SoftwareSerial ss (RXPin, TXPin);

// TinyGPS ++ - objektet TinyGPSPlus gps;

unsigned long lastUpdateTime = 0;

#define EIFFEL_LAT 48.85823#definere EIFFEL_LNG 2.29438

/* Dette eksemplet viser et grunnleggende rammeverk for hvordan du kan bruke kurs og avstand for å veilede en person (eller en drone) til en destinasjon. Denne destinasjonen er Eiffeltårnet. Endre det etter behov

Den enkleste måten å få den lat/lange koordinaten er å høyreklikke på destinasjonen i Google Maps (maps.google.com) og velge "Hva er her?". Dette setter de eksakte verdiene i søkeboksen

*/

ugyldig oppsett () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

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

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

Serial.println ("av Mikal Hart");

Serial.println ();

}

void loop () {

// Hvis noen tegn har kommet fra GPS -en, // send dem til TinyGPS ++ - objektet mens (ss.available ()> 0) gps.encode (ss.read ());

// Gjør en oppdatering hvert 5. sekund

if (millis () - lastUpdateTime> = 5000)

{

lastUpdateTime = millis ();

Serial.println ();

// Fastslå vår nåvæ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;

// feilsøk 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 ());

// Innen 20 meter fra destinasjonen? Var her

hvis (distanceToDestination <= 20,0)

{Serial.println ("GRATULERER: Du har kommet!");

utgang (1);

}

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

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

Serial.print ("INSTRUKSJON:");

// Står stille? Bare angi hvilken retning du skal gå

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

{

Serial.print ("hode");

Serial.print (directionToDestination);

Serial.println (".");

komme tilbake;

}

if (courseChangeNeeded> = 345 || courseChangeNeeded <15) Serial.println ("Fortsett rett frem!");

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

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

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

Serial.println ("Veer litt til høyre.");

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

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

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

Serial.println ("Ta til høyre.");

ellers

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

}

}

Hvert 5. sekund registrerer koden brukerens plassering og kurs (kjøreretning) og beregner peilingen (retning til destinasjonen) ved hjelp av TinyGPS ++ courseTo () -metoden. Å sammenligne de to vektorene gir et forslag om å fortsette rett eller svinge, som vist nedenfor.

Kopier skissen FindingYourWay.ino (ovenfor) og lim den inn i Arduino IDE. Sett en destinasjon 1 km eller 2 km unna, last opp skissen til din Arduino, kjør den på den bærbare datamaskinen din, og se om den vil lede deg dit. Men enda viktigere, studer koden og forstå hvordan den fungerer.

Trinn 9: Gå videre

Det kreative potensialet til GPS er stort. En av de mest tilfredsstillende tingene jeg noensinne har laget var en GPS-aktivert puslespillboks som bare åpnes på et forhåndsprogrammert sted. Hvis offeret ditt ønsker å få skatten låst inne, må hun finne ut hvor det hemmelige stedet er og fysisk bringe esken dit. En populær første prosjektidee er en slags loggingsenhet som registrerer minutt for minutt posisjon og høyde for, for eksempel, en turgåer som går på Trans-Pennine Trail. Eller hva med en av de lune magnetiske trackerne DEA -agentene i Breaking Bad holder på skurkene sine biler? Begge er fullt mulig, og vil trolig være morsomt å bygge, men jeg oppfordrer deg til å tenke mer ekspansivt, utover ting du allerede kan kjøpe på Amazon. Det er en stor verden der ute. Reis så langt og bredt du kan.

Anbefalt: