Parsowanie danych NMEA - Arduino

0

Jakoś nie jestem zawsze zbyt dobry w takich sprawach, gdy są jakieś dane w jakimś formacie i trzeba wyłuskać coś z nich, w tym przypadku chcę wyłuskać tylko długość i szerokość geograficzną, zapisać ją w stringu z dokładnością do 6 miejsca po przecinku, no i to później wysyłam przez Bluetooth.

Ogólnie realizuję to na Arduino i co każdy takt do char'a zapisuje się po jednym znaku, więc to nie jest tak, że w jednym takcie sczytuję cały ten pakiet danych tylko w kilkudziesięciu. To są dane, które otrzymuje:

$GPRMC,105106.00,A,5238.01851,N,01726.07021,E,0.197,,181117,,,A*74
$GPVTG,,T,,M,0.197,N,0.364,K,A*2D
$GPGGA,105106.00,5238.01851,N,01726.07021,E,1,05,3.18,78.9,M,37.4,M,,*61
$GPGSA,A,3,22,14,31,01,03,,,,,,,,6.34,3.18,5.49*04
$GPGSV,3,1,11,01,67,160,32,03,70,272,34,04,,,18,12,,,25*70
$GPGSV,3,2,11,14,36,054,32,16,,,27,19,,,18,22,85,082,32*7D
$GPGSV,3,3,11,23,,,36,31,28,092,39,32,,,29*4E
$GPGLL,5237.85485,N,01725.59137,E,114456.00,A,A*65

Stwierdziłem, że najłatwiej będzie mi wyłuskać ostatnią linijkę, bo ma dwa charakterystyczne "LL", które nigdzie indziej nie występują, więc sobie zrobiłem taki kod:

char c;
String read_line;

 if (gpsPort.available())
  { 
    c=gpsPort.read();
    if( c == 'L') pos++;
    if( c == '$') {
      pos=0;
      Serial.print(read_line);
      read_line="";
    }
    Serial.write(c); //wyświetlanie
     if(pos==2) {
      wyslany+=(char)c;
     }
  }

Czyli, jak rozpozna, że było 2xL to zapisuje po znaku do stringa read_line i kończy zapisywanie przy pojawieniu się $. Dzięki temu teraz w tym stringu otrzymuję taką linijkę:

L,5237.85485,N,01725.59137,E,114456.00,A,A*65

Znacie teraz może jakiś sposób już bez if'ów, żeby łatwo wydostać z tego 5237.85485 oraz 1725.59137 tak żeby to było w dwóch osobnych stringach w formie 52.3785485 oraz 17.2559137 ? Bo jakbym to robił po stronie aplikacji Android to bym skorzystał z indexOf i substringów, a tu nie wiem jak.

I wiecie może czy jest jakiś sposób, żeby sczytać te dane jakoś w jednej chwili od razu/w jednym takcie? Ale skoro to transmisja szeregowa, to raczej się nie da.

0

Wpisujesz w przeglądarkę hasło: "nmea gps arduino library" i na pewno coś się znajdzie

0
Manuel.Artificer napisał(a):

Wpisujesz w przeglądarkę hasło: "nmea gps arduino library" i na pewno coś się znajdzie

Muszę napisać własną, bo każda inna koliduje z biblioteką Servo.h, bo żeby obsłużyć Bluetooth i GPS, potrzeba dwa seriale, jeden jest sprzętowy, a drugi SoftwareSerial drugi i Servo.h korzystają z przerwań i kolidują z sobą, i gdy coś się wysyła z GPS'a serwo opada ....

0

Tu wcale nie musi chodzić o przerwania tylko o zasilanie, bo pewnie wszystko zasilasz z arduino, a serwo trochę ciągnie, zależy jeszcze jakie. Nie pamiętam jaką wydajność prądową ma arduino, ale jak zasilasz z niego bluetooth, gps i jeszcze serwo to pewnie to jest problemem. Musiałbyś sobie zrobić dodatkowy obwód zasilania no i pamiętasz o wspólnej masie. A co do bibliotek to nawet jeśli nie możesz z nich skorzystać to możesz sobie podejrzeć ich kod na jakimś githubie czy czymś podobnym. No i w arduino też jest typ String co udostępnia metody indexOf, substring itd. Tu masz link:

