Подключение U-Blox NEO-7 к Wemos D1

Сегодня мы научимся подключать и настраивать основной компонент нашего устройства – GPS модуль на базе чипа от компании U-Blox серии NEO-7m.

NEO-7 относится к серии профессиональных модулей позиционирования, сочетает в себе низкое энергопотребление, высокую точность, а также, кроме GPS, поддерживает отечественный ГЛОНАСС.

Так как GPS и ГЛОНАСС модуль может задействовать только в режиме ИЛИ, то первым делом необходимо определиться, что мы будем использовать. Вот сводная таблица некоторых характеристик из официального даташита:

GPS

GLONASS

Холодный старт

30с

32с

Горячий старт

Точность позиционирования

2.5м

Точность скорости

0.1м/с

0.1м/с

Частота обновления (max)

10Гц

1Гц

Сигнал холодного старта

-147дБм

-139дБм

Сигнал навигации

-161дБм

-158дБм

С более подробной информацией можно ознакомиться на сайте производителя https://www.u-blox.com/en/product/neo-7-series.

Из таблицы уже становится понятно, что ГЛОНАСС нам абсолютно не подходит. Но всё же, я решил это проверить еще и на практике, для наглядности.

В режиме GPS, модуль быстро находит более 12 спутников и позиционируется по ним.

С режимом ГЛОНАСС я просидел в ожидании почти 20 минут, но, больше 5 спутников так и не увидел, зафиксировать положение даже в режиме 2D, модуль по ним тоже не смог.

Подключение NEO-7 к ESP8266

Общение с модулем реализовано через UART (com порт), поэтому подключить его к нашей плате Wemos D1 мы можем через аппаратный интерфейс (пины RX, TX) либо через софтверный (пины D7, D8).

Давайте для первоначальной настройки подключим NEO-7 через софтверный порт, так как аппаратный у нас задействован в соединении с компьютером, и напишем простой «бридж» com порта, который будет перенаправлять данные из GPS на порт компьютера.

Код будет предельно простым – два цикла, в которых ожидаются данные с com портов и при их поступлении пересылаются дальше. Создайте новый скетч в Arduino IDE со следующим содержимым и запустите его.

#include <SoftwareSerial.h>
SoftwareSerial gps(D7, D8, false, 256);
void setup() {
  Serial.begin(9600);
  gps.begin(9600);
}
void loop() {
  while (gps.available() > 0) {
    Serial.write(gps.read());
  }
  while (Serial.available() > 0) {
    gps.write(Serial.read());
  }
}

Если у вас есть USB – TTL конвертер, то вы можете просто подключить модуль через него к компьютеру и сразу приступить к настройке.

Теперь, если вы откроете «Монитор порта», то увидите поток данных в формате NMEA.

Настройка U-Blox NEO-7m

Чем по-настоящему меня порадовал модуль U-Blox, так это возможностью настраивать абсолютно все параметры чипа, как через фирменную утилиту U-Center, так и по хорошо задокументированным протоколам NMEA и UBX.

Скачайте U-Center с официального сайта https://www.u-blox.com/en/product/u-center-windows и установите его.

По умолчанию модуль отправляет данные в com порт в формате NMEA и UBX на скорости 9600 бод c частотой 1 раз в секунду. Нам для работы не нужен весь поток данных и обновление раз в секунду тоже не устраивает, поэтому мы перенастроим модуль под себя. К тому же NEO-7 и ESP8266 поддерживают скорость com порта вплоть до 115200 бод, так что её мы тоже увеличим.

Откройте U-Center, выберите скорость порта 9600 и ваш com порт.


Кнопка станет зеленой, а в правой части окна начнут появляться спутники.

Неизвестно, кто и что настраивал в этом модуле до нас, поэтому первым делом скинем настройки на дефолтные. Открываем окно конфигурации, «View – Configuration View», выбираем пункт «CFG (Configuration)», ставим переключатель в положение «Revert to default configuration» и нажимаем кнопку «Send».

Теперь переходим в пункт «GNSS (GNSS Config)», отключаем всё кроме GPS и SBAS, жмём «Send».

В пункте «NAV5 (Navigation 5)», устанавливаем «Dynamic Model» в положение «3-Pedestrian», не забываем нажать кнопку «Send».

Увеличим частоту обновления данных, для этого в пункте «RATE (Rates)» вводим в поле «Measurement Period» число 100, и применяем настройки, нажав кнопку «Send». Теперь данные будут прилетать с частотой 10 герц.

В пункте «SBAS (SBAS Settings)», устанавливаем переключатель «PRN Codes» в положение «Auto-Scan» и нажимаем «Send».

На этом основные настройки почти закончены, нам осталось только поднять скорость порта до 115200 бод и сохранить конфигурацию.

Перейдите в пункт «PRT (Ports)», переключите параметр «Protocol out» в положение «0 - UBX», это отключит вывод всех проколов кроме фирменного UBX, тем самым мы разгрузим и модуль NEO, и сам Wemos, для которого мы напишем простой парсер протокола а не будем использовать тяжеловесные сторонние библиотеки. В строке «Baudrate» выберите скорость «115200» и как всегда нажмите кнопку «Send».

Вот и всё, ваш модуль благополучно отвалился! ))) Не пугайтесь, всё в порядке, вы же помните, что изначально мы ставили скорость 9600 а теперь изменили ее на 115200. Откройте скетч, и поправьте в нём строки инициализации портов и загрузите его.

Serial.begin(115200);
gps.begin(115200);

Не забудьте выставить в самом ЮЦентре правильную скорость.

Если вы подключались через USB - TTL конвертер, то сразу просто измените скорость порта.

Сохраним нашу конфигурацию. Откройте пункт «CFG (Configuration)», установите переключатель в положение «Save current configuration» и нажмите кнопку «Send».

Поздравляю, с настройкой мы закончили!

Использование GPS в Wemos D1

Как я уже говорил, нам важно добиться максимального быстродействия нашего будущего устройства для наибольшей точности измерений. Поэтому мы отключили «родной» для GPS протокол NMEA и оставили только легковесный UBX. К счастью, для ардуино уже есть готовый код для парсинга этого протокола. Очень рекомендую посмотреть видео автора кода - https://www.youtube.com/watch?v=TwhCX0c8Xe0.

Я объединил всё в простой скетч, который вы можете скачать тут - GPStest.zip.

Если вы загрузите его в ваш Wemos и откроете монитор порта, то увидите примерно такую картину:


Количество спутников, тип фиксации, текущие дату и время, координаты, скорость, высоту и точность позиционирования.

Теперь у нас есть необходимый минимум для замеров. Урок получился несколько больше чем я планировал изначально, поэтому на сегодня всё, а в следующий раз мы подключим дисплей, напишем что то типа спидометра и проверим это всё в движении на автомобиле.