В различных электронных проектах достаточно часто возникают задачи определения географических координат (широты и долготы) какого-либо устройства и, возможно, скорости его движения. Для решения данной задачи отлично подходят GPS модули. И в данной статье мы рассмотрим принципы работы GPS модуля NEO-6M и как его подключить к модулю ESP32.
Также на нашем сайте мы рассматривали подключение GPS модулей к другим микроконтроллерам (платам):
- к микроконтроллеру PIC;
- к микроконтроллеру AVR;
- к плате Arduino;
- к плате Raspberry Pi;
- к плате STM32 Blue Pill.
Необходимые компоненты
- Модуль ESP32 (купить на AliExpress).
- GPS модуль NEO-6M (купить на AliExpress).
Принципы работы GPS модуля NEO-6M
Распиновка GPS модуля NEO-6M
Распиновка GPS модуля NEO-6M показана на следующем рисунке. Как видим, он имеет всего 4 контакта: GND, TxD, RxD и VCC. При этом для взаимодействия с микроконтроллером используются контакты TxD и RxD.
Назначение контактов модуля:
GND – общий провод (земля) модуля, его необходимо подключить к общему проводу модуля ESP32.
TXD – передающий контакт GPS модуля, его необходимо подключить к контакту RX модуля ESP32.
RXD – приемный контакт GPS модуля, его необходимо подключить к контакту TX модуля ESP32.
VCC – контакт для подачи питания на GPS модуль, его необходимо подключить к контакту 3.3V модуля ESP32.
Компоненты GPS модуля NEO-6M
NEO-6M – это GSM GPS модуль, удобный для применения в различных проектах. Его компоненты показаны на следующем рисунке.
На плате GPS модуля NEO-6M расположены 5 его основных компонентов. Его первым главным компонентом является чип NEO-6M – это "сердце" модуля. Также в составе модуля имеется перезаряжаемая батарея и модуль энергонезависимой памяти EEPROM. Модуль EEPROM вместе с батареей позволяет хранить данные о времени, последние данные о местоположении и конфигурацию модуля, но он не предназначен для постоянного хранения данных. Без батарейки GPS модуль NEO-6M начинает свою работу с "холодного" старта, что увеличивает время включения модуля до "нормального" состояния. Батарейка в составе модуля начинает автоматически заряжаться при подаче на модуль питания и позволяет модулю хранить данные в течение двух недель после отключения от него питания.
Также на плате модуля имеется понижающий регулятор напряжения, поэтому его можно запитывать от напряжения 5V. Дополнительно в составе модуля имеется разъем UFL, к которому необходимо подключить внешнюю антенну для корректной работы модуля.
Обзор GPS модуля NEO-6M
Глобальная система навигации и определения положения (Global Positioning System, GPS) состоит из 31 спутника на орбите Земли. Мы знаем их точное местоположение благодаря тому что они непрерывно передают информацию о местоположении при помощи радиосигналов. Сердцем модуля GPS модуля NEO-6M является бок, разработанный компанией u-blox. Он по размеру очень маленький, но возможности у него впечатляющие. Он может отслеживать до 22 спутников по 50 каналам и потребляет ток всего 45mA во время своей работы. Работает он от напряжения 2.7V ~ 3.6V. Его интересной особенностью является режим энергосбережения, который позволяет уменьшить потребление электроэнергии. В этом режиме потребляемый им ток снижается до 11 мА. Для более подробной информации по модулю NEO-6M вы можете посмотреть даташит на него.
Светодиод-индикатор режима работы
При внимательном рассмотрении на плате модуля NEO-6M вы можете обнаружить маленький светодиод, который используется для индикации его режимов работы:
- не мигает: модуль ищет спутники;
- мигает каждую секунду: местоположение определено (модуль видит достаточное количество спутников);
Антенна
GPS модуль NEO-6M имеет чувствительность -161 дБм и содержит чувствительную антенну, которая может принимать радиосигналы от спутников. Антенна подключается к UFL разъему модуля.
Для большинства приложений вне помещений, возможностей антенны, показанной на рисунке ниже, вполне хватит, но для использования внутри помещений для обеспечения стабильной работы модуля может потребоваться активная GPS антенна, запитываемая от 3V.
Схема GPS модуля NEO-6M
Схема GPS модуля NEO-6M представлена на следующем рисунке. Как видите, она достаточно проста.
На схеме модуля мы имеем регулятор напряжения 3.3V, который отвечает за преобразование входного напряжения 5V в напряжение 3.3V. Также на схеме присутствует модуль EEPROM AT24C33 и батарейка – вместе они образуют временное ОЗУ (RAM), которое может хранить данные времени и местоположения в течение ограниченного времени. На схеме показан и разъем UFL, к которому подключается антенна.
Наиболее часто задаваемые вопросы про GPS модуль NEO-6M
Какая точность у GPS модуля NEO-6M?
Как следует из даташита на модуль NEO-6M, он в идеальных условиях имеет точность определения положения по горизонтали равную 2,5 метра.
Как узнать работает ли GPS модуль NEO-6M?
Подайте питание на модуль, подключите к нему преобразователь UART и установите бодовую скорость 9600 бод. Если модуль работает корректно, то вы должны получать данные от него каждую секунду.
Что такое GPS антенна?
GNSS или GPS антенна – это устройство, предназначенное для усиления и приема радиосигналов, транслируемых на определенных частотах спутниками GNSS (Global Navigation Satellite Systems, глобальная навигационная спутниковая система) и передачи их в GNSS или GPS приемник.
Почему для работы системы GPS нужно 4 спутника?
Для точного определения местоположения нужно именно 4 спутника. Каждый спутник передает сигнал, включающий точное время передачи сигнала и свою точную позицию относительно центра Земли.
Какие частоты использует система GPS?
Все спутники GPS передают сигналы на, как минимум, двух несущих частотах: L1 – 1575.42 MHz и L2 – 1227.6 MHz. Новые спутники могут также использовать частоту L5 – 1176 MHz.
Формат NMEA
GPS передает данные, идентифицирующие местоположение, в реальном времени. Но вместе с этими данными он передает и очень много других данных в формате NMEA – смотрите приведенный ниже рисунок. NMEA содержит несколько строк (предложений) – нам из всей этой совокупности данных будет нужна всего лишь одна строка. Эта строка начинается с $GPGGA и содержит координаты, время и другую полезную информацию. Эти данные относятся к фиксированным данным глобального позиционирования (Global Positioning System Fix Data).
Мы можем извлечь нужные нам данные из строки $GPGGA при помощи подсчета запятых в строке. К примеру, если вы нашли строку $GPGGA и сохранили ее в массиве, то широта может быть найдена в нем после двух запятых, а долгота – после четырех запятых. После извлечения значения широты и долготы можно поместить в другие массивы.
Приведем пример $GPGGA строки с расшифровкой:
$GPGGA,104534.000,7791.0381,N,06727.4434,E,1,08,0.9,510.4,M,43.9,M,,*47
$GPGGA,HHMMSS.SSS,latitude,N,longitude,E,FQ,NOS,HDP,altitude,M,height,M,,checksum data
В следующей таблице представлен перевод (описание) этих данных GPS.
Идентификатор | Описание |
$GPGGA | Фиксированные данные системы глобального позиционирования |
HHMMSS.SSS | Время в формате: час минута секунда и миллисекунда |
Latitude | Широта (координата) |
N | Направление: N=North (север), S=South (юг) |
Longitude | Долгота (координата) |
E | Направление: E= East (восток), W=West (запад) |
FQ | Данные фиксированного качества (Fix Quality Data) |
NOS | Номер использованного спутника |
HPD | Фактор снижения точности при определении положения в горизонтальной плоскости (Horizontal Dilution of Precision) |
Altitude | Высота над уровнем моря |
M | Meter (метр) |
Height | Height (высота) |
Checksum | Данные контрольной суммы |
Далее рассмотрим схему и программу проекта.
Схема проекта
Схема подключения GPS модуля NEO-6M к ESP32 представлена на следующем рисунке.
Объяснение кода программы для модуля ESP32
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Если вы подключите выход GPS модуля NEO-6M к монитору последовательной связи, то вы увидите в нем все те данные из NMEA предложений, которые были показаны на рисунке выше. Один из очевидных способов выделить из множества этих данных необходимые нам данные широты и долготы – это вычленить их из этого потока данных с помощью подсчета количества необходимых запятых в необходимом NMEA предложении, как это сделано, к примеру, в статье про подключение GPS модуля к микроконтроллеру AVR. Но мы упростим себе задачу и будем использовать для получения необходимых GPS данных библиотеку для модуля ESP32 под названием TinyGPSPlus, разработанную энтузиастом Mike Hart. Вы можете скачать ее с репозитория GitHub или использовать для ее установки менеджер библиотек Arduino IDE.
Первым делом в коде программы подключим необходимые библиотеки – у нас это будет всего одна библиотека.
1 |
#include <TinyGPSPlus.h> |
Далее, чтобы иметь возможность работы с этой библиотекой, создадим объект типа TinyGPSPlus.
1 |
TinyGPSPlus gps; |
Затем, в функции void setup(), мы инициализируем два порта последовательной связи модуля ESP32 (Serial и Serial2), чтобы иметь возможность одновременной работы и с GPS модулем, и с компьютером.
1 2 3 4 5 |
void setup() { Serial.begin(9600); Serial2.begin(9600); delay(3000); } |
Далее запрограммируем функцию updateSerial(). Эта функция представляет собой контур (петлю) обратной связи между портами UART1 и UART2 чтобы мы могли на компьютере мониторить данные, поступающие от GPS модуля.
1 2 3 4 5 6 7 8 9 |
void updateSerial(){ delay(500); while (Serial.available()) { Serial2.write(Serial.read());//Forward what Serial received to Software Serial Port } while (Serial2.available()) { Serial.write(Serial2.read());//Forward what Software Serial received to Serial Port } } |
После этого запрограммируем функцию displayInfo(), в которой мы будем считывать GPS данные широты и долготы с помощью функций gps.location.lat() и gps.location.lng() библиотеки TinyGPSPlus и выводить их в окно монитора последовательной связи.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void displayInfo() { Serial.print(F("Location: ")); if (gps.location.isValid()){ Serial.print(gps.location.lat(), 6); Serial.print(F(",")); Serial.print(gps.location.lng(), 6); } else { Serial.print(F("INVALID")); } } |
И, наконец, в функции void loop() мы сначала будем вызывать функцию updateSerial() – она будет полезна для процесса отладки программы. После того как вы отладили программу данную функцию можно закомментарить. Далее мы будем проверять доступен ли serial2. Если он доступен, то мы будем считывать с модуля данные долготы и широты и отображать их в окне монитора последовательной связи.
1 2 3 4 5 6 7 8 9 10 11 |
void loop() { //updateSerial(); while (Serial2.available() > 0) if (gps.encode(Serial2.read())) displayInfo(); if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println(F("No GPS detected: check wiring.")); while (true); } } |
Тестирование работы проекта
На представленном ниже видео вы можете увидеть как работает наш проект. При первоначальном включении мы будем с помощью окна монитора последовательной связи проверять поступление GPS данных от модуля. После этого первоначального тестирования мы будем уже целенаправленно выделять из этого потока данных широту и долготу и выводить их в окно монитора последовательной связи.
Отладка работы GPS модуля NEO-6M
При отладке данного проекта его автор (ссылка на оригинал приведена в конце статьи) столкнулся с рядом трудностей:
- первоначально он хотел запитать модуль от шины 3.3V модуля ESP32, но GPS модуль при этом не работал, поэтому ему пришлось использовать для питания модуля внешнюю батарею;
- для работы внутри помещений антенна, использованная в этом проекте, оказалась достаточно слабой. Для более стабильной работы модуля в этих условиях автор рекомендует использовать активную антенну.
Исходный код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#include <TinyGPSPlus.h> // The TinyGPSPlus object TinyGPSPlus gps; void setup() { Serial.begin(9600); Serial2.begin(9600); delay(3000); } void loop() { //updateSerial(); while (Serial2.available() > 0) if (gps.encode(Serial2.read())) displayInfo(); if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println(F("No GPS detected: check wiring.")); while (true); } } void displayInfo() { Serial.print(F("Location: ")); if (gps.location.isValid()){ Serial.print("Lat: "); Serial.print(gps.location.lat(), 6); Serial.print(F(",")); Serial.print("Lng: "); Serial.print(gps.location.lng(), 6); Serial.println(); } else { Serial.print(F("INVALID")); } } void updateSerial() { delay(500); while (Serial.available()) { Serial2.write(Serial.read());//Forward what Serial received to Software Serial Port } while (Serial2.available()) { Serial.write(Serial2.read());//Forward what Software Serial received to Serial Port } } |
Подключил neo6m через USB-TTL(ch340) к порту ноутбука. В программе u-center(8.21) модуль будто видит спутники но не может к ним подключиться и даже не принимает дату и время. в текстовой консоли есть какието данные, но гораздо больше запятых. В чем может быть проблема? может нужно чтото в конфигурации поменять?
Честно говоря, не знаю, не подключал таким образом gps модуль к компьютеру. Можете попробовать вот эту статью посмотреть, может она вам чем то поможет
Добрый вечер! Ц меня почему то при подключении ни от 5 ни от 3.3 v модуль так и не работает. Лежал сутки на окне( Может быть сам модуль попался не рабочий? И второй вопрос. При подключении контактов RX-TX и TX -RX скетчи перестают заливаться, IDE не конектится с МК. Как олько отключаю один из контактов,то все норм.
Добрый вечер. Ну тут нужно попробовать либо другой модуль, либо попробовать подключать его к другому источнику питания/компьютеру. По поводу отключения контактов на время загрузки программы да, такое возможно, читал где то про это. Не у всех экземпляров модуля это, конечно, проявляется, но судя по имеющейся информации в сети интернет проблема такая иногда все таки встречается
Видимо попался плохой модуль. Питал его и от внешних источников разных,увы так и не запустился.
Благодарю за ответ!
Да не за что, сочувствую
Схема GPS модуля NEO-6M какая то не такая, RF_IN никуда не идет.
А куда он обычно должен идти? И как вы собираетесь использовать внутреннюю схему GPS модуля? В большинстве случаев нам же нужны только его внешних 4 контакта
В тексте указана скорость 9660 - это видимо опечатка. 3.3V недостаточно для работы стабилизатора. Питать можно от 5V платы ESP32 при этом уровни TTL будут 3.3V
Да, спасибо, опечатку исправил. В разделе статьи "Отладка работы GPS модуля NEO-6M" написано что при питании от шины 3.3V модуля ESP32 модуль GPS у автора не работал, поэтому он запитал его от внешнего источника
Мне кажется если подать питание за стабилизатором модуля, то всё должно работать . На прямую в vcc на пинах - нет.
Возможно. Будем надеяться что кто-нибудь попробует так сделать и отпишется здесь о своих успехах