Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

GPS FGPMMOPA6H - nie wysyła danych o pozycji

bercik11palcow 11 Maj 2014 12:34 4719 66
  • #1 11 Maj 2014 12:34
    bercik11palcow
    Poziom 18  

    Witam, chciałęm sprawdzić na początku działanie GPS ze schematu, i podłączyłem go poprostu za pomocą rs-232-USB do PC aby odczytać wysyłane ramki przez GPS za pomocą terminala. I ok, GPS działa, lecz nie wysyła mi danych o pozycji. Wysyłą tylko Czas, później kilka przecinków(tu powinna być m.in pozycja) i jakieś inne zbędne dane. Do GPS'a jest tylko podpięte zasilanie 3.3V i linia TX do MAX3232 i dalej do przejściówki RS232-USB. Czemu nie wysyła danych o pozycji? Tutaj datasheet: http://www.adafruit.com/datasheets/GlobalTop-FGPMMOPA6H-Datasheet-V0A.pdf

    0 29
  • #2 11 Maj 2014 16:07
    krru
    Poziom 32  

    Same przecinki zwykle oznaczaja brak danych - pewnie nie złapał fixa, czyli nie widzi satelitów, lub widzi je za krótko. Czasami potrzeba kilku minut na złapanie pozycji.
    GPS zwykle wysyla pewien zestaw komunikatow NMEA, powtarzający się w kółko. Jakbyś mógł zaczytować taki zestaw to byłoby łatwiej coś powiedzieć.
    Tak w skrócie:
    komunikat $GPGSV podaje listę widzianych satelitów, ich pozycję i siłę sygnału. W ramach zestawy może być wysyłanych wiele takich komunikatów - są one numerowane:

    Code:

    $GPGSV,3,1 ...
    $GPGSV,3,2 ...
    $GPGSV,3,3 ...

    pierwsza liczba wskazuje ile jest komunikatów GPSSV w zestawie, druga to numer kolejnego komunikatu. Jeden komunikat zawiera dane o trzech czy czterech satelitach, im więcej więc komunikatów GPGSV jest - tym więcej satelitów widzi odbiornik.
    Niektóre inne komunikaty też zawierają informację, czy pozycja została określona, czy nie.

    0
  • #3 11 Maj 2014 16:28
    bercik11palcow
    Poziom 18  

    Oto ramki które mi GPS wysyła po czasie ok 5min:

    Code:
    $GPGGA,142102.328,,,,,0,0,,,M,,M,,*45
    
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    $GPGSV,1,1,03,17,,,24,04,,,26,15,,,29*75
    $GPRMC,142102.328,V,,,,,0.00,0.00,110514,,,N*40
    $GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
    $PGTOP,11,2*6E

    z tym, że ramkę GPGSV i PGTOP wysyła mi co jakiś 3-4 krok. Z tego wynika że korzysta tylko z 1 satelity tak? A może by do pinu odpowiadającego za antenę zewnętrzną przylutować kawałek druta/przewodu i pociągnąć za okno?
    A może to wina tego, że nie podłączyłem modułu tak jak to jest w datasheet(kondensatorki i rezystory) ?

    0
  • #4 11 Maj 2014 19:12
    piotrva
    Moderator na urlopie...

    1. Do jakiegokolwiek fix'a potrzeba 3 satelitów minimum :D
    2. Poczytaj o tym module - można tam skonfigurować jak często ma nadawać dane
    3. Możesz ściągnąć sobie od producenta programik GPS Viewer, który bardzo fajnie pokazuje dane i świetnie nadaje się do zrozumienia o co chodzi z tym wszystkim ;)

    0
  • #5 11 Maj 2014 19:15
    bercik11palcow
    Poziom 18  

    ok, ale co mam zrobić, aby wykrył te 3 satelity?

    0
  • #6 11 Maj 2014 19:26
    piotrva
    Moderator na urlopie...

    1. Jeśli masz odpowiedni stan na pinie FIX3D to znaczy że układ złapał 4 satelity i może podawać po UART pozycję.
    2. Jeśli na pinie tym masz na zmianę 1 i 0 to znaczy to, że układ pobiera dane z satelitów (trwa to do kilku minut, jeśli pamięci RAM modułu nie jest podtrzymana bateryjnie)
    3. Co zrobić - moduł postawić koło okna i czekać - i nie rób nic z anteną - dla GPS kawałek druta to niezbyt dobry pomysł :D

    0
  • #7 11 Maj 2014 19:53
    rekinisko
    Poziom 22  

    bercik11palcow napisał:
    ...
    $GPRMC,142102.328,V,,,,,0.00,0.00,110514,,,N*40
    ...

    "V" oznacza, że nie złapał fixa. "A" oznacza fix. Antena powinna być przy szybie okna lub na zewnątrz, szyby z okien plastikowych skutecznie ekranują sygnał.

    0
  • #8 11 Maj 2014 21:47
    Jaca
    Poziom 28  

    1. Z czego podajesz te 3.3 V (jakie tętnienia, częstotliwość przetwornicy, itp.) ?
    2. Podłączyłeś pin VBACKUP ?

    Umieść moduł (używając cienkiej przekładki z nieprzewodzącej folii) na środku kawałka laminatu z miedzią o wymiarach ok. 4x4cm i podłącz obszar miedzi do masy modułu. Antena potrzebuje trochę masy aby poprawnie odbierać sygnał.

    ps. Jesteś na dobrej drodze ponieważ moduł pobrał już datę i godzinę i próbuje dokonać akwizycji.

    0
  • #9 11 Maj 2014 21:49
    krru
    Poziom 32  

    GPS przede wszystkim musi 'widzieć' niebo. I to widzieć praktycznie w sensie dosłownym - z miejsca gdzie się znajduje musi być widoczny spory kawałek nieba, dobrze jest jak widać tak z 1/3.

    0
  • #10 14 Maj 2014 20:17
    bercik11palcow
    Poziom 18  

    ok, gps złapał po dłuższym czasie dane o pozycji, i teraz pytanie. Wyswietla mi tak: 5145.0657N i 01926.9054E. Jak przeliczyć te dane, aby po wpisaniu w GoogleMaps pokazało mi gdzie jestem? jak wpisze tę dane co wysyła mi GPS do terminala na PC, to pokazuję mi w ogóle inna pozycję, a jak otworzę program GPSViewer, i z niego przepiszę dane to pokazuję mi prawdziwą aktualną pozycję.

    0
  • #11 14 Maj 2014 20:38
    Jaca
    Poziom 28  

    1. Pozycję z GPS podziel przez 100

    5145.0657 / 100 = 51.450657

    2. Część po przecinku podziel przez 0.6

    0.450657 / 0.6 = 0.751095

    3. Dodaj część całkowitą do wyniku z punktu 2.

    Lat = 51 + 0.751095 = 51.751095

    0
  • #12 15 Maj 2014 13:22
    bercik11palcow
    Poziom 18  

    ok, działa, DZIĘKI WIELKIE!
    tylko teraz mam problem z kodem. Otóż szerokość i długość geograficzną przechowuję w tablicy charów. Przesyłając tę tablicę za pomocą funkcji Usart1_Transmit do PC, wyswietla mi się taki ciąg znaków: 5145.0715,N,01926.8297,E
    Jak wykonać na tej tablicy tę operacje matematyczne co napisał Jaca? mogę bez problemu też wysyłać np 2 tablice: jedną z 5145.0715 i drugą z 01926.8297, ale i tak nie wiem jak wykonać na nich te operacje do uzyskania szer o dł.

    0
  • #13 15 Maj 2014 13:30
    mi14chal
    Poziom 28  

    Taką tablicę trzeba sparsować tak żeby uzyskać z nich liczby na których potem wykonasz operację matematyczne.

    0
  • #14 15 Maj 2014 13:45
    tplewa
    Poziom 38  

    nie wiem w czym piszesz i jakie tablice itd.

    Masz fragment jakiegos mojego kodu co przelicza string na pozycje w double

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #15 15 Maj 2014 16:19
    bercik11palcow
    Poziom 18  

    tplewa, w tym twoim kodzie parametry s1 i s2 to są odpowiednio pozycja z GPS przed kropką i po kropce?

    0
  • #16 15 Maj 2014 16:46
    tplewa
    Poziom 38  

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    param to tablica zawietajace "string-i" po zrobieniu splitu z GPGGA wedlug przecinkow.

    Czyli s1 to cala pozycja, a s2 to literka (W,S itp. czyli kierunki swiata).

    jak dales przykladowy zapis:
    5145.0715,N,01926.8297,E

    to s1 = "5145.0715" s2 = "N" itd.

    tu jest jeszcze w druga strone to jest z double do string
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #17 17 Maj 2014 14:20
    bercik11palcow
    Poziom 18  

    może pokaże swój kod, i powiem co jest nie tak. Otóż wysyła mi szerokosc i dlugosc geograficzną ale z błędami. Lecą sobie dane, co 3 sek pojawia się nowa linijka, i tak polecą trzy linijki, później jedna linijak przerwy, później znowu 3 linijki, jakieś krzaki i znowu normalnie pozycję. Czemu tak się dzieje z tymi przerwami i krzakami?


    Oto wycinek z terminala z krzakami:

    Code:
    5145.0883,N,01926.8694,E
    
    5145.0881,N,01926.8692,E
    5145.0880,N,01926.8691,E

    5145.0883,N,01926.8683,E
    ˙2Nó€NNNNNNNNNNNNNNN
    5145.0890,N,01926.8679,E

    5145.0891,N,01926.8676,E
    5145.0891,N,01926.8677,E
    5145.0882,N,01926.8686,E

    5145.0869,N,01926.8707,E
    5145.0˙2Nó€NNNNNNNN
    5145.0851,N,01926.8737,E


    A oto fragment ramek wysyłanych przez GPS bezpośrednio do PC, bez użycia uC:
    Code:
    $GPGGA,121850.000,5145.0709,N,01926.8990,E,1,6,1.35,177.3,M,40.4,M,,*5F
    
    $GPGSA,A,3,15,26,12,28,01,17,,,,,,,1.63,1.35,0.92*04
    $GPRMC,121850.000,A,5145.0709,N,01926.8990,E,0.88,333.85,170514,,,A*66
    $GPVTG,333.85,T,,M,0.88,N,1.62,K,A*36
    $PGTOP,11,2*6E
    $GPGGA,121851.000,5145.0710,N,01926.8983,E,1,6,1.35,177.3,M,40.4,M,,*54
    $GPGSA,A,3,15,26,12,28,01,17,,,,,,,1.63,1.35,0.92*04
    $GPGSV,3,1,10,24,60,291,,15,51,208,28,17,48,091,26,37,30,177,*70
    $GPGSV,3,2,10,26,26,166,19,12,24,238,22,28,22,059,20,18,15,277,*77
    $GPGSV,3,3,10,22,13,313,,01,09,036,18*7F
    $GPRMC,121851.000,A,5145.0710,N,01926.8983,E,0.91,325.88,170514,,,A*6F
    $GPVTG,325.88,T,,M,0.91,N,1.69,K,A*3F
    $PGTOP,11,2*6E
    $GPGGA,121852.000,5145.0706,N,01926.8983,E,1,6,1.35,177.3,M,40.4,M,,*50
    $GPGSA,A,3,15,26,12,28,01,17,,,,,,,1.63,1.35,0.92*04
    $GPRMC,121852.000,A,5145.0706,N,01926.8983,E,0.82,327.18,170514,,,A*62
    $GPVTG,327.18,T,,M,0.82,N,1.52,K,A*3E
    $PGTOP,11,2*6E
    $GPGGA,121853.000,5145.0698,N,01926.8981,E,1,6,1.35,177.3,M,40.4,M,,*55
    $GPGSA,A,3,15,26,12,28,01,17,,,,,,,1.63,1.35,0.92*04
    $GPRMC,121853.000,A,5145.0698,N,01926.8981,E,0.67,326.07,170514,,,A*63
    $GPVTG,326.07,T,,M,0.67,N,1.24,K,A*3B
    $PGTOP,11,2*6E
    $GPGGA,121854.000,5145.0689,N,01926.8979,E,1,6,1.35,177.3,M,40.4,M,,*55
    $GPGSA,A,3,15,26,12,28,01,17,,,,,,,1.63,1.35,0.92*04
    $GPRMC,121854.000,A,5145.0689,N,01926.8979,E,0.50,326.07,170514,,,A*67
    $GPVTG,326.07,T,,M,0.50,N,0.93,K,A*32
    $PGTOP,11,2*6E
    $GPGGA,121855.000,5145.0680,N,01926.8978,E,1,6,1.35,177.3,M,40.4,M,,*5C
    $GPGSA,A,3,15,26,12,28,01,17,,,,,,,1.63,1.35,0.92*04
    $GPRMC,121855.000,A,5145.0680,N,01926.8978,E,0.35,326.07,170514,,,A*6D
    $GPVTG,326.07,T,,M,0.35,N,0.65,K,A*38
    $PGTOP,11,2*6E
    $GPGGA,121856.000,5145.0674,N,01926.8978,E,1,6,1.35,177.3,M,40.4,M,,*54
    $GPGSA,A,3,15,26,12,28,01,17,,,,,,,1.63,1.35,0.92*04
    $GPGSV,3,1,10,24,60,291,,15,51,208,28,17,48,091,25,39,30,172,*78
    $GPGSV,3,2,10,26,26,166,17,12,24,238,20,28,22,059,22,18,15,277,*79
    $GPGSV,3,3,10,22,13,313,,01,09,036,17*70
    $GPRMC,121856.000,A,5145.0674,N,01926.8978,E,0.30,326.07,170514,,,A*60
    $GPVTG,326.07,T,,M,0.30,N,0.55,K,A*3E
    $PGTOP,11,2*6E


    A oto mój kod w C++:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #18 17 Maj 2014 16:10
    krru
    Poziom 32  

    Kod jest ogólnie zły:
    Czytasz 81 znaków a potem szukasz w tym tekstu "GGA" (swoją drogą są gotowe funkcje do tego).
    A co będzie jak znajdziesz taki tekst pod koniec bufora? Potem w ten pętli for (y) wychodzisz poza tablicę.
    Pamiętaj, że GPS nadaje niezależnie od twojego programu i nie wiesz co nadaje w momencie
    gdy program rusza. NMEA jest dość prosta do analizy - każdy komunikat zaczyna się od $GP, a kończy znakiem nowej linii. Znak $ też w zasadzie wystarczy na wykrycie początku.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ja to bym w ogóle zrobił trochę inaczej, poprzez automat stanów, ale skoro już tak zacząłeś to niech będzie.

    0
  • #19 17 Maj 2014 18:14
    bercik11palcow
    Poziom 18  

    ok, ale nie rozumiem kodu który tutaj podałeś. jak w tym warunku z memcmp mam wyslac tę tablicę tylko z interesującymi mnie danymi? Ok, funkcja memcmp znajduje porównanie, zwraca 0 i co dalej? skąd mam wiedzieć w którym elemencie tablicy zaczyna się pozycja i jak to zapisać w pętli for wysyłającej pozycje do PC?

    0
  • #20 17 Maj 2014 18:42
    krru
    Poziom 32  

    "GPGGA" jest na początku bufora - tam gdzie jest robione memcmp (tak swoją drogą warto jeszcze sporawdzić czy w ogóle wczytano przynajmniej 5 bajtów). W swoim kodzie wysyłałeś od około 15. bajtu. Tylko nie zalecam wysyłania - jak widzę działasz na AVR, one nie mają dużych sprzętowych buforów na USART (coś około 1 bajtu), więc w trakcie wysyłania kilkudziesięciu znaków podobna liczba znaków nadchodzących z GPSa może zostać zgubiona. Wyjścia - automat stanów albo przejście na przerwania.

    0
  • #22 17 Maj 2014 19:42
    krru
    Poziom 32  

    Tam przecież też podano uwagę, że ten program gubi znaki. Tyle że to nie zawsze przeszkadza, jednak trzeba przed realizacją takiego pomysłu być świadomym konsekwencji. GPS wysyła dane ciągle, więc w dużej liczbie zastosowań gubienie części danych nie ma większego znaczenia - najwyżej zamiast nowej pozycji co 1s będzie co 5s (ale właśnie taki problem zgłosiłeś). Dodatkowo, jeśli interesuje cię tylko komunikat GGA to on przychodzi co sekundę, w takim czasie wyrobisz się z przetwarzaniem (o ile wywalisz ten delay), zgubisz najwyżej jakiś fragment innego komunikatu, który i tak byś olał.
    Synchronizowanie się od znaku $ załatwia problem odbierania komunikatów od połowy itp.
    Jeśli chodzi o to co będzie łatwiejsze - IMHO przerwania, wystarczą zwykłe bufory obsługiwane przerwaniami, nawet tylko w jednym kierunku, a takie coś znajdziesz gotowe.

    0
  • #23 17 Maj 2014 20:45
    tplewa
    Poziom 38  

    Nie powinno być problemów z gubieniem znaków, transmisja jest wolna więc dlaczego coś takiego ma występować. Trzeba to tylko dobrze przemyśleć.

    O rozpoznaniu znaku "$" już ktoś tutaj wspominał i to jest też dobry pomysł. Ja kodu już niejako nie chcę dołączać bo reszta jest dość mocno pisana pod FreeRTOS - więc na wiele się nie przyda. Ale całość parsowania ma wygląda w tym stylu:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Choć ja tak prawdę mówiąc sprawdzam tylko w funkcji GpsNMEAChecksum czy '$' jest na początku i czy '*' na końcu no i czy suma się zgadza. Dopiero gdy ten warunek jest spełniony wykonywana jest reszta funkcji. Samo odbieranie i kompletowanie linii to sprawdzanie znaków końca linii..

    0
  • #24 18 Maj 2014 15:31
    bercik11palcow
    Poziom 18  

    nie za bardzo rozumiem. Czemu odbieranie i kompletowanie lini to sprawdzenie znaków końca lini, skoro ja chcę tylko wyłuskać ok 10 znaków ze środka lini GPGGA? Ok ta linia zaczyna się od $ i kończy \r ale w ten sposób sparsuję tylko komendę GPGGA.

    0
  • #25 18 Maj 2014 18:18
    krru
    Poziom 32  

    Ja z kolei nie rozumiem twojego pytania - zasada jest taka, że każda komunikacja jest warstwowa i należy odtworzyć w kodzie te warstwy. Tutaj pierwsza warstwa to komunikaty NMEA (od $ do \r) i należy to zaimplementować. Dopiero po wydzieleniu poszczególnych komunikatów (dobrze też byłoby sprawdzić w tym momencie sumę kontrolną) możesz je analizować.

    0
  • #26 18 Maj 2014 20:00
    tplewa
    Poziom 38  

    bercik11palcow napisał:
    nie za bardzo rozumiem. Czemu odbieranie i kompletowanie lini to sprawdzenie znaków końca lini, skoro ja chcę tylko wyłuskać ok 10 znaków ze środka lini GPGGA? Ok ta linia zaczyna się od $ i kończy \r ale w ten sposób sparsuję tylko komendę GPGGA.


    Bo tak jest najbardziej bezpiecznie - wtedy sprawdzasz sume kontrolna i masz pewnosc cze odebrane dane sa poprawne. Jak bedziesz kombinowal z wybieraniem to lekka zmiana lub brak danych pomiedzy przecinkami i twoje odbieranie sie sypie - zreszta co juz zobaczyles w swoim kodzie.

    Jak lecisz po koncu lini to odbierasz przykladowo taka linijke:

    Code:

    $GPGGA,121850.000,5145.0709,N,01926.8990,E,1,6,1.35,177.3,M,40.4,M,,*5F


    Ja potem robie sobie jak pisalem split po przecinkach do param[] czyli przykladowo dla tej linijki bedzie wygladac to tak:

    param[0] = "$GPGGA"
    param[1] = "121850.000"
    param[2] = "5145.0709"
    param[3] = "N"

    itd.

    wczesniej jak pisalem sprawdzam czy na poczatku jest '$' i na koncu * + suma kontrolna (w ptym przykladzie "*5F"). Nastepnie sprawdzam sume i wtedy jak jest ok funkcja GpsGetParam() rozbija mi cala linie na to co podalem wyzej... Potem sa warunki i wybranie parsowania danej komendy...

    0
  • #27 18 Maj 2014 23:10
    bercik11palcow
    Poziom 18  

    split po przecinkach czyli npo coś takiego:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #28 19 Maj 2014 01:03
    krru
    Poziom 32  

    Błąd jaki robisz to to, że odbierasz ileś tam danych ciurkiem do bufora, bez synchronizacji z komunikatami. Możesz napotkać początek komunikatu ($) gdziekolwiek w buforze. Co zrobisz jak te znak będzie pod koniec, powiedzmy na pozycji 70? Nie zmieści się tam interesująca część komunikatu. Z kolei jak bez sprawdzania końca będziesz wczytywał stała liczbę znaków to możesz też wczytać kawałek następnego komunikatu i już go potem nie dasz rady dokończyć.

    0
  • #29 19 Maj 2014 08:03
    bercik11palcow
    Poziom 18  

    aha, czyli zrobić tak, że odbierać dopiero jak napotka daną sekwencję tak?

    0
  • #30 19 Maj 2014 09:46
    tplewa
    Poziom 38  

    Co do funkcji odbierajacej znak z UARTU to mam cos takiego:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod



    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  Szukaj w 5mln produktów