====== GPS: сообщения NMEA ======
GPS-модули общаются с управляющей платой с помощью NMEA-сообщений (от «National Marine Electronics Association») — это стандарт передачи данных оборудования навигации, связи и других информационных сетей.
{{ :articles:gps:nmea:nmea.1.jpg?nolink |}}
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-модуля осуществляется при помощи [[http://naviaglonass.ru/wp-content/uploads/Opisanie-komand-NL3333_KL3333-i-SL3333E-v1_0.pdf|специальных NMEA –
подобных команд.]]
GPS-модуль не сохраняет настройки в своей памяти. После сброса питания, модуль вернётся в своё первоначальное состояние.
Пример команды установки скорости общения ''9600 бод''.
$PMTK251,9600*17\r\n
Каждое входное NMEA-сообщение должно начинаться с символа ''$'' и заканчивается символами ''\r\n'':
* ''$'' — служебный символ;
* ''PMTK'' — идентификатор;
* ''251'' — тип команды (в данном случае команда смена скорости);
* ''9600'' — данные (в данном случае установка 9600);
* ''*'' — символ окончания данных;
* ''17'' — контрольная сумма;
* ''\r'' — возврат каретки '''';
* ''\n'' — начало строки ''''.
Контрольная сумма — восьмибитная (исключающая ИЛИ) всех символов сообщения, включая пробелы, расположенных между разделителями ''$'' и ''*''. Для нахождения контрольной суммы используйте [[http://nmeachecksum.eqth.net/|NMEA Checksum Calculator]].
==== Пример работы для HardwareSerial ====
По умолчания GPS-модуль отдаёт данные раз в секунду. В качестве примера выведем сырые данные в формате NMEA-сообщений и и увеличим отдачу данных до 10 раз в секунду.
- Прошейте плату Arduino скетчем проброса данных с ''USB'' на аппаратный ''UART''.
// 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-порта, нажав на иконку лупы.{{ :articles:gps:nmea:nmea-hard.1x.png?nolink |}}
- Установите скорость обмена данными на ''115200'' бод и установите дополнительные параметры ''NL''— новой строки и ''CR'' — возврат каретки. В итоге каждую секунду вы будете получать данные в формате ''NMEA-сообщений''.{{ :articles:gps:nmea:nmea-hard.2x.png?nolink |}}
- Из [[http://naviaglonass.ru/wp-content/uploads/Opisanie-komand-NL3333_KL3333-i-SL3333E-v1_0.pdf|документации на NMEA-команды]] находим команду:$PMTK220,variable*
- ''variable'' — значение от 100 до 10000 в миллисекундах, нашем случае это 100.
- ''CS'' — контрольная сумма;
- ''CR'' — возврат каретки ''\r'';
- ''LF'' — новая строка ''\n''.
- Перейдите на сайт [[http://nmeachecksum.eqth.net/|NMEA Checksum Calculator]].{{ :articles:gps:nmea:nmea-hard.3.png?nolink |}}
- Введите команду ''PMTK220,100'' в поле ввода ''Command'' и нажмите кнопку ''Enter''. В окне ''With checksum'' вы получите команду вместе с контрольной суммой.{{ :articles:gps:nmea:nmea-hard.4x.png?nolink |}}
- В окне ввода информации введите вместе с контрольной суммой NMEA-команду смены скорости отдачи данных до десяти раз в секунду и нажмите кнопку ''Отправить''$PMTK220,100*2F
{{ :articles:gps:nmea:nmea-hard.5x.png?nolink |}}
Если всё прошло правильно, теперь данные с GPS-модуля будут приходить до десяти раз в секунду.
==== Пример работы для SoftwareSerial ====
В качестве примера выведем сырые данные в формате NMEA-сообщений с GPS-модуля.
- Прошейте плату Arduino скетчем проброса данных с ''USB'' на программный ''UART''.
// библиотека для работы программного Serial
#include
// создаём объект для работы с программным 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-порта, нажав на иконку лупы.{{ :articles:gps:nmea:nmea-soft.1x.png?nolink |}}
- Установите скорость обмена данными на ''9600'' бод и установите дополнительные параметры ''NL''— новой строки и ''CR'' — возврат каретки. В итоге вы должны увидеть данные в полном формате ''NMEA-сообщений''.{{ :articles:gps:nmea:nmea-soft.2x.png?nolink |}} - Из [[http://naviaglonass.ru/wp-content/uploads/Opisanie-komand-NL3333_KL3333-i-SL3333E-v1_0.pdf|документации на NMEA-команды]] находим команду:$PMTK220,variable*
- ''variable'' — значение от 100 до 10000 в миллисекундах, нашем случае это 100.
- ''CS'' — контрольная сумма;
- ''CR'' — возврат каретки ''\r'';
- ''LF'' — новая строка ''\n''.
- Перейдите на сайт [[http://nmeachecksum.eqth.net/|NMEA Checksum Calculator]].{{ :articles:gps:nmea:nmea-soft.3.png?nolink |}}
- Введите команду ''PMTK220,100'' в поле ввода ''Command'' и нажмите кнопку ''Enter''. В окне ''With checksum'' вы получите команду вместе с контрольной суммой.{{ :articles:gps:nmea:nmea-soft.4x.png?nolink |}}
- В окне ввода информации введите вместе с контрольной суммой NMEA-команду смены скорости отдачи данных до десяти раз в секунду и нажмите кнопку ''Отправить''$PMTK220,100*2F
{{ :articles:gps:nmea:nmea-soft.5x.png?nolink |}}
Если всё прошло правильно, теперь данные с GPS-модуля будут приходить до десяти раз в секунду.
===== Полезные ресурсы =====