• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Tiny GPS++, Podzielenie danych na części
#11
(19-02-2020, 08:40)Robson Kerman napisał(a): Ta biblioteka nie czyta prefiksów Glonass Galileo tylko GPS, czyli szukaj $GPGGA. Najprostrze i najtańsze odbiorniki muszą wysyłać przynajmniej $GPRMC, ale w/w biblioteka już niestety tego nie obsługuje.

Odpowiadając na pytanie:
Tak jest możliwość. Najprościej to pomnożyć pierwsze dwie cyfry przez 1000000 i odjąć od 50339920.00
Chcialbym poprawic dokladnosc (!) odczytow polozenia horyzontalnego punktu w ktorym aktualnie sie znajduje razem z odbiornikiem GPS. Poniewaz dluzsza obserwacja kolejnych odczytow pokazuje skale bledow (nie wiem na razie dokladnie z czego to wynika) chcialbym czesc z tych bledow wyeliminowac korzystajac z wartosci HDOP podawanej w ciagu #GPGSA odczytywanym przez biblioteke TinyGPS++. Metoda kombinacji przykladow sklecilem taki kod, ktory niestety z niewiadomego powodu nie ogranicza wyswietlanych na LCD wartosci do takich dla ktorych spelniony jest warunek HDOP<=2.00. Sadze ze gdzies jest blad ktorego kompilator nie odrzuca a ow fragment nie dziala.
Prosze o analize i pomoc w rozwiklaniu zagadki.
Kod:
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
float h_dop;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);
// Horizontal diminution
TinyGPSCustom hdop(gps, "GPGSA", 16); // $GPGSA sentence, 16th element

void setup()
{
  Serial.begin(115200);
  ss.begin(GPSBaud);
  lcd.begin();
  lcd.backlight();

}

void loop()
{
  // This sketch displays information every time a new sentence is correctly encoded.
  while (ss.available() > 0)
    if (gps.encode(ss.read()))
    {
      displayInfo();
    }
  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    Serial.println(F("No GPS detected: check wiring."));
    while(true);
  }
}

void displayInfo()
{
  lcd.clear();
  if (gps.location.isValid() || hdop.isUpdated() )
//  if (gps.location.isUpdated())
  {
    float h_dop = gps.hdop.hdop();
    Serial.print(F(" HDOP=")); Serial.print(h_dop);
    Serial.println(); 
  }
  else
  {
    Serial.println(F("INVALID"));
    lcd.setCursor(0, 0);
    lcd.print("Brak synchronu");
    delay(5000); 
  }

if (h_dop <= 2.00)
{
        lcd.setCursor(0, 0);
        lcd.print("Lat ");
        lcd.print(gps.location.lat(), 6);
        lcd.setCursor(0, 1);
        lcd.print("Lon ");
        lcd.print(gps.location.lng(), 6);
   

else
{
  Serial.print ("Blad");
}
}
Na monitorze portu szeregowego wyswietla mi rozne wartosci HDOP w zakresie od 0.00 do 99.99 czasem trafia sie cos posredniego ale bardzo rzadko i caly czas na LCD mam nowe wartosci co 1 sekunde bez eliminacji niedokladnych odczytow.
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
 
Odpowiedź
#12
Wyszlo na to ze sam sobie musze odpowiedziec :-(. Po pierwsze prawdopodobnie ze wzgledu na polecenie "void" funkcja dopisana przeze mnie nie dzialala. Pomoglo zastapienie definicji  "void DisplayInfo" przez sama owa procedure i teraz dziala.
Co do dokladnosci to obserwujac dostatecznie dlugo wyniki odebrane przez odbiornik GPS wynika, ze oprocz odczytow o slabej dokladnosci (pomijanych przez moj skrypt) wazna jest jeszcze aktualna konfiguracja "widzianych" przez odbiornik satelitow. Stojac w miejscu gdzie nie bylo ograniczen horyzontu uzyskalem dokladnosc ponizej 1 metra. Przypominam ze  dlugosc odcinka na ziemi odpowiadajacego 1 stopniowi szerokosci geograficznej to okolo 110km. Jesli ow 1 stopien podzielimy przez 1000000 ( szesc cyfr po kropce) to wyjdzie 11 centymetrow. To jest zmiana wartosci ostatniej cyfry odczytu o 1.
Poniewaz zalezalo mi na dokladnosci moge jeszcze zmienic warunek aby HDOP byl mniejsze ale to i tak dokladnosc zalezy od pogody oraz aktualnej konfiguracji satelitow na niebosklonie.
W zasadzie przy dostatecznym ukladzie satelitow stojac w miejscu zmienia mi sie tylko ostatnia cyfra odczytu. Lepsza precyzja urzadzen geodezyjnych wynika z zastosowania jeszcze innych zrodel pozycjonowania.
Jesli uzywam programu bez ograniczen to odchylenie standardowe dla szerokosci geograficznej wynosi 16,25m a dla dlugosci geograficznej 4,5m ze wszystkich 3650 probek odebranych przez odbiornik.
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
 
Odpowiedź
#13
Żeby dokładnie precyzyjnie określać jest potrzebny dokładny precyzyjny zegar. Dlatego geodezyjne są na zegarze atomowym...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#14
(29-08-2021, 17:58)Jarewa0606 napisał(a): Żeby dokładnie precyzyjnie określać jest potrzebny dokładny precyzyjny zegar.  Dlatego geodezyjne są na zegarze atomowym...
Nie wystarczy precyzyjny zegar potrzeba wiecej puktow stalych w terenie.
Moj pomysl sie sprawdza. Mam 2 odbiorniki w naroznym oknie na polnoc i wschod. Czasem przez ponad pol godziny odbiornik nie odbiera sygnalow o HDOP <= 1.50
czyli nie zasmiecam sobie odczytow niepewnymi wynikami. Czyli o precyzji decyduje aktualna konfiguracja satelitow.
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości