Neo8m

Тема в разделе "Проводная и беспроводная связь", создана пользователем вертеплюшка, 13 дек 2020.

  1. Здравствуйте. Приобрел GPS модуль https://roboparts.ru/catalog/datchiki/datchiki_navigatsii/smart-gnss-gps-glonass-modul-neo-m8n/. Подключил к arduino nano, как на схеме с сайта (только пины поменял на 3 и 4): 9ae396d4ae768df97452a486c490e8f8 (1).png
    Напряжение на батарейке модуля 2,2 вольта. Если я правильно понял, у модуля получилось найти спутники (мигает красный светодиод), однако, координаты ардуино не получает.
    После использования данной программы (пример simple_test из библиотеки TinyGPS):
    Код (C++):
    #include <SoftwareSerial.h>

    #include <TinyGPS.h>

    /* This sample code demonstrates the normal use of a TinyGPS object.
    It requires the use of SoftwareSerial, and assumes that you have a
    4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
    */


    TinyGPS gps;
    SoftwareSerial ss(3, 4);

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

    Serial.print("Simple TinyGPS library v. "); Serial.println(TinyGPS::library_version());
    Serial.println("by Mikal Hart");
    Serial.println();
    }

    void loop()
    {
    bool newData = false;
    unsigned long chars;
    unsigned short sentences, failed;

    // For one second we parse GPS data and report some key values
    for (unsigned long start = millis(); millis() - start < 1000;)
    {
    while (ss.available())
    {
    char c = ss.read();
    // Serial.write(c); // uncomment this line if you want to see the GPS data flowing
    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 **");
    }
    в мониторе порта оказалось следующее: 1607790406680.png
    Взяв пример test_with_gps_device из той же библиотеки:

    Код (C++):
    #include <SoftwareSerial.h>

    #include <TinyGPS.h>

    /* This sample code demonstrates the normal use of a TinyGPS object.
       It requires the use of SoftwareSerial, and assumes that you have a
       4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
    */


    TinyGPS gps;
    SoftwareSerial ss(3, 4);

    static void smartdelay(unsigned long ms);
    static void print_float(float val, float invalid, int len, int prec);
    static void print_int(unsigned long val, unsigned long invalid, int len);
    static void print_date(TinyGPS &gps);
    static void print_str(const char *str, int len);

    void setup()
    {
      Serial.begin(9600);

      Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
      Serial.println("by Mikal Hart");
      Serial.println();
      Serial.println("Sats HDOP Latitude  Longitude  Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum");
      Serial.println("          (deg)     (deg)      Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail");
      Serial.println("-------------------------------------------------------------------------------------------------------------------------------------");

      ss.begin(9600);
    }

    void loop()
    {
      float flat, flon;
      unsigned long age, date, time, chars = 0;
      unsigned short sentences = 0, failed = 0;
      static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;

      print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
      print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
      gps.f_get_position(&flat, &flon, &age);
      print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
      print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
      print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
      print_date(gps);
      print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2);
      print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
      print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
      print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
      print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
      print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE : TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
      print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);

      gps.stats(&chars, &sentences, &failed);
      print_int(chars, 0xFFFFFFFF, 6);
      print_int(sentences, 0xFFFFFFFF, 10);
      print_int(failed, 0xFFFFFFFF, 9);
      Serial.println();

      smartdelay(1000);
    }

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

    static void print_float(float val, float invalid, int len, int prec)
    {
      if (val == invalid)
      {
        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 print_int(unsigned long val, unsigned long invalid, int len)
    {
      char sz[32];
      if (val == invalid)
        strcpy(sz, "*******");
      else
        sprintf(sz, "%ld", val);
      sz[len] = 0;
      for (int i = strlen(sz); i < len; ++i)
        sz[i] = ' ';
      if (len > 0)
        sz[len - 1] = ' ';
      Serial.print(sz);
      smartdelay(0);
    }

    static void print_date(TinyGPS &gps)
    {
      int year;
      byte month, day, hour, minute, second, hundredths;
      unsigned long age;
      gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
      if (age == TinyGPS::GPS_INVALID_AGE)
        Serial.print("********** ******** ");
      else
      {
        char sz[32];
        sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
                month, day, year, hour, minute, second);
        Serial.print(sz);
      }
      print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
      smartdelay(0);
    }

    static void print_str(const char *str, int len)
    {
      int slen = strlen(str);
      for (int i = 0; i < len; ++i)
        Serial.print(i < slen ? str[i] : ' ');
      smartdelay(0);
    }
    получил: 1607790715969.png
    Если поменять пины RX и TX местами, какие-либо значения и вовсе пропадут:
    1607791091948.png
    Грешил на батарейку, она вроде как вольта на 3 должна быть. Подал на контакты батарейки (разумеется, после ее извлечения) напряжение от ЛБП, однако, не помогло.
    Ранее получалось добыть координаты, используя этот модуль, но повторить успех не выходит.
    Буду благодарен за любую помощь в решении проблемы.
     
  2. GeoShu

    GeoShu Гик

    По вашей же ссылке написано - напряжение питания 5 вольт, а вы 2.2 вольта даёте. Он и не стартует поэтому.
     
    Последнее редактирование: 26 янв 2021
  3. Andy16

    Andy16 Гик

    Можно же для начала на компе посмотреть, что там с модуля идет.
     
  4. Un_ka

    Un_ka Гуру

    С помощью U-center.
     
  5. Andy16

    Andy16 Гик

    Ну, можно хоть терминалом любым. Хотя, юцентр удобнее. Он у меня даже в данный момент запущен :)
     
  6. GeoShu

    GeoShu Гик

    Если на монитор порта идут данные, то и на ю центр пойдут