GPS/GLONASS приёмник (Troyka-модуль)

Тема в разделе "Arduino & Shields", создана пользователем RomanRoman, 15 авг 2017.

  1. RomanRoman

    RomanRoman Нуб

    Добрый день, форумчане. Подскажите пожалуйста, кто работал с вышеуказанным модулем http://amperka.ru/product/troyka-gps-glonass от амперки. В формате NMEA все вроде бы работает, данные приходят, но при загрузке скетча отказывается их парсить.
    GPS Error Data.
    Библиотека от амперки https://github.com/amperka/TroykaGPS
    Скетч:

    Код (C++):
    // библиотека для работы с GPS устройством
    #include <TroykaGPS.h>
    // создаём объект класса GPS и передаём в него объект Serial1
    GPS gps(Serial1);
    // задаём размер массива для времени, даты, широты и долготы
    #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-модулем
      Serial1.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;
      }
    }
    Заранее спасибо.
     
  2. Neymar

    Neymar Нуб

    На какую ардуино ставите код?
     
  3. b707

    b707 Гуру

    Скорее всего формат немного не совпадает с библиотекой. Ежели в NMEA все работает - парсите его сами, это вроде несложно.
     
  4. Shum99

    Shum99 Нуб

    При компиляции этого скетча компилятор выдает ошибку:
    'Serial1' was not declared in this scope
    в строке:
    GPS gps(Serial1);
    Действительно, Serial1 ранее не объявлен. Как правильно поступить?
     
  5. Unixon

    Unixon Оракул Модератор

    Код для Leonardo, как обычно. Что у вас и куда хотите выводить? Если гнать через контроллер, нужно два UARTа (ну т.е. Mega/Leo), если напрямую в USB - совсем убрать инициализацию Serial и где-то между модулем и материнкой перекрутить RX/TX.
     
  6. Neymar

    Neymar Нуб

    Амперка в уроке про GPS модуль показывает Уно, а код даёт для Меги или Лео...Я, например, купил Мегу ))
     
  7. b707

    b707 Гуру

    в чем проблема использовать SoftwareSerial ? - тогда и Уна и Нана справятся без проблем. Или пару букв в коде поправить не судьба?
     
  8. Unixon

    Unixon Оракул Модератор

    Это при четырех то аппаратных портах на меге...
     
  9. b707

    b707 Гуру

    А кто сказал. что это должна быть именно Мега?
     
  10. Unixon

    Unixon Оракул Модератор

    Ну у @Neymar уже мега :)
     
  11. Neymar

    Neymar Нуб

    Флаг в руки! У меня сходу не получилось...Модуль по умолчанию работает на 115200 Baud..Показалось что SoftwareSerial "не потянул"...Пробовал PMTK командой настроить модуль на частоту ниже, но сразу не получилось, и возиться дальше не стал...Теперь у меня есть мега ))
     
  12. Zulus

    Zulus Нуб

    Подскажите, как через модуль TroykaGPS определить расстояние и азимут до WayPoint?
     
  13. issaom

    issaom Гуру

    Я самой Ардуиной считал :)
     
  14. Zulus

    Zulus Нуб

    Там не так просто. Земля Не Круглая.
    В Tiny GPS ++ сделано просто:

    Distance and Course
    If your application has some notion of a “waypoint” or destination, it is sometimes useful to be able to calculate the distance to that waypoint and the direction, or “course”, you must travel to get there. TinyGPS++ provides two methods to get this information, and a third (cardinal()) to display the course in friendly, human-readable compass directions.



    const double EIFFEL_TOWER_LAT = 48.85826;
    const double EIFFEL_TOWER_LNG = 2.294516;
    double distanceKm =
    TinyGPSPlus.distanceBetween(
    gps.location.lat(),
    gps.location.lng(),
    EIFFEL_TOWER_LAT,
    EIFFEL_TOWER_LNG) / 1000.0;
    double courseTo =
    TinyGPSPlus.courseTo(
    gps.location.lat(),
    gps.location.lng(),
    EIFFEL_TOWER_LAT,
    EIFFEL_TOWER_LNG);
    Serial.print("Distance (km) to Eiffel Tower: ");
    Serial.println(distanceKm);
    Serial.print("Course to Eiffel Tower: ");
    Serial.println(courseTo);
    Serial.print("Human directions: ");
    Serial.println(TinyGPSPlus.cardinal(courseTo));


    В командах модуля есть упоминание события "Достижения WP". А вот записи координат - нет :-(
     
  15. issaom

    issaom Гуру

    И что?, Ардуино легко посчитает и расстояние и азимут между двумя точками с учетом круглости Земли. Функции рабочие, проверял сам - можете пользоваться.
    http://forum.amperka.ru/threads/robot-ship-4х4-miniq-НС-12-imu-gps-glonass-sd-картридер-ina-219-3x-arduino-nano.12862/
    предпоследнее сообщение в ветке
     
  16. Zulus

    Zulus Нуб

    :) Спасибо .... Может сразу свой класс написать .... Эх хотелось на готовенкое...
    Тройка удивила. Делают платы, а библиотеки колхозные ....