Содержание

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

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

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

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

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

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

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

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

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

$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47

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

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

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

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

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

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

$PMTK251,9600*17\r\n

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

Контрольная сумма — восьмибитная (исключающая ИЛИ) всех символов сообщения, включая пробелы, расположенных между разделителями $ и *. Для нахождения контрольной суммы используйте 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-модуля будут приходить до десяти раз в секунду.

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