Содержание

GPS/GLONASS-приёмник v2 с выносной антенной (Troyka-модуль): инструкция по подключению и примеры использования

Модуль GPS/GLONASS v2 с внешней антенной принимает сигналы спутников глобального позиционирования — GPS, GLONASS и Galileo — и рассчитывает свои географические координаты, скорость перемещения, высоту над уровнем моря и точное локальное время.

Данные передаются на управляющую электронику в текстовом формате NMEA по интерфейсу UART.

Видеообзор

Принцип работы систем спутниковой навигации

Спутники непрерывно передают навигационные сигналы на дециметровых волнах. В сигнал входят метки точного времени и координаты самого спутника.

Навигатор, по задержке прохождения сигнала со спутника рассчитывает точное расстояние до него. Затем повторяет эту операцию для остальных известных спутников. Эти данные сводятся вместе — так получается точное значение координат приёмника.

Для работы навигаторов нужно открытое небо с минимум четырьмя спутниками в прямой видимости. Чтобы система работала по всей планете в каждой орбитальной группировке приходится держать более двух десятков спутников.

Подключение и настройка

GPS/GLONASS-модуль общается с управляющей платой по протоколу UART. В зависимости от управляющей платформы выберите вариант подключения GPS-модуля.

HardwareSerial

На управляющей плате Iskra JS и Arduino платах с микроконтроллером ATmega32U4 / ATSAMD21G18, данные по USB и общение через пины 0 и 1 осуществляется через два раздельных UART. Это даёт возможность подключить GPS-модуль к аппаратному UART на пинах 0 и 1.

Список поддерживаемых плат:

При подключении удобно использовать Troyka Shield. С Troyka Slot Shield можно обойтись без лишних проводов.

SoftwareSerial

Некоторые платы Arduino, например, Uno, прошиваются через пины 0 и 1. Это означает невозможность использовать одновременно прошивку/отладку по USB и общение с GPS-модулем. Решение проблемы — программный UART. Подключите пины TX и RX GPS-модуля к другим контактам управляющей платы и используйте библиотеку SoftwareSerial.

Для примера подключим управляющие пины GPS-модуля TX и RX — на 4 и 5 контакты управляющей платы.

При подключении удобно использовать Troyka Shield. С Troyka Slot Shield можно обойтись без лишних проводов.

HardwareSerial Mega

На платах форм-фактора Arduino Mega 2560 аппаратный UART, который отвечает за передачу данных через пины 1 и 0, отвечает также за передачу по USB. Это означает невозможность использовать одновременно UART для коммуникации с GPS-модулем и отладки по USB.

Но на платах такого форм-фактора есть ещё дополнительно 3 аппаратных UART:

Список поддерживаемых плат:

Подключим GPS-модуль к объекту Serial1 на пины 18 и 19 на примере платы Arduino Mega 2560

Примеры работы

Рассмотрим примеры работы GPS-модуля в зависимости от управляющей платформы.

Пример для Arduino HardwareSerial

В качестве примера выведем в Serial данные с GPS-модуля. Распарсим строки в отдельные переменные и сохраним их. Для этого скачайте и установите библиотеку TroykaGPS

gpsTestHardwareSerial.ino
// библиотека для работы с GPS устройством
#include <TroykaGPS.h>
 
// serial-порт к которому подключён GPS-модуль
#define GPS_SERIAL Serial1
 
// создаём объект класса GPS и передаём в него объект Serial1
GPS gps(GPS_SERIAL);
 
// задаём размер массива для времени, даты, широты и долготы
#define MAX_SIZE_MASS 16
// массив для хранения текущего времени
char strTime[MAX_SIZE_MASS];
// массив для хранения текущей даты
char strDate[MAX_SIZE_MASS];
// массив для хранения широты в градусах, минутах и секундах
char latitudeBase60[MAX_SIZE_MASS];
// массив для хранения долготы в градусах, минутах и секундах
char longitudeBase60[MAX_SIZE_MASS];
 
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.available()) {
        // считываем данные и парсим
        gps.readParsing();
        // проверяем состояние GPS-модуля
        switch (gps.getState()) {
        // всё OK
        case GPS_OK:
            Serial.println("GPS is OK");
            // выводим координаты широты и долготы
            // 1. в градусах, минутах и секундах
            // 2. градусах в виде десятичной дроби
            Serial.println("GPS Coordinates: ");
            gps.getLatitudeBase60(latitudeBase60, MAX_SIZE_MASS);
            gps.getLongitudeBase60(longitudeBase60, MAX_SIZE_MASS);
            Serial.print("Latitude\t");
            Serial.print(latitudeBase60);
            Serial.print("\t\t");
            Serial.println(gps.getLatitudeBase10(), 6);
            Serial.print("Longitude\t");
            Serial.print(longitudeBase60);
            Serial.print("\t\t");
            Serial.println(gps.getLongitudeBase10(), 6);
            // выводим количество видимых спутников
            Serial.print("Sat: ");
            Serial.println(gps.getSat());
            // выводим текущую скорость
            Serial.print("Speed: ");
            Serial.println(gps.getSpeedKm());
            // выводим высоту над уровнем моря
            Serial.print("Altitude: ");
            Serial.println(gps.getAltitude());
            // выводим текущее время
            Serial.print("Time: ");
            gps.getTime(strTime, MAX_SIZE_MASS);
            gps.getDate(strDate, MAX_SIZE_MASS);
            Serial.write(strTime);
            Serial.println();
            // выводим текущую дату
            Serial.print("Date: ");
            Serial.write(strDate);
            Serial.println("\r\n");
            // каждую переменную дату и времени можно выводить отдельно
            /*    Serial.print(gps.getHour());
                  Serial.print(gps.getMinute());
                  Serial.print(gps.getSecond());
                  Serial.print(gps.getDay());
                  Serial.print(gps.getMonth());
                  Serial.print(gps.getYear());
            */
            break;
        // ошибка данных
        case GPS_ERROR_DATA:
            Serial.println("GPS error data");
            break;
        // нет соединения со спутниками
        case GPS_ERROR_SAT:
            Serial.println("GPS is not connected to satellites!!!");
            break;
        }
    }
}

Пример для Arduino SoftwareSerial

В отличии от аппаратного UART (HardwareSerial), за работу программного UART (SoftwareSerial) отвечает микроконтроллер, который назначает другие пины в режим работы RX и TX, соответственно и данные которые приходят от модуля GPS обрабатывает сам микроконтроллер во время программы. По умолчанию скорость общения GPS-модуля равна 115200, что значительно выше чем позволяет библиотека SoftwareSerial. В итоге часть информации которая приходит с GPS-модуля будет утеряна.

Решение понизить скорость общения GPS-модуля с управляющей платой. Из описание команд управления GPS-модулем найдём NMEA-команду понижение скорости до 9600бод.

$PMTK251,9600*17

Данную команду придётся выполнять при каждом новом включении GPS-модуля. В качестве примера выведем в Serial данные с GPS-модуля. Распарсим строки в отдельные переменные и сохраним их. Для этого скачайте и установите библиотеку TroykaGPS

SoftwareSerialGpsTest.ino
// библиотека для работы с GPS устройством
#include <TroykaGPS.h>
 
// библиотека для работы программного Serial
#include <SoftwareSerial.h>
 
// создаём объект для работы с программным Serial
// и передаём ему пины TX и RX
SoftwareSerial mySerial(4, 5);
 
// serial-порт к которому подключён GPS-модуль
#define GPS_SERIAL    mySerial
 
// создаём объект класса GPS и передаём в него объект GPS_SERIAL 
GPS gps(GPS_SERIAL);
 
// задаём размер массива для времени, даты, широты и долготы
#define MAX_SIZE_MASS 16
// массив для хранения текущего времени
char strTime[MAX_SIZE_MASS];
// массив для хранения текущей даты
char strDate[MAX_SIZE_MASS];
// массив для хранения широты в градусах, минутах и секундах
char latitudeBase60[MAX_SIZE_MASS];
// массив для хранения долготы в градусах, минутах и секундах
char longitudeBase60[MAX_SIZE_MASS];
 
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.available()) {
    // считываем данные и парсим
    gps.readParsing();
    // проверяем состояние GPS-модуля
    switch(gps.getState()) {
      // всё OK
      case GPS_OK:
        Serial.println("GPS is OK");
        // выводим координаты широты и долготы
        // 1. в градусах, минутах и секундах
        // 2. градусах в виде десятичной дроби
        Serial.println("GPS Coordinates: ");
        gps.getLatitudeBase60(latitudeBase60, MAX_SIZE_MASS);
        gps.getLongitudeBase60(longitudeBase60, MAX_SIZE_MASS);
        Serial.print("Latitude\t");
        Serial.print(latitudeBase60);
        Serial.print("\t\t");
        Serial.println(gps.getLatitudeBase10(), 6);
        Serial.print("Longitude\t");
        Serial.print(longitudeBase60);
        Serial.print("\t\t");
        Serial.println(gps.getLongitudeBase10(), 6);
        // выводим количество видимых спутников
        Serial.print("Sat: ");
        Serial.println(gps.getSat());
        // выводим текущую скорость
        Serial.print("Speed: ");
        Serial.println(gps.getSpeedKm());
        // выводим высоту над уровнем моря
        Serial.print("Altitude: ");
        Serial.println(gps.getAltitude());
        // выводим текущее время
        Serial.print("Time: ");
        gps.getTime(strTime, MAX_SIZE_MASS);
        gps.getDate(strDate, MAX_SIZE_MASS);
        Serial.write(strTime);
        Serial.println();
        // выводим текущую дату
        Serial.print("Date: ");
        Serial.write(strDate);
        Serial.println("\r\n");
        // каждую переменную дату и времени можно выводить отдельно
  /*    Serial.print(gps.getHour());
        Serial.print(gps.getMinute());
        Serial.print(gps.getSecond());
        Serial.print(gps.getDay());
        Serial.print(gps.getMonth());
        Serial.print(gps.getYear());
  */   
        break;
      // ошибка данных
      case GPS_ERROR_DATA:
        Serial.println("GPS error data");
        break;
      // нет соединение со спутниками
      case GPS_ERROR_SAT:
        Serial.println("GPS no connect to satellites!!!");
        break;
    }
  }
}

Пример кода для Iskra JS

Выведем данные о координатах, высоте над уровнем моря, количестве видимых спутников и точном времени в консоль Web IDE.

testGPS.js
Serial3.setup(115200, {rx: P0, tx: P1});
var gps = require("GPS").connect(Serial3, function(data) {
  console.log(data);
});

Каждую секунду в консоль будет выводится информация от модуля.

{ "time":"16:35:29", "lat":53.068403,"lon":-4.076282,"fix":1,"satellites":7,"altitude":1085.0 }

Формат сообщений 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-модульl
      if (Serial.available()) {
        GPS_SERIAL.write(Serial.read());
      }
    }
  2. Откройте монитор Serial-порта, нажав на иконку лупы.
  3. Установите скорость обмена данными на 9600 бод и установите дополнительные параметры 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-модуля будут приходить до десяти раз в секунду.

Элементы платы

Модуль NL3333

NL3333 – навигационный приемник НАВИА, выполненный в оригинальном форм-факторе 8.7×9.5 мм на базе чипсета MediaTek MT3333.

Приемник использует весь спектр GNSS систем: GPS, GLONASS и Galileo. NL3333 отличается высокой чувствительностью, малым энергопотреблением и быстрым временем первой фиксации (TTFF). Связь с модулем осуществляется через UART, данные выводятся по протоколу NMEA.

Контакты подключения трёхпроводных шлейфов

1 группа

2 группа

GPS/GLONASS антенна

Пассивная антенна на керамической подложке необходима для приёма сигнала навигационным приемником GPS/GLONASS.

Преобразователь логических уровней

Необходим для сопряжения устройств с разными напряжениями логических уровней.

В нашем случае это может быть управляющее устройство Arduino с 5 вольтовой логикой и GPS/GLONASS модуль с 3,3 вольтовой логикой.

Светодиодная индикация

Имя светодиода Назначение
RX и TX Мигают при обмене данными между GPS/GLONASS модулем и управляющим устройством.
P Индикатор приёма спутниковых сигналов. Мигает если GPS-модуль «нашёл себя»

Обновление прошивки GPS-модуля

По умолчанию в GPS-модуле NL3333 установлена стабильная прошивка. Периодически выходят новые версии прошивки — с улучшениями и новыми функциями. Для обновления прошивки вам понадобится одна из плат:

  1. В зависимости от выбранной платы, соберите следующую схему:
    1. USB-Serial адаптер
    2. Arduino Uno
    3. Arduino Mega 2560
  2. Скачайте и распакуйте необходимый софт и файлы прошивки модуля:
    1. Flash Tool — программа для обновления прошивки;
    2. прошивка загрузчика для чипсета NL3333;
    3. файл прошивки для чипсета NL3333
  3. Запустите программу Flash Tool.
  4. Нажмите на кнопку Download Agent и выберите файл прошивки загрузчика для чипсета NL3333. После чего увидите путь к файлу загрузчика для чипсета NL3333.
  5. Нажмите на кнопку ROM и выберите файл прошивки для чипсета NL3333. В результате вы увидите путь к файлу прошивки для модуля NL3333.
  6. Выберите номер COM-порта платы программатора. Узнать номер COM-порта вашей платы можно в диспетчере устройств.
  7. Выберите скорость обновление прошивки модуля 115200.
  8. Установите текущую скорость модуля 115200.
  9. Настройки закончены. Нажмите на кнопку Connect. Перед вами откроется окно состояния прошивки модуля.
  10. Нажмите кнопку Download. В прогресс баре вы увидите процесс прошивки GPS-модуля.
  11. После окончания прошивки в окне состояния появится зелёный кружок. Это значит всё получилось и можно продолжать работу с модулем.

Принципиальная и монтажная схемы

Характеристики

Ресурсы