Moduły GPS FGPMMOP6 oraz NEO6-M
Moduł NEO6-M z oferty sklepu elty.pl
Moduł FGPMMOP6 z oferty sklepu ElectroPark.pl
Jakiś czas temu miałem konieczność zaopatrzenia się mały moduł GPS do jednego z moich projektów.
Moją uwagę przykuły dwa modele - jeden wykorzystujący układ FGPMMOP6 oraz drugi wykorzystujący bardzo popularny układ NEO6 w wersji M. Ceny są bardzo do siebie zbliżone, jednak w ogólnym rozrachunku musiałem postawić tylko na jeden z nich.
Moduły te, pracują standardzie NMEA i komunikują się mikrokontrolerem za pomocą magistrali UART. Bardzo zależało mi, aby odbiornik był on jak najmniejszy z możliwością wpięcia w gniazdo o standardowym rozstawie pinów 2.45mm.
Porównajmy na początek parametry:
FGPMMOP6 | NEO6-M | |
Liczba kanałów | 66 | 50 |
Zimny start / Ciepły start / Gorący start | 35s / 33s / 1s | 27s / 27s / 1s |
Czułość | -165dBm | -161dBm |
Maksymalna częstotliwość pomiaru | 10Hz | 5Hz |
Dokładność pomiaru położenia | 3m | 2.5m |
Dokładność pomiaru prędkości | 0.1m/s | 0.1m/s |
Wbudowana antena | TAK | NIE |
Komunikaty NMEA | GGA, GSA, GSV, RMC, VTG | GGA, GLL, GSA, GSV, RMC, VTG, TXT |
Maksymalna wysokość | 18000m | 50000m |
Maksymalne przyśpieszenie | 515m/s | 500m/s |
Przyglądając się powyższym parametrom pracy obu modułów, bardziej praktycznym może okazać się tańszy NEO6-M. Pierwszym aspektem jest zasilanie modułu. W przypadku FGPMMOP6 jest możliwe teoretycznie zasilanie napięciem 5V, ale nawet producent zaleca zasilanie napięciem 3.3V. Jeśli chodzi zaś o NEO6-M takiego problemu nie ma.
NEO6-M może okazać się również dokładniejszy za sprawą zewnętrznej anteny, gdzie z kolei FGPMMOP6 posiada ją wbudowaną. Czasy jakie potrzebne są do pracy modułu również przemawiają na korzyść NEO-6M i są prawie 30% krótsze.
Jedyną przewagę jaką posiada FGPMMOP6 jest częstotliwość pomiaru, która może wynieść nawet 10Hz - w przypadku NEO6-M jest to tylko 1Hz otrzymujemy 5Hz Pewną zaletą może okazać się również sama budowa modułu FGPMMOP6, pozwalająca wpiąć go jak tradycyjny układ scalony.
Zanim jednak porównamy w boju oba moduły, wypadałoby napisać odrobinę więcej o nawigacji GPS.
Jak działa system GPS w pigułce?
Ogólnie działanie systemu GPS opiera się o trzy podstawowe segmenty: kosmiczny, kontrolny oraz użytkownika. Segment kosmiczny składa się obecnie z 34 satelitów, które krążą po ściśle określonych orbitach na wysokości około 20183 km nad Ziemią. Co ciekawe - czynne jest jedynie 30 z nich, natomiast pozostałe są testowane, bądź wyłączone z przyczyn technicznych. Trajektorie, jak i czasy ich przelotu są tak dobrane (pół doby gwiazdowej 11h 58 min), że w każdej chwili, w dowolnym miejscu na Ziemi, powinno być widoczne od 8 do 12 satelitów. Stąd też wiadomo, gdzie dany satelita powinien się znajdować - na jakiej jest wysokości oraz jaką posiada prędkość oraz kierunek. Wiadome jest również, w jakim czasie sygnał z konkretnego satelity powinien dotrzeć do Ziemi. Te podstawowe informacje, które są potem przetwarzane przez nasz odbiornik GPS nazywamy almanachem. Warto również pamiętać, że satelity wyposażone są w super dokładne zegary, które pozwalają na ustalenie czasu w jakim sygnał został przez nie wysłany. Ważność almanachu w urządzeniu GPS to kilka dni, jednak może przestać być aktualny, gdy nasz odbiornik znacznie zmieni swoją pozycję.
Niestety znajomość almanachu w praktyce nie wystarczy. Jest bowiem wiele czynników, które mogą wpłynąć na trajektorię satelitów oraz szybkość dotarcia sygnału do odbiorcy. Dlatego pojawia się kolejny ważny segment kontrolny, który składa ze stacji naziemnych w różnych zakątkach na Ziemi. Ich zadanie polega na analizie sygnałów emitowany przez każdego satelitę pod kątem zgodności położenia i w razie konieczności korygują trajektorię satelity, umożliwiając jej powrót na właściwy tor. Zbiór tych danych nazywamy efemerydami, które są transmitowane z powrotem do satelity, a następnie satelita wysyła je do odbiorcy. Efemeryda posiada ważność około 5 godzin.
Segment użytkownika jest ostatnim elementem układanki, który polega na precyzyjnym zsynchronizowania zegara odbiornika GPS z zegarami satelitów, gdzie błąd ułamków sekundy przekłada się na błędne określenie naszej pozycji.
Zanim nasz odbiornik GPS przystąpi do określenia naszej dokładnej pozycji, musi więc dogadać się z satelitami odnośnie powyższych kwestii. Czas jaki na to będzie potrzebował może mieścić się w zakresie od 1 do 60 sekund (w zależności od warunków pogodowych, może nawet być to czas dłuższy). Gotowość odbiornika GPS poprzedza więc zimny, ciepły lub gorący start.
Zimny, ciepły, gorący start?
Rozróżniamy kilka rodzajów startu odbiornika GPS: zimny, ciepły i gorący, który definiujemy w zależności od tego, jak bardzo aktualne dane posiada nasz odbiornik. Dla naszych konretrnych modułów są to kolejno 35s, 34s i 1s (FGPMMOP6) oraz 27s, 27s i 1s (NEO6-M).
Zimny start może nastąpić wtedy, gdy almanach jest aktualny, zaś nieaktualne są efemerydy dla poszczególnych satelitów, które biorą udział w bieżącym obliczaniu pozycji. Jak wspomniałem wcześniej, efemeryda zmienia się dla każdego satelity co około 5 godzin, dlatego nawet jeśli nasz odbiornik nie był używany przez krótki czas, konieczna jest ponowna ich aktualizacja ze wszystkich używanych aktualnie satelitów. Oczywiście nasz odbiornik musi upewnić się, że satelita jest prawidłowo zidentyfikowany i jego sygnał jest dostatecznie silny, aby mógł brać udział w określaniu naszej pozycji. Do poprawnego określenia pozycji (2D fix) wymagane są minimum trzy satelity, natomiast dla dodatkowej wysokości (3D fix) są to cztery satelity. Zimny start rozpocznie się oczywiście również wtedy, kiedy almanach będzie nieaktualny.
Ciepły start występuje wtedy, gdy efemerydy dla co najmniej 3 satelitów biorących udział w pozycjonowaniu są aktualne, gdzie pozostaje jedynie precyzyjna synchronizacja czasu z tymi satelitami. Dla naszycg modułów są to czasy 34s i 27s, ale można spotkać również moduły, gdzie czas ten wynosi zaledwie 5 do 10 sekund. Ciepły start może wystąpić po czasie od około 20 minut do 4-5 godzin po ostatnim użytkowaniu odbiornika.
Gorący start nastąpi wtedy, kiedy nasz odbiornik nie rozbiegnie się zegarami satelitów więcej niż 100ms. Taką rozbieżność czasu odbiornik GPS uzyskuje po czasie około 20 minut (stąd też przekroczenie tego czasu, z reguły wymusza już ciepły start). Jeśli różnica jest mniejsza niż 100ms, nasz odbiornik może natychmiast przetwarzać dane z satelitów. Sprawdzenie takiego stanu rzeczy zajmuje około 1 sekundy.
Wyprowadzenia i podłączenie modułu NEO6-M
Moduł NEO6-M nie wymaga do podłączenia z Arduino żadnych dodatkowych elementów. Doskonale radzi sobie z logiką 5V. Podłączenie jest więc bardzo proste, polegające na doprowadzeniu jedynie zasilania, masy oraz linii sygnałowej UART (RX oraz TX).
Chcąc mieć dostęp do konsoli szeregowej w Arduino UNO, linie UART podłączamy do zwykłych pinów cyfrowych, posiłkując się dalej biblioteką SoftwareSerial. Jeśli korzystamy z Arduino Leonardo, zalecane jest podłączenie do sprzętowego UART-a (pin 0,1).
Oczywiście możemy zrobić to również w UNO, o ile nie zamierzamy korzystać z konsoli szeregowej - ten wariant będzie wymagany z innego powodu, ale o tym w dalszej części.
Wyprowadzenia i podłączenie modułu FGPMMOP6
- VCC - zasilanie modułu (3.3V ÷ 5V)
- EN - aktywacja odbiornika stanem wysokim
- GND - masa
- V_BACK - zasilanie zapasowe
- 3D-FIX - sygnalizacja "złapania" 3D-fixa
- 1PPS - wyjście sygnałowe 1Hz
- NC - nie podłączać
- TX, RX - linie transmisyjne UART
Jak wspomniałem wcześniej, pomimo tego, że producent modułu zezwala zasilanie napięciem 5V, to już nota katalogowa mówi, że maksymalne napięcie zasilania to 4.3V. Nie chcąc tego sprawdzać w praktyce, lepiej zasilmy moduł napięciem 3.3V. Problem może pojawić się również na linii Arduino(TX) - GPS(RX), gdzie dla bezpieczeństwa, posłużymy się prostym dzielnikiem napięcia 1.8kΩ / 3.3kΩ, co sprowadzi nam poziom napięcia z 5V do 3.3V. Dla drugiej linii nie jest konieczne stosowanie dzielnika napięcia.
Jeśli chcielibiśmy wykorzystać podtrzymanie bateryjne dla modułu, możemy również zasilić pin V_BACK napięciem 3.3V.
Dla przykładu podepniemy także dwie diody LED pod piny 3D-FIX oraz 1PPS przez rezystory 100Ω.
Pin EN możemy pozostawić wolny.
Standard NMEA
Zanim wgramy nasz pierwszy szkic, zobaczmy jakie informacje będzie zwracał nam moduł, który nieustannie wyrzuca na magistralę UART komunikaty w standrdzie NMEA. Każdy znich zaczyna się odpowiednim prefiksem i zawiera zróżnicowany zestaw danych:
$GPGGA - Global Positioning System Fix Data (czas i pozycja)
$GPGGA,211455.000,5022.3220,N,01850.9486,E,1,4,20.73,337.7,M,42.1,M,,*66 | |||
Parametr | Wartość | Opis | |
Identyfikator | $GPGGA | ||
Czas UTC | 211455.000 | 21:14:55.000 / hhmmss.sss | |
Szerokość geograficzna | 5022.3220,N |
50d 22.3220' N lub 50d 22' 19" N |
|
Długość geograficzna | 01850.9486,E | 18d 50.9486' E lub 18d 50' 57" E ddmm.mmmm, E - wschód, W - zachód |
|
Jakość | 1 | 0:błędna, 1:GPS fix, 2:DGPS fix | |
Liczba użytych seatelitów | 4 | Liczba widocznych satelitów | |
Względna dokładność pozycji poziomej | 20.73 | HDOP | |
Wysokość | 337.7,M | 336,7 metrów (3D fix) | |
Wysokość geoidy powyżej elipsoidy WGS84 | 42.1,M | 42.1 metra | |
Czas od ostatniej aktualizacji DGPS | <brak> | ||
Stacja referencyjna DGPS | <brak> | ||
Suma kontrolna | *66 |
$GPGSA - GPS DOP and active satellites (tryb pracy odbiornika, aktywne satelity)
$GPGSA,A,3,15,21,18,22,,,,,,,,,20.76,20.73,0.97*07 | |||
Parametr | Wartość | Opis | |
Identyfikator | $GPGSA | ||
Tryb pracy | A | M - ręczny, A - automatyczny | |
Tryb fixa | 3 | 1 - brak, 2 - 2D fix, 3 - 3D fix | |
Satelity biorące udział w obliczeniu pozycji | 15,21,18,22,,,,,,,,, | Pola od 3 do 14 | |
PDOP | 20.76 | Rozmycie pozycji | |
HDOP | 20.73 | Rozmycie poziome | |
VDOP | 0.97 | Rozmycie pionowe | |
Suma kontrolna | *07 |
$GPGSV - GPS Satellites in view (ilość widocznych satelit, ich numery identyfikacyjne, azymut)
$GPGSV,3,1,12,27,61,297,,18,60,118,40,16,54,231,14,21,45,071,37*76 $GPGSV,3,2,12,22,44,174,32,26,34,197,15,39,31,171,26,19,30,296,*7D $GPGSV,3,3,12,15,16,059,36,07,10,315,14,13,08,027,23,30,04,343,14*7C |
|||
Parametr | Wartość | Opis | |
Identyfikator | $GPGSV | ||
Ilość wiadomości | 3 | Ile jest dsotępnych wiadomości | |
Numer wiadomości | 1 | Powinny być zwrócone kolejno 1, 2 i 3 | |
Całkowita liczba widocznych sateltów | 12 | ||
Identyfikator satelity | 27 | ||
Elewacja | 61 | Wysokość w stopniach | |
Azymut | 297 | Stopnie od prawdziwej północy | |
Siła sygnału | <brak> | 00-99 dB, wartość pusta jeśli nie bierze udziału | |
Informacje o drugiej satelicie | 18,60,118,40 | Informacje takie same jak w polach 4 - 7 | |
Informacje o trzeciej satelicie | 16,54,231,14 | Informacje takie same jak w polach 4 - 7 | |
Informacje o czwartej satelicie | 21,45,071,37 | Informacje takie same jak w polach 4 - 7 | |
Suma kontrolna | *76 |
Jak widać, widoczne jest 12 sateltitów, każdy komunikat GPGSV zawiera informacje o czterech z nich, dlatego dostaliśmy 3 komunikaty GPGSV.
$GPRMC - Recommended minimum specific GPS/Transit data (czas, data, pozycja, kierunek, prędkość)
$GPRMC,211455.000,A,5022.3220,N,01850.9486,E,1.18,290.28,020515,,,A*6B | |||
Parametr | Wartość | Opis | |
Identyfikator | $GPRMC | ||
Czas UTC | 211455.000 | 21:14:55.000 hhmmss.sss |
|
Poprawność danych | A | A - OK, V - błędne | |
Szerokość geograficzna | 5022.3220,N | 50d 22.3220' N lub 50d 22' 19" N ddmm.mmmm, N - północ, S - południe |
|
Wysokość geograficzna | 01850.9486,E | 18d 50.9486' E lub 18d 50' 57" E ddmm.mmmm, E - wschód, W - zachód |
|
Prędkość w węzłach | 1.18 | ~ 0.6 m/s | |
Prawdziwy kurs | 290.28 | w stopniach | |
Data | 020515 | 2 maja 2015 ddmmyy |
|
Deklinacja magnetyczna | <puste>,<puste> | w stopniach, E (wschód) lub W (zachód) | |
Tryb | A | A – autonomiczny, D – dyferencyjny, E - estymowany | |
Suma kontrolna | *6B |
$GPVTG - Track Made Good and Ground Speed (kierunek i prędkość)
$GPVTG,290.28,T,,M,1.18,N,2.19,K,A*3E | |||
Parametr | Wartość | Opis | |
Identyfikator | $GPVTG | ||
Prawdziwy kurs | 290.28 | w stopniach | |
Poprawność danych | T | T - True track made good | |
Nie używany parametr | <pusty> | ||
Poprawność danych | M | M - Magnetic track made good | |
Prędkość w węzłach | 1.18,N | ~ 0.6 m/s ~ 2.19 km/h | |
Prędkość w km/h | 2.19,K | ||
Tryb | A | A – autonomiczny, D – dyferencyjny, E - estymowany | |
Suma kontrolna | *3E |
Pobieramy surówkę z UART
Na początek nieśmiertelny program do podglądu danych z programowej magistrali szeregowej, którą ustawiamy na 9600bps. Kiedy pojawią się dane z modułu, zostaną one przekopiowane na domyślny port, co pozwoli nam na podgląd w monitorze szeregowym.
- #include <SoftwareSerial.h>
- SoftwareSerial GPS(2, 3); // RX, TX
- void setup()
- {
- Serial.begin(115200);
- while (!Serial) { }
- GPS.begin(9600);
- }
- void loop()
- {
- if (GPS.available())
- {
- Serial.write(GPS.read());
- }
- }
Biblioteka TinyGPS++
Jeśli nie mamy ochoty na samodzielne przetwarzanie komunikatów NMEA, możemy skorzystać ze znanej biblioteki TinyGPS++. Po wgraniu jej do naszych bibliotek, mamy dostęp do kilku dostępnych przykładów, w tym FullExample.ino. Nie zapomnijmy tylko zmienić definicji numerów pinów dla sygnałów RX i TX oraz prędkości 4800bps na 9600bps.
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 4800;
zmieniamy na:
static const int RXPin = 2, TXPin = 3;
static const uint32_t GPSBaud = 9600;
Po wgraniu szkicu do Arduino, możemy cieszyć się kompletem informacji z naszego modułu GPS:
Zbyt wolny SoftwareSerial dla NEO6-M
Jak się okazuje, biblioteka SoftwareSerial jest za wolna dla komunikatów, które wyrzuca NEO6-M. Chociaż moduł działa prawidłowo, to pojawiają się tutaj błędy sum kontrolnych.
Błędy te wynikają z faktu, że moduł NEO6-M wysyła kolejną sekwencję NMEA, zanim Arduino odbierze poprzednią. Na szczęście nie wpływa to na jego ogólne działanie. Dodatkowo należy pamiętać, że problem ten występuję jedynie przy korzystaniu z programowego portu szeregowego (SoftwareSerial). W normalnych warunkach projektowania urządzenia, nie będziemy przecież korzystać z konsoli szeregowej, tylko sprzętowej, a wyniki wyświetlać na wyświetlaczu lub zapisywać na karcie SD.
Test sprzętowego UART-a z wykorzystaniem modułu FTDI
Podgląd programem minicom. Dane odbierane są prawidłowo
NEO6-M i u-center
Ogromnym plusem, który przemawia za modułem NEO6-M jest program u-center, pozwalający na monitorowanie praktycznie każdego parametru modułu. Bardziej zaawansowani użytkownicy mogą dodatkowo zmieniać jego ogromną ilość parametrów pracy, dostosowując go do własnych, indywidualnych potrzeb.
u-center 8.16
Przykład konfiguracji UART:
Podsumowanie
Moduł NEO6-M posiada zdecydowanie większe możliwości od FGPMMOP6, zarówno konfiguracyjne, jak i użytkowe. Biorąc pod uwagę dodatkowy fakt, że jest on tańszy niż FGPMMOP6, czyni go zdecydowanym zwycięzcą. Jedynymi punktami, które przemawiają za FGPMMOP6 są: możliwość wpięcia go jak tradycyjny układ scalony oraz brak kłopotów z biblioteką SoftwareSerial.
Warto również wspomnieć, że NEO6-M może komunikować się mikrokontrolerem nie tylko za pomocą komunikatów NEMA, ale również specjalnego, binarnego protokołu u-blox UBX.
Reklama
Komentarze
w pierwszej tabelce jest "Maksymalna wysokość 4G 4G", zdaje się, że powinno być "Maksymalne przyspieszenie"
Bóg zapłać, dobry człowieku :)
Mam pytanie, w datasheecie odnośnie neo6m znalazłem coś takiego:
Maximum Navigation update rate - NEO-6G/Q/M/T - 5Hz
NEO-6P/V - 1Hz
Czy to błąd, czy faktycznie da się ustawić te 5Hz?
Faktycznie, źle musiałem spojrzeć na pdf-a. Wersja "M" daje radę na 5Hz :) Dzięki za poprawkę.
Wysokość 337.7,M 336,7 metrów (3D fix)
Tu jest jakaś translacja czy to pomyłka?
Oczywiście :) Błąd ;)
Zamówiony .... zrobi się monitoring samochodu bo akurat będę zmianiał :D Do tego SIM900A - mam nadzieję, że firmware zamienię bez problemu.
Niebanalną zaletą FGPMMOP6 jest wyjście na LED, informującą o Fiksie. Nie każdemu jest to potrzebne, ale wystarczy rzucić okiem na GPS leżący na podszybiu i już wiadomo czy mamy Fix czy nie. Z drugiej strony miałem do czynienia tylko ze starszymi modułami (np. SirfStar II), gdzie zgubiony Fix był na porządku dziennym.
Dodam, że moduły GPS używam do systemu APRS.
W zasadzie byłem zdecydowany na NEO..., ale teraz zacząłem się zastanawiać.
Tak czy inaczej, dzięki za wpis. Wiele mi rozjaśnił i ułatwi podjąć decyzję co do modułu, który zamierzam kupić.
W jaki sposób wysłać informację do GPS w celu zmiany prędkości na 4800?
Korneliuszu, proszę Cię! - nagraj poradnik jak zaprogramować te "cholerstwo". Problemy z konfiguracja mam, błędy Time out i braki jakichkolwiek informacji w oknie wgrywania. Potrzebuję z prędkością komunikacji 4800.
Jak można wykorzystać moduł neo6 jako budzik? Chodzi mi o to żeby np co 15 minut (0,15,30,45 m) wykonywał się kod w warunku IF, a dokładnie zapis danych z czujników na kartę SD, bo w przypadku DS3231 jest to jako alarm, natomiast nie wiem jak ugryźć to w tym przypadku.
Wspomniana wartość "maksymalne przyśpieszenie" to raczej "maksymalna prędkość", skoro jednostka miary to [m/s] :-)
Czyli jeśli chcemy poznać swoją pozycję wystarczy iż odkodujemy komunikaty lub , jeśli chodzi natomiast o czas i datę, to możemy się posłużyć jedynie ?
A jak przejść w tryb pracy DGPS?
Czy będzie on współpracował z Galieo (EU GPS)? W sumie pytanie o inne rozwiązania - jak dobrze pamiętam jest jeszcze rosyjski i chiński GPS?
Witam.
Ja mam natomiast problem taki, że nieważne jak podpinam i co próbuje cały czas nie otrzymuje danych od modułu GPS. Dioda od PPS mruga z częstotliwością ok. 1Hz za to otrzymuje coś takiego:
Sats HDOP Latitude Longitude Fix Date Time Date Alt Course Speed Card Distance Course Card Chars Sentences Checksum
(deg) (deg) Age Age (m) --- from GPS ---- ---- to London ---- RX RX Fail
-------------------------------------------------------------------------------------------------------------------------------------
**** **** ********* ********** **** ********** ******** **** ****** ****** ***** *** ******* ****** *** 0 0 0
**** **** ********* ********** **** ********** ******** **** ****** ****** ***** *** ******* ****** *** 0 0 0
i tak dalej. Jak widać Chars RX jest cały czas zero. tak jakby nic nie było wysyłane. Już próbowałem przez SoftwareSerial uzyskać jakiekolwiek dane ale też nic nie uzyskuje. Już nie mam pomysłu co z tym zrobić
W końcu udało mi się ogarnąć moduł gps-a, zwraca odczytane dane, ale mam problem z wysokością i prędkością. Wysokość ciągle pokazuje mi zero, a gps.speed? czy to jest zwracana prędkość np samochodu w km/h?