У меня в почте, на Youtube и форумах было несколько пожеланий о публикации сведений о LoRa-GPS трекере, который летает в любительских ракетах (моих и коллег). Обычные решения используют GSM канал для передачи местоположения в СМС. Здесь опишу решение имеющее большую автономность — свой радиоканал.
Описан LoRa-GPS трекер, выполненный на платформе Arduino и LoRa модулях E19 от E-byte. На приемной стороне в качестве оконечного устройства используется смартфон/планшет на Android. Конструкция совместима по протоколам радиоканала с конструкцией Дианко Чернева (pinko): настройка модуля LoRa, длина и формат передаваемого пакета.
Общая схема работы GPS-трекера типовая: модуль GPS принимает сигналы навигационных спутников и определяет свои текущие координаты. Полученные данные передаются радиопередатчиком (диапазон 433МГц). Приемник получает пакет данных, извлекает координаты и по последовательному каналу отправляет информацию на оконечное устройство. Оконечное устройство (смартфон/планшет/компьютер и т.п.) отображает/обрабатывает полученные координаты, сообщая/рисуя на карте местоположение передатчика.
В первой части повествования будет описан передатчик. Задача передатчика заключается в приеме сигналов со спутников и определении текущих координат (этим занимается специальный модуль GPS), упаковке полученных данных в удобный формат и передаче подготовленного пакета по радиоканалу (этим занимается радиопередатчик модуля LoRa E19-433M20S2).
Схема передатчика не имеет изысков.
В качестве контроллера DD1 выступает модуль Arduino Pro mini (проверены ATmega168 и ATmega328, а реально «полетел» клон LGT8F328P (SOP20)).
К нему по SPI подключен модуль LoRa E19-433M20S2 (DD5, обратите внимание — «сигнал готовности модуля» DIO0 опрашивается программно через D2 Arduino).
По UART подключен выход модуля GPS — на схеме DD6. На рисунке это Neo-6M, «запрограммированный» на нужный нам формат выводимых данных заранее — с помощью внешнего компьютера. Проверены также модули L80 и HT1818Z3G5L — для них кроме выхода, надо подключать и вход UART, т.к. они «не помнят» настроек и их приходится программировать «на ходу». На схеме показано подключение при использовании библиотеки для Arduino AltSoftwareSerial (задействованы pin D8,D9); на самом деле проверялась работа только с аппаратным UART, поэтому GPS модули надо подключать к Rx, Tx Arduino.
Показанные на схеме датчик давления BMP280 (DD2) и EEPROM 24C256 (DD3) в реальном проекте не устанавливались. Светодиод нужен для контроля работоспособности передатчика (программно включается на время посылки данных по радиоканалу).
Питание схемы осуществляется от литиевого аккумулятора GB1. Диод Шоттки VD1 служит «для гашения лишнего напряжения», т.к. питание E19-433M20S2 по datasheet ограничено 3,6В. При повторении конструкции питанию стоит уделить больше внимания и обеспечить модули «нормальным» напряжением! Здесь конструкция «любительская», поэтому в цепях питания присутствуют «некоторые вольности».
На схеме не показано, но вход A1 Arduino подключен к питанию через делитель напряжения! Это полезно для определения значения питающего напряжения и примерной оценки «а сколько еще протянет? успею ли я тебя найти?»
Скетч для модуля Arduino Pro mini (работает и на ATMega168) можно тут взять. Это версия, проверенная Михаилом и Дмитрием. В качестве GPS модуля выступает китайский HT1818Z3G5L.
Алгоритм программы простой: после инициализации в цикле делаем:
- с заданным интервалом, определяемым в строке:
#define tPress 5000 //период отправки посылок
ждем, что накопилось в буфере UART. - Проверяем корректность данных GPS и переупаковываем их в 17 байтовую двоичную последовательность.
- Затем отсылаем эту «упаковку» по радиоканалу.
Важно! Для настройки модуля LoRa (для совместимости с решением LoRa-GPS pinko):
С помощью стандартной библиотеки LoRa не удалось заставить работать модуль с приемником pinko. Многие регистры в типовой библиотеке либо не настраиваются (остаются «как есть»), либо жестко программируются без возможности смены их состояния доступными методами. Пришлось «доработать» типовую библиотеку для SX1278 (LoRa): перенесены в public функции работы с регистрами микросхемы, добавлена специальная процедура инициализации модуля LoRa — beginE19t.
Настройка основных параметров модуля производится в соответствующей строке:
//запуск с частотой сигнала, полосой и длиной посылки
if (!LoRa.beginE19t(436.0E6,62E3,17)) {
например, здесь устанавливается частота 436МГц и полоса 62,5КГц. Длина посылки фиксирована = 17 байт.
Формат передаваемых по радиоканалу данных предложен pinko и оставлен для совместимости (далее — payload — это условный массив, в программе эта переменная не используется):
— 4 байта «широты»:
payload[0] = Lat_full.Byte3 ‘GPS Latitude as 32b signed integer, negative means South, the DDMM.MMMM becomes integer number like DDMMMMMM, example: 5107.8136,N —> 51078136 or 5107.8136,S —> -51078136
payload[1] = Lat_full.Byte2 ‘GPS Latitude as 32b signed integer, negative means South, the DDMM.MMMM becomes integer number like DDMMMMMM, example: 5107.8136,N —> 51078136 or 5107.8136,S —> -51078136
payload[2] = Lat_full.Byte1 ‘GPS Latitude as 32b signed integer, negative means South, the DDMM.MMMM becomes integer number like DDMMMMMM, example: 5107.8136,N —> 51078136 or 5107.8136,S —> -51078136
payload[3] = Lat_full.Byte0 ‘GPS Latitude as 32b signed integer, negative means South, the DDMM.MMMM becomes integer number like DDMMMMMM, example: 5107.8136,N —> 51078136 or 5107.8136,S —> -51078136
— 4 байта «долготы»:
payload[4] = Lon_full.Byte3 ‘GPS Longitude as 32b signed integer, negative means West, the DDDMM.MMMM becomes integer number like DDDMMMMMM, example: 00434.7700,E —> 004347700 or 00434.7700,W —> -004347700
payload[5] = Lon_full.Byte2 ‘GPS Longitude as 32b signed integer, negative means West, the DDDMM.MMMM becomes integer number like DDDMMMMMM, example: 00434.7700,E —> 004347700 or 00434.7700,W —> -004347700
payload[6] = Lon_full.Byte1 ‘GPS Longitude as 32b signed integer, negative means West, the DDDMM.MMMM becomes integer number like DDDMMMMMM, example: 00434.7700,E —> 004347700 or 00434.7700,W —> -004347700
payload[7] = Lon_full.Byte0 ‘GPS Longitude as 32b signed integer, negative means West, the DDDMM.MMMM becomes integer number like DDDMMMMMM, example: 00434.7700,E —> 004347700 or 00434.7700,W —> -004347700
— два байта «высоты»:
payload[8] = Alt.Byte1 ‘GPS altitude As 16b signed integer
payload[9] = Alt.Byte0 ‘GPS altitude As 16b signed integer
— далее два байта для передачи сведений о напряжении питания. Тут значение 1023 должно соответствовать примерно 6,6В (во всяком случае — все равно придется подбирать Kv для реальной платы)
valAlt = analogRead(A1); //напряжение АКБ через делитель почти 1:2
float vA1d = (float) valAlt * Kv; //считаем с плавающей точкой
valAlt = (int) vA1d * 1.0; //возвращаем к целому
payload[11] = lowByte(valAlt);
payload[10] = highByte(valAlt);
— еще два байта передают номер текущей посылки (с момента подачи питания) — это полезно: на приеме можно узнать сколько и какие посылки «пропали».
payload[12] = highByte(counter);
payload[13] = lowByte(counter);
— и последние три байта дают сведения о текущем времени GPS на стороне передатчика
payload[14] = UTC_hour ‘GPS UTC time — hour As unsigned byte
payload[15] = UTC_minute ‘GPS UTC time — minute As unsigned byte
payload[16] = UTC_second ‘GPS UTC time — second As unsigned byte
К модулям GPS требования вполне определенные:
- скорость 9600 (это стандартное значение, которое установлено во всех модулях), 8 бит, без контроля, 1 стоп
- периодичность вывода данных не критична, работал с стандартным значением 1 секунда.
- выводимые данные: только строка $GPGGA (для модуля HT1818Z3G5L $GNGGA)
- программа критична к числу цифр после запятой, выводимых в строке GGA (L80 выдает 4 цифры, другие модули — 5).
Как было сказано выше, Neo-6M настраивается в программе u-center от u-blox и запоминает настройки (заодно, надо отключить SBAS и поставить режим «air» вместо «пешехода»). Поэтому для GPS модуля Neo-6M можно к Arduino подключить только выход TxD. Остальные GPS модули не сохраняют настройки, поэтому приходится их программировать контроллером сразу после включения питания. Строки инициализации у модулей L80 и HT1818Z3G5L — разные — в скетче их видно.
По просьбе Михаила в выводимые данные включены сведения о числе видимых спутников. Т.к. в 17-байтовой посылке места для этого не было, то число спутников передается в «часах» (ячейка payload[14] — выше).
Настройка GPS-трекера для конкретных условий работы сводится к установке центральной рабочей частоты (для E19-433M20S2 определен очень широкий диапазон: от 410 до 525МГц, но реально проверялось в диапазоне 415…440 МГц) и ширины «полосы качания»: от 7КГц до 250КГц. Соответствующим образом должен быть настроен и приемник. С выбором рабочей частоты более-менее все ясно: либо «по закону», либо «как попало — авось пронесет». Ширина полосы сильно влияет на дальность работы системы и на стабильность приема: чем шире полоса, тем устойчивее прием и меньше дальность, и наоборот: чем уже, тем дальше, но повышается вероятность сбоев… Так как в модулях E19-433M20S2 использован «обычный» кварцевый резонатор, получить стабильный канал при полосе менее 62,5КГц становится проблематичным. Большую исследовательскую работу по данной теме провел pinko.
Отдельно — несколько замечаний о мощности передатчика. E19-433M20S2 в режиме передачи дает 20dBm (100 мВт). Использование такой мощности без соответствующего разрешения является нарушением (в диапазоне 433МГц допустима мощность 10 мВт).
Про антенну: проверял вариант «проволочка 17см», «Китайская пружинка» (на фото) и «фирменная» антенна. Результаты везде примерно одинаковы. Максимальная дальность стабильного приема (вариант передатчика на следующем фото) около 3,5 км (зима, снег, озера, лес — трек в начале статьи). Сигнал на таком удалении стабилен — можно было бы «шагать и дальше».
Несколько фото разных вариантов реализации конструкции передатчика.
Это фото моей конструкции, где вместо Pro mini из любопытства я запаял LGT8F328P (SOP20). Очень интересный «аналог» ATmega. Пришлось повозиться — тут и выводов меньше, и нет кварцевого резонатора, и АЦП — двенадцати битный…
И несколько реализаций от Михаила
тут варианты с модулями GPS — L80 (снизу — горел в полете) и HT1818Z35GL (сверху).
Файлы: