Inhaltsverzeichnis:

Finden Sie Ihren Weg mit GPS - Gunook
Finden Sie Ihren Weg mit GPS - Gunook

Video: Finden Sie Ihren Weg mit GPS - Gunook

Video: Finden Sie Ihren Weg mit GPS - Gunook
Video: Mit diesen Profi Tipps zum erfolgreichen Marathon! 2024, Juli
Anonim
Finden Sie Ihren Weg mit GPS
Finden Sie Ihren Weg mit GPS

Eine kurze Übung zum Verstehen und Anwenden von GPS-Daten

  • Benötigte Zeit: 2 Stunden
  • Kosten: $75–$150

Für Hersteller ist es recht günstig geworden, hochwertige Geodaten in Elektronikprojekte zu integrieren. Und in den letzten Jahren sind GPS-Empfängermodule (Global Positioning System) viel vielfältiger, leistungsfähiger geworden und lassen sich einfach in Entwicklungsboards wie Arduino, PIC, Teensy und Raspberry Pi integrieren. Wenn Sie daran denken, rund um GPS zu bauen, haben Sie einen guten Zeitpunkt für den Einstieg gewählt.

Schritt 1: Wie es funktioniert

Ein GPS-Modul ist ein winziger Funkempfänger, der Signale verarbeitet, die von einer Flotte von Satelliten auf bekannten Frequenzen ausgestrahlt werden. Diese Satelliten wirbeln in etwa kreisförmigen Umlaufbahnen um die Erde und übertragen äußerst präzise Positions- und Uhrdaten an den Boden darunter. Wenn der erdgebundene Empfänger genug von diesen Satelliten „sehen“kann, kann er daraus seinen eigenen Standort und seine Höhe berechnen.

Wenn eine GPS-Nachricht eintrifft, überprüft der Empfänger zuerst seinen Sendezeitstempel, um zu sehen, wann sie gesendet wurde. Da die Geschwindigkeit einer Funkwelle im Weltraum eine bekannte Konstante (c) ist, kann der Empfänger Sende- und Empfangszeiten vergleichen, um die Entfernung zu bestimmen, die das Signal zurückgelegt hat. Sobald er seinen Abstand zu vier oder mehr bekannten Satelliten ermittelt hat, ist die Berechnung seiner eigenen Position ein ziemlich einfaches Problem der 3D-Triangulation. Um dies jedoch schnell und genau zu tun, muss der Empfänger in der Lage sein, Zahlen aus bis zu 20 Datenströmen gleichzeitig flink zu berechnen. Da das GPS-System das veröffentlichte Ziel hat, überall auf der Erde einsetzbar zu sein, muss das System sicherstellen, dass mindestens vier Satelliten - am besten mehr - sind jederzeit von jedem Punkt der Erde aus sichtbar. Derzeit führen 32 GPS-Satelliten einen akribisch choreografierten Tanz in einer 20.000 Kilometer hohen Wolke auf.

Schritt 2: Fan-Tatsache

GPS könnte ohne Einsteins Relativitätstheorie nicht funktionieren, denn die 38 Mikrosekunden, die die umlaufenden Atomuhren täglich durch die Zeitdilatation im Gravitationsfeld der Erde gewinnen, müssen kompensiert werden.

Schritt 3: Erste Schritte

Einstieg
Einstieg

Was auch immer Ihr Projekt ist, GPS ist einfach zu integrieren. Die meisten Empfängermodule kommunizieren mit einem unkomplizierten seriellen Protokoll. Wenn Sie also einen freien seriellen Port auf Ihrer Controller-Platine finden, sollten Sie nur eine Handvoll Kabel benötigen, um die physische Verbindung herzustellen. Und selbst wenn nicht, unterstützen die meisten Controller einen emulierten seriellen „Software“-Modus, mit dem Sie beliebige Pins anschließen können.

Für Anfänger ist das Ultimate GPS Breakout-Modul von Adafruit eine gute Wahl. Es gibt viele Konkurrenzprodukte auf dem Markt, aber der Ultimate ist ein solider Performer zu einem vernünftigen Preis, mit großen Durchgangslöchern, die leicht zu löten oder an ein Steckbrett anzuschließen sind.

Verbinden Sie zuerst Masse und Strom. In Arduino-Begriffen bedeutet dies, einen der GND-Pins des Mikrocontrollers mit dem GND des Moduls und den +5V-Pin mit der VIN des Moduls zu verbinden. Um die Datenübertragung zu verwalten, müssen Sie auch die TX- und RX-Pins des Moduls mit dem Arduino verbinden. Ich werde zu diesem Zweck willkürlich die Arduino-Pins 2 (TX) und 3 (RX) auswählen, obwohl die Pins 0 und 1 speziell für die Verwendung als "Hardware Serial Port" oder UART ausgelegt sind. Warum? Weil ich nicht den einzigen UART verschwenden möchte, den diese Low-End-AVR-Prozessoren haben. Arduinos UART ist fest mit dem Onboard-USB-Anschluss verdrahtet, und ich lasse ihn gerne zum Debuggen mit meinem Computer verbunden.

Schritt 4: Ein Zeh im Datenstrom

Ein Zeh im Datenstrom
Ein Zeh im Datenstrom

Sobald Sie die Stromversorgung einschalten, beginnt ein GPS-Modul, Textdatenblöcke auf seiner TX-Leitung zu senden. Es kann noch keinen einzigen Satelliten sehen, geschweige denn einen „Fix“haben, aber der Datenhahn geht sofort an, und es ist interessant zu sehen, was dabei herauskommt. Unsere erste einfache Skizze (unten) zeigt nur diese unverarbeiteten Daten an.

#include #define RXPin 2

#define TXPin 3#define GPSBaud 4800

#define ConsoleBaud 115200

// Die serielle Verbindung zum GPS-GerätSoftwareSerial ss(RXPin, TXPin);

Void-Setup () {

Serial.begin (ConsoleBaud);

ss.begin(GPSBaud);

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

Serial.println ("Anzeige der vom GPS-Modul übertragenen NMEA-Rohdaten.");

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

}

Leere Schleife ()

{ if (ss.available() > 0) // Wenn jedes Zeichen ankommt…

Serial.write (ss.read ()); // … in die Konsole schreiben

}

HINWEIS: Die Skizze definiert den Empfangspin (RXPin) als 2, obwohl wir zuvor gesagt haben, dass der Sendepin (TX) mit Pin 2 verbunden wäre. Dies ist eine häufige Ursache für Verwirrung. RXPin ist aus Arduino-Sicht der Empfangspin (RX). Natürlich muss es mit dem Sendepin (TX) des Moduls verbunden werden und umgekehrt.

Laden Sie diese Skizze hoch und öffnen Sie Serial Monitor mit 115, 200 Baud. Wenn alles funktioniert, sollten Sie einen dichten, endlosen Strom von durch Kommas getrennten Textzeichenfolgen sehen. Jedes sieht ungefähr wie das zweite Bild am Anfang des Absatzes aus.

Diese unverwechselbaren Zeichenfolgen sind als NMEA-Sätze bekannt, so genannt, weil das Format von der National Maritime Electronics Association erfunden wurde. NMEA definiert eine Reihe dieser Sätze für Navigationsdaten, die vom Wesentlichen (Ort und Zeit) bis hin zu esoterischen (Satelliten-Signal-Rausch-Verhältnis, magnetische Varianz usw.) reichen. Hersteller sind sich nicht einig, welche Satztypen ihre Empfänger verwenden, aber GPRMC ist unerlässlich. Sobald Ihr Modul behoben wurde, sollten Sie eine angemessene Anzahl dieser GPRMC-Sätze sehen.

Schritt 5: Sich selbst finden

Es ist nicht trivial, die Rohmodulausgabe in Informationen umzuwandeln, die Ihr Programm tatsächlich verwenden kann. Glücklicherweise gibt es bereits einige großartige Bibliotheken, die dies für Sie tun. Die beliebte Adafruit GPS-Bibliothek von Limor Fried ist eine bequeme Wahl, wenn Sie ihren Ultimate Breakout verwenden. Es wurde geschrieben, um einzigartige Funktionen des Ultimate zu ermöglichen (wie die interne Datenprotokollierung) und fügt einige pfiffige Schnickschnack hinzu. Meine Lieblings-Parsing-Bibliothek jedoch - und da bin ich natürlich völlig unvoreingenommen - ist die, die ich geschrieben habe namens TinyGPS++. Ich habe es so konzipiert, dass es umfassend, leistungsstark, prägnant und einfach zu bedienen ist. Lassen Sie uns eine Runde drehen.

Schritt 6: Codierung mit TinyGPS++

Aus der Sicht des Programmierers ist die Verwendung von TinyGPS++ sehr einfach:

1) Erstellen Sie ein GPS-Objekt.

2) Leiten Sie jedes Zeichen, das vom Modul ankommt, mit gps.encode() an das Objekt weiter.

3) Wenn Sie Ihre Position oder Höhe oder Zeit oder Datum wissen müssen, fragen Sie einfach das GPS-Objekt ab.

#einschließen #einschließen

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Die serielle Verbindung zum GPS-GerätSoftwareSerial ss(RXPin, TXPin);

// Das TinyGPS++-Objekt

TinyGPSPlus-GPS;

Void-Setup () {

Serial.begin (ConsoleBaud);

ss.begin(GPSBaud);

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

Serial.println ("Ein einfacher Tracker mit TinyGPS ++.");

Serial.println ("von Mikal Hart");

Serial.println();

}

Leere Schleife () {

// Wenn Zeichen vom GPS angekommen sind, /

/ sende sie an das TinyGPS++ Objekt

while (ss.verfügbar() > 0)

gps.encode(ss.read());

// Lassen Sie uns den neuen Standort und die neue Höhe anzeigen

// wann immer einer von ihnen aktualisiert wurde

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

{

Serial.print("Ort:");

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

Serial.print (", ");

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

Serial.print ("Höhe: ");

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

}

}

Unsere zweite Anwendung zeigt kontinuierlich den Standort und die Höhe des Empfängers an und verwendet TinyGPS++, um beim Parsen zu helfen. In einem echten Gerät können Sie diese Daten auf einer SD-Karte protokollieren oder auf einem LCD anzeigen. Schnappen Sie sich die Bibliothek und skizzieren Sie FindingYourself.ino (oben). Installieren Sie die Bibliothek wie gewohnt im Arduino-Bibliotheksordner. Laden Sie die Skizze auf Ihren Arduino hoch und öffnen Sie Serial Monitor bei 115, 200 Baud. Sie sollten sehen, wie sich Ihr Standort und Ihre Höhe in Echtzeit aktualisieren. Um genau zu sehen, wo Sie stehen, fügen Sie einige der resultierenden Breiten-/Längen-Koordinaten in Google Maps ein. Schließen Sie jetzt Ihren Laptop an und machen Sie einen Spaziergang oder eine Fahrt. (Aber denken Sie daran, die Straße im Auge zu behalten!)

Schritt 7: Die "VIERTE DIMENSION"

Obwohl wir GPS mit der Position im Weltraum assoziieren, vergessen Sie nicht, dass diese Satelliten auch Zeit- und Datumsstempel senden. Die durchschnittliche GPS-Uhr ist auf eine Zehnmillionstelsekunde genau, und die theoretische Grenze liegt noch höher. Auch wenn Sie Ihr Projekt nur zur Zeiterfassung benötigen, kann ein GPS-Modul dennoch die günstigste und einfachste Lösung sein.

Um FindingYourself.ino in eine supergenaue Uhr zu verwandeln, ändern Sie einfach die letzten Zeilen wie folgt:

if (gps.time.isUpdated()) {

kohle buf[80];

sprintf(buf, "Die Zeit ist %02d:%02d:%02d", gps.time.hour(), gps.time.minute(), gps.time.second()); Serial.println (buf);

}

Schritt 8: Finden Sie Ihren Weg

Deinen Weg finden
Deinen Weg finden

Unsere dritte und letzte Anwendung ist das Ergebnis einer persönlichen Herausforderung, eine lesbare TinyGPS++-Skizze mit weniger als 100 Codezeilen zu schreiben, die einen Benutzer mit einfachen Textanweisungen wie „gerade halten“oder „links abbiegen“zu einem Ziel führt.

#einschließen #einschließen

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Die serielle Verbindung zum GPS-GerätSoftwareSerial ss(RXPin, TXPin);

// Das TinyGPS++-Objekt TinyGPSPlus gps;

unsigned long lastUpdateTime = 0;

#define EIFFEL_LAT 48.85823#define EIFFEL_LNG 2.29438

/* Dieses Beispiel zeigt ein grundlegendes Gerüst dafür, wie Sie Kurs und Entfernung verwenden können, um eine Person (oder eine Drohne) zu einem Ziel zu führen. Dieses Ziel ist der Eiffelturm. Ändern Sie es nach Bedarf

Am einfachsten erhalten Sie die Breiten-/Längenkoordinate, indem Sie in Google Maps (maps.google.com) mit der rechten Maustaste auf das Ziel klicken und "Was ist hier?" auswählen. Dadurch werden die genauen Werte in das Suchfeld eingefügt

*/

