====== 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-модуля будут приходить до десяти раз в секунду. ===== Полезные ресурсы =====