Arduino с GPS-модулем NEO-M8N: получение широты, долготы, высоты, даты и времени
В этом руководстве вы узнаете, как подключить плату Arduino к GPS-модулю NEO-M8N. Вы научитесь подключать модуль к плате и программировать его для получения GPS-данных: широты, долготы, высоты, времени UTC, количества видимых спутников и многого другого.
Вот что вы узнаете из этого руководства:
Подключение GPS-модуля NEO-M8N к Arduino через последовательный порт;
Получение необработанных GPS-данных;
Парсинг необработанных данных для получения выбранной и читаемой GPS-информации с помощью библиотеки
TinyGPSPlus.
Знакомство с GPS-модулем NEO-M8N
GPS-модуль NEO-M8N является одним из самых популярных GPS-приёмников, используемых с микроконтроллерами в проектах навигации и отслеживания. Он может получать данные о широте, долготе, высоте и времени.
Он поддерживает несколько спутниковых систем, включая GPS, Galileo, GLONASS и BeiDou. Он обеспечивает лучшее отслеживание спутников, чем NEO-6M, что делает его более надёжным в сложных условиях.
Согласно даташиту, он имеет точность определения горизонтального положения от 2,5 до 4 метров и быстрое время запуска (1 секунда для горячего старта, 26–57 секунд для холодного старта — ожидайте более длительное время, если вы находитесь рядом со зданиями).
Модуль включает резервную батарею, встроенную EEPROM и светодиодный индикатор, который мигает при достижении фиксации позиции.
Этот модуль обычно поставляется с керамической GPS-антенной. Но вы можете заменить её на любую другую совместимую антенну, которая лучше подходит для вашего проекта. Например, мне нравится использовать ту, что справа на картинке ниже, потому что она водонепроницаемая, и антенна поставляется с длинным кабелем, что обеспечивает большую гибкость.
GPS-модуль NEO-M8N взаимодействует с микроконтроллером по протоколу последовательной связи и работает со стандартными NMEA-предложениями. NMEA расшифровывается как National Marine Electronics Association (Национальная ассоциация морской электроники), и в мире GPS это стандартный формат данных, поддерживаемый производителями GPS.
Где купить?
Вы можете посмотреть нашу страницу Maker Advisor Tools для сравнения цен на GPS-приёмник NEO-M8N в различных магазинах:
Вы можете использовать приведённые выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все детали для ваших проектов по лучшей цене!
Подключение GPS-модуля NEO-M8N к Arduino
Для связи с GPS-модулем NEO-M8N мы будем использовать программный последовательный порт (Software Serial), поэтому вы можете использовать любые доступные пины. Мы будем использовать Pin 5 (TX –> подключается к RX модуля) и Pin 6 (RX –> подключается к TX модуля).
GPS-модуль NEO-M8N |
Arduino |
|---|---|
VCC |
5V |
RX |
Pin 5 |
TX |
Pin 6 |
GND |
GND |
Получение необработанных GPS-данных — тестирование GPS-модуля NEO-M8N с Arduino
Чтобы получить необработанные GPS-данные, вам нужно установить последовательную связь с GPS-модулем и прочитать доступные данные.
Следующий код устанавливает последовательную связь с GPS-модулем и считывает доступные данные.
/*
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/arduino-neo-m8n-gps-module/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <SoftwareSerial.h>
static const int RXPin = 6, TXPin = 5;
static const uint32_t GPSBaud = 9600;
// The serial connection to the GPS module
SoftwareSerial gpsSerial(RXPin, TXPin);
void setup(){
Serial.begin(9600);
gpsSerial.begin(GPSBaud);
}
void loop(){
while (gpsSerial.available() > 0){
// get the byte data from the GPS
byte gpsData = gpsSerial.read();
Serial.write(gpsData);
}
}
Как работает код?
Этот скетч предполагает, что вы используете Pin 6 и Pin 5 в качестве RX и TX пинов последовательного порта для установления последовательной связи с GPS-модулем. Если вы используете другие пины, вам следует изменить их в следующих строках:
static const int RXPin = 6, TXPin = 5;
Кроме того, если ваш модуль использует скорость передачи данных по умолчанию, отличную от 9600 бит/с, вам следует изменить код в следующей строке:
static const uint32_t GPSBaud = 9600;
Затем мы создаём экземпляр SoftwareSerial на пинах, определённых ранее, с именем gpsSerial.
// The serial connection to the GPS device
SoftwareSerial gpsSerial(RXPin, TXPin);
В setup() мы инициализируем монитор порта.
Serial.begin(9600);
Затем мы инициализируем последовательную связь с GPS-модулем.
gpsSerial.begin(GPSBaud);
В loop() код прослушивает последовательный порт GPS, и когда данные получены от модуля, они выводятся в монитор порта.
void loop(){
while (gpsSerial.available() > 0){
// get the byte data from the GPS
byte gpsData = gpsSerial.read();
Serial.write(gpsData);
}
}
Тестирование кода
Загрузите код на вашу плату.
Убедитесь, что антенна подключена и что модуль или антенна размещены снаружи или рядом с окном, чтобы они могли получать данные от спутников.
Синий светодиод модуля начнёт мигать, когда он найдёт фиксацию позиции.
Монитор порта отобразит NMEA-предложения с GPS-данными (убедитесь, что скорость передачи данных монитора порта установлена на 9600).
Важно: Если вы запускаете этот скетч впервые, может потребоваться несколько минут, пока модуль не получит фиксацию позиции. Вы начнёте получать реальные данные, когда синий светодиод начнёт мигать. Если вы находитесь внутри здания, маловероятно, что вы сможете получить GPS-данные. Выйдите на улицу или разместите антенну снаружи, чтобы максимально увеличить шансы на приём сигнала от спутников.
Вы должны получить массу информации на стандартном языке GPS — NMEA. Каждая строка, которую вы видите в мониторе порта, является NMEA-предложением.
NMEA расшифровывается как National Marine Electronics Association (Национальная ассоциация морской электроники), и в мире GPS это стандартный формат данных, поддерживаемый производителями GPS.
NMEA-предложения
NMEA-предложения начинаются с символа $, и каждое поле данных разделяется запятой.
$GNRMC,115209.00,A,4114.5500,N,00861.4900,W,0.129,,160125,,,D*XX
$GNVTG,,T,,M,0.129,N,0.239,K,D*XX
$GNGGA,115209.00,4114.5500,N,00861.4900,W,2,10,0.93,130.6,M,50.1,M,,0000*XX
$GNGSA,A,3,24,25,28,32,29,,,,,,,,1.65,0.93,1.37*XX
$GNGSA,A,3,78,66,67,77,,86,26,083,20*XX
$GLGSV,3,3,09,87,13,131,*XX
$GNGLL,4114.5500,N,00861.4900,W,115209.00,A,D*XX
Существуют различные типы NMEA-предложений. Тип сообщения определяется символами перед первой запятой.
GN после $ указывает, что это GPS-позиция. $GNGGA — это базовое GNSS NMEA-сообщение, которое предоставляет данные о 3D-местоположении и точности.
В следующем предложении:
$GNGGA,110827.00,4114.32485,N,00831.79799,W,1,10,0.93,130.6,M,50.1,M,,*5F
Вот как выглядят поля для M8N:
$GNGGA: Данные глобального GNSS-местоположения.110827.00: Время в UTC (11:08:27).4114.32485,N: Широта.00831.79799,W: Долгота.1: Качество фиксации (1 = GPS-фиксация, 2 = DGPS и т.д.).10: Количество отслеживаемых спутников (больше для M8N по сравнению с NEO-6M).0.93: Горизонтальное снижение точности (чем меньше, тем лучше).130.6,M: Высота над средним уровнем моря (в метрах).50.1,M: Высота геоида над эллипсоидом WGS84.*5F: Пересчитанная контрольная сумма для NEO-M8N.
Другие NMEA-предложения предоставляют дополнительную информацию:
$GNRMC — Основные данные GNSS PVT (позиция, скорость, время)
$GNVTG — Информация о скорости и курсе
$GNGGA — Информация о GNSS-фиксации
$GNGSA — DOP и активные спутники GNSS
$GLGSV — Подробная информация о спутниках (GLONASS)
$GNGLL — Географическая широта и долгота
Для получения дополнительной информации о NMEA-предложениях я нашёл этот веб-сайт с очень подробной информацией.
Вы можете использовать этот онлайн-анализатор NMEA и вставить туда ваши предложения для интерпретации GPS-данных.
Однако самый простой способ получить и интерпретировать нужные вам GPS-данные — это парсить NMEA-предложения непосредственно в коде. Для этого мы можем использовать библиотеку TinyGPSPlus, которая предоставляет методы для простого извлечения данных из NMEA-предложений.
Парсинг NMEA-предложений с помощью библиотеки TinyGPSPlus
Библиотека TinyGPSPlus упрощает получение GPS-данных в формате, который легко понять. Вы можете нажать здесь для получения дополнительной информации о библиотеке TinyGPSPlus.
Установка библиотеки TinyGPSPlus
В Arduino IDE перейдите в Sketch > Include Library > Manage Libraries или нажмите на значок Library Manager на левой боковой панели.
Найдите TinyGPSPlus и установите библиотеку от Mikal Hart.
Получение GPS-данных с помощью GPS-модуля NEO-M8N и библиотеки TinyGPSPlus
Следующий код показывает, как получить GPS-данные с помощью библиотеки TinyGPSPlus. Мы получим дату, время, скорость, высоту, количество видимых спутников и HDOP (показатель точности сигнала).
/*
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/arduino-neo-m8n-gps-module/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 6, TXPin = 5;
static const uint32_t GPSBaud = 9600;
// The TinyGPS++ object
TinyGPSPlus gps;
// The serial connection to the GPS device
SoftwareSerial gpsSerial(RXPin, TXPin);
void setup() {
// Serial Monitor
Serial.begin(9600);
// Start Serial for the GPS module
gpsSerial.begin(GPSBaud);
Serial.println("Software Serial started at 9600 baud rate");
}
void loop() {
// This sketch displays information every time a new sentence is correctly encoded.
unsigned long start = millis();
while (millis() - start < 2000) {
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
if (gps.location.isUpdated()) {
Serial.print("LAT: ");
Serial.println(gps.location.lat(), 6);
Serial.print("LONG: ");
Serial.println(gps.location.lng(), 6);
Serial.print("SPEED (km/h) = ");
Serial.println(gps.speed.kmph());
Serial.print("ALT (min)= ");
Serial.println(gps.altitude.meters());
Serial.print("HDOP = ");
Serial.println(gps.hdop.value() / 100.0);
Serial.print("Satellites = ");
Serial.println(gps.satellites.value());
Serial.print("Time in UTC: ");
Serial.println(String(gps.date.year()) + "/" + String(gps.date.month()) + "/" + String(gps.date.day()) + "," + String(gps.time.hour()) + ":" + String(gps.time.minute()) + ":" + String(gps.time.second()));
Serial.println("");
}
}
}
Как работает код?
Вы начинаете с подключения библиотеки TinyGPSPlus.
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
Затем вы определяете пины, которые хотите использовать как RX и TX, и скорость передачи данных GPS.
static const int RXPin = 6, TXPin = 5;
static const uint32_t GPSBaud = 9600;
Затем вы создаёте объект TinyGPSPlus:
TinyGPSPlus gps;
Создайте экземпляр SoftwareSerial на пинах, определённых ранее.
SoftwareSerial gpsSerial(RXPin, TXPin);
В setup() инициализируйте монитор порта и последовательную связь с GPS-модулем.
void setup() {
// Serial Monitor
Serial.begin(9600);
// Start Serial for the GPS module
gpsSerial.begin(GPSBaud);
Serial.println("Software Serial started at 9600 baud rate");
}
В loop() происходит запрос информации. Парсите данные от GPS-модуля в объект TinyGPSPlus с помощью метода encode() следующим образом.
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
Затем вы можете запросить объект gps, чтобы узнать, были ли обновлены какие-либо поля данных:
if (gps.location.isUpdated()) {
Если есть новые данные, мы можем получить их следующим образом:
Широта |
|
Долгота |
|
Скорость (км/ч) |
|
Высота (метры) |
|
HDOP |
|
Количество видимых спутников |
|
Год |
|
Месяц |
|
День |
|
Часы |
|
Минуты |
|
Секунды |
|
В коде мы получаем данные и выводим всю информацию в монитор порта.
Serial.print("LAT: ");
Serial.println(gps.location.lat(), 6);
Serial.print("LONG: ");
Serial.println(gps.location.lng(), 6);
Serial.print("SPEED (km/h) = ");
Serial.println(gps.speed.kmph());
Serial.print("ALT (min)= ");
Serial.println(gps.altitude.meters());
Serial.print("HDOP = ");
Serial.println(gps.hdop.value() / 100.0);
Serial.print("Satellites = ");
Serial.println(gps.satellites.value());
Serial.print("Time in UTC: ");
Serial.println(String(gps.date.year()) + "/" + String(gps.date.month()) + "/" + String(gps.date.day()) + "," + String(gps.time.hour()) + ":" + String(gps.time.minute()) + ":" + String(gps.time.second()));
Serial.println("");
Тестирование кода
Загрузите код на вашу плату Arduino. Откройте монитор порта на скорости 9600 бит/с. Убедитесь, что ваш GPS-модуль размещён снаружи или рядом с окном для получения данных от спутников.
Примечание: вам может потребоваться подождать несколько секунд или минут, пока модуль не получит фиксацию позиции.
Вы получите данные в мониторе порта о вашем текущем местоположении, скорости, высоте, количестве видимых спутников, HDOP и времени.
HDOP расшифровывается как Horizontal Dilution of Precision (горизонтальное снижение точности). Это показатель точности определения позиции. Чем выше значение HDOP, тем менее точной будет фиксация позиции. В идеале вы должны получить значение меньше 2. Чем меньше значение, тем лучше точность.
Заключение
В этом руководстве вы узнали, как использовать GPS-модуль NEO-M8N с Arduino. Он весьма похож на NEO-6M, но поддерживает несколько спутниковых систем, а не только GPS. Мы рассмотрели, как получить информацию о местоположении и времени.
У нас есть ещё руководства для датчиков и модулей Arduino, которые могут быть вам полезны:
Полное руководство по ультразвуковому датчику HC-SR04 с Arduino
Полное руководство по датчику влажности и температуры DHT11/DHT22 с Arduino
Узнайте больше об Arduino с помощью наших руководств:
Спасибо за чтение.