Innehållsförteckning:

Hitta din väg med GPS: 9 steg
Hitta din väg med GPS: 9 steg

Video: Hitta din väg med GPS: 9 steg

Video: Hitta din väg med GPS: 9 steg
Video: Swidish;GPS-navigering: Offlinekartor och vägbeskrivningar-appen kommer att få alla funktioner nedan 2024, November
Anonim
Hitta din väg med GPS
Hitta din väg med GPS

En snabb övning för att förstå och tillämpa GPS -data

  • Tid som krävs: 2 timmar
  • Kostnad: $ 75– $ 150

För tillverkare har det blivit ganska billigt att införliva högkvalitativ geospatial data i elektronikprojekt. Och under de senaste åren har GPS -mottagarmoduler (Global Positioning System) blivit mycket mer mångsidiga, kraftfulla och enkla att integrera med utvecklingskort som Arduino, PIC, Teensy och Raspberry Pi. Om du har tänkt bygga kring GPS har du valt en bra tid att komma igång.

Steg 1: Hur det fungerar

En GPS -modul är en liten radiomottagare som bearbetar signaler som sänds på kända frekvenser av en satellitflotta. Dessa satelliter virvlar runt jorden i ungefär cirkulära banor och överför extremt exakt position och klockdata till marken nedanför. Om den jordbundna mottagaren kan "se" tillräckligt med dessa satelliter kan den använda dem för att beräkna sin egen plats och höjd.

När ett GPS -meddelande kommer inspekterar mottagaren först sin sändningstidsstämpel för att se när det skickades. Eftersom hastigheten för en radiovåg i rymden är en känd konstant (c) kan mottagaren jämföra sändnings- och mottagningstider för att bestämma avståndet signalen har rest. När den väl har fastställt sitt avstånd från fyra eller fler kända satelliter är beräkningen av sin egen position ett ganska enkelt problem med 3D -triangulering. Men för att göra detta snabbt och noggrant måste mottagaren enkelt knäcka nummer från upp till 20 dataströmmar samtidigt. Eftersom GPS -systemet har ett publicerat mål om att vara användbart överallt på jorden måste systemet säkerställa att minst fyra satelliter - helst fler - är synliga hela tiden från varje punkt på jordklotet. Det finns för närvarande 32 GPS -satelliter som utför en noggrant koreograferad dans i ett glest moln 20 000 kilometer högt.

Steg 2: Fan Fact

GPS kunde inte fungera utan Einsteins relativitetsteori, eftersom kompensation måste göras för de 38 mikrosekunder som atomklockorna kretsar varje dag genom tidsutvidgning i jordens gravitationsfält.

Steg 3: Komma igång

Komma igång
Komma igång

Oavsett ditt projekt är GPS enkel att integrera. De flesta mottagarmoduler kommunicerar med ett enkelt seriellt protokoll, så om du kan hitta en ledig seriell port på ditt styrkort bör det bara ta en handfull ledningar för att göra den fysiska anslutningen. Och även om inte, de flesta kontroller stöder ett emulerat "programvara" seriellt läge som du kan använda för att ansluta till godtyckliga stift.

För nybörjare är Adafruit Ultimate GPS Breakout -modul ett bra val. Det finns många konkurrerande produkter på marknaden, men Ultimate är en solid performer till ett rimligt pris, med stora genomgående hål som är lätta att löda eller ansluta till ett brödbräda.

Anslut först jord och ström. I Arduino -termer betyder det att ansluta en av mikrokontrollerns GND -stift till modulens GND och +5V -stiftet till modulens VIN. För att hantera dataöverföring måste du också ansluta modulens TX- och RX -stift till Arduino. Jag kommer godtyckligt att välja Arduino -stift 2 (TX) och 3 (RX) för detta ändamål, även om stift 0 och 1 är speciellt utformade för användning som en "hårdvaruseriell port" eller UART. Varför? Eftersom jag inte vill slösa bort den enda UART som dessa avancerade AVR-processorer har. Arduinos UART är ansluten till USB-kontakten ombord, och jag gillar att hålla den ansluten till min dator för felsökning.

Steg 4: En tå i dataströmmen

En tå i dataströmmen
En tå i dataströmmen

I samma ögonblick som du använder ström börjar en GPS -modul skicka bitar av textdata på sin TX -linje. Den kanske ännu inte ser en enda satellit, mycket mindre har en "fix", men datakranen startar direkt och det är intressant att se vad som kommer ut. Vår första enkla skiss (nedan) gör inget annat än att visa dessa obearbetade data.

#include #define RXPin 2

#define TXPin 3#definiera GPSBaud 4800

#define ConsoleBaud 115200

// Seriell anslutning till GPS -enheten SoftwareSerial ss (RXPin, TXPin);

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

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

Serial.println ("Visar rå NMEA -data som överförs av GPS -modul.");

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

}

void loop ()

{if (ss.available ()> 0) // När varje tecken kommer …

Serial.write (ss.read ()); // … skriv det till konsolen

}

OBS: Skissen definierar mottagningsstiftet (RXPin) som 2, även om vi tidigare sa att sändningsstiften (TX) skulle anslutas till stift 2. Detta är en vanlig källa till förvirring. RXPin är mottagningsstiftet (RX) ur Arduinos synvinkel. Naturligtvis måste den vara ansluten till modulens sändning (TX) -stift, och vice versa.

Ladda upp denna skiss och öppna Serial Monitor på 115, 200 baud. Om allt fungerar bör du se en tät, oändlig ström av kommaseparerade textsträngar. Var och en kommer att se ut ungefär som den andra bilden i början av stycket.

Dessa distinkta strängar är kända som NMEA -meningar, så kallade eftersom formatet uppfanns av National Maritime Electronics Association. NMEA definierar ett antal av dessa meningar för navigationsdata som sträcker sig från det väsentliga (plats och tid) till det esoteriska (satellit-signal-brus-förhållande, magnetisk varians, etc.). Tillverkare är inkonsekventa om vilka meningsformer deras mottagare använder, men GPRMC är viktigt. När din modul har fått en fix bör du se en hel del av dessa GPRMC -meningar.

Steg 5: Hitta dig själv

Det är inte trivialt att konvertera råmodulutmatningen till information som ditt program faktiskt kan använda. Lyckligtvis finns det några fantastiska bibliotek som redan finns tillgängliga för att göra detta åt dig. Limor Freds populära Adafruit GPS -bibliotek är ett bekvämt val om du använder deras Ultimate breakout. Det är skrivet för att möjliggöra funktioner som är unika för Ultimate (som intern dataloggning) och lägger till några snygga klockor och visselpipor. Mitt favorit analysbibliotek - men här är jag förstås helt opartisk - är det jag skrev som heter TinyGPS ++. Jag utformade den för att vara omfattande, kraftfull, kortfattad och lätt att använda. Låt oss ta en snurr.

Steg 6: Kodning med TinyGPS ++

Från programmerarens synvinkel är det väldigt enkelt att använda TinyGPS ++:

1) Skapa ett objekt gps.

2) Dra varje tecken som kommer från modulen till objektet med hjälp av gps.encode ().

3) När du behöver veta din position eller höjd eller tid eller datum, fråga bara GPS -objektet.

#inkludera #inkludera

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Seriell anslutning till GPS -enheten SoftwareSerial ss (RXPin, TXPin);

// Objektet TinyGPS ++

TinyGPSPlus gps;

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("GPS Exempel 2");

Serial.println ("En enkel spårare som använder TinyGPS ++.");

Serial.println ("av Mikal Hart");

Serial.println ();

}

void loop () {

// Om några tecken har kommit från GPS: en, /

/ skicka dem till TinyGPS ++ - objektet

medan (ss.available ()> 0)

gps.encode (ss.read ());

// Låt oss visa den nya platsen och höjden

// när någon av dem har uppdaterats

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

{

Serial.print ("Plats:");

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

Serial.print (",");

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

Serial.print ("Altitude:");

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

}

}

Vår andra applikation visar ständigt mottagarens plats och höjd med hjälp av TinyGPS ++ för att hjälpa till med analys. I en verklig enhet kan du logga dessa data till ett SD -kort eller visa dem på en LCD -skärm. Ta tag i biblioteket och skissa FindingYourself.ino (ovan). Installera biblioteket som vanligt i mappen Arduino bibliotek. Ladda upp skissen till din Arduino och öppna seriell bildskärm på 115, 200 baud. Du bör se din plats och höjd uppdateras i realtid. För att se exakt var du står klistrar du in några av de resulterande koordinaterna för latitud/longitud i Google Maps. Anslut nu din bärbara dator och ta en promenad eller en promenad. (Men kom ihåg att hålla ögonen på vägen!)

Steg 7: "FJÄRDE DIMENSIONEN"

även om vi förknippar GPS med plats i rymden, glöm inte att satelliterna sänder tids- och datastämplar också. Den genomsnittliga GPS-klockan är exakt till en tiomiljonedel av en sekund, och den teoretiska gränsen är ännu högre. Även om du bara behöver ditt projekt för att hålla reda på tid kan en GPS -modul fortfarande vara den billigaste och enklaste lösningen.

