ESP8266 NodeMCU с GPS-модулем NEO-M8N (Arduino IDE)

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

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

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

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

  • Парсить необработанные данные для получения выбранной и читаемой GPS-информации;

  • Получать ваше текущее местоположение, дату, время и многое другое…

Оглавление

В этом руководстве мы рассмотрим следующие темы:

Знакомство с 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 для сравнения цен на GPS-приёмник NEO-M8N в разных магазинах:

Вы можете воспользоваться приведёнными выше ссылками или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все комплектующие для ваших проектов по лучшей цене!

Подключение GPS-модуля NEO-M8N к ESP8266

Для связи с GPS-модулем NEO-M8N мы будем использовать программный последовательный порт (Software Serial), поэтому вы можете использовать любые доступные GPIO. Мы будем использовать: GPIO 14 (D5) и GPIO 12 (D6).

Схема подключения GPS-модуля NEO-M8N к ESP8266 NodeMCU

Рекомендуемое чтение: Распиновка ESP8266: какие выводы GPIO следует использовать?

GPS-модуль NEO-M8N

ESP8266 NodeMCU

VCC

3V3

RX

GPIO 12 (D6)

TX

GPIO 14 (D5)

GND

GND

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

Мы будем программировать ESP8266 NodeMCU с помощью Arduino IDE. Убедитесь, что у вас установлены платы ESP8266, следуя этому руководству: Установка платы ESP8266 в Arduino IDE 2 (Windows, Mac OS X, Linux).

Для декодирования NMEA-сообщений, получаемых от GPS-модуля, мы будем использовать библиотеку TinyGPSPlus. Установите её перед продолжением.

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

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

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

ESP8266 NodeMCU с GPS-модулем NEO-M8N — получение данных GPS

ESP8266 с GPS-модулем NEO-M8N — получение данных GPS

Следующий код показывает, как получить данные GPS с помощью библиотеки TinyGPSPlus. Мы получим дату, время, скорость, высоту, количество видимых спутников и HDOP (показатель точности сигнала).

/*********
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete instructions at https://RandomNerdTutorials.com/esp8266-nodemcu-neo-m8n-gps-arduino/
  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>
#include <TinyGPS++.h>

// Define the RX and TX pins for Software Serial
#define RX 14
#define TX 12

#define GPS_BAUD 9600

// The TinyGPS++ object
TinyGPSPlus gps;

// Create an instance of Software Serial
SoftwareSerial gpsSerial(RX, TX);

void setup() {
  // Serial Monitor
  Serial.begin(115200);

  // Start Serial 2 with the defined RX and TX pins and a baud rate of 9600
  gpsSerial.begin(GPS_BAUD);
  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 < 1000) {
    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 и SoftwareSerial.

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

Затем вы определяете GPIO, которые хотите использовать для Software Serial, и скорость передачи данных GPS-модуля.

// Define the RX and TX pins for Software Serial 2
#define RX 14
#define TX 12

#define GPS_BAUD 9600

Затем вы создаёте объект TinyGPS++:

TinyGPSPlus gps;

Создаёте экземпляр SoftwareSerial на определённых ранее пинах.

SoftwareSerial gpsSerial(RX, TX);

В функции setup() вы инициализируете Serial Monitor и последовательную связь с GPS-модулем.

void setup() {
  // Serial Monitor
  Serial.begin(115200);

  // Start Serial 2 with the defined RX and TX pins and a baud rate of 9600
  gpsSerial.begin(GPS_BAUD);
  Serial.println("Software Serial started at 9600 baud rate");
}

В функции loop() происходит запрос информации. Парсинг данных от GPS-модуля в объект TinyGPS++ выполняется с помощью метода 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 Monitor Arduino IDE.

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("");

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

Загрузите код на вашу плату ESP8266. Откройте Serial Monitor со скоростью 115200 бод. Убедитесь, что ваш GPS-модуль размещён на улице или рядом с окном для получения данных со спутников.

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

ESP8266 получение GPS-данных от NEO-M8N

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

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

Заключение

В этом руководстве вы узнали, как использовать GPS-модуль NEO-M8N с ESP8266 и как получить информацию о местоположении, времени, высоте, скорости, количестве спутников и многом другом.

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

Если вы хотите узнать больше о ESP8266, обязательно ознакомьтесь с нашими ресурсами: