Arduino с GPS-модулем NEO-M8N: получение широты, долготы, высоты, даты и времени

В этом руководстве вы узнаете, как подключить плату Arduino к GPS-модулю NEO-M8N. Вы научитесь подключать модуль к плате и программировать его для получения GPS-данных: широты, долготы, высоты, времени UTC, количества видимых спутников и многого другого.

Arduino с GPS-модулем NEO-M8N

Вот что вы узнаете из этого руководства:

  • Подключение GPS-модуля NEO-M8N к Arduino через последовательный порт;

  • Получение необработанных GPS-данных;

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

Знакомство с GPS-модулем NEO-M8N

GPS-модуль NEO-M8N является одним из самых популярных GPS-приёмников, используемых с микроконтроллерами в проектах навигации и отслеживания. Он может получать данные о широте, долготе, высоте и времени.

Он поддерживает несколько спутниковых систем, включая GPS, Galileo, GLONASS и BeiDou. Он обеспечивает лучшее отслеживание спутников, чем NEO-6M, что делает его более надёжным в сложных условиях.

GPS-модуль NEO-M8N

Согласно даташиту, он имеет точность определения горизонтального положения от 2,5 до 4 метров и быстрое время запуска (1 секунда для горячего старта, 26–57 секунд для холодного старта — ожидайте более длительное время, если вы находитесь рядом со зданиями).

Модуль включает резервную батарею, встроенную EEPROM и светодиодный индикатор, который мигает при достижении фиксации позиции.

Этот модуль обычно поставляется с керамической GPS-антенной. Но вы можете заменить её на любую другую совместимую антенну, которая лучше подходит для вашего проекта. Например, мне нравится использовать ту, что справа на картинке ниже, потому что она водонепроницаемая, и антенна поставляется с длинным кабелем, что обеспечивает большую гибкость.

Антенны для 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

GPS-модуль NEO-M8N

Arduino

VCC

5V

RX

Pin 5

TX

Pin 6

GND

GND

Получение необработанных GPS-данных — тестирование GPS-модуля NEO-M8N с Arduino

Чтобы получить необработанные GPS-данные, вам нужно установить последовательную связь с GPS-модулем и прочитать доступные данные.

Arduino с GPS-модулем NEO-M8N — получение необработанных данных

Следующий код устанавливает последовательную связь с 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);
  }
}

Тестирование кода

Загрузите код на вашу плату.

Кнопка загрузки Arduino IDE 2

Убедитесь, что антенна подключена и что модуль или антенна размещены снаружи или рядом с окном, чтобы они могли получать данные от спутников.

Активная GPS-антенна для NEO-6M

Синий светодиод модуля начнёт мигать, когда он найдёт фиксацию позиции.

Монитор порта отобразит NMEA-предложения с GPS-данными (убедитесь, что скорость передачи данных монитора порта установлена на 9600).

Важно: Если вы запускаете этот скетч впервые, может потребоваться несколько минут, пока модуль не получит фиксацию позиции. Вы начнёте получать реальные данные, когда синий светодиод начнёт мигать. Если вы находитесь внутри здания, маловероятно, что вы сможете получить GPS-данные. Выйдите на улицу или разместите антенну снаружи, чтобы максимально увеличить шансы на приём сигнала от спутников.

Получение необработанных GPS-данных с Arduino и NEO-M8N

Вы должны получить массу информации на стандартном языке 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

Arduino с GPS-модулем NEO-M8N — руководство

Библиотека TinyGPSPlus упрощает получение GPS-данных в формате, который легко понять. Вы можете нажать здесь для получения дополнительной информации о библиотеке TinyGPSPlus.

Установка библиотеки TinyGPSPlus

В Arduino IDE перейдите в Sketch > Include Library > Manage Libraries или нажмите на значок Library Manager на левой боковой панели.

Найдите TinyGPSPlus и установите библиотеку от Mikal Hart.

Установка библиотеки TinyGPSPlus в Arduino IDE

Получение 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()) {

Если есть новые данные, мы можем получить их следующим образом:

Широта

gps.location.lat()

Долгота

gps.location.lng()

Скорость (км/ч)

gps.speed.kmph()

Высота (метры)

gps.altitude.meters()

HDOP

gps.hdop.value()

Количество видимых спутников

gps.satellites.value()

Год

gps.date.year()

Месяц

gps.date.month()

День

gps.date.day()

Часы

gps.time.hour()

Минуты

gps.time.minute()

Секунды

gps.time.second()

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

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

Примечание: вам может потребоваться подождать несколько секунд или минут, пока модуль не получит фиксацию позиции.

Arduino с NEO-M8N — получение парсированных данных с TinyGPSPlus

Вы получите данные в мониторе порта о вашем текущем местоположении, скорости, высоте, количестве видимых спутников, HDOP и времени.

HDOP расшифровывается как Horizontal Dilution of Precision (горизонтальное снижение точности). Это показатель точности определения позиции. Чем выше значение HDOP, тем менее точной будет фиксация позиции. В идеале вы должны получить значение меньше 2. Чем меньше значение, тем лучше точность.

Заключение

В этом руководстве вы узнали, как использовать GPS-модуль NEO-M8N с Arduino. Он весьма похож на NEO-6M, но поддерживает несколько спутниковых систем, а не только GPS. Мы рассмотрели, как получить информацию о местоположении и времени.

У нас есть ещё руководства для датчиков и модулей Arduino, которые могут быть вам полезны:

Узнайте больше об Arduino с помощью наших руководств:

Спасибо за чтение.