För att göra FindingYourself.ino till en superexakt klocka ändrar du bara de sista raderna så här:

if (gps.time.isUpdated ()) {

röding buf [80];

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

}

Steg 8: Hitta din väg

Hitta din väg
Hitta din väg

Vår tredje och sista ansökan är resultatet av en personlig utmaning att skriva en läsbar TinyGPS ++ -skiss, i färre än 100 rader kod, som skulle vägleda en användare till en destination med hjälp av enkla textinstruktioner som "håll rakt" eller "sväng vänster."

#inkludera #inkludera

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Seriell anslutning till GPS -enheten SoftwareSerial ss (RXPin, TXPin);

// TinyGPS ++ - objektet TinyGPSPlus gps;

unsigned long lastUpdateTime = 0;

#define EIFFEL_LAT 48.85823#definiera EIFFEL_LNG 2.29438

/* Detta exempel visar en grundläggande ram för hur du kan använda kurs och avstånd för att vägleda en person (eller en drönare) till en destination. Denna destination är Eiffeltornet. Ändra det efter behov

Det enklaste sättet att få lat/long-koordinaten är att högerklicka på destinationen i Google Maps (maps.google.com) och välja "Vad finns här?". Detta sätter de exakta värdena i sökrutan

*/

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

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

Serial.println ("Ett inte så omfattande vägledningssystem");

Serial.println ("av Mikal Hart");

Serial.println ();

}

void loop () {

// Om några tecken har kommit från GPS: en, // skicka dem till TinyGPS ++ - objektet medan (ss.available ()> 0) gps.encode (ss.read ());

// Var femte sekund, gör en uppdatering

if (millis () - lastUpdateTime> = 5000)

{

lastUpdateTime = millis ();

Serial.println ();

// Upprätta vår nuvarande 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 ());

// Inom 20 meter från destinationen? Var här

if (distanceToDestination <= 20,0)

{Serial.println ("GRATTIS: Du har kommit!");

utgång (1);

}

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

Serial.println ("meter kvar.");

Serial.print ("INSTRUKTION:");

// Står stilla? Ange bara vilken riktning du ska gå

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

{

Serial.print ("Head");

Serial.print (directionToDestination);

Serial.println (".");

lämna tillbaka;

}

if (courseChangeNeeded> = 345 || courseChangeNeeded <15) Serial.println ("Fortsätt rakt fram!");

annars om (courseChangeNeeded> = 315 && courseChangeNeeded <345)

Serial.println ("Veer något åt vänster.");

annars om (courseChangeNeeded> = 15 && courseChangeNeeded <45)

Serial.println ("Veer något åt höger.");

annars om (courseChangeNeeded> = 255 && courseChangeNeeded <315)

Serial.println ("Sväng åt vänster.");

annars om (courseChangeNeeded> = 45 && courseChangeNeeded <105)

Serial.println ("Sväng åt höger.");

annan

Serial.println ("Vänd dig helt om.");

}

}

Var femte sekund fångar koden användarens plats och kurs (färdriktning) och beräknar bäringen (riktning till destinationen) med hjälp av TinyGPS ++ courseTo () -metoden. Att jämföra de två vektorerna ger ett förslag om att fortsätta rakt eller svänga, som visas nedan.

Kopiera skissen FindingYourWay.ino (ovan) och klistra in den i Arduino IDE. Ställ in en destination 1 km eller 2 km bort, ladda upp skissen till din Arduino, kör den på din bärbara dator och se om den leder dig dit. Men ännu viktigare, studera koden och förstå hur den fungerar.

Steg 9: Gå vidare

GPS: s kreativa potential är enorm. En av de mest tillfredsställande sakerna jag någonsin gjort var en GPS-aktiverad pusselbox som bara öppnar på en förprogrammerad plats. Om ditt offer vill låsa skatten inuti måste hon ta reda på var den hemliga platsen är och fysiskt ta med lådan dit. En populär första projektidé är någon slags loggningsanordning som registrerar minut för minut position och höjd för, till exempel, en vandrare som går Trans-Pennine Trail. Eller vad sägs om en av de där luriga magnetiska spårarna som DEA -agenterna i Breaking Bad håller på skurkarnas bilar? Båda är helt genomförbara och skulle förmodligen vara roliga att bygga, men jag uppmuntrar dig att tänka mer expansivt, utöver saker du redan kan köpa på Amazon. Det är en stor värld där ute. Ströva så långt och brett du kan.

Rekommenderad: