Модуль GPS/GLONASS v2 с внешней антенной принимает сигналы спутников глобального позиционирования — GPS, GLONASS и Galileo — и рассчитывает свои географические координаты, скорость перемещения, высоту над уровнем моря и точное локальное время.
Данные передаются на управляющую электронику в текстовом формате NMEA по интерфейсу UART.
Спутники непрерывно передают навигационные сигналы на дециметровых волнах. В сигнал входят метки точного времени и координаты самого спутника.
Навигатор, по задержке прохождения сигнала со спутника рассчитывает точное расстояние до него. Затем повторяет эту операцию для остальных известных спутников. Эти данные сводятся вместе — так получается точное значение координат приёмника.
Для работы навигаторов нужно открытое небо с минимум четырьмя спутниками в прямой видимости. Чтобы система работала по всей планете в каждой орбитальной группировке приходится держать более двух десятков спутников.
GPS/GLONASS-модуль общается с управляющей платой по протоколу UART. В зависимости от управляющей платформы выберите вариант подключения GPS-модуля.
На управляющей плате Iskra JS и Arduino платах с микроконтроллером ATmega32U4 / ATSAMD21G18
, данные по USB и общение через пины 0
и 1
осуществляется через два раздельных UART
. Это даёт возможность подключить GPS-модуль к аппаратному UART
на пинах 0
и 1
.
Список поддерживаемых плат:
При подключении удобно использовать Troyka Shield. С Troyka Slot Shield можно обойтись без лишних проводов.
Некоторые платы Arduino, например, Uno, прошиваются через пины 0
и 1
. Это означает невозможность использовать одновременно прошивку/отладку по USB и общение с GPS-модулем. Решение проблемы — программный UART
. Подключите пины TX
и RX
GPS-модуля к другим контактам управляющей платы и используйте библиотеку SoftwareSerial.
Для примера подключим управляющие пины GPS-модуля TX
и RX
— на 4
и 5
контакты управляющей платы.
При подключении удобно использовать Troyka Shield. С Troyka Slot Shield можно обойтись без лишних проводов.
На платах форм-фактора Arduino Mega 2560 аппаратный UART, который отвечает за передачу данных через пины 1
и 0
, отвечает также за передачу по USB. Это означает невозможность использовать одновременно UART
для коммуникации с GPS-модулем и отладки по USB.
Но на платах такого форм-фактора есть ещё дополнительно 3 аппаратных UART:
19(RX1)
и 18(TX1)
;17(RX2)
и 16(TX2)
;15(RX3)
и 14(TX3)
.Список поддерживаемых плат:
Подключим GPS-модуль к объекту Serial1
на пины 18
и 19
на примере платы Arduino Mega 2560
Рассмотрим примеры работы GPS-модуля в зависимости от управляющей платформы.
В качестве примера выведем в Serial данные с GPS-модуля. Распарсим строки в отдельные переменные и сохраним их. Для этого скачайте и установите библиотеку TroykaGPS
// библиотека для работы с 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; } } }
В отличии от аппаратного UART
(HardwareSerial), за работу программного UART
(SoftwareSerial) отвечает микроконтроллер, который назначает другие пины в режим работы RX
и TX
, соответственно и данные которые приходят от модуля GPS обрабатывает сам микроконтроллер во время программы. По умолчанию скорость общения GPS-модуля равна 115200
, что значительно выше чем позволяет библиотека SoftwareSerial. В итоге часть информации которая приходит с GPS-модуля будет утеряна.
Решение понизить скорость общения GPS-модуля с управляющей платой.
Из описание команд управления GPS-модулем найдём NMEA-команду понижение скорости до 9600
бод.
$PMTK251,9600*17
Данную команду придётся выполнять при каждом новом включении GPS-модуля. В качестве примера выведем в Serial данные с GPS-модуля. Распарсим строки в отдельные переменные и сохраним их. Для этого скачайте и установите библиотеку TroykaGPS
// библиотека для работы с 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; } } }
Выведем данные о координатах, высоте над уровнем моря, количестве видимых спутников и точном времени в консоль Web IDE.
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 }
GPS-модуль общается с управляющей платой с помощью NMEA-сообщений (от «National Marine Electronics Association») — это стандарт передачи данных оборудования навигации, связи и других информационных сетей. NMEA — это так же простой и понятный формат, который позволяет не только обеспечить обмен данными между GPS приемниками и навигационными программами, но и дает пользователям некоторое представление о принципах работы спутниковой навигационной аппаратуры.
Данные с GPS-модуля передаются на управляющую электронику в текстовом формате NMEA, состоят из последовательного набора данных, разделенных запятыми. Каждое NMEA сообщение начинается с $
, заканчивается \n
(перевод строки) и не может быть длиннее 80 символов.
Некоторые из NMEA сообщений могут содержать одинаковые поля данных, либо полностью содержать данные других, меньших по размеру, NMEA сообщений.
Самое популярное и наиболее используемое NMEA сообщение с информацией о текущем фиксированном решении – горизонтальные координаты, значение высоты, количество используемых спутников и тип решения.
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
Это NMEA сообщение содержит весь наборы, так называемых «PVT» данных. «PVT» — общепринятое сокращение от «position, velocity, time» (позиция, скорость, время).
$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
По умолчанию в 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.
По умолчания GPS-модуль отдаёт данные раз в секунду. В качестве примера выведем сырые данные в формате NMEA-сообщений и и увеличим отдачу данных до 10 раз в секунду.
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()); } }
$PMTK220,variable*<CS><CR><LF>
variable
— значение от 100 до 10000 в миллисекундах, нашем случае это 100. CS
— контрольная сумма;CR
— возврат каретки \r
;LF
— новая строка \n
.Если всё прошло правильно, теперь данные с GPS-модуля будут приходить до десяти раз в секунду.
В качестве примера выведем сырые данные в формате NMEA-сообщений с GPS-модуля.
USB
на программный UART
.// библиотека для работы программного 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()); } }
$PMTK220,variable*<CS><CR><LF>
variable
— значение от 100 до 10000 в миллисекундах, нашем случае это 100. CS
— контрольная сумма;CR
— возврат каретки \r
;LF
— новая строка \n
.Если всё прошло правильно, теперь данные с GPS-модуля будут приходить до десяти раз в секунду.
NL3333 – навигационный приемник НАВИА, выполненный в оригинальном форм-факторе 8.7×9.5 мм на базе чипсета MediaTek MT3333.
Приемник использует весь спектр GNSS систем: GPS, GLONASS и Galileo. NL3333 отличается высокой чувствительностью, малым энергопотреблением и быстрым временем первой фиксации (TTFF). Связь с модулем осуществляется через UART, данные выводятся по протоколу NMEA.
1 группа
RX
микроконтроллера2 группа
TX
микроконтроллераПассивная антенна на керамической подложке необходима для приёма сигнала навигационным приемником GPS/GLONASS.
Необходим для сопряжения устройств с разными напряжениями логических уровней.
В нашем случае это может быть управляющее устройство Arduino с 5 вольтовой логикой и GPS/GLONASS модуль с 3,3 вольтовой логикой.
Имя светодиода | Назначение |
---|---|
RX и TX | Мигают при обмене данными между GPS/GLONASS модулем и управляющим устройством. |
P | Индикатор приёма спутниковых сигналов. Мигает если GPS-модуль «нашёл себя» |
По умолчанию в GPS-модуле NL3333
установлена стабильная прошивка. Периодически выходят новые версии прошивки — с улучшениями и новыми функциями. Для обновления прошивки вам понадобится одна из плат: