GPS NEO-6M - это модуль GPS, который позволяет определять местоположение и получать информацию о времени и скорости при помощи спутниковой навигации. Он работает на основе системы GPS (Global Positioning System), которая состоит из сети спутников, вращающихся вокруг Земли и передают сигналы в приемники GPS на земле. GPS NEO-6 может работать как автономно, так и в составе более крупных проектов.
Технические параметры
- GPS модуль: U-Blox NEO-6M-0-001;Встроенная батарейка для быстрого, холодного старта;
- Чувствительность: -161 dBm;
- Скорость обновления: 5 Гц;
- Интерфейсы: UART (выведен), SPI, DDC, IIC;
- Передает координаты в формате: NMEA;
- Скорость подключения по умолчанию по UART: 9600 бод;
- Есть активная антенна;
- Напряжение питания: 3 – 5 В;
- Возможность работы с программами: U-Center и т.п.;
- Размеры платы: 57 х 25 x 15 мм;
- Вес комплекта: 18 г.
Для урока понадодиться:
Протокол NMEA (National Marine Electronics Association) - это стандарт обмена данными, который используется в морской электронике и навигации. GPS NEO-6M поддерживает протокол NMEA и может получать информацию о местоположении, времени, скорости и других параметрах. Сообщения NMEA начинаются со знака "$" и состоят из нескольких полей, разделенных запятой. Каждое сообщение имеет уникальный идентификатор, например $GPGGA (Global Positioning System Fix Data) или $GPRMC (Recommended Minimum Specific GPS/Transit Data). Различные сообщения содержат разную информацию о местоположении и времени, и могут использоваться для разных целей, например, для навигации, картографии или мониторинга транспорта. При работе с GPS NEO 6 важно знать, какие сообщения нужны для вашей задачи и как их правильно обрабатывать.
Подключение GPS NEO-6M к ESP32.
Чтобы подключить GPS NEO-6M к ESP32, необходимо использовать один из портов UART, которые поддерживаются на плате. Рекомендуется использовать порт Serial2, который доступен на выводах GPIO16 (RX) и GPIO17 (TX) на плате ESP32. На модуле GPS NEO 6 также есть выходы RX и TX, которые нужно соединить с соответствующими пинами на ESP32.
Схема подключения GPS NEO-6M к ESP32.
Светодиодный индикатор NEO-6M:
На модуле NEO-6M установлен светодиод, который показывает состояние определения местоположения.
- Не мигает — поиск спутников.
- Мигает каждые 1 с — определение местоположения найдено (модуль видит достаточно спутников).
UART (Universal Asynchronous Receiver-Transmitter) - это протокол последовательной связи, который используется для передачи данных между устройствами. UART работает в режиме асинхронного обмена данными, то есть данные передаются без использования внешней тактовой сигнализации. Вместо этого каждый байт данных отправляется со своим собственным стартовым битом и стоповым битом, чтобы получатель мог синхронизироваться с передатчиком.
Настройка порта Serial2 для работы с GPS NEO 6 может быть выполнена в следующем коде на языке Arduino:
void setup() {
Serial.begin(115200);
Serial2.begin(9600, SERIAL_8N1, 16, 17); // скорость 9600, формат 8 бит данных, пины RX и TX на 16 и 17 выводах
}
void loop() {
if (Serial2.available()) {
Serial.println("-------------------");
String data = Serial2.readStringUntil('\n');
Serial.println("-------------------");
Serial.println(data);
}
}
Аргументы функции begin() определяют скорость передачи данных, формат данных и пины RX и TX, соединенные с модулем GPS NEO 6. В основном цикле loop() можно использовать функцию available() для проверки наличия данных в Serial2, и если они есть, то использовать функцию readStringUntil() для чтения строковых данных, отправленных от модуля GPS NEO 6. Затем можно обработать эти данные в соответствии с требованиями вашего проекта.
Получение данных от GPS NEO-6M.
Чтение данных от GPS NEO 6 через порт Serial2 можно осуществить с помощью функции Serial2.readStringUntil(), которая читает строку символов из порта, пока не встретит указанный символ (в данном случае это символ новой строки '\n'). Пример кода:
void loop() {
if (Serial2.available()) {
Serial.println("-------------------");
String data = Serial2.readStringUntil('\n');
Serial.println("-------------------");
// обработка данных GPS NEO 6
}
}
Сообщения NMEA содержат информацию о координатах, времени, скорости, высоте и других параметрах, которые могут быть полезны для навигации. Каждое сообщение начинается с символа '$', за которым следует идентификатор сообщения (например, GPRMC, GPVTG, GPGGA и т. д.) и набор полей, разделенных запятыми. Пример NMEA сообщения:
-------------------
$GPGGA,115954.00,5806.00000,N,05747.00000,E,1,08,1.30,210.4,M,-4.8,M,,*48
-------------------
Чтобы извлечь информацию из NMEA сообщений, можно использовать функцию split(), которая разбивает строку на отдельные поля и возвращает массив строк. Пример кода:
void loop() {
if (Serial2.available()) {
String data = Serial2.readStringUntil('\n');
Serial.println(data);
Serial.println("-------------------");
delay(1000);
// обработка данных GPS NEO 6
if (data.startsWith("$GPGGA")) { // проверяем, является ли сообщение GGA
String* fields = split(data, ',', qtde); // разбиваем сообщение на поля
float lat = fields[2].toFloat(); // извлекаем широту
float lon = fields[4].toFloat(); // извлекаем долготу
float alt = fields[9].toFloat(); // извлекаем высоту
// обработка полученных данных
// -- выводим широту
Serial.print("lat: ");
Serial.println(lat);
// -- выводим долготу
Serial.print("lon: ");
Serial.println(lon);
// -- выводим высоту
Serial.print("alt: ");
Serial.println(alt);
Serial.println("-------------------");
delay(1000);
}
}
}
String* split(String& v, char delimiter, int& length) {
length = 1;
bool found = false;
// Figure out how many itens the array should have
for (int i = 0; i < v.length(); i++) {
if (v[i] == delimiter) {
length++;
found = true;
}
}
// If the delimiter is found than create the array
// and split the String
if (found) {
// Create array
String* valores = new String[length];
// Split the string into array
int i = 0;
for (int itemIndex = 0; itemIndex < length; itemIndex++) {
for (; i < v.length(); i++) {
if (v[i] == delimiter) {
i++;
break;
}
valores[itemIndex] += v[i];
}
}
// Done, return the values
return valores;
}
// No delimiter found
return nullptr;
}
В этом примере кода мы сначала проверяем, является ли прочитанное сообщение сообщением GGA, используя функцию startsWith(). Затем мы разбиваем строку на поля с помощью функции split() и сохраняем результат в массив строк fields[]. Затем мы извлекаем нужную информацию из полей массива fields[] с помощью функции toFloat() и сохраняем результат в соответствующие переменные. Кроме широты, долготы и высоты, из других сообщений можно извлекать информацию о скорости и времени, используя аналогичный подход. Например, чтобы получить информацию о скорости, можно использовать сообщение VTG:
-------------------
$GPVTG,,T,,M,0.732,N,1.355,K,A*27
-------------------
В этой строке скорость находится в пятом поле (0.732), которое указывает на скорость в узлах. Чтобы извлечь эту информацию, мы можем использовать следующий код:
if (data.startsWith("$GPVTG")) { // проверяем, является ли сообщение VTG
String* fields = split(data, ',', qtde); // разбиваем сообщение на поля
float speed = fields[5].toFloat(); // извлекаем скорость в узлах
}
Кроме того, можно использовать сообщение RMC для получения информации о времени:
-------------------
$GPRMC,120009.00,A,5806.00000,N,05747.00000,E,0.187,,200323,,,A*78
-------------------
В этой строке время находится в первом поле (120009.00), которое представляет собой время UTC в формате HHMMSS.ss. Чтобы извлечь это время, мы можем использовать следующий код:
if (data.startsWith("$GPRMC")) { // проверяем, является ли сообщение RMC
String* fields = split(data, ',', qtde); // разбиваем сообщение на поля
String time = fields[1]; // извлекаем время в формате HHMMSS.ss
}
Таким образом, используя различные NMEA сообщения и функцию split(), можно извлекать различную информацию о координатах, времени, скорости и других параметрах из GPS NEO 6 и использовать эту информацию для навигации, геопозиционирования и других приложений.
Пример кода, который позволяет получать данные от GPS NEO 6 с использованием библиотеки TinyGPS++.
Для упрощения процесса чтения данных от GPS NEO 6 мы можем использовать библиотеку TinyGPS++. Она предоставляет удобные функции для обработки NMEA сообщений и извлечения информации о координатах, времени и других параметрах.
Установка библиотек:
Первым делом необходимо установить библиотеку "TinyGPSPlus", скачать ее можно в конце статьи или с сайта github.com.
Пример кода для получения данных от GPS NEO 6 с использованием библиотеки TinyGPS++ выглядит следующим образом:
#include <TinyGPS++.h>
// Создаем объект GPS
TinyGPSPlus gps;
void setup() {
Serial.begin(9600);
Serial2.begin(9600, SERIAL_8N1, 16, 17);
}
void loop() {
while (Serial2.available() > 0) {
if (gps.encode(Serial2.read())) {
// Если есть данные
if (gps.location.isValid() && gps.date.isValid() && gps.time.isValid() && gps.speed.isValid()) {
// Выводим координаты
Serial.print("Latitude: ");
Serial.print(gps.location.lat(), 6);
Serial.print(" Longitude: ");
Serial.println(gps.location.lng(), 6);
// Выводим время
Serial.print("Time: ");
Serial.print(gps.time.hour());
Serial.print(":");
Serial.print(gps.time.minute());
Serial.print(":");
Serial.println(gps.time.second());
// Выводим скорость
Serial.print("Speed: ");
Serial.print(gps.speed.kmph());
Serial.println(" km/h");
delay(1000);
}
}
}
}
Здесь мы создаем объект GPS и настраиваем порты Serial и Serial2. В цикле loop() мы проверяем, есть ли данные от GPS в порте Serial2. Если есть, мы передаем эти данные в функцию encode() библиотеки TinyGPS++, которая обрабатывает сообщения NMEA и извлекает из них нужную информацию. Затем мы проверяем, есть ли данные для получения информации о координатах, скорости и времени, и если да, то выводим эту информацию в монитор порта.
В этом примере мы использовали методы объекта gps, такие как gps.location.lat() и gps.speed.kmph(), для извлечения информации о координатах и скорости. Эти методы возвращают значения в удобном для нас формате, который мы можем вывести в монитор порта с помощью методов Serial.print() и Serial.println().
Также мы использовали методы объекта gps, такие как gps.date.isValid() и gps.time.isValid(), для проверки, есть ли данные для получения информации о времени.
Заключение.
В данной статье мы рассмотрели процесс подключения и использования GPS-модуля NEO 6 с контроллером ESP32. Мы изучили, что такое GPS, как работает протокол NMEA и как обрабатывать данные GPS, используя библиотеку TinyGPS++.
Знание использования
GPS-модуля может быть полезно во многих
проектах, таких как навигация, геолокация, мониторинг и т.д. Используя эти знания, вы можете создавать устройства, которые могут определять свое местоположение, скорость и направление движения.
Понравился урок: Подключение GPS NEO-6M к ESP32 с примерами кода? Не забудь поделиться с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube, вступить в группу Вконтакте.
Спасибо за внимание!
Технологии начинаются с простого!
Фотографии к статье
Файлы для скачивания
|
Пример кода, который позволяет получать данные от GPS NEO 6 с использованием библиотеки TinyGPS++.ino | 2 Kb | 634 |
Скачать
Вы можете скачать файл.
|
|
Чтение данных от GPS NEO 6 через порт Serial2.ino | 2 Kb | 597 |
Скачать
Вы можете скачать файл.
|
Комментарии