GPS-трекер LoRa-GPS. Часть 6. Передатчик на E19 433M20SC и HT1818Z3G5L.

Это дополнительная часть к общему повествованию о LoRa-GPS трекере, который летает в любительских ракетах (моих и коллег). Тут описаны особенности использования GPS модуля HT1818Z3G5L и LoRa модуля E19-433M20SC.

Тут описан LoRa-GPS трекер, выполненный на платформе Arduino и LoRa модулях E19 от E-byte. На приемной стороне в качестве оконечного устройства используется смартфон/планшет на Android. Конструкция совместима по протоколам радиоканала с конструкцией Дианко Чернева (pinko): настройка модуля LoRa, длина и формат передаваемого пакета.

Общая схема работы GPS-трекера описана в первой части.

Задача рассматриваемого передатчика заключается в приеме сигналов со спутников и определении текущих координат (этим занимается специальный модуль GPS, в данной реализации — HT1818Z3G5L), упаковке полученных данных в удобный формат и передаче подготовленного пакета по радиоканалу (этим занимается радиопередатчик модуля LoRa E19-433M20SC).


Схема передатчика c модулем E19-433M20SC несколько отличается от схемы с модулем E19-433M20S2. Это связано с наличием у модуля SC двух дополнительных входов TXEN, RXEN для управления антенным коммутатором модуля.
cntr-Lo-Ra-SC

Эти входы требуют подключения к микроконтроллеру. В нашем случае LoRa модуль работает только на передачу, поэтому вход RXEN постоянно подключен к общему проводу. При включении передатчика на вход TXEN подается сигнал логической единицы.

В качестве контроллера DD1 выступает модуль Arduino Pro mini (проверены ATmega168 и ATmega328).

К нему по SPI подключен модуль LoRa E19-433M20SC (DD7, обратите внимание — «сигнал готовности модуля» DIO0 опрашивается программно через A3 (используется как цифровой) Arduino).

По UART подключен выход модуля GPS — на схеме DD6. На рисунке обозначено неверно — на самом деле это HT1818Z3G5L. На схеме показано подключение при использовании библиотеки для Arduino AltSoftwareSerial (задействованы pin D8,D9); на самом деле проверялась работа только с аппаратным UART, поэтому GPS модули надо подключать к Rx, Tx Arduino.

Показанная на схеме  EEPROM 24C256 (DD3) в реальном проекте не устанавливалась. Датчик давления BMP280 (DD2) в скетче обрабатывается и показывает «высоту». Светодиод нужен для контроля работоспособности передатчика (программно включается на время посылки данных по радиоканалу).

Питание схемы осуществляется от литиевого аккумулятора GB1. Диод Шоттки VD1 служит «для гашения лишнего напряжения», т.к. питание E19-433M20S2 по datasheet ограничено 3,6В. При повторении конструкции питанию стоит уделить больше внимания и обеспечить модули «нормальным» напряжением! Здесь конструкция «любительская», поэтому в цепях питания присутствуют «некоторые вольности».

На схеме показан MOSFET (VT1). В данном скетче он не используется и распаян для будущего применения в полетном контроллере для управления ССР.

В пакете передается напряжение питания на контроллере (задействован соответствующий вход АЦП).


Скетч для модуля Arduino Pro mini (работает и на ATMega168) можно тут взять.

Алгоритм программы простой: после инициализации в цикле делаем:

  • с заданным интервалом, определяемым в строке:
    #define tPress 5000                      //период отправки посылок
    ждем, что накопилось в буфере UART.
  • Проверяем корректность данных GPS и переупаковываем их в 17 байтовую двоичную последовательность.
  • Затем отсылаем эту «упаковку» по радиоканалу.

Важно! Для настройки модуля LoRa (для совместимости с решением LoRa-GPS pinko):
С помощью стандартной библиотеки LoRa не удалось заставить работать модуль с приемником pinko. Многие регистры в типовой библиотеке либо не настраиваются (остаются «как есть»), либо жестко программируются без возможности смены их состояния доступными методами. Пришлось «доработать» типовую библиотеку для SX1278 (LoRa): перенесены в public функции работы с регистрами микросхемы, добавлена специальная процедура инициализации модуля LoRa — beginE19t.

Для модуля E19-433M20SC добавлено включение TXEN при передаче. Скетч подходит и для модуля E19-433M20S2 — в этом случае вывод управления входом TXEN остается не подключенным.

Настройка основных параметров модуля производится в соответствующей строке:
//запуск с частотой сигнала, полосой и длиной посылки
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 секунда.
  • выводимые данные: в данной реализации из потока выделяется только строка $GNGGA (для модуля HT1818Z3G5L)
  • программа критична к числу цифр после запятой, выводимых в строке GGA (для модуля HT1818Z3G5L — 5).

Имевшийся модуль HT1818Z3G5L оказался невосприимчив к командам настройки $PCAS. Пришлось переписать скетч. В данной реализации поток текста «фильтруется на лету» и в буфер для анализа записывается только строка $GNGGA.

В отправляемые по радиоканалу данные включены сведения о числе видимых спутников. Т.к. в 17-байтовой посылке места для этого не было, то число спутников передается в «часах» (ячейка payload[14] — выше).


Вариант реализации конструкции передатчика.Это фото моей конструкции, где GPS модуль подключен к выводам программирования Arduino…


Файлы: