GPS NEO-6M - это модуль GPS, который позволяет определять местоположение и получать информацию о времени и скорости при помощи спутниковой навигации. Он работает на основе системы GPS (Global Positioning System), которая состоит из сети спутников, вращающихся вокруг Земли и передают сигналы в приемники GPS на земле. GPS NEO-6 может работать как автономно, так и в составе более крупных проектов.
Для урока понадодиться:
Протокол 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, необходимо использовать один из портов UART, которые поддерживаются на плате. Рекомендуется использовать порт Serial2, который доступен на выводах GPIO16 (RX) и GPIO17 (TX) на плате ESP32. На модуле GPS NEO 6 также есть выходы RX и TX, которые нужно соединить с соответствующими пинами на ESP32.
Схема подключения GPS NEO-6M к ESP32.
Светодиодный индикатор NEO-6M:
На модуле NEO-6M установлен светодиод, который показывает состояние определения местоположения.
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 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++. Она предоставляет удобные функции для обработки 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.date.isValid() и gps.time.isValid(), для проверки, есть ли данные для получения информации о времени.
Заключение.
В данной статье мы рассмотрели процесс подключения и использования GPS-модуля NEO 6 с контроллером ESP32. Мы изучили, что такое GPS, как работает протокол NMEA и как обрабатывать данные GPS, используя библиотеку TinyGPS++.
Понравился урок: Подключение GPS NEO-6M к ESP32 с примерами кода? Не забудь поделиться с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube, вступить в группу Вконтакте.
Спасибо за внимание!
Технологии начинаются с простого!
Фотографии к статье
Файлы для скачивания
![]() |
Пример кода, который позволяет получать данные от GPS NEO 6 с использованием библиотеки TinyGPS++.ino | 2 Kb | 765 | Скачать |
![]() |
Чтение данных от GPS NEO 6 через порт Serial2.ino | 2 Kb | 731 | Скачать |
Уроки ESP32 (заметки)
20 марта , 2023
Комментариев:0
Файлов для скачивания:2
Фото:7
Понравилась статья? Нажми
Виджеты для Easy HMI
Читайте также
Мы в соц сетях
Комментарии