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

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

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

В этом руководстве вы узнаете, как:

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

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

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

У нас есть аналогичное руководство для платы ESP32 с GPS-модулем NEO-6M (Arduino IDE).

Если вы новичок в работе с платой ESP8266, вам может быть полезно прочитать: Начало работы с платой разработки ESP8266 NodeMCU.

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

GPS-модуль NEO-6M — это GPS-приёмник, совместимый с большинством плат микроконтроллеров. Он может получать данные о местоположении, скорости, высоте и времени.

GPS-модуль NEO-6M

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

Обычно эти модули поставляются с керамической GPS-антенной.

Керамическая GPS-антенна

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

Антенны для GPS-модулей

GPS-модуль NEO-6M связывается с микроконтроллером, используя протокол последовательной связи.

Этот модуль работает со стандартными NMEA-предложениями. NMEA расшифровывается как National Marine Electronics Association (Национальная ассоциация морской электроники), и в мире GPS это стандартный формат данных, поддерживаемый производителями GPS.

Характеристики GPS-модуля NEO-6M

GPS-модуль NEO-6M

Краткие характеристики:

  • Этот модуль имеет внешнюю антенну и встроенную EEPROM.

  • Интерфейс: RS232 TTL

  • Питание: от 3 В до 5 В

  • Скорость передачи данных по умолчанию: 9600 бит/с

  • Работает со стандартными NMEA-предложениями

Где купить?

Вы можете приобрести GPS-модуль NEO-6M по цене от $5 до $20. Рекомендуем посмотреть страницу GPS-модуля NEO-6M на Maker Advisor, чтобы сравнить цены в разных магазинах и найти лучшую.

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

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

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

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

GPS-модуль NEO-6M

ESP8266

VCC

3V3

RX

GPIO 12 (D6)

TX

GPIO 14 (D5)

GND

GND

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

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

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

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

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

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

После подключения GPS-модуля к ESP8266 и установки библиотеки TinyGPSPlus давайте запустим простой пример для получения широты, долготы, высоты, даты, времени и многого другого.

ESP8266 NodeMCU с GPS-модулем NEO-6M

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

/*********
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete instructions at https://RandomNerdTutorials.com/esp8266-nodemcu-neo-6m-gps-module-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 2
#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() инициализируем монитор порта и последовательную связь с 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()

В коде мы получаем данные и выводим всю информацию в монитор порта 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("");

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

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

Затем откройте монитор порта на скорости 115200 бод.

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

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

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

Синий светодиод GPS-модуля NEO-6M мигает

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

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

Получение GPS-данных с ESP8266 — модуль NEO-6M

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

Теперь вы можете развить этот проект дальше и отобразить данные, например, на OLED-дисплее. Чтобы узнать, как использовать OLED-дисплей с платой ESP8266, вы можете следовать следующему руководству:

Заключение

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

Точность данных будет зависеть от того, где размещён модуль, и от используемой антенны. Для лучшей производительности датчик должен быть размещён на улице или рядом с окном и вдали от узких улиц с высокими зданиями. Чем больше количество видимых спутников, тем точнее будет определение местоположения.

Мы надеемся, что это руководство было для вас полезным. У нас есть руководства для более чем 20 модулей и датчиков с ESP8266, вы можете ознакомиться с ними ниже:

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