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 раз в секунду.
- Прошейте плату 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()); } }
- Откройте монитор Serial-порта, нажав на иконку лупы.
- Установите скорость обмена данными на
115200
бод и установите дополнительные параметрыNL
— новой строки иCR
— возврат каретки. В итоге каждую секунду вы будете получать данные в форматеNMEA-сообщений
. - Из документации на NMEA-команды находим команду:
$PMTK220,variable*<CS><CR><LF>
variable
— значение от 100 до 10000 в миллисекундах, нашем случае это 100.CS
— контрольная сумма;CR
— возврат каретки\r
;LF
— новая строка\n
.
- Перейдите на сайт NMEA Checksum Calculator.
- Введите команду
PMTK220,100
в поле вводаCommand
и нажмите кнопкуEnter
. В окнеWith checksum
вы получите команду вместе с контрольной суммой. - В окне ввода информации введите вместе с контрольной суммой NMEA-команду смены скорости отдачи данных до десяти раз в секунду и нажмите кнопку
Отправить
$PMTK220,100*2F
Если всё прошло правильно, теперь данные с GPS-модуля будут приходить до десяти раз в секунду.
Пример работы для SoftwareSerial
В качестве примера выведем сырые данные в формате NMEA-сообщений с GPS-модуля.
- Прошейте плату 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()); } }
- Откройте монитор Serial-порта, нажав на иконку лупы.
- Установите скорость обмена данными на
9600
бод и установите дополнительные параметрыNL
— новой строки иCR
— возврат каретки. В итоге вы должны увидеть данные в полном форматеNMEA-сообщений
. - Из документации на NMEA-команды находим команду:$PMTK220,variable*<CS><CR><LF>
variable
— значение от 100 до 10000 в миллисекундах, нашем случае это 100.CS
— контрольная сумма;CR
— возврат каретки\r
;LF
— новая строка\n
.
- Перейдите на сайт NMEA Checksum Calculator.
- Введите команду
PMTK220,100
в поле вводаCommand
и нажмите кнопкуEnter
. В окнеWith checksum
вы получите команду вместе с контрольной суммой. - В окне ввода информации введите вместе с контрольной суммой NMEA-команду смены скорости отдачи данных до десяти раз в секунду и нажмите кнопку
Отправить
$PMTK220,100*2F
Если всё прошло правильно, теперь данные с GPS-модуля будут приходить до десяти раз в секунду.