Inhoudsopgave:

Uw weg vinden met GPS: 9 stappen
Uw weg vinden met GPS: 9 stappen

Video: Uw weg vinden met GPS: 9 stappen

Video: Uw weg vinden met GPS: 9 stappen
Video: AirTags? Nee joh, met GPS-trackers vind je écht alles terug! 2024, November
Anonim
Je weg vinden met GPS
Je weg vinden met GPS

Een snelle oefening in het begrijpen en toepassen van GPS-gegevens

  • Benodigde tijd: 2 uur
  • Kosten: $ 75- $ 150

Voor makers is het vrij goedkoop geworden om geospatiale gegevens van hoge kwaliteit in elektronicaprojecten op te nemen. En in de afgelopen jaren zijn GPS-ontvangermodules (Global Positioning System) veel diverser, krachtiger en gemakkelijker te integreren met ontwikkelborden zoals Arduino, PIC, Teensy en Raspberry Pi geworden. Als je erover hebt nagedacht om rond GPS te bouwen, heb je een goed moment gekozen om te beginnen.

Stap 1: Hoe het werkt

Een GPS-module is een kleine radio-ontvanger die signalen verwerkt die worden uitgezonden op bekende frequenties door een vloot van satellieten. Deze satellieten wervelen rond de aarde in ongeveer cirkelvormige banen en zenden uiterst nauwkeurige positie- en klokgegevens naar de grond eronder. Als de aardgebonden ontvanger genoeg van deze satellieten kan 'zien', kan hij ze gebruiken om zijn eigen locatie en hoogte te berekenen.

Wanneer een GPS-bericht binnenkomt, inspecteert de ontvanger eerst het tijdstempel van de uitzending om te zien wanneer het is verzonden. Omdat de snelheid van een radiogolf in de ruimte een bekende constante is (c), kan de ontvanger zend- en ontvangsttijden vergelijken om de afstand te bepalen die het signaal heeft afgelegd. Als het eenmaal zijn afstand tot vier of meer bekende satellieten heeft bepaald, is het berekenen van zijn eigen positie een vrij eenvoudig probleem van 3D-triangulatie. Maar om dit snel en nauwkeurig te doen, moet de ontvanger in staat zijn om behendig getallen van maximaal 20 datastromen tegelijk te verwerken. Aangezien het GPS-systeem een gepubliceerd doel heeft om overal op aarde bruikbaar te zijn, moet het systeem ervoor zorgen dat ten minste vier satellieten - liefst meer - zijn te allen tijde zichtbaar vanaf elk punt op de aardbol. Er zijn momenteel 32 GPS-satellieten die een zorgvuldig gechoreografeerde dans uitvoeren in een dunne wolk van 20.000 kilometer hoog.

Stap 2: Fanfeit

GPS zou niet kunnen werken zonder de relativiteitstheorie van Einstein, aangezien er compensatie moet worden gemaakt voor de 38 microseconden die de ronddraaiende atoomklokken elke dag winnen door tijddilatatie in het zwaartekrachtveld van de aarde.

Stap 3: Aan de slag

Beginnen
Beginnen

Wat uw project ook is, GPS is eenvoudig te integreren. De meeste ontvangermodules communiceren met een eenvoudig serieel protocol, dus als u een vrije seriële poort op uw controllerkaart kunt vinden, hoeft u slechts een handvol draden te gebruiken om de fysieke verbinding tot stand te brengen. En zelfs als dat niet het geval is, ondersteunen de meeste controllers een geëmuleerde "software" seriële modus die u kunt gebruiken om verbinding te maken met willekeurige pinnen.

Voor beginners is de Ultimate GPS Breakout-module van Adafruit een goede keuze. Er zijn veel concurrerende producten op de markt, maar de Ultimate presteert solide voor een redelijke prijs, met grote doorgaande gaten die gemakkelijk kunnen worden gesoldeerd of op een breadboard kunnen worden aangesloten.

Sluit eerst aarde en voeding aan. In Arduino-termen betekent dit dat een van de GND-pinnen van de microcontroller wordt aangesloten op de GND van de module en de +5V-pin op het VIN van de module. Om de gegevensoverdracht te beheren, moet u ook de TX- en RX-pinnen van de module op de Arduino aansluiten. Ik ga voor dit doel willekeurig Arduino-pinnen 2 (TX) en 3 (RX) selecteren, hoewel pinnen 0 en 1 specifiek zijn ontworpen voor gebruik als een "hardware-seriële poort" of UART. Waarom? Omdat ik de enige UART die deze low-end AVR-processors hebben niet wil verspillen. Arduino's UART is vast verbonden met de ingebouwde USB-connector en ik houd hem graag aangesloten op mijn computer voor foutopsporing.

Stap 4: Een teen in de datastroom

Een teen in de datastroom
Een teen in de datastroom

Op het moment dat u stroom aansluit, begint een GPS-module stukjes tekstgegevens op zijn TX-lijn te verzenden. Het ziet misschien nog geen enkele satelliet, laat staan een "fix", maar de datakraan gaat meteen aan en het is interessant om te zien wat eruit komt. Onze eerste eenvoudige schets (hieronder) doet niets anders dan deze onverwerkte gegevens weergeven.

#include #define RXPin 2

#define TXPin 3#define GPSBaud 4800

#define ConsoleBaud 115200

// De seriële verbinding met het GPS-apparaatSoftwareSerial ss (RXPin, TXPin);

ongeldige setup(){

Serial.begin(ConsoleBaud);

ss.begin(GPSBaud);

Serial.println("GPS Voorbeeld 1");

Serial.println("De onbewerkte NMEA-gegevens weergeven die door de GPS-module zijn verzonden.");

Serial.println ("door Mikal Hart"); Serieel.println();

}

lege lus()

{ if (ss.available() > 0) // Als elk personage arriveert…

Serieel.schrijven(ss.lezen()); // … schrijf het naar de console

}

OPMERKING: De schets definieert de ontvangstpin (RXPin) als 2, hoewel we eerder zeiden dat de zendpin (TX) zou worden aangesloten op pin 2. Dit is een veelvoorkomende bron van verwarring. RXPin is de ontvangstpin (RX) vanuit het oogpunt van de Arduino. Uiteraard moet deze worden aangesloten op de zend (TX) pin van de module en vice versa.

Upload deze schets en open Serial Monitor op 115, 200 baud. Als alles werkt, zou je een dichte, eindeloze stroom van door komma's gescheiden tekstreeksen moeten zien. Elk ziet er ongeveer uit als de tweede afbeelding aan het begin van de alinea.

Deze onderscheidende strings staan bekend als NMEA-zinnen, zo genoemd omdat het formaat is uitgevonden door de National Maritime Electronics Association. NMEA definieert een aantal van deze zinnen voor navigatiegegevens, variërend van het essentiële (locatie en tijd) tot het esoterische (satellietsignaal-ruisverhouding, magnetische variantie, enz.). Fabrikanten zijn inconsistent over welke zinstypen hun ontvangers gebruiken, maar GPRMC is essentieel. Zodra uw module een oplossing heeft gekregen, zou u een behoorlijk aantal van deze GPRMC-zinnen moeten zien.

Stap 5: Jezelf vinden

Het is niet triviaal om de uitvoer van de onbewerkte module om te zetten in informatie die uw programma daadwerkelijk kan gebruiken. Gelukkig zijn er al enkele geweldige bibliotheken beschikbaar om dit voor u te doen. De populaire Adafruit GPS-bibliotheek van Limor Fried is een handige keuze als je hun Ultimate breakout gebruikt. Het is geschreven om functies in te schakelen die uniek zijn voor de Ultimate (zoals interne datalogging) en voegt een aantal hippe toeters en bellen toe. Mijn favoriete parseerbibliotheek echter - en hier ben ik natuurlijk volledig onbevooroordeeld - is degene die ik heb geschreven met de naam TinyGPS++. Ik heb het ontworpen om uitgebreid, krachtig, beknopt en gebruiksvriendelijk te zijn. Laten we het eens proberen.

Stap 6: Coderen met TinyGPS++

Vanuit het oogpunt van de programmeur is het gebruik van TinyGPS++ heel eenvoudig:

1) Maak een object-gps.

2) Routeer elk teken dat vanuit de module naar het object komt met behulp van gps.encode().

3) Als u uw positie of hoogte of tijd of datum wilt weten, vraagt u eenvoudig het gps-object op.

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// De seriële verbinding met het GPS-apparaatSoftwareSerial ss (RXPin, TXPin);

// Het TinyGPS++-object

TinyGPSPlus-gps;

ongeldige setup(){

Serial.begin(ConsoleBaud);

ss.begin(GPSBaud);

Serial.println("GPS Voorbeeld 2");

Serial.println("Een eenvoudige tracker die TinyGPS++ gebruikt.");

Serial.println ("door Mikal Hart");

Serieel.println();

}

lege lus(){

// Als er tekens van de GPS zijn aangekomen, /

/ stuur ze naar het TinyGPS++ object

while (ss.available() > 0)

gps.encode(ss.read());

// Laten we de nieuwe locatie en hoogte weergeven

// wanneer een van beide is bijgewerkt

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

{

Serial.print("Locatie: ");

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

Serieel.print(", ");

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

Serial.print(" Hoogte: ");

Serial.println(gps.hoogtemeters());

}

}

Onze tweede applicatie geeft continu de locatie en hoogte van de ontvanger weer, met behulp van TinyGPS++ om te helpen bij het parseren. In een echt apparaat kunt u deze gegevens op een SD-kaart loggen of op een LCD-scherm weergeven. Pak de bibliotheek en schets FindingYourself.ino (hierboven). Installeer de bibliotheek zoals gewoonlijk in de map Arduino-bibliotheken. Upload de schets naar je Arduino en open Serial Monitor op 115, 200 baud. U zou uw locatie en hoogte in realtime moeten zien bijwerken. Om precies te zien waar u staat, plakt u enkele van de resulterende lengte- en breedtegraadcoördinaten in Google Maps. Sluit nu uw laptop aan en maak een wandeling of een ritje. (Maar vergeet niet om je ogen op de weg te houden!)

Stap 7: De "VIERDE DIMENSIE"

Hoewel we GPS associëren met locatie in de ruimte, vergeet niet dat die satellieten ook tijd- en datumstempels uitzenden. De gemiddelde GPS-klok is nauwkeurig tot op een tienmiljoenste van een seconde, en de theoretische limiet is zelfs nog hoger. Zelfs als je je project alleen nodig hebt om de tijd bij te houden, kan een GPS-module nog steeds de goedkoopste en gemakkelijkste oplossing zijn.

Om van FindingYourself.ino een supernauwkeurige klok te maken, verander je de laatste paar regels als volgt:

if (gps.time.isUpdated()) {

char buf [80];

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

}

Stap 8: Je weg vinden

Je weg vinden
Je weg vinden

Onze derde en laatste toepassing is het resultaat van een persoonlijke uitdaging om een leesbare TinyGPS++-schets te schrijven, in minder dan 100 regels code, die een gebruiker naar een bestemming zou leiden met behulp van eenvoudige tekstinstructies zoals "rechtdoor blijven" of "naar links buigen".

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// De seriële verbinding met het GPS-apparaatSoftwareSerial ss (RXPin, TXPin);

// Het TinyGPS++ object TinyGPSPlus gps;

niet-ondertekend lang lastUpdateTime = 0;

#define EIFFEL_LAT 48.85823#define EIFFEL_LNG 2.29438

/* Dit voorbeeld toont een basiskader voor hoe u koers en afstand kunt gebruiken om een persoon (of een drone) naar een bestemming te leiden. Deze bestemming is de Eiffeltoren. Wijzig het indien nodig

De eenvoudigste manier om de breedte-/lengtecoördinaat te krijgen, is door met de rechtermuisknop op de bestemming in Google Maps (maps.google.com) te klikken en 'Wat is hier?' te kiezen. Dit plaatst de exacte waarden in het zoekvak

*/

ongeldige setup(){

Serial.begin(ConsoleBaud);

ss.begin(GPSBaud);

Serial.println("GPS Voorbeeld 3");

Serial.println ("Een niet zo uitgebreid begeleidingssysteem");

Serial.println ("door Mikal Hart");

Serieel.println();

}

lege lus(){

// Als er tekens van de GPS zijn aangekomen, // stuur ze naar het TinyGPS++ object while (ss.available() > 0) gps.encode(ss.read());

// Voer elke 5 seconden een update uit

if (millis() - lastUpdateTime >= 5000)

{

lastUpdateTime = millis();

Serieel.println();

// Bepaal onze huidige status

dubbele distanceToDestination = TinyGPSPlus::distanceBetween

gps.locatie.lat(), gps.locatie.lng(), EIFFEL_LAT, EIFFEL_LNG);

dubbele courseToDestination = TinyGPSPlus::courseTo

gps.locatie.lat(), gps.locatie.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(cursusNaarbestemming);

Serial.print(" CurCourse: ");

Serial.print(gps.course.deg());

Serial.print(" Dir2Dest: ");

Serial.print (richtingNaarbestemming);

Serial.print(" RelCourse: ");

Serial.print (cursusChangeNeeded);

Serial.print(" CurSpd: ");

Seriële.println(gps.snelheid.kmph());

// Binnen 20 meter van bestemming? Waren hier

if (distanceToDestination <= 20.0)

{ Serial.println("GEFELICITEERD: je bent gearriveerd!");

uitgang(1);

}

Serial.print("AFSTAND: "); Serial.print (afstand naar bestemming);

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

Serial.print("INSTRUCTIE: ");

// Stilstaan? Geef gewoon aan welke kant je op moet

if (gps.snelheid.kmph() < 2.0)

{

Serial.print("Hoofd");

Serial.print (richtingNaarbestemming);

Serieel.println(".");

opbrengst;

}

if (courseChangeNeeded >= 345 || courseChangeNeeded < 15) Serial.println("Blijf rechtdoor!");

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

Serial.println("Beetje naar links buigen.");

else if (courseChangeNeeded >= 15 && courseChangeNeeded < 45)

Serial.println("Een beetje naar rechts buigen.");

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

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

else if (courseChangeNeeded >= 45 && courseChangeNeeded < 105)

Serial.println("Sla naar rechts.");

anders

Serial.println("Draai je helemaal om.");

}

}

Elke 5 seconden legt de code de locatie en koers van de gebruiker vast (reisrichting) en berekent de peiling (richting naar de bestemming), met behulp van de TinyGPS++ courseTo()-methode. Door de twee vectoren te vergelijken, ontstaat een suggestie om rechtdoor te blijven gaan of te draaien, zoals hieronder wordt weergegeven.

Kopieer de schets FindingYourWay.ino (hierboven) en plak deze in de Arduino IDE. Stel een bestemming in op 1 km of 2 km afstand, upload de schets naar uw Arduino, voer deze uit op uw laptop en kijk of deze u daarheen zal leiden. Maar nog belangrijker, bestudeer de code en begrijp hoe deze werkt.

Stap 9: Verder gaan

Het creatieve potentieel van GPS is enorm. Een van de meest bevredigende dingen die ik ooit heb gemaakt, was een puzzelbox met GPS die slechts op één voorgeprogrammeerde locatie kan worden geopend. Als je slachtoffer de schat binnen wil sluiten, moet ze uitzoeken waar die geheime locatie is en de kist daar fysiek brengen. Een populair eerste projectidee is een soort registratieapparaat dat van minuut tot minuut de positie en hoogte registreert van, laten we zeggen, een wandelaar die de Trans-Pennine Trail loopt. Of hoe zit het met een van die stiekeme magnetische trackers die de DEA-agenten in Breaking Bad op de auto's van de slechteriken plakken? Beide zijn volledig haalbaar en zouden waarschijnlijk leuk zijn om te bouwen, maar ik moedig je aan om uitgebreider te denken, verder dan dingen die je al op Amazon kunt kopen. Het is een grote wereld daarbuiten. Dwaal zo ver en wijd als je kunt.

Aanbevolen: