Spisu treści:

Znajdowanie drogi z GPS: 9 kroków
Znajdowanie drogi z GPS: 9 kroków

Wideo: Znajdowanie drogi z GPS: 9 kroków

Wideo: Znajdowanie drogi z GPS: 9 kroków
Wideo: Jak działa GPS – proste wyjaśnienie 2024, Listopad
Anonim
Znajdowanie drogi z GPS
Znajdowanie drogi z GPS

Szybkie ćwiczenie w zrozumieniu i zastosowaniu danych GPS

  • Wymagany czas: 2 godziny
  • Koszt: 75–150 USD

Dla twórców włączanie wysokiej jakości danych geoprzestrzennych do projektów elektronicznych stało się dość tanie. W ciągu ostatnich kilku lat moduły odbiornika GPS (Global Positioning System) stały się znacznie bardziej zróżnicowane, wydajne i łatwe do zintegrowania z płytkami rozwojowymi, takimi jak Arduino, PIC, Teensy i Raspberry Pi. Jeśli zastanawiałeś się nad budowaniem wokół GPS, wybrałeś dobry moment, aby zacząć.

Krok 1: Jak to działa

Moduł GPS to niewielki odbiornik radiowy, który przetwarza sygnały nadawane na znanych częstotliwościach przez flotę satelitów. Satelity te krążą wokół Ziemi po mniej więcej kołowych orbitach, przesyłając niezwykle precyzyjne dane pozycyjne i zegarowe na ziemię poniżej. Jeśli odbiornik naziemny „widzi” wystarczającą liczbę tych satelitów, może ich użyć do obliczenia własnej lokalizacji i wysokości.

Gdy nadejdzie wiadomość GPS, odbiornik najpierw sprawdza swój znacznik czasu emisji, aby zobaczyć, kiedy została wysłana. Ponieważ prędkość fali radiowej w kosmosie jest znaną stałą (c), odbiornik może porównać czasy nadawania i odbioru, aby określić odległość, jaką przebył sygnał. Po ustaleniu odległości od czterech lub więcej znanych satelitów obliczenie własnej pozycji jest dość prostym problemem triangulacji 3D. Aby jednak zrobić to szybko i dokładnie, odbiornik musi być w stanie zwinnie analizować liczby z maksymalnie 20 strumieni danych naraz. Ponieważ system GPS ma opublikowany cel, aby można go było używać na całym świecie, system musi zapewnić, że co najmniej cztery satelity - najlepiej więcej - są widoczne przez cały czas z każdego punktu na kuli ziemskiej. Obecnie 32 satelity GPS wykonują skrupulatnie ułożony taniec w rzadkiej chmurze na wysokości 20 000 kilometrów.

Krok 2: Fakt wentylatora

GPS nie mógłby działać bez teorii względności Einsteina, ponieważ należy skompensować 38 mikrosekund, które orbitujące zegary atomowe zyskują każdego dnia od dylatacji czasu w polu grawitacyjnym Ziemi.

Krok 3: Pierwsze kroki

Pierwsze kroki
Pierwsze kroki

Niezależnie od projektu, GPS jest łatwy do zintegrowania. Większość modułów odbiornika komunikuje się za pomocą prostego protokołu szeregowego, więc jeśli możesz znaleźć wolny port szeregowy na płycie kontrolera, wykonanie fizycznego połączenia powinno zająć tylko kilka przewodów. A nawet jeśli nie, większość kontrolerów obsługuje emulowany „programowy” tryb szeregowy, którego można użyć do połączenia z dowolnymi pinami.

Dla początkujących dobrym wyborem będzie moduł Adafruit Ultimate GPS Breakout. Na rynku dostępnych jest wiele konkurencyjnych produktów, ale Ultimate to solidne urządzenie w rozsądnej cenie, z dużymi otworami przelotowymi, które można łatwo przylutować lub podłączyć do płytki stykowej.

Najpierw podłącz uziemienie i zasilanie. W terminologii Arduino oznacza to podłączenie jednego z pinów GND mikrokontrolera do GND modułu, a pinu +5V do VIN modułu. Aby zarządzać transferem danych, musisz również podłączyć piny TX i RX modułu do Arduino. W tym celu arbitralnie wybiorę piny 2 (TX) i 3 (RX) Arduino, mimo że piny 0 i 1 są specjalnie zaprojektowane do użytku jako „sprzętowy port szeregowy” lub UART. Dlaczego? Ponieważ nie chcę marnować jedynego UARTa, jaki mają te low-endowe procesory AVR. UART Arduino jest podłączony na stałe do wbudowanego złącza USB i lubię trzymać go podłączony do komputera w celu debugowania.

Krok 4: Paluch w strumieniu danych

Palec w strumieniu danych
Palec w strumieniu danych

Natychmiast po włączeniu zasilania moduł GPS zaczyna wysyłać fragmenty danych tekstowych na linii TX. Może jeszcze nie widzieć ani jednego satelity, a tym bardziej mieć „naprawę”, ale kurek danych włącza się od razu i interesujące jest obserwowanie, co z niego wyjdzie. Nasz pierwszy prosty szkic (poniżej) nie robi nic poza wyświetlaniem tych nieprzetworzonych danych.

#włącz #zdefiniuj RXPin 2

#zdefiniuj TXPin 3#zdefiniuj GPSBaud 4800

#define KonsolaBaud 115200

// Połączenie szeregowe z urządzeniem GPSSoftwareSerial ss(RXPin, TXPin);

pusta konfiguracja (){

Serial.początek(Baud konsoli);

ss.początek(GPSBaud);

Serial.println("Przykład GPS 1");

Serial.println("Wyświetlanie surowych danych NMEA przesyłanych przez moduł GPS.");

Serial.println("przez Mikala Harta"); Serial.println();

}

pusta pętla()

{ if (ss.available() > 0) // Po nadejściu każdego znaku…

Serial.write(ss.read()); // … zapisz go w konsoli

}

UWAGA: Szkic definiuje pin odbiorczy (RXPin) jako 2, mimo że powiedzieliśmy wcześniej, że pin nadawczy (TX) będzie podłączony do pinu 2. Jest to powszechne źródło nieporozumień. RXPin to pin odbiorczy (RX) z punktu widzenia Arduino. Oczywiście musi być podłączony do pinu transmisyjnego (TX) modułu i odwrotnie.

Prześlij ten szkic i otwórz Serial Monitor z prędkością 115, 200 bodów. Jeśli wszystko działa, powinieneś zobaczyć gęsty, niekończący się strumień ciągów tekstowych oddzielonych przecinkami. Każdy z nich będzie wyglądał jak drugi obrazek na początku akapitu.

Te charakterystyczne ciągi są znane jako zdania NMEA, tak zwane, ponieważ format został wymyślony przez National Maritime Electronics Association. NMEA definiuje szereg tych zdań dla danych nawigacyjnych, począwszy od podstawowych (lokalizacja i czas), do ezoterycznych (stosunek sygnału do szumu satelity, wariancja magnetyczna itp.). Producenci nie są konsekwentni w kwestii tego, jakich typów zdań używają ich odbiorcy, ale GPRMC jest niezbędne. Gdy twój moduł otrzyma poprawkę, powinieneś zobaczyć sporą liczbę zdań GPRMC.

Krok 5: Odnalezienie siebie

Nie jest łatwo przekonwertować surowe dane wyjściowe modułu na informacje, z których może korzystać Twój program. Na szczęście istnieje już kilka świetnych bibliotek, które mogą to zrobić za Ciebie. Popularna biblioteka GPS Adafruit firmy Limor Fried to wygodny wybór, jeśli korzystasz z ich Ultimate Breakout. Został napisany, aby włączyć funkcje unikalne dla Ultimate (takie jak wewnętrzne rejestrowanie danych) i dodaje kilka własnych dzwonków i gwizdów. Jednak moją ulubioną biblioteką do przetwarzania - i tutaj jestem oczywiście całkowicie bezstronna - jest ta, którą napisałem, nazwana TinyGPS++. Zaprojektowałem go tak, aby był wszechstronny, wydajny, zwięzły i łatwy w użyciu. Weźmy to na przejażdżkę.

Krok 6: Kodowanie za pomocą TinyGPS++

Z punktu widzenia programisty korzystanie z TinyGPS++ jest bardzo proste:

1) Utwórz obiekt gps.

2) Kieruj każdy znak przychodzący z modułu do obiektu za pomocą gps.encode().

3) Gdy chcesz poznać swoją pozycję lub wysokość, godzinę lub datę, po prostu zapytaj o obiekt GPS.

#włącz #włącz

#define RXPin 2

#zdefiniuj pinezkę TX 3

#define GPSBaud 4800

#define KonsolaBaud 115200

// Połączenie szeregowe z urządzeniem GPSSoftwareSerial ss(RXPin, TXPin);

// Obiekt TinyGPS++

Mały GPSPlus;

pusta konfiguracja (){

Serial.początek(Baud konsoli);

ss.początek(GPSBaud);

Serial.println("Przykład GPS 2");

Serial.println("Prosty tracker używający TinyGPS++.");

Serial.println("przez Mikala Harta");

Serial.println();

}

pusta pętla () {

// Jeśli z GPS dotarły jakieś znaki, /

/ wyślij je do obiektu TinyGPS++

podczas gdy (ss.available() > 0)

gps.encode(ss.read());

// Wyświetlmy nową lokalizację i wysokość

// gdy któryś z nich został zaktualizowany

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

{

Serial.print("Lokalizacja: ");

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

Serial.print(", ");

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

Serial.print(" Wysokość: ");

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

}

}

Nasza druga aplikacja stale wyświetla lokalizację i wysokość odbiornika, używając TinyGPS++ do pomocy w parsowaniu. W prawdziwym urządzeniu możesz zapisać te dane na karcie SD lub wyświetlić je na wyświetlaczu LCD. Chwyć bibliotekę i naszkicuj FindingYourself.ino (powyżej). Zainstaluj bibliotekę, jak zwykle, w folderze bibliotek Arduino. Prześlij szkic do Arduino i otwórz Serial Monitor z prędkością 115, 200 bodów. Twoja lokalizacja i wysokość powinny być aktualizowane w czasie rzeczywistym. Aby zobaczyć, gdzie dokładnie stoisz, wklej niektóre z otrzymanych współrzędnych szerokości/długości geograficznej do Map Google. Teraz podłącz laptopa i wybierz się na spacer lub przejażdżkę. (Ale pamiętaj, aby patrzeć na drogę!)

Krok 7: „CZWARTY WYMIAR”

chociaż kojarzymy GPS z lokalizacją w kosmosie, nie zapominaj, że te satelity przesyłają również znaczniki czasu i daty. Przeciętny zegar GPS jest dokładny do jednej dziesięciomilionowej sekundy, a teoretyczny limit jest jeszcze wyższy. Nawet jeśli potrzebujesz tylko swojego projektu do śledzenia czasu, moduł GPS może nadal być najtańszym i najłatwiejszym rozwiązaniem.

Aby zmienić FindingYourself.ino w super dokładny zegar, po prostu zmień kilka ostatnich linijek w ten sposób:

if (gps.time.isUpdated()) {

bufor char[80];

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

}

Krok 8: Znajdowanie swojej drogi

Znalezienie drogi
Znalezienie drogi

Nasza trzecia i ostatnia aplikacja jest wynikiem osobistego wyzwania polegającego na napisaniu czytelnego szkicu TinyGPS ++, w mniej niż 100 wierszach kodu, który poprowadzi użytkownika do miejsca docelowego za pomocą prostych instrukcji tekstowych, takich jak „trzymaj się prosto” lub „skręć w lewo”.

#włącz #włącz

#define RXPin 2

#zdefiniuj pinezkę TX 3

#define GPSBaud 4800

#define KonsolaBaud 115200

// Połączenie szeregowe z urządzeniem GPSSoftwareSerial ss(RXPin, TXPin);

// Obiekt TinyGPS++ TinyGPSPlus gps;

unsigned long lastUpdateTime = 0;

#zdefiniuj EIFFEL_LAT 48.85823#zdefiniuj EIFFEL_LNG 2.29438

/* Ten przykład pokazuje podstawowe ramy, w jaki sposób można wykorzystać kurs i odległość, aby poprowadzić osobę (lub drona) do celu. Tym celem jest Wieża Eiffla. Zmień to zgodnie z wymaganiami

Najłatwiejszym sposobem uzyskania współrzędnej szerokości/długości jest kliknięcie prawym przyciskiem myszy miejsca docelowego w Mapach Google (maps.google.com) i wybranie opcji „Co tu jest?”. Spowoduje to umieszczenie dokładnych wartości w polu wyszukiwania

*/

pusta konfiguracja (){

Serial.początek(Baud konsoli);

ss.początek(GPSBaud);

Serial.println("Przykład GPS 3");

Serial.println("Niezbyt kompleksowy system nawigacji");

Serial.println("przez Mikala Harta");

Serial.println();

}

pusta pętla () {

// Jeśli jakieś znaki dotarły z GPS, // wyślij je do obiektu TinyGPS++ while (ss.available() > 0) gps.encode(ss.read());

// Co 5 sekund wykonaj aktualizację

if (millis() - lastUpdateTime >= 5000)

{

lastUpdateTime = millis();

Serial.println();

// Ustal nasz obecny status

podwójna odległośćDoMiejsca docelowego = TinyGPSPlus::distanceBetween

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

double courseToDestination = TinyGPSPlus::courseTo

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

const char *directionToDestination = TinyGPSPlus::cardinal(courseToDestination);

int courseChangeNeeded = (int)(360 + courseToDestination - gps.course.deg()) % 360;

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

Serial.print(kurs do miejsca docelowego);

Serial.print("Kurs:");

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

Serial.print(" Dir2Dest: ");

Serial.print(kierunekDoMiejscaDocelowego);

Serial.print("RelCourse:");

Serial.print(Wymagana zmiana kursu);

Serial.print("CurSpd: ");

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

// W promieniu 20 metrów od celu? Były tu

if (odległość do miejsca docelowego <= 20,0)

{ Serial.println("GRATULACJE: Przyjechałeś!");

wyjście (1);

}

Serial.print("ODLEGŁOŚĆ: "); Serial.print(odległość do miejsca docelowego);

Serial.println(" metry do przebycia.");

Serial.print("INSTRUKCJA: ");

// Stojąc w miejscu? Po prostu wskaż, w którym kierunku iść

jeśli (gps.prędkość.km/h() < 2.0)

{

Serial.print("Główka");

Serial.print(kierunekDoMiejscaDocelowego);

Serial.println(".");

powrót;

}

if (kursChangeNeeded >= 345 || courseChangeNeeded < 15) Serial.println("Idź prosto!");

else if (PotrzebnaZmianaKursu >= 315 &&WymaganaZmianaKursu < 345)

Serial.println("Skręć lekko w lewo.");

else if (PotrzebnaZmianaKursu >= 15 &&WymaganaZmianaKursu < 45)

Serial.println("Skręć lekko w prawo.");

else if (PotrzebnaZmianaKursu >= 255 &&WymaganaZmianaKursu < 315)

Serial.println("Skręć w lewo.");

else if (PotrzebnaZmianaKursu >= 45 &&WymaganaZmianaKursu < 105)

Serial.println("Skręć w prawo.");

w przeciwnym razie

Serial.println("Odwróć się całkowicie.");

}

}

Co 5 sekund kod przechwytuje lokalizację i kurs użytkownika (kierunek podróży) i oblicza namiar (kierunek do celu), wykorzystując metodę TinyGPS++ courseTo(). Porównanie tych dwóch wektorów generuje sugestię, aby jechać prosto lub skręcić, jak pokazano poniżej.

Skopiuj szkic FindingYourWay.ino (powyżej) i wklej go do Arduino IDE. Ustaw miejsce docelowe w odległości 1 km lub 2 km, prześlij szkic do Arduino, uruchom go na laptopie i zobacz, czy Cię tam zaprowadzi. Ale co ważniejsze, przestudiuj kod i zrozum, jak to działa.

Krok 9: Idź dalej

Potencjał twórczy GPS jest ogromny. Jedną z najbardziej satysfakcjonujących rzeczy, jakie kiedykolwiek zrobiłem, było pudełko z łamigłówką z obsługą GPS, które otwiera się tylko w jednym zaprogramowanym miejscu. Jeśli twoja ofiara chce zamknąć skarb w środku, musi dowiedzieć się, gdzie znajduje się ta tajna lokalizacja i fizycznie przenieść tam pudełko. Popularnym pomysłem na pierwszy projekt jest coś w rodzaju urządzenia rejestrującego, które minuta po minucie rejestruje pozycję i wysokość, powiedzmy, wędrowca idącego Szlakiem Trans-Pennińskim. A co z jednym z tych podstępnych magnetycznych trackerów, które agenci DEA w Breaking Bad przyczepiają do samochodów złoczyńców? Oba są całkowicie wykonalne i prawdopodobnie fajnie byłoby je zbudować, ale zachęcam do bardziej ekspansywnego myślenia, poza rzeczami, które już możesz kupić na Amazon. Tam jest wielki świat. Wędruj tak daleko i szeroko, jak tylko możesz.

Zalecana: