Rozszerzenie GPS dla Raspberry Pi

Ostatnio dostałem do testów rozszerzenie GPS dla Raspberry:

IMG_0975Rozszerzenie opisano jako: Raspberry Pi Hat GPS GTS-4E-60.  Jest kompatybilne z A+, B+, Pi2 i Zero (40-sto pinowe GPIO). Sprzedawane jest w dwóch wersjach: z anteną pasywną (tutaj: Pi Hat GPS z anteną pasywną na electropark.pl) oraz aktywną (tutaj: Pi Hat GPS z anteną aktywną na electropark.pl). I to właśnie tym drugim modelem miałem szansę się pobawić.


Sprzęt do testów dostarczył electropark.pl
electropark_logo


GPS

Rozszerzenie wyposażono w czip Fibocom GTS-4E-60 oparty na SIRF-IV. Producent obiecuje zimny start w 35 s a gorący – w ciągu 1s.

Zimny start (cold start): bez poprzednich namiarów i bez jakichkolwiek załadowanych danych – np. dopiero co włączony gps, nieaktywny dłużej niż kilka godzin.

Gorący start (hot start): ostatnio włączony nie dawniej niż 2 godziny temu – niektóre z poprawek na położenie satelit mogą być jeszcze w miarę aktualne.

Rozszerzenie komunikuje się z Raspberry za pomocą interfejsu UART (szeregowego) z szybkością 9600bps. Zgodnie z instrukcją, zastosowany model czipu GPS nie wspiera komunikacji po SPI – funkcjonlność ta jest dostępna jedynie dla wersji GTS-4E-50 i GTS-4E-70.

Czip GPS Fibocom (pobrane z instrukcji na electropark.pl)
Czip GPS Fibocom (pobrane z instrukcji na electropark.pl)

Spójrzmy na kilka co ciekawszych pinów:

  • Pin 3: TIMEPULSE: PPS – emituje sygnał co 1s; tutaj podłączone przez rezystor do diody,
  • Pin 11: RF_IN: wejście sygnału GPS
  • Pin 18: BAUD_RATE_0: szybkość komunikacji,
  • Pin 19: BAUD_RATE_1: szybkość komunikacji,
  • Pin 20: TXD:nadawanie po porcie szeregowym,
  • Pin 21: RXD: odbiór z portu szeregowego,
  • Pin 22: V_BACK: zapasowe zasilanie,
  • Pin 23: VCC, napięcie zasilania (podłączone do 5V)

Opis GPS’a z czipem u-blox znajdziecie w tym wpisie.

TIMEPULSE

Rozszerzenie wyposażono w diodę PPS (Pulse Per Second). Po uzyskaniu pełnego namiaru zacznie ona mrugać raz na sekundę. Jak sprawdziłem, dioda ta miga dopiero gdy GPS widzi 5 satelit.

Sygnał PPS
Sygnał PPS

W systemie nawigacji GPS, w każdym punkcie ziemi widoczne są conajmniej 3 satelity.

Sygnał PPS możecie wykorzystać np. do budowania serwera czasu. Impuls wysyłany co sekundę pozwala na dokładną synchronizację z odczytami NMEA na konsoli szeregowej.

Wiecej o wykorzystaniu PPS pisałem w Młodym Techniku – za darmo do pobrania ze strony mt.com.pl.

Sygnał PPS nie jest wyprowadzony na żaden z pinów GPIO. Możecie jednak sami dolutować się do czipu (lub przed diodą LED).

RF_IN

Do pinu RF_IN podłączana jest antena. Rozszerzenie srzedawane jest z dwoma rodzajami anten: pasywną i aktywną. Antena pasywna to niewielki, 10-centymetrowy bacik wkręcany do gniazda SMA płytce. Antena aktywna, to niewielkie pudełko na ok. 5m kablu, również zakończonym wtykiem SMA.

Różnica jest taka, że anteny aktywne są dodatkowo wyposażone w znajdujący się na jej końcu wzmacniacz, który poprawia jakość sygnału i kompensuje straty na kablu. Generalnie GPS z aktywną anteną powinien znacznie szybciej łapać namiary.

Antenę możecie zmieniać tylko gdy rozszerzenie jest wyłączone. Podczas startu, czip kalibruje się do poziomu szumów. Przełączenie anteny w trakcie pracy może spowodować trudności z uzyskaniem namiaru.

BAUD_RATE

Domyślnie komunikacja rozszerzenia z Raspberry  odbywa się z szybkością 9600kbps. Możecie zmienić tą wartość podpinając stan niski lub wysoki do BAUD_RATE_0:BAUD_RATE_1 (1:1 – 4800, 1:0: 9600, 0:1: 38400, 0:0 – 115200).

TX

Zgodnie ze specyfikacją, na porcie TX czip wysyła wiadomości NMEA 0183 (format tekstow, nie binarny):

  • co 1 sekundę: GPGGA, GPGSA, GPRMC
  • co 5 sekund: GPGSV

Dla przykładu, wiadomość GPGGA dostarcza dane dotyczące pozycji, czasu, ilości satelitów. Format:

$GPGGA, hhmmss.ss, llll.ll, a, yyyyy.yy, a, q, ss,x.x,a.a,M,g.g,M,x.x,iiii*cc

gdzie:

hhmmss.ss Czas uniwersalny UTC
llll.ll Szerokość geograficzne
a N (północ) lub S (południe)
yyyyy.yy Długość geograficzne
a E (wschód) or W (zachód)
q Wskaźnik jakości namiaru: 0=brak namiaru, 1=namiar, 2=namiar różnicowy (DGPS, z uwzględnieniem poprawek ze stacji bazowej)
ss Ilość satelitów
x.x HDOP (horizontal dilution of precision), wpływ konstelacji satelitów na dokładność pomiarów współrzędnych płaskich; 1: idealny ( nie ma wpływu), 2-3 bardzo dobry, 4-6 dobry (zob. więcej o DOP na wikipedi)
a.a Wysokość na średnim poziomem morza
M Jednostka wysokości
g.g Różnica wysokości między kształtem geoidy a średnim poziomem morza
M Jednostka różnicy wysokości
x.x Sekundy od ostatniego namiaru ze stacji bazowej (DGPS)
iiii Identyfikator stacji bazowej (DGPS)
*cc Suma kontrolna

GPGSA dostarcza wiadomości o aktywnych satelitach i odchyłkach w dokładności pomiarów:

$GPGSA, aa, bb, s1-s12,PDOP, HDOP, VDOP

gdzie:

aa tryb pracy, A: automatyczny, M: manualny (narzucone namierzanie 2D lub 3D)
bb namiar: 1: brak namiaru, 2: namiar 2D, 3: namiar 3D
s1-s12 namierzone satelity (puste, jeżeli nieznane)
PDOP błąd pozycji satelity do błędu użytkownika
HDOP odchylenie współrzędnych płaskich
VDOP odchylenie wysokości

GPGSV informuje o ilość satelitów znajdujących się w zasięgu:

Więcej o wiadomościach NMEA znajdziecie na tej stronie.

RX

Wysyłając odpowiednie wiadomości NMEA na port RX możecie dodatkowo skonfigurować moduł określając np. które wiadomości będą wysyłane na TX i z jaką częstotliwością. Ustawienia te zostaną przywrócone do domyślnych po restarcie czipu.

V_BACK

Pin 22 możecie wykorzystać do podłączenia rezerwowego zasilania. Podtrzyma ono pracę wewnętrznego zegara RTC i pamięć RAM czipu. W tym celu możecie użyć baterii lub np. superkondensatora.

Wiecej o „hackowaniu” tego modułu będzie w kolejnym wpisie.

Dodatkowo…

Rozszerzenie to wyposażono w dość duże pole pinowe z dodatkowymi wyprowadzeniami portów GPIO oraz SPI, I2C i zasilania (5V,  3v3 i masa). Pole ma standardowy raster 2.54mm.

IMG_0979 IMG_0981Dzięki niemu możecie rozszerzyć funkcjonalność płytki o dodatkowe elementy – np. podtrzymanie pamięci czy wyświetlacz.

IMG_1001

„Rasowanie” rozszerzenia: już wkrótce na uczymy.edu.pl.

HAT czy nie HAT?

Rozszerzenie to jest określane przez producenta jako „HAT”. Rozmiary mechaniczne są zgodne ze standardem. Producent zadbał również o otwory na taśmę kamery i wyświetlacza.

Na pierwszy rzut oka widać jednak, że brakuje pamięci ID_EEPROM. Piny ID_SC i ID_SD wyprowadzono na płytkę. Nie są jednak do niczego podłączone. Oczywiście nie jest problemem, żebyście sami dolutowali sobie taką pamięć.

IMG_0990Zgodnie jednak ze standardem, rozszerzenie to nie powinno być nazywane HAT.

Więcej o standardzie HAT dowiecie się z tego posta.

Uruchomienie GPS (raspbian jessie)

Wyłączcie Raspberry. Nałóżcie rozszerzenie na gniazdo GPS. Włączcie Raspberry. Rozszerzenie to (podobnie jak wiele innnych GPS’ów) kontaktuje się z systemem za pomocą konsoli szeregowej na urządzeniu /dev/ttyAMA0. Co sekundę wysyła na nią wiadomości w formacie NMEA. Żeby je zobaczyć, musicie wyłączyć konsolę szeregową inicjowaną dmyślnie przez system operacyjny. W Raspbianie Jessie wystarczy odpowiednio zmodyfikować plik /boot/cmdline.txt. Znajdują się w nim parametry do startu jądra systemu, np:
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

Usuńcie wpisy „console=". Zmodyfikowany /boot/cmdline.txt może wyglądać tak:
dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

Po restarcie, logi powinny pokazać się na konsoli:
$ cat /dev/ttyAMA0
GPGGA,190244.000,51xx.xx,N,018xx.xxxx,E,1,09,1.0,137.2,M,41.0,M,,0000*56
$GPGSA,...

Systemową konsolę szeregową możecie również wyłączyć z poziomu raspi-config.

Teraz zainstalujcie zestaw wymaganych narzędzi:
$ sudo apt-get -y install gpsd gpsd-clients python-gps

Ustawcie konfigurację demona w pliku /etc/default/gpsd:

START_DAEMON="true"
USBAUTO="true"
DEVICES=""
GPSD_OPTIONS="dev/ttyAMA0"
GPSD_SOCKET="/var/run/gpsd.sock"

Upewnijcie się, że usługa gpsd działa :
$ sudo service gpsd status
gpsd.service - GPS (Global Positioning System) Daemon
Loaded: loaded (/lib/systemd/system/gpsd.service; static)
Active: active (running) since Wed 2015-12-23 18:31:52 CET; 1h 31min ago
Main PID: 639 (gpsd)
CGroup: /system.slice/gpsd.service
└─639 /usr/sbin/gpsd -N dev/ttyAMA0

Wartości odbierane przez GPS możecie wygodnie sprawdzić za pomocą narzędzia cgps:
$ cgps -s

Screenshot from 2015-12-23 20:14:43Testy

Pobór prądu

Jak zmierzyłem, rozszerzenie pobiera od 50 do 83 mA prądu. Zasilane brane jest z pinu 1 (5V) oraz masy na pinie 34.
Na pinie V_BACK, pobór prądu utrzymywał się około 1mA.

Namiary

Uzyskanie obiektywnych wyników podczas testowania urządzeń GPS jest naprawdę trudne. Szybkość dostrojenia do sygnału z satelitów zależy od bardzo wielu czynników. Nie chodzi tu tylko o to, czy odbiornik znajduje się głęboko w szafie czy też leży na parapecie. Liczy się rówież konstelacja satelitów w danym momencie, położenie geograficzne, interferencje elektromagnetyczne – czy pogoda w dniu wykonywania testów. Rozbieżność wyników może być naprawdę duża.

Swoje pomiary wykonałem dla GPSa wyposażanego w aktywną antenę. W pliku /etc/rc.local (przed exit 0) dodałem wpis zrzucający wszystkie logi z /dev/ttyAMA0 do pliku tekstowego:

cat /dev/ttyAMA0 > /home/pi/gps_log.txt &

Później uruchamiałem Raspberry i analizowałem uzyskane logi.

Możecie łatwo filtrować wiadomości za pomocą polecenia grep, np.:

cat -v gps_log_09.txt | grep -n GPGSA,A,3

Za uzyskanie pełnego namiaru uznałem moment, w którym zaczęła migać dioda PPS. Wtedy wiadomości GPGSA potwierdzały uzyskanie namiaru 3D (GPGSA,A,3) i dodatkowo wykorzystanie 5 satelitów równocześnie. Następnie odnajdywałem wiadomość GPGGA następującą bezpośrednio po GPGSA,3,A z 5-ma satelitami. Różnica czasu między pierwszym wpisem GPGGA w logu i GPGGA po tedy GPGSA z namiarem 3D i 5-ma satelitami wyznaczała czas namiaru.

Czas od ostatniego włączenia GPS Czas uzyskania PPS (min.SS) Typ anteny Uwagi
 10 min 01.24  Aktywna GPS na oknie
 30 min 05.42  Aktywna GPS na oknie
 10 min 04.10  Aktywna GPS na kanapie (4m od okna)
 4 godz 09.03  Aktywna GPS na kanapie
 30 min  09.25  Aktywna GPS na kanapie
 30 min  17.01  Aktywna GPS w łazience
Po 1 godz.  27.50  Aktywna GPS w łazience

Podsumowanie

W konfiguracji z anteną aktywną, GPS działał bardzo dobrze. Szybko łapał namiary i dostarczał sygnał PPS. Fakt: umieszczony w łazience g głębi mieszkania w bloku, trudził się prawie pół godziny. Myślę jednak, że nie jest to standardowa aplikacja:)

Trudno tutaj oczywiście o obiektywną ocenę szybkości uzyskiwania namiarów – wiele zależy od pogody, aktualnej konfiguracji satelitów itp. Jestem jednak przekonany, że nie będziecie mieli z tym problemów.

Rozszerzenie łatwo się instaluje. Wystarczy je nałożyć na GPIO Raspberry, wyłączyć konsolę szeregową – i już logi NMEA pojawią się na /dev/ttyAMA0. Nie ma potrzeby podłączania żadnych kabelków.

Na rynku znajdziecie wiele różnych rozszerzeń GPS dla Raspberry. W tym bardzo podoba mi się duże pole pinowe. Pozostawia pole do modyfikacji, umożliwiając rozszerzenie modułu o dodatkową funkcjonalność. Mogą to być na przykład:

  • Kość ID_EEPROM,
  • Zapasowe zasilanie do podtrzymania pamięci czipu i zegara,
  • Wyświetlacz.

Szkoda, że producent nie pokusił się o wyprowadzenie V_BACK i PPS na osobne piny. Żeby je wykorzystać, trzeba będzie dolutować się bezpośrednio do czipa…

…czego już nie mogę się doczekać:)

Źródła

Jedna myśl w temacie “Rozszerzenie GPS dla Raspberry Pi”

Dodaj komentarz