https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/

0
Manuel.Artificer napisał(a):

Tu wcale nie musi chodzić o przerwania tylko o zasilanie, bo pewnie wszystko zasilasz z arduino, a serwo trochę ciągnie, zależy jeszcze jakie. Nie pamiętam jaką wydajność prądową ma arduino, ale jak zasilasz z niego bluetooth, gps i jeszcze serwo to pewnie to jest problemem. Musiałbyś sobie zrobić dodatkowy obwód zasilania no i pamiętasz o wspólnej masie. A co do bibliotek to nawet jeśli nie możesz z nich skorzystać to możesz sobie podejrzeć ich kod na jakimś githubie czy czymś podobnym. No i w arduino też jest typ String co udostępnia metody indexOf, substring itd. Tu masz link:

https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/

Nie nie są problemem problemem są przerwania. Serwa są zasilane osobno z obwodu oddzielającego je od części logicznej czytaj Arduino, 6xAA w koszyczku z baterii (oczywiście po przepuszczenie poprzez stabilizator 5V), a same Arduino Lipolem 7.4V z części logicznej mostka H też odseparowanej od części silnoprądowej oczywiście na 5V, więc to na pewno nie jest problemem i problemem są na 100% przerwania, w ogóle ta biblioteka Software Serial jest do ch*** i zużywa z 90% czasu procesora.

Dzięki za linki skoro jest substring i indexOf to sobie poradzę, a wiesz może czy da się sczytać jakoś ten jeden cały pakiet danych (max 84 znaków) w jednym takcie do jednego stringa, wtedy nie marnowałbym tyle czasu i mógłbym sobie łatwo użyć substring i indexOf. Bo zależy mi na tym, żeby GPS był prókowany z częstotliwością 1Hz, poza tym w mojej aplikacji liczy się timing, bo mam Filtr Kalmana do estymacji kąta Pitch/Roll poza tym jeszcze sterowanie robotem, sterowanie z telefonu z przechyłu i pochyłu telefonu serwami z kamerą i wiele innych przez co liczy się timing tego wszystkiego i synchronizacji tak żebym nie miał problemu z odbiorem danych i parsowaniem ich po stronie Androida.

0

Bez dokumentacji GPS nic się nie ruszy. I to dla tego urządzenia, bo może być chińskim zamiennikiem jakiegoś innego i potem to się różni. I czemu akurat 1Hz? No i te baterie to trochę słabo, lepiej jakiegoś Li-Iona użyć bo baterie szybko się zużyją.

0
Manuel.Artificer napisał(a):

Bez dokumentacji GPS nic się nie ruszy. I to dla tego urządzenia, bo może być chińskim zamiennikiem jakiegoś innego i potem to się różni. I czemu akurat 1Hz? No i te baterie to trochę słabo, lepiej jakiegoś Li-Iona użyć bo baterie szybko się zużyją.

E tam nie zużywają się tak szybko, poza tym ja nigdzie nie jeżdżę tym samochodem to tylko ma wytrzymać prezentację na obronie inżynierki. Bo z 5Hz nie pracuje stabilnie, a z 1 Hz tak, poza tym nie jest mi potrzebne szybciej.

GPS to ten moduł -> https://botland.com.pl/moduly-gps/4452-modul-gps-neo-6m-ublox-uart-z-antena-piny-katowe.html

0

Znalazłem takie coś:

https://www.monocilindro.com/2016/03/28/reading-gps-data-using-arduino-and-a-u-blox-neo-6m-gps-receiver/

Tutaj gość pisze jak skonfigurować ten gps, żeby nie przesyłał tych 6 informacji automatycznie tylko wybrane z nich przez odpytywanie. Jest tam zarówno opis jak i kod, oczywiście po engliszu, ale skoro indzynier to pewnie umie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1