GPS: сообщения NMEA

GPS-модули общаются с управляющей платой с помощью NMEA-сообщений (от «National Marine Electronics Association») — это стандарт передачи данных оборудования навигации, связи и других информационных сетей. NMEA — это так же простой и понятный формат, который позволяет не только обеспечить обмен данными между GPS приемниками и навигационными программами, но и дает пользователям некоторое представление о принципах работы спутниковой навигационной аппаратуры.

Исходящие сообщения NMEA

Данные с GPS-модуля передаются на управляющую электронику в текстовом формате NMEA, состоят из последовательного набора данных, разделенных запятыми. Каждое NMEA сообщение начинается с $, заканчивается \n (перевод строки) и не может быть длиннее 80 символов.

Список сообщений

  • AAM – Прибытие в путевую точку
  • ALM – Данные альманаха
  • АPA – Данные автопилота «А»
  • APB – Данные автопилота «В»
  • BOD – Азимут на пункт назначения
  • DTM – Используемый датум
  • GGA – Информация о фиксированном решении
  • GLL – Данные широты и долготы
  • GSA – Общая информация о спутниках
  • GSV – Детальная информация о спутниках
  • MSK – Передача управлению базовому приемнику
  • MSS – Статус базового приемника
  • RMA – Рекомендованный набор данных системы «Loran»
  • RMB – Рекомендованный набор навигационных GPS данных
  • RMC – Рекомендованный минимальный набор GPS данных
  • RTE – Маршрутная информация VTG – Вектор движения и скорости
  • WCV – Данные скорости вблизи путевой точки
  • WPL – Данные путевой точки
  • XTC – Ошибка отклонения от трека
  • XTE – Измеренная ошибка отклонения от трека
  • ZTG – UTC время и оставшееся время до прибытия в точку назначения
  • ZDA – Дата и время.

Некоторые из NMEA сообщений могут содержать одинаковые поля данных, либо полностью содержать данные других, меньших по размеру, NMEA сообщений.

Содержание NMEA сообщений

GGA - информация о фиксированном решении

Самое популярное и наиболее используемое NMEA сообщение с информацией о текущем фиксированном решении – горизонтальные координаты, значение высоты, количество используемых спутников и тип решения.

$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
  • GGA – NMEA Заговолок
  • 123519 –UTC время 12:35:19
  • 4807.038, N – Широта, 48 градусов 7.038 минуты северной широты
  • 01131.000, Е – Долгота, 11 градусов 31.000 минуты восточной долготы
  • 1 – тип решение, StandAlone решение
    • 0 – нет решения,
    • 1 – StandAlone,
    • 2 – DGPS,
    • 3 – PPS,
    • 4 – фиксированный RTK,
    • 5 – не фиксированный RTK,
    • 6 – использование данных инерциальных систем,
    • 7 – ручной режим,
    • 8 – режим симуляции
  • 08 – количество используемых спутников
  • 0.9 – геометрический фактор, HDOP
  • 545.4, М – высота над уровнем моря в метрах
  • 46.9, М – высота геоида над эллипсоидом WGS 84
  • [пустое поле] – время прошедшее с момента получения последней DGPS поправки. Заполняется при активизации DGPS режима
  • [пустое поле] – идентификационный номер базовой станции. Заполняется при активизации DGPS режима.

RMC — рекомендованный минимальный набор GPS данных

Это NMEA сообщение содержит весь наборы, так называемых «PVT» данных. «PVT» — общепринятое сокращение от «position, velocity, time» (позиция, скорость, время).

$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
  • RMC – NMEA заголовок
  • 123419 – UTC время, 12:34:59
  • А – статус (А- активный, V- игнорировать)
  • 4807.038,N – Широта, 48 градусов 07.038 минут северной широты
  • 01131.000,Е – Долгота, 11 градусов 31.000 минута восточной долготы
  • 022.4 – Скорость, в узлах
  • 084.4 – Направление движения, в градусах
  • 230394 – Дата, 23 марта 1994 года
  • 003.1,W – Магнитные вариации

Входящие сообщения NMEA

По умолчанию в GPS-модуле установлены дефолтные настройки. Например частота отдачи данных на принимающее устройство или скорость общение с управляющей платой. При желании можно модуль настроить под себя.

Управление работой GPS-модуля осуществляется при помощи специальных NMEA – подобных команд.

GPS-модуль не сохраняет настройки в своей памяти. После сброса питания, модуль вернётся в своё первоначальное состояние.

Пример команды установки скорости общения 9600 бод.

$PMTK251,9600*17\r\n

Каждое входное NMEA-сообщение должно начинаться с символа $ и заканчивается символами \r\n:

  • $ — служебный символ;
  • PMTK — идентификатор;
  • 251 — тип команды (в данном случае команда смена скорости);
  • 9600 — данные (в данном случае установка 9600);
  • * — символ окончания данных;
  • 17 — контрольная сумма;
  • \r — возврат каретки <CR>;
  • \n — начало строки <CL>.

Контрольная сумма — восьмибитная (исключающая ИЛИ) всех символов сообщения, включая пробелы, расположенных между разделителями $ и *. Для нахождения контрольной суммы используйте NMEA Checksum Calculator.

Пример работы для HardwareSerial

По умолчания GPS-модуль отдаёт данные раз в секунду. В качестве примера выведем сырые данные в формате NMEA-сообщений и и увеличим отдачу данных до 10 раз в секунду.

  1. Прошейте плату Arduino скетчем проброса данных с USB на аппаратный UART.
    HardwareSerialGpsToUsb.ino
    // serial-порт к которому подключён GPS-модуль
    #define GPS_SERIAL    Serial1
     
    void setup()
    {
      // открываем последовательный порт для мониторинга действий в программе
      // и передаём скорость 115200 бод
      Serial.begin(115200);
      while (!Serial) {
      }
      Serial.print("\r\nSerial init OK\r\n");
      // открываем Serial-соединение с GPS-модулем
      // и передаём скорсть 115200 бод
      GPS_SERIAL.begin(115200);
    }
     
    void loop()
    {
      // если приходят данные из GPS-модуля - отправим их в порт компьютера
      if (GPS_SERIAL.available()) {
        Serial.write(GPS_SERIAL.read());
      }
      // если приходят данные из компьютера - отправим их в GPS-модуль
      if (Serial.available()) {
        GPS_SERIAL.write(Serial.read());
      }
    }
  2. Откройте монитор Serial-порта, нажав на иконку лупы.
  3. Установите скорость обмена данными на 115200 бод и установите дополнительные параметры NL— новой строки и CR — возврат каретки. В итоге каждую секунду вы будете получать данные в формате NMEA-сообщений.
  4. Из документации на NMEA-команды находим команду:
    $PMTK220,variable*<CS><CR><LF>
    1. variable — значение от 100 до 10000 в миллисекундах, нашем случае это 100.
    2. CS — контрольная сумма;
    3. CR — возврат каретки \r;
    4. LF — новая строка \n.
  5. Перейдите на сайт NMEA Checksum Calculator.
  6. Введите команду PMTK220,100 в поле ввода Command и нажмите кнопку Enter. В окне With checksum вы получите команду вместе с контрольной суммой.
  7. В окне ввода информации введите вместе с контрольной суммой NMEA-команду смены скорости отдачи данных до десяти раз в секунду и нажмите кнопку Отправить
    $PMTK220,100*2F

Если всё прошло правильно, теперь данные с GPS-модуля будут приходить до десяти раз в секунду.

Пример работы для SoftwareSerial

В качестве примера выведем сырые данные в формате NMEA-сообщений с GPS-модуля.

  1. Прошейте плату Arduino скетчем проброса данных с USB на программный UART.
    SoftwareSerialGpsToUsb.ino
    // библиотека для работы программного Serial
    #include <SoftwareSerial.h>
     
    // создаём объект для работы с программным Serial
    // и передаём ему пины TX и RX
    SoftwareSerial mySerial(4, 5);
     
    // serial-порт к которому подключён GPS-модуль
    #define GPS_SERIAL    mySerial
     
    void setup()
    {
      // открываем последовательный порт для мониторинга действий в программе
      // и передаём скорость 9600 бод
      Serial.begin(9600);
      // ждём, пока не откроется монитор последовательного порта
      // для того, чтобы отследить все события в программе
      while (!Serial) {
      }
      Serial.print("Serial init OK\r\n");
      // открываем Serial-соединение с GPS-модулем на скорости 115200 бод
      GPS_SERIAL.begin(115200);
      // печатаем строку
      Serial.println("GPS init is OK on speed 115200");
      // изменяем скорость обещение GPS-модуля с управляющей платой на 9600 бод
      // используем NMEA-команду «$PMTK251,9600*17\r\n»
      GPS_SERIAL.write("$PMTK251,9600*17\r\n");
      // закрываем Serial-соединение с GPS-модулем
      GPS_SERIAL.end();
      // открываем Serial-соединение с GPS-модулем на скорости 9600 бод
      GPS_SERIAL.begin(9600);
      // печатаем строку
      Serial.print("GPS init is OK on speed 9600");
    }
     
    void loop()
    {
      // если приходят данные из GPS-модуля - отправим их в порт компьютера
      if (GPS_SERIAL.available()) {
        Serial.write(GPS_SERIAL.read());
      }
      // если приходят данные из компьютера - отправим их в GPS-модуль.
      if (Serial.available()) {
        GPS_SERIAL.write(Serial.read());
      }
    }
  2. Откройте монитор Serial-порта, нажав на иконку лупы.
  3. Установите скорость обмена данными на 9600 бод и установите дополнительные параметры NL— новой строки и CR — возврат каретки. В итоге вы должны увидеть данные в полном формате NMEA-сообщений. - Из документации на NMEA-команды находим команду:
    $PMTK220,variable*<CS><CR><LF>
    1. variable — значение от 100 до 10000 в миллисекундах, нашем случае это 100.
    2. CS — контрольная сумма;
    3. CR — возврат каретки \r;
    4. LF — новая строка \n.
  4. Перейдите на сайт NMEA Checksum Calculator.
  5. Введите команду PMTK220,100 в поле ввода Command и нажмите кнопку Enter. В окне With checksum вы получите команду вместе с контрольной суммой.
  6. В окне ввода информации введите вместе с контрольной суммой NMEA-команду смены скорости отдачи данных до десяти раз в секунду и нажмите кнопку Отправить
    $PMTK220,100*2F

Если всё прошло правильно, теперь данные с GPS-модуля будут приходить до десяти раз в секунду.

Полезные ресурсы