Подключение GPS NEO-6M к ESP32 с примерами кода.

GPS NEO-6M - это модуль GPS, который позволяет определять местоположение и получать информацию о времени и скорости при помощи спутниковой навигации. Он работает на основе системы GPS (Global Positioning System), которая состоит из сети спутников, вращающихся вокруг Земли и передают сигналы в приемники GPS на земле. GPS NEO-6 может работать как автономно, так и в составе более крупных проектов.

GPS NEO-6M - это модуль GPS, который позволяет определять местоположение и получать информацию о времени

Технические параметры

  • 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 важно знать, какие сообщения нужны для вашей задачи и как их правильно обрабатывать.

Протокол NMEA (National Marine Electronics Association) - это стандарт обмена данными


Подключение 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.

Схема подключения 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-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
  }
}

Получение данных от GPS NEO-6M.


Сообщения 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 NEO 6 с использованием библиотеки TinyGPS++.

В этом примере мы использовали методы объекта 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-модуля NEO 6 с контроллером ESP32.

Знание использования GPS-модуля может быть полезно во многих проектах, таких как навигация, геолокация, мониторинг и т.д. Используя эти знания, вы можете создавать устройства, которые могут определять свое местоположение, скорость и направление движения.

Понравился урок: Подключение GPS NEO-6M к ESP32 с примерами кода? Не забудь поделиться с друзьями в соц. сетях.

А также подписаться на наш канал на YouTube, вступить в группу Вконтакте.

Спасибо за внимание!

Технологии начинаются с простого!

Фотографии к статье

Файлы для скачивания

Пример кода, который позволяет получать данные от GPS NEO 6 с использованием библиотеки TinyGPS++ Пример кода, который позволяет получать данные от GPS NEO 6 с использованием библиотеки TinyGPS++.ino2 Kb 634 Скачать
Чтение данных от GPS NEO 6 через порт Serial2 Чтение данных от GPS NEO 6 через порт Serial2.ino2 Kb 597 Скачать

Комментарии

Ваше Имя*


Разработка проектов