Пустой gpsBuffer на тройке

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Илья Савицкий, 6 ноя 2017.

Метки:
  1. Купил gps тройку, подключил к uno, загрузил пример, создал SoftwareSerial порт и получил бесконечный GPS_ERROR_DATA от getData(). Посмотрел библиотеку, вроде все должно работать, вставил вывод gpsBuffer на каждом вызове readData(), а он пустой. Если подключить gps датчик прямо к 0, 1 портам, то получается нормальный поток nmea-данных, в которых содержатся правильные координаты.

    Что делать?
     
  2. BAR__MEN

    BAR__MEN Вселенский Няш Администратор

    может что то не так подключили?
     
  3. BAR__MEN

    BAR__MEN Вселенский Няш Администратор

    Мне интересно, библиотека только с тройка gps работает или со всеми gps модулями
     
  4. DIYMan

    DIYMan Гуру

    Приведите код, который НЕ работает, и код, который работает. Приведите схемы подключения.
     
  5. не работает код никакой, я просто взял пример из библиотеки и запустил(добавив softwareserial порт)
    Код (C++):
    // библиотека для работы с GPS устройством
    #include <TroykaGPS.h>
    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(10, 11);
    // создаём объект класса GPS и передаём в него объект Serial1
    GPS gps(mySerial);
    // задаём размер массива для времени, даты, широты и долготы
    #define MAX_SIZE_MASS 16
    // массив для хранения текущего времени
    char time[MAX_SIZE_MASS];
    // массив для хранения текущей даты
    char date[MAX_SIZE_MASS];
    // массив для хранения широты в градусах, минутах и секундах
    char latitudeBase60[MAX_SIZE_MASS];
    // массив для хранения долготы в градусах, минутах и секундах
    char longitudeBase60[MAX_SIZE_MASS];

    void setup()
    {
      // открываем последовательный порт для мониторинга действий в программе
      Serial.begin(115200);
      // ждём, пока не откроется монитор последовательного порта
      // для того, чтобы отследить все события в программе
      while (!Serial) {
      }
      Serial.print("Serial init OK\r\n");
      // открываем Serial-соединение с GPS-модулем
      mySerial.begin(115200);
    }
    void loop()
    {
      // считываем состояние GPS-модуля
      switch(gps.getData()) {
        // всё OK
        case GPS_OK:
          Serial.println("GPS is OK");
          // выводим координаты широты и долготы
          // 1. в градусах, минутах и секундах
          // 2. градусах в виде десятичной дроби
          Serial.println("GPS Coordinates: ");
          gps.getLatitudeBase60(latitudeBase60, MAX_SIZE_MASS);
          gps.getLongitudeBase60(longitudeBase60, MAX_SIZE_MASS);
          Serial.print("Latitude\t");
          Serial.print(latitudeBase60);
          Serial.print("\t\t");
          Serial.println(gps.getLatitudeBase10(), 6);
          Serial.print("Longitude\t");
          Serial.print(longitudeBase60);
          Serial.print("\t\t");
          Serial.println(gps.getLongitudeBase10(), 6);
          // выводим количество видимых спутников
          Serial.print("Sat: ");
          Serial.println(gps.getSat());
          // выводим текущую скорость
          Serial.print("Speed: ");
          Serial.println(gps.getSpeedKm());
          // выводим высоту над уровнем моря
          Serial.print("Altitude: ");
          Serial.println(gps.getAltitude());
          // выводим текущее время
          Serial.print("Time: ");
          gps.getTime(time, MAX_SIZE_MASS);
          gps.getDate(date, MAX_SIZE_MASS);
          Serial.write(time);
          Serial.println();
          // выводим текущую дату
          Serial.print("Date: ");
          Serial.write(date);
          Serial.println("\r\n");
          // каждую переменную дату и времени можно выводить отдельно
    /*    Serial.print(gps.getHour());
          Serial.print(gps.getMinute());
          Serial.print(gps.getSecond());
          Serial.print(gps.getDay());
          Serial.print(gps.getMonth());
          Serial.print(gps.getYear());
    */
     
          break;
        // ошибка данных
        case GPS_ERROR_DATA:
          Serial.println("GPS error data");
          break;
        // нет соединение со спутниками
        case GPS_ERROR_SAT:
          Serial.println("GPS no connect to satellites");
          break;
      }
    }
    Если посмотреть на TroykaGPS.cpp, то там мы найдем
    Код (C++):
     // $GNGGA,165708.000,5544.648951,N,03739.472758,E,2,5,4.62,143.098,M,14.426,M,,*49
        // $GNRMC,165708.000,A,5544.648951,N,03739.472758,E,4.00,63.20,070717,,,D*4F
        int i = 0;
        int j = 0;
        char *strGNGGA;
        char *strGNRMC;
        char gpsBuffer[GPS_BUFFER];
        uartDeviceFlushSerial();
        uartDeviceCleanBuffer(gpsBuffer, sizeof(gpsBuffer));
        uartDeviceReadBuffer(gpsBuffer, sizeof(gpsBuffer), DEFAULT_TIMEOUT);
    //    Serial.write(gpsBuffer, sizeof(gpsBuffer));
    //    Serial.println();
        Serial.println(gpsBuffer);
        strGNRMC = strstr(gpsBuffer,"$GNRMC");

        if (strlen(strGNRMC) < 100) {
            return false;
        }
        if (strGNRMC[i] == '$') {
            i++;
            while (strGNRMC[i] != ',') {
                i++;
            }
        }

        if (strGNRMC[i] == ',') {
            i++;
            j = 0;
            while (strGNRMC[i] != '.') {
                time[j++] = strGNRMC[i++];
            }
            i++;
            time[j] = '\0';
            while (strGNRMC[i] != ',') {
                i++;
            }
        }
        // состояние GPS
        if (strGNRMC[i] == ',') {
            i++;
            gpsConnectSat[0] = strGNRMC[i];
            i++;
        }

        // запись данных широты
        if (strGNRMC[i] == ',') {
            i++;
            j = 0;
            while (strGNRMC[i] != ',') {
                latitude[j++] = strGNRMC[i++];
            }
            i++;
            while (strGNRMC[i] != ',') {
                latitude[j++] = strGNRMC[i++];
            }
            latitude[j] = '\0';    
        }

        // запись данных долготы
        if (strGNRMC[i] == ',') {
            i++;
            j = 0;
            while (strGNRMC[i] != ',') {
                longitude[j++] = strGNRMC[i++];
            }
            i++;
            while (strGNRMC[i] != ',') {
                longitude[j++] = strGNRMC[i++];
            }
            longitude[j] = '\0';
        }

        // запись данных скорости
        if (strGNRMC[i] == ',') {
            i++;
            j = 0;
            while (strGNRMC[i] != ',') {
            speed[j++] = strGNRMC[i++];
            }
            speed[j] = '\0';
        }

        // пропуск данных высоты
        if (strGNRMC[i] == ',') {
            i++;
            j = 0;
            while (strGNRMC[i] != ',') {
                i++;
            }
        }

        // запись даты
        if (strGNRMC[i] == ',') {
            i++;
            j = 0;
            while (strGNRMC[i] != ',') {
                date[j++] = strGNRMC[i++];
            }
            date[j] = '\0';
        }
     
    Если выводить gpsBuffer, то он оказывается пустым
     
  6. Подключение стандартное. Питание сенсора в питание ардуины, rx в 10, tx в 11
     
  7. Arduino_man

    Arduino_man Гик

    С GPS-датчиком никак не работает SoftwareSerial! Сам мучался, в итоге отказался! :mad:
     
  8. Arduino_man

    Arduino_man Гик

    Сотрудники Амперки в личной переписке ответили, что попробуют переделать библиотеку для GPS, но лучше работать с платой нескольких стандартных uart-портов (Leonardo например).
     
  9. DIYMan

    DIYMan Гуру

    Просмотрел вскользь исходники библиотеки - судя по коду, должна работать и с SoftwareSerial, т.к. там всё от Stream юзается, что есть правильно.
    Не будет SoftwareSerial работать на такой скорости, его потолок - 9600 бод. Проблема в вашем коде.
     
    Последнее редактирование: 6 ноя 2017
  10. ок, спасибо
     
  11. Но ведь gps датчик работает только на 115200, получается, от SoftwareSerial надо отказаться
     
  12. issaom

    issaom Гик

    Это зависит от того что вы хотите собрать ;-)
     
  13. Вообще, изначально задумывалось, как устройство, которое с GPRS шилдом и GPS модулем раз в некоторый период времени отсылало sms с координатами(не спрашивайте зачем, и, нет, я не хочу устраивать ни за кем слежку). Отдельно GPRS шилд работает, а с GPS начались проблемы
     
  14. issaom

    issaom Гик

    Ну тогда та - проще взять что-то имеющее несколько аппаратных serial ту же мегу....
     
  15. Мега - это, конечно, хорошо, но финальный вариант надо будет повторить 120 раз, поэтому желательно сделать все как можно дешевле. Возьму искру, GPS повешу на 0, 1, а GPRS на SoftwareSerial(10, 11)
     
  16. rkit

    rkit Гуру

    Таких устройств на рынке миллион. Готовое будет и быстрее и дешевле. Не страдайте ерундой.
     
  17. DIYMan

    DIYMan Гуру

    В даташите на микруху http://mediatek-club.ru/wp-content/uploads/2017/04/MT3333_Datasheet.pdf - упоминается о разных скоростях UART, если вы об этом модуле: http://amperka.ru/product/troyka-gps-glonass

    Вот тут описано, как поменять скорость: https://hobbyking.com/media/file/201626144X19082X53.pdf
    Вот тут тоже, правда чип немного другой, но решение в той же области: http://www.instructables.com/id/Change-Baudrate-of-MT3339-PA6C-With-Arduino/

    Короче, всё меняется ;)