Void-Setup () {

Serial.begin (ConsoleBaud);

ss.begin(GPSBaud);

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

Serial.println ("Ein nicht so umfassendes Leitsystem");

Serial.println ("von Mikal Hart");

Serial.println();

}

Leere Schleife () {

// Wenn Zeichen vom GPS angekommen sind, // diese an das TinyGPS++ Objekt senden while (ss.available() > 0) gps.encode(ss.read());

// Alle 5 Sekunden ein Update durchführen

if (millis() - lastUpdateTime >= 5000)

{

lastUpdateTime = millis();

Serial.println();

// Ermitteln Sie unseren aktuellen Status

double distanceToDestination = TinyGPSPlus::distanceBetween

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

doublecourseToDestination = 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;

// Debuggen Serial.print ("DEBUG: Course2Dest:");

Serial.print (courseToDestination);

Serial.print("CurseCourse:");

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

Serial.print (" Dir2Dest: ");

Serial.print (directionToDestination);

Serial.print ("RelCourse:");

Serial.print (KursChangeNeeded);

Serial.print("CurSpd:");

Serial.println (gps.speed.kmph());

// Innerhalb von 20 Metern vom Ziel? Waren hier

if (distanzToDestination <= 20.0)

{Serial.println ("HERZLICHEN GLÜCKWUNSCH: Sie sind angekommen!");

Ausgang(1);

}

Serial.print ("ABSTAND:"); Serial.print (distanzToDestination);

Serial.println ("Meter zu gehen.");

Serial.print ("ANWEISUNG:");

// Still stehen? Geben Sie einfach an, in welche Richtung es gehen soll

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

{

Serial.print ("Kopf");

Serial.print (directionToDestination);

Serial.println(".");

Rückkehr;

}

if (courseChangeNeeded >= 345 || CourseChangeNeeded < 15) Serial.println ("Weiter geradeaus!");

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

Serial.println ("Gehen Sie leicht nach links.");

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

Serial.println ("Schwenken Sie leicht nach rechts.");

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

Serial.println ("Nach links abbiegen.");

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

Serial.println ("Nach rechts drehen.");

anders

Serial.println ("Vollständig umdrehen.");

}

}

Alle 5 Sekunden erfasst der Code den Standort und Kurs des Benutzers (Fahrtrichtung) und berechnet die Peilung (Richtung zum Ziel) mithilfe der TinyGPS++ CourseTo()-Methode. Der Vergleich der beiden Vektoren erzeugt einen Vorschlag, wie unten gezeigt, geradeaus zu fahren oder abzubiegen.

Kopieren Sie die Skizze FindingYourWay.ino (oben) und fügen Sie sie in die Arduino IDE ein. Legen Sie ein 1 km oder 2 km entferntes Ziel fest, laden Sie die Skizze auf Ihren Arduino hoch, führen Sie sie auf Ihrem Laptop aus und sehen Sie, ob sie Sie dorthin führt. Aber noch wichtiger ist, den Code zu studieren und zu verstehen, wie er funktioniert.

Schritt 9: Weiter gehen

Das kreative Potenzial von GPS ist enorm. Eines der befriedigendsten Dinge, die ich je gemacht habe, war eine GPS-fähige Puzzlebox, die sich nur an einem vorprogrammierten Ort öffnet. Wenn Ihr Opfer den Schatz einschließen möchte, muss es herausfinden, wo sich dieser geheime Ort befindet, und die Kiste physisch dorthin bringen. Eine beliebte erste Projektidee ist eine Art Logging-Gerät, das die Position und Höhe eines Wanderers auf dem Trans-Pennine Trail von Minute zu Minute aufzeichnet. Oder was ist mit einem dieser hinterhältigen Magnettracker, die die DEA-Agenten in Breaking Bad auf die Autos der Bösewichte kleben? Beides ist absolut machbar und würde wahrscheinlich Spaß machen, aber ich ermutige Sie, umfassender zu denken, über Dinge hinaus, die Sie bereits bei Amazon kaufen können. Es ist eine große Welt da draußen. Durchstreifen Sie so weit und breit wie Sie können.

Empfohlen: