ESP8266 NodeMCU с GPS-модулем NEO-6M (Arduino IDE)
Узнайте, как подключить GPS-модуль NEO-6M к плате ESP8266 NodeMCU для получения GPS-данных. Вы узнаете, как получить широту, долготу, высоту, скорость и время UTC. ESP8266 будет программироваться с использованием Arduino IDE.
В этом руководстве вы узнаете, как:
Подключить GPS-модуль NEO-6M к ESP8266 через последовательный интерфейс
Парсить необработанные данные для получения выбранной и читаемой GPS-информации
Получить ваше текущее местоположение, дату, время и многое другое…
У нас есть аналогичное руководство для платы ESP32 с GPS-модулем NEO-6M (Arduino IDE).
Если вы новичок в работе с платой ESP8266, вам может быть полезно прочитать: Начало работы с платой разработки ESP8266 NodeMCU.
Знакомство с GPS-модулем NEO-6M
GPS-модуль NEO-6M — это GPS-приёмник, совместимый с большинством плат микроконтроллеров. Он может получать данные о местоположении, скорости, высоте и времени.
Модуль поставляется с небольшой резервной батареей, внешней EEPROM и светодиодным индикатором сигнала. Этот светодиод начнёт мигать, когда модуль получит фиксацию позиции.
Обычно эти модули поставляются с керамической GPS-антенной.
Но вы можете заменить её на любую другую совместимую антенну, которая лучше подходит для вашего проекта. Например, мне нравится использовать ту, что справа на фотографии ниже, потому что она водонепроницаемая, а антенна поставляется с длинным кабелем, что обеспечивает большую гибкость.
GPS-модуль NEO-6M связывается с микроконтроллером, используя протокол последовательной связи.
Этот модуль работает со стандартными NMEA-предложениями. NMEA расшифровывается как National Marine Electronics Association (Национальная ассоциация морской электроники), и в мире GPS это стандартный формат данных, поддерживаемый производителями GPS.
Характеристики 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 |
|---|---|
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.
ESP8266 с GPS-модулем NEO-6M — получение GPS-данных
После подключения GPS-модуля к ESP8266 и установки библиотеки TinyGPSPlus давайте запустим простой пример для получения широты, долготы, высоты, даты, времени и многого другого.
Следующий код показывает, как получить 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()) {
Если есть новые данные, мы можем получить их следующим образом:
Широта |
|
Долгота |
|
Скорость (км/ч) |
|
Высота (метры) |
|
HDOP |
|
Количество видимых спутников |
|
Год |
|
Месяц |
|
День |
|
Часы |
|
Минуты |
|
Секунды |
|
В коде мы получаем данные и выводим всю информацию в монитор порта 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 бод.
Убедитесь, что антенна подключена и что модуль или антенна размещены на улице или рядом с окном, чтобы можно было получать данные со спутников.
Синий светодиод модуля начнёт мигать, когда модуль найдёт фиксацию позиции.
Откройте монитор порта на скорости 115200 бод. Убедитесь, что ваш GPS-модуль размещён на улице или рядом с окном для получения данных со спутников.
Вы получите GPS-данные в мониторе порта о вашем текущем местоположении, скорости, высоте, количестве видимых спутников, HDOP и времени.
HDOP расшифровывается как Horizontal Dilution of Precision (горизонтальное снижение точности). Это показатель точности определения местоположения. Чем выше значение HDOP, тем менее точным будет определение местоположения. В идеале вы должны получить значение меньше 2. Более низкое значение означает лучшую точность.
Теперь вы можете развить этот проект дальше и отобразить данные, например, на OLED-дисплее. Чтобы узнать, как использовать OLED-дисплей с платой ESP8266, вы можете следовать следующему руководству:
Заключение
В этом руководстве вы узнали, как использовать GPS-модуль NEO-6M с ESP8266 для получения GPS-данных: широты, долготы, высоты, скорости, даты, времени, количества спутников и многого другого.
Точность данных будет зависеть от того, где размещён модуль, и от используемой антенны. Для лучшей производительности датчик должен быть размещён на улице или рядом с окном и вдали от узких улиц с высокими зданиями. Чем больше количество видимых спутников, тем точнее будет определение местоположения.
Мы надеемся, что это руководство было для вас полезным. У нас есть руководства для более чем 20 модулей и датчиков с ESP8266, вы можете ознакомиться с ними ниже:
Если вы хотите узнать больше об ESP8266, ознакомьтесь с нашими ресурсами: