Inhoudsopgave:
- Stap 1: Hoe het werkt
- Stap 2: Fanfeit
- Stap 3: Aan de slag
- Stap 4: Een teen in de datastroom
- Stap 5: Jezelf vinden
- Stap 6: Coderen met TinyGPS++
- Stap 7: De "VIERDE DIMENSIE"
- Stap 8: Je weg vinden
- Stap 9: Verder gaan
Video: Uw weg vinden met GPS: 9 stappen
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:18
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
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
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
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:
Een eenvoudige robot maken van dingen die je in je huis kunt vinden (hotwheel-versie): 5 stappen
Een eenvoudige robot maken van dingen die je in je huis kunt vinden (hotwheel-versie): deze Instructable laat je zien hoe je een zelfrijdende hotwheel maakt die op dubbele A-batterijen werkt. U hoeft alleen dingen te gebruiken die u waarschijnlijk in uw huis kunt vinden. Houd er rekening mee dat deze robot waarschijnlijk niet helemaal recht gaat, een
Hope's kistverlenging gebruiken om onvolledig tempelverordeningswerk binnen uw stamboom te vinden op Family Search: 11 stappen
Hope's Chest Extension gebruiken om onvolledig tempelverordeningswerk binnen uw stamboom te vinden bij Family Search: Het doel van deze instructie is om te demonstreren hoe u in Family Search uw stamboom kunt doorzoeken op voorouders met onvolledig tempelverordeningswerk met behulp van de Hope's Chest-extensie. Het gebruik van Hope's Chest kan je zoektocht naar incom
ActoKids: een nieuwe manier om activiteiten te vinden: 11 stappen
ActoKids: een nieuwe manier om activiteiten te vinden: Het is belangrijk om kinderen van alle leeftijden en vaardigheden actief en betrokken te houden in hun gemeenschap. Deelname aan activiteiten helpt kinderen gezond te blijven, vriendschappen te sluiten, vaardigheden te ontwikkelen en creativiteit te bevorderen. Echter, het vinden van informatie over een
Arduino vinden: 4 stappen
Arduino vinden: dit is mijn Arduino-werk. Dit is een machine die me kan helpen mijn spullen te vinden als ik wakker word. Als ik op de knop druk, verandert het licht en draaien de lichten in een patroon
WLAN-wachtwoord vinden (u hoeft alleen maar verbinding te maken): 4 stappen
Zoek WLAN-wachtwoord (u hoeft alleen maar verbonden te zijn): Wat ik u vandaag wil laten zien, is eigenlijk slechts een opdracht. Je kunt er echter ook je vrienden mee in de maling nemen! Let op: dit is geen hack om een wlan-wachtwoord te hacken. Het is slechts een manier om het wlan-wachtwoord van het verbonden wlan te achterhalen