Подскажите пожалуйста по GPS

Тема в разделе "Проводная и беспроводная связь", создана пользователем AlexAxel, 1 июн 2018.

  1. AlexAxel

    AlexAxel Нерд

    Имеется модуль GPS NEO 6M, пытаюсь подключить. Скетч из примера библиотеки TinyGPS
    Код (C++):
    #include <SoftwareSerial.h>
    #include <TinyGPS.h>
    TinyGPS gps;
    SoftwareSerial ss(4, 3);
    void setup()
    {  Serial.begin(9600);
      ss.begin(9600);   }

    void loop()
    {  bool newData = false;
      unsigned long chars;
      unsigned short sentences, failed;
      for (unsigned long start = millis(); millis() - start < 1000;)
      {    while (ss.available())
        {      char c = ss.read();
          if (gps.encode(c)) // Did a new valid sentence come in?
            newData = true;    }
      }

      if (newData)
      {
        float flat, flon;
        unsigned long age;
        gps.f_get_position(&flat, &flon, &age);
        Serial.print("LAT=");
        Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
        Serial.print(" LON=");
        Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
        Serial.print(" SAT=");
        Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
        Serial.print(" PREC=");
        Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
      }
      gps.stats(&chars, &sentences, &failed);
      Serial.print(" CHARS=");
      Serial.print(chars);
      Serial.print(" SENTENCES=");
      Serial.print(sentences);
      Serial.print(" CSUM ERR=");
      Serial.println(failed);
      if (chars == 0)
        Serial.println("** No characters received from GPS: check wiring **");
    }
    Подключение:

    ARDUINO GPS
    5V------------>VCC
    GND--------->GND
    D4------------>RX
    D3------------>TX

    По результату не видит данных от GPS. Что делать и как бороться? Штука вроде примитивная по подключению, все просто должно быть...
     
  2. ostrov

    ostrov Гуру

    Просто подключите питание и TX модуля в пин 1 ардуины, запустите монитор порта и смотрите что происходит. Возможно, придется подобрать скорость. Для вычисления координат и времени из приходящих данных потребуется всего лишь парсить эти строчки.
     
  3. AlexAxel

    AlexAxel Нерд

    Я так понимаю, достаточно пустого скетча, чтобы смотреть содержимое порта? Ну, кроме Serial.begin? Или я что-то не так понимаю?:)
     
  4. ostrov

    ostrov Гуру

    Пустой скетч. Ардуино для просмотра нужна как источник питания и адаптер для USB.
     
  5. AlexAxel

    AlexAxel Нерд

    Не, ничего нет. Специально на ночь оставлял на балконе, думал - время нужно чтобы спутники прогрузились. Но нет.
     
  6. ostrov

    ostrov Гуру

    Инфо идет сразу даже без спутников, просто не сразу координаты и время выскакивает. Я вот не поленился собрал еще раз и у меня сразу пошло такое:
    [​IMG]
    Проверьте соединения. TX ---> D1 Скетч пустой. Скорость монитора 9600.
     
  7. sslobodyan

    sslobodyan Гик

    У ублоксов есть настройка какой протокол в какой порт слать. То есть можно так "настроить" модуль, что он не будет выдавать никаких данных. Настраивать в u-center.
     
    Igor68 нравится это.
  8. Сайдо

    Сайдо Нуб

    Помогите почему когда я использую библиотеку TinyGPS - TinyGPS++ у меня координаты не приходят, а если использовать обычный скетч координаты есть даже в программе u-center показывает но не при TinyGps
     
  9. ostrov

    ostrov Гуру

    Какая нафиг библиотека? Все что надо - немного парсить прилетающие строки.
     
  10. Сайдо

    Сайдо Нуб

    Без библиотеки TinyGPS прилетают неверные координаты, я точно не знаю может быть там есть вычисление, но в данный момент мне нужно что бы работало библиотека TinyGPS - TinyGPS++
    Вот скетч который я использую, он загружается верно но не прилетают координаты, частоту я настроил как нужно ибо при других частотах не ловило


    #include <TinyGPS++.h>
    #include <SoftwareSerial.h>

    static const int RXPin = 2, TXPin = 3;
    static const int GPSBaud = 57600;

    TinyGPSPlus gps;

    SoftwareSerial ss(RXPin, TXPin);

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

    Serial.println(F("FullExample.ino"));
    Serial.println(F("An extensive example of many interesting TinyGPS++ features"));
    Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
    Serial.println(F("by Mikal Hart"));
    Serial.println();
    Serial.println(F("Sats HDOP Latitude Longitude Fix Date Time Date Alt Course Speed Card Distance Course Card Chars Sentences Checksum"));
    Serial.println(F(" (deg) (deg) Age Age (m) --- from GPS ---- ---- to London ---- RX RX Fail"));
    Serial.println(F("---------------------------------------------------------------------------------------------------------------------------------------"));
    }

    void loop()
    {
    static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;

    printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
    printInt(gps.hdop.value(), gps.hdop.isValid(), 5);
    printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
    printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
    printInt(gps.location.age(), gps.location.isValid(), 5);
    printDateTime(gps.date, gps.time);
    printFloat(gps.altitude.meters(), gps.altitude.isValid(), 7, 2);
    printFloat(gps.course.deg(), gps.course.isValid(), 7, 2);
    printFloat(gps.speed.kmph(), gps.speed.isValid(), 6, 2);
    printStr(gps.course.isValid() ? TinyGPSPlus::cardinal(gps.course.value()) : "*** ", 6);

    unsigned long distanceKmToLondon =
    (unsigned long)TinyGPSPlus::distanceBetween(
    gps.location.lat(),
    gps.location.lng(),
    LONDON_LAT,
    LONDON_LON) / 1000;
    printInt(distanceKmToLondon, gps.location.isValid(), 9);

    double courseToLondon =
    TinyGPSPlus::courseTo(
    gps.location.lat(),
    gps.location.lng(),
    LONDON_LAT,
    LONDON_LON);

    printFloat(courseToLondon, gps.location.isValid(), 7, 2);

    const char *cardinalToLondon = TinyGPSPlus::cardinal(courseToLondon);

    printStr(gps.location.isValid() ? cardinalToLondon : "*** ", 6);

    printInt(gps.charsProcessed(), true, 6);
    printInt(gps.sentencesWithFix(), true, 10);
    printInt(gps.failedChecksum(), true, 9);
    Serial.println();
    smartDelay(1000);

    if (millis() > 5000 && gps.charsProcessed() < 10)
    Serial.println(F("No GPS data received: check wiring"));
    }


    static void smartDelay(unsigned long ms)
    {
    unsigned long start = millis();
    do
    {
    while (ss.available())
    gps.encode(ss.read());
    } while (millis() - start < ms);
    }

    static void printFloat(float val, bool valid, int len, int prec)
    {
    if (!valid)
    {
    while (len-- > 1)
    Serial.print('*');
    Serial.print(' ');
    }
    else
    {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
    Serial.print(' ');
    }
    smartDelay(0);
    }

    static void printInt(unsigned long val, bool valid, int len)
    {
    char sz[32] = "*****************";
    if (valid)
    sprintf(sz, "%ld", val);
    sz[len] = 0;
    for (int i=strlen(sz); i<len; ++i)
    sz = ' ';
    if (len > 0)
    sz[len-1] = ' ';
    Serial.print(sz);
    smartDelay(0);
    }

    static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
    {
    if (!d.isValid())
    {
    Serial.print(F("********** "));
    }
    else
    {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d ", d.month(), d.day(), d.year());
    Serial.print(sz);
    }
    if (!t.isValid())
    {
    Serial.print(F("******** "));
    }
    else
    {
    char sz[32];
    sprintf(sz, "%02d:%02d:%02d ", t.hour(), t.minute(), t.second());
    Serial.print(sz);
    }

    printInt(d.age(), d.isValid(), 5);
    smartDelay(0);
    }

    static void printStr(const char *str, int len)
    {
    int slen = strlen(str);
    for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str : ' ');
    smartDelay(0);
    }
     
  11. ostrov

    ostrov Гуру

    Может мы говорим о разных устройствах? То, про которое я говорю вообще никак не зависит от того что к нему подключено, оно просто выдает в UART информацию о координатах в текстовом виде (см пример выше) и времени раз в секунду. Можно распарсить ее либо правильно, либо неправильно.
     
  12. Igor68

    Igor68 Гуру

    И ещё:
    http://www.prin.ru/images/old_site/about_trm_copernicus_ii_rus.pdf
    http://www.gaw.ru/html.cgi/txt/ic/Trimble/start_gps.htm
    http://wiki.wildsong.biz/index.php/GPS_Protocols

    А так же:
    Если устройство не настроено на выдачу с интервалом, то и выдавать не будет!!!
    Если память не изменяет то TSIP позволяет производить обращение к устройству и соответственно им и производится конфигурация. Им же и задаётся задание в настройках содержание выдаваемых пакетов. Настройки могут быть и по выдаче по запросу. Ведь не зря там есть и TX и RX.
     
  13. Сайдо

    Сайдо Нуб

    Дело в том что у меня TinyGps++ работало по начало, но по неизвестным мне причинам он перестал работать! =(, Я уверен что запчасти установлены правильно как и в arduino так и в gps модуле "A7 AI-Thinker"
     
  14. Igor68

    Igor68 Гуру

    Выход на вскидку думаю один есть. Это если есть возможность (не знаю что за модуль "A7 AI-Thinker" такой - но думаю что-то для связи вашего модуля с PC для тестирования и настройки) то поставьте настройку на выдачу пакета NMEA вместе с выдачей синхроимпулса. (в нашем случае был таковой - секундный от времени GPS). А NMEA и будете парсить. Самое простое предположение - это просто слетели настройки. Сложнее если вы его сгубили. У нас мрдуль питался от 3.3 в. Настроить можно на выдачу пакета с захватом времени GPS при наличии спутников (он их поймал), либо по внешнему запросу по RX/TX. И пакеты с синхронизацией были только при наличии спутников (от 4 шт). Кстати TSIP и TAIP стали стандартом и применяются не только Trimble.
     
  15. Сайдо

    Сайдо Нуб

    Все получилось TinyGPS++ работает !
    Но вышла еще одна проблема, GPRS когда пишу AT+SAPBR=1,1 – установка соединения с сим картой. выдаёт ошибку
    +CME ERROR:58
    Я искал эту ошибку в гугле но не нашёл нужный ответ, из за чего это может быть ? подскажите если знаете
     
  16. Сайдо

    Сайдо Нуб

    Использую стандартную библиотеку SoftwareSerial
     
  17. Igor68

    Igor68 Гуру

    С GPRS дела не имел. Пардон.