ESP8266:Примеры/Использование ESP8266 вместе с GPS-модулем от компании u-blox
Использование ESP8266 вместе с GPS-модулем от компании u-blox[1]
Около 20 лет назад я несколько семестров учился электротехнике в знаменитом цюрихском ETH, и однажды был на лекции об основах цифровой электроники. Я помню, как профессор сверлил дырки в CD-дисках, чтобы показать качество исправления ошибок у CD-плееров разной ценовой категории. Кроме того, я помню, как он говорил о крошечных и недорогих GPS-ресиверах, которыми скоро будут оснащены все сотовые телефоны (повторюсь, это было 20 лет назад, и до начала эры смартфонов оставалось еще несколько лет). Этого профессора зовут Герхард Тростер (Gerhard Tröster), и в последствии он основал бесфабричную (т.е. не имеющую собственных производственных мощностей) компанию u-blox (в которой на данный момент трудится 450 человек), изготавливающую системы позиционирования. Я был приятно удивлен, когда увидел этот недорогой GPS-модуль, спроектированный u-blox, в своем любимом китайском онлайн-магазине!
Итак, в этой статье я сделаю обзор на этот модуль, покажу, как использовать его с ESP8266, и дам пару идей о том, где его можно применить.
Что делает этот модуль?
Сейчас GPS-навигация стала почти обыденной для огромного количества людей, но начался этот тренд примерно с выхода iPhone 3G. GPS – это глобальная система позиционирования, которая получает сигналы от спутников. Если устройство получает данные хотя бы от 4 спутников, вы можете рассчитать его месторасположение. Это выполняется при помощи сравнения небольших отличий во времени, в течение которого сигнал доходит до устройства. Поскольку от спутников исходит слабый сигнал, устройству нужна линия прямой видимости до спутника, и по этой причине «чистый» GPS зачастую плохо работает в закрытых помещениях.
Но хватит о теории. Как нам настроить коммуникацию между ESP8266 и GPS-модулем u-blox? Модуль отправляет информацию о позиционировании через последовательный интерфейс – такой же используется для программирования ESP8266. По умолчанию скорость этой коммуникации составляет 9600 бод, но этот параметр можно поменять и через последовательный интерфейс.
По всей видимости, многие GPS-модули работают через последовательную шину, а другим частично стандартизированным аспектом является формат сообщений. Модуль, о котором рассказывается в этой статье, отправляет сообщения в формате NMEA (0183 V3.0). Этот формат поддерживает множество разных типов сообщений, и некоторые их них специфичны для определенных производителей. Нам же интересны главные сообщения.
Если взглянуть на данные, исходящие от модуля, мы увидим примерно следующее:
$GPGSV,5,1,19,01,,,29,02,,,30,05,,,27,07,,,29*72
$GPGSV,5,2,19,08,,,23,10,,,28,12,,,32,13,,,29*7F
$GPGSV,5,3,19,15,,,26,16,,,28,18,,,27,21,,,26*71
$GPGSV,5,4,19,22,,,29,23,,,30,24,,,27,28,,,27*75
$GPGSV,5,5,19,29,,,29,33,,,30,40,,,30*75
Настройка GPS-модуля для работы с ESP8266
Вот схема для подключения GPS-модуля e-blox и чипа EP8266:
То есть вам нужно будет подключить следующие контакты:
- Контакт E на GPS-модуле (желтый) – к контакту 3.3V на ESP8266
- Контакт G (черный) – к контакту GND
- Контакт R (зеленый) – к контакту D6
- Контакт T (синий) – к контакту D5
- Контакт V (красный) – к контакту 3.3V
- Контакт P (белый) – оставьте неподключенным
Итак, теперь, когда GPS-модуль подключен к ESP8266, мы можем загрузить на него код. Мы хотим, чтобы ESP8266 считывал сообщения, а затем отправлял их на монитор порта IDE Arduino. Код для этих действий будет выглядеть следующим образом:
#include <SoftwareSerial.h>
// если вы используете не плату NodeMCU, а другой модуль ESP8266,
// вам могут понадобиться другие GPIO-контакты:
SoftwareSerial mySerial(D5, D6); // RX, TX
void setup() {
Serial.begin(115200);
while (!Serial) {
; // ждем подключения последовательного порта
// (нужно только для штатного USB-порта)
}
// задаем скорость передачи данных через порт SoftwareSerial:
mySerial.begin(9600);
}
void loop() {
if (mySerial.available()) {
Serial.write(mySerial.read());
}
if (Serial.available()) {
mySerial.write(Serial.read());
}
}
Загрузите этот скетч на ESP8266 и откройте монитор порта IDE Arduino. Вы должны увидеть входящие NMEA-сообщения. Поначалу некоторые данные могут быть пропущены, но чем больше сигналов будет получать ресивер, тем полнее будет информация о позиционировании. Но это была лишь начальная проверка. Теперь давайте попробуем воспользоваться библиотекой, умеющей работать с NMEA-сообщениями.
Библиотека «TinyGPS+»
Установив эту библиотеку, вы получите, наконец, самую маковку GPS-информации: широту, долготу, высоту, скорость и т.д. Для начала скачайте библиотеку с этой страницы, поместите ее в папку библиотек IDE Arduino, а затем перезапустите IDE Arduino. Затем кликните в IDE Arduino по Файл > Примеры > TinyGPSPlus (File > Examples > TinyGPSPlus) и откройте файл «FullExample». Теперь выставьте скорость передачи данных на 9600 бод (это скорость коммуникации GPS-модуля u-blox по умолчанию), назначьте D5 и D6 контактами для передачи последовательных данных и запустите код.
static const int RXPin = D5, TXPin = D6;
static const uint32_t GPSBaud = 9600;
Если вам не приходит никакой информации о позиционировании, то подойдите к окну, а лучше – выйдите на улицу. «Чистый» GPS печально известен тем, что плохо работает в закрытом пространстве – из за слабого спутникового сигнала и помех, вызываемых другими радиочастотными источниками.
Идеи для проектов
Итак, у нас есть готовый GPS-модуль. Но куда его применить? Вот парочка идей:
- Велосипедный компьютер. Подключите друг к другу OLED-дисплей, плату NodeMCU, внешний аккумулятор с USB-портом и GPS-модуль, а затем установите их на велосипед. Далее напишите программу, отображающую на OLED-дисплее различную информацию вроде скорости, высоты над уровнем моря и пр. Кроме того, можно добавить поддержку путевых точек (для простенькой навигации), а также запись в EEPROM данных о маршруте (чтобы потом загрузить их в облако, когда система определит рядом ваше домашнее устройство).
- Модуль для «вардрайвинга». Вообще, сейчас целесообразность этого устройства под большим вопросом, но зато на его сборку требуется менее 20 долларов! Подключите друг к другу GPS-модуль, плату NodeMCU и внешний аккумулятор, а затем включите и принесите на работу. Это устройство предназначено для того, чтобы каждые 30 секунд составлять список SSID’ов вместе с данными об их месторасположении, а затем сохранять эту информацию в EEPROM. В дальнейшем эти данные можно использовать для создания карты (бесплатных?) точек доступа WiFi.
- Часы реального времени высокой точности. Чтобы рассчитать ваше месторасположение, спутник отправляет очень точные временные метки (time stamp), которые можно считывать при помощи библиотеки TinyGPS+. Да, если ESP8266 подключен к интернету, точное время можно узнавать при помощи протокола NTP. Но если вы по какой-то причине ушли в офлайн, эти GPS-часы могут прийтись весьма кстати. Вы даже можете создать собственный NTP-сервер, работающий на основе GPS-модуля.
Итого
Этот GPS-модуль прост в использовании и стоит менее 10 долларов. Работа с ним осуществляется через последовательный интерфейс, который требует всего два свободных GPIO-контакта. Таким образом, я могу безо всяких проблем воспользоваться SoftwareSerial, а аппаратный последовательный интерфейс оставить для отладки.
Хотя этот модуль весьма хорош для открытых пространств, в закрытых помещениях от работает уже не так хорошо (в отличие от уже ставших привычными GPS-модулей, которыми оснащаются смартфоны). Дело в том, что он не может использовать информацию вроде GSM или SSID’ов WiFi-сетей, чтобы улучшить скорость и точность позиционного сигнала.
Впрочем, этот GPS-модуль все равно будет хорошим дополнением к вашему набору электротехнических компонентов (идеи для проектов смотрите в разделе выше).
И еще! Забыл добавить, что этот GPS-модуль очень удобен в ситуации, когда вам нужно избежать лишних трат электроэнергии – если подать на желтый контакт сигнал LOW, это полностью выключит модуль.
См.также
Внешние ссылки
ESP8266 AT-команды | |
---|---|
Список AT-команд | |
Базовые команды |
|
Команды для WiFi |
|
Команды для TCP/IP |
|