Всем привет! Пару лет назад я попробовал сделать прототип… Хотя нет, начну с начала. 

Все началось с той самой статьи про котика! После того, как несколько знакомых прислали мне на неё ссылку, я подумал что штука может оказаться интересной, и запилил прототип трекера - просто посмотреть как оно вообще может работать. Оно заработало, я опубликовал проект и пообщался с теми кто пробовал его собрать.

Собственно, за первый прототип до сих пор немного стыдно, но зато он позволил собрать хотелки, пожелания и ожидания от тех людей, которые сами реально собирали это устройство. Для меня как для обычного инженера, не избалованного популярными opensource-проектами была, удивительна география тех, кому проект был интересен, даже из Новой Зеландии написали. Пришло время доработать проект с учетом живых отзывов.

А теперь, для тех, кто не планирует читать мою первую статью, кратенько поясню, о чем вообще речь.

Краткая ретроспектива. Что за AGLoRa?

AGLoRa — это акроним из слов Arduino+GPS+LoRa. Я хотел попробовать сделать максимально простое и дешевое устройство, которое отправляет свое местоположение на другие подобные устройства через беспроводной модуль LoRa.

Исходим из того, что применяться всё будет там, куда нельзя взять обычный трекер с сим-картой: лес, открытое море, горы, то есть места с низкой плотностью беспроводных устройств вообще и где нет сотовой связи — то есть глухомань глухоманьская, да еще и, возможно, каждый раз разная. Значит, нам не нужна сеть LoRaWan и дорогая базовая станция,  достаточно хотя бы двух трекеров с дешевыми платками от EByte. Я попытался было сэкономить еще больше, но проверил, и Ra-02 толком не заработали, в отличие от EByte. Минутка бахвальства: кто-то даже скинул на сам EByte мой проект, и они написали мне на почту, мол, не хочу ли я вдруг протестировать еще и другие модули. Было забавно, приятно, но я так себе инфлюенсер, поэтому нет, этот текст — всё ещё не реклама!????

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

Мне хотелось сделать, чтобы устройство собиралось с нулевым уровнем навыков, максимально просто. Поэтому используется Arduino и только один скетч. Подключил модули по схеме, вставил кабель, залил скетч — готово! Да, можно сделать круче. Да, можно дешевле. Да, с энергосбережением. Но это всё — уже другая ниша устройств.

Основное отличие LoRa от привычных GSM трекеров: считаем что потеря пакетов передаваемых по воздуху — это нормально! 

Низкокачественная картинка "из интернетов", описывающая ситуацию
Низкокачественная картинка "из интернетов", описывающая ситуацию

Если нужны какие-то критичные данные, типа километража, то нужно считать их отдельно и передавать дополнительной информацией. Этого не было в первом прототипе, и, для того чтобы добавить дополнительный сенсор, пришлось бы переписывать парсер бинарного протокола в приложении. А кому это надо? У нас DIY или как?

Из-за этого я решил перейти на osmand-подобный протокол вместо первоначального бинарного. Теперь человек с базовым уровнем программирования может сам легко дополнять протокол обмена так, чтобы можно было быстро добавить в скетче необходимые параметры. Эти параметры (например, внешние датчики или заряд батарейки) затем отобразятся в приложении. Далее я покажу как это делается.

У какого-то Рика есть дополнительные параметры
У какого-то Рика есть дополнительные параметры

Вторым большим минусом первого прототипа было отсутствие памяти. После подключения телефона надо было ждать, пока из эфира прилетит очередная точка, Разумеется, это я исправил в первую очередь. Теперь трекер Аглора умеет хранить в своей памяти историю полученных точек. Можно хранить и в RAM, и в EEPROM (тогда память не пропадает при отключении питания), это можно выбрать в настройках скетча.

Попробовать, как всё работает, можно в бесплатном приложении, которое есть в App Store, а Android-версию можно скачать как APK в релизах проекта на GitHub. Исходники всего традиционно открыты.

Ещё что-то будет?

Естественно, остановиться просто на приложении работающем по блютус — это скучно. Сейчас расскажу в какую сторону проект сейчас развивается.

Неожиданно оказалось, что такой трекер нужен и там, где сотовая связь есть. Причин может быть несколько, но, в основном, это способ сэкономить на GSM-связи в тех случая, когда трекер используется редко.

Поэтому у меня на подходе новое приложение, умеющее “в бэкенд”, что несколько расширяет "кругозор пользователя". На телефоне можно будет увидеть трекеры, которые не долетают по радиоканалу LoRa, но которые увидел другой телефон с такой же учёткой. Магия! Что-то типа AirTag на минималках, только про лес, комаров и трекеры, да. Ладно, шучу, я понимаю, что это скукота, ничего нового, но такая реализация тоже напрашивается.

Следующим этапом в экосистему можно будет добавить простое и, опять же, что важно, дешевое устройство-шлюз с WI-FI или GSM, которое будет транслировать данные с окружающих трекеров в бэкенд. Это можно применять там, где поднимать свою LoRaWan сеть дорого: мало объектов и пустой эфир. И тут откроются приятные перспективы мониторинга чего-нибудь подвижного, ездящего вокруг дома, с сохранением всей истории перемещений без лишних затрат и телодвижений. 

Как вы понимаете, перспективы для развития проекта есть. А теперь из будущего вернемся немного назад, в сегодняшний день. Я опубликовал новую версию скетча, с новым протоколом, и, соответственно, новое приложение, которое с ним работает (а еще карту попросили добавить для удобства — сделано).

Сборка

Теперь я покажу, как собирается и настраивается устройство. В принципе я старался сделать всё максимально просто, так что достаточно читать комментарии в скетче и следовать их указаниям.

Для сборки нам понадобится какая-нибудь Ардуинка, какой-нибудь NMEA модуль GPS (только не берите совсем уж дешёвые, они часами могут искать спутники), какой-нибудь bluetooth умеющий в BLE (искать по названию HM-10, например), и  LoRa-модуль от производителя EByte с UART-интерфейсом (например, E220-900T22D или E433T30D).

Все это хозяйство будет подключаться к телефону Android или iOS, но может и не подключаться, если от трекера нужна только передача своих координат. Просто не подключайте bluetooth и всё, в скетче ничего менять не надо.

Да и вообще bluetooth подключается к TX и RX serial поэтому, его подключим уже после загрузки скетча.

Подключаем модули EByte LoRa и GPS по инструкции. По фэншую нужны делители напряжения для EByte, но заработает и без них. Но если что-то сгорит или не будет работать — я этого не советовал!

Подключение LoRa-модуля
Подключение LoRa-модуля
Подключение GPS-модуля
Подключение GPS-модуля

После подключения хочется убедиться, что все собрано правильно, для этого в каталоге hardware-tests есть скетчи для тестирования LoRa и GPS.

Список файлов проекта
Список файлов проекта

Там все уже сконфигурировано, нужно только запустить скетч и посмотреть в мониторе, что он выдает. Тест LoRa конфигурирует плату на дефолтные параметры, так что если в выдаче что-то отличается от картинки, то “чек вайринг”, как говорится.

Проверка подключения LoRa
Проверка подключения LoRa

Разумеется, собирать надо минимум два устройства, иначе не интересно. Если постараться, то все можно запихнуть в небольшой корпус. Для тестов лучше использовать внешнюю GPS антенну.

Прототипы AGLoRa для экспериментов
Прототипы AGLoRa для экспериментов

Конфигурирование скетча

Собрали, проверили подключение, а теперь загружаем себе скетч самого трекера. Я специально сделал его одним файлом, чтобы не было соблазна что-то потерять при установке. Да, спагетти-код, но не волнуйтесь: всё что вам там будет нужно, находится в его начале.

Устанавливаем библиотеки "EByte LoRa E220 by Renzo Mischianty" и "TinyGPSPlus by Mikal Hart" из встроенной библиотеки, если ещё не сделали этого раньше. Это, кстати, еще одно отличие новой версии кода, я переписал Аглору с библиотеки, которую нужно было устанавливать самостоятельно на ту, которая устанавливается двумя кликами мышки.

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

#define NAME_LENGTH 6

char MY_NAME[NAME_LENGTH] = "Rick"; 

Длина поля (да и вообще версия скетча) должна быть одинаковой для всех ваших трекеров, иначе они не будут между собой дружить.

Всё! Легко и просто! После этого можно нажать кнопку заливки скетча в плату, подключить блютус и перейти к разделу установки программы на телефон.

Подключение BLE-модуля
Подключение BLE-модуля

Но это лёгкий путь, мы же с вами прогуляемся по настройкам дальше.

Чуть ниже увидите еще одну важную строчку:

#define DEBUG_MODE false

Она расширит вывод в serial дополнительной служебной информацией, если что-то пойдет не так.

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

struct DATA {
char id[NAME_LENGTH]; // имя
float lat; // координаты
float lon;
unsigned char sat;
unsigned char year; // дата
unsigned char month;
unsigned char day;
unsigned char hour; // время
unsigned char minute;
unsigned char s5econd;
// А здесь добавляем необходимые поля
//...
// unsigned char speed;
// unsigned char battery;
// unsigned char sensor1;
//...
};

А это структура данных которая передается между трекерами:

void sendPackageToBluetooth(DATA *package) {
 …
  // Датчики и дополнительные параметры
  Serial.print(F("&sat="));    //название параметра
  Serial.print(package->sat);  //значение параметра 
  // Добавляем любое необходимое количество
  // Serial.print("&speed=");       // название параметра, например “скорость”
  // Serial.print(package->speed);   // значение
  // Serial.print("&batt=");
  // Serial.print(package->battery);
  // Serial.print("&alienSensor=");
  // Serial.print(package->sensor1);
…
}

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

В следующем разделе настроек есть довольно важный параметр GPS_PACKET_INTERVAL, это то, как часто трекер будет кидать своё местоположение в эфир. 

Переходим дальше, хранение данных в трекере. Трекер хранит “какое-то количество” последних полученных точек, чтобы после подключения телефона вы могли сразу увидеть свежие принятые данные. Разумеется, при подключенном телефоне новые пакеты данных отображаются моментально.

По умолчанию данные хранятся как обычные переменные (SRAM-память). За это отвечает параметр #define USE_EEPROM_MEMORY false

В этом случае создается обычная табличка размером SRAM_STORAGE_SIZE,это и есть память трекера. При отключении питания данные обнуляются. Этим размером можно поиграться, чтобы использовать объем памяти максимально полно (но не надо стараться занять все 100 процентов). Arduino IDE пишет при компиляции, сколько места будут занимать переменные.

Arduino Nano. При SRAM_STORAGE_SIZE = 40  71% памяти свободен
Arduino Nano. При SRAM_STORAGE_SIZE = 40 71% памяти свободен

Для случаев, когда выключение питания не должно приводить к потере данных, я реализовал вариант их хранения в постоянной памяти EEPROM. В этом режиме SRAM_STORAGE_SIZE можно установить в ноль, она не используется. Так как у EEPROM ограниченное количество циклов записи, частоту передачи данных трекерами в этом случае следует понизить, чтобы сберечь ресурс памяти. А скетч хранит данные в постоянной памяти с контрольными суммами и сверяет их при запуске, чтобы можно было отследить момент, когда память начнёт сыпаться. Это можно увидеть в режиме отладки (#define DEBUG_MODE true), а еще результат проверок контрольной суммы есть в пакете данных при отправке содержимого трекера в телефон.

Вот команды, на которые сейчас отзывается трекер. Вы может использовать их при ручной проверке или для подключения к своим программам.

“info” —  в ответ трекер присылает информацию о себе и состоянии памяти

“all” — выгрузка всех точек из памяти

“id=номер” — выгрузка конкретной точки 

“clear” — очистка

“restart” — повторная инициализация хранилища

Установка приложения

Чтобы попробовать, как это работает, осталось только установить программу на телефон. Чуть позже я опубликую её в Google Play (все время хочется что-то исправить), но готовая актуальная apk всегда лежит вот здесь в релизах: https://github.com/Udj13/AGLoRa-client-flutter/releases/

Скачивайте последнюю версию, я не исключаю новые изменения в протоколе. На этапе прототипирования вообще не вижу смысла заморачиваться “обратной совместимостью”.

Для тех, у кого айфончик, стараюсь актуализировать версию в App Store: https://apps.apple.com/ru/app/aglora/id1600250635

Приложение простое: открываете список видимых устройств, находите там название своей BLE-платки или имя AGLoRa (если у трекера получилось его установить, а он пытается! ???? ), подключаетесь и видите другие устройства, если они есть в памяти трекера. Кнопка "Map" показывает объект на карте.

Интерфейс приложения
Интерфейс приложения

Заключение

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

Страничка проекта: https://github.com/Udj13/AGLoRa/

Комментарии (14)


  1. LAutour
    13.08.2023 08:22
    +3

    Так как у EEPROM ограниченное количество циклов записи, частоту передачи данных трекерами в этом случае следует понизить, чтобы сберечь ресурс памяти.

    Внешняя FRAM


    1. Yuri0128
      13.08.2023 08:22
      +1

      Примерно год непрерывной работы до сбоя EEPROM. Либо внешнюю EEPROM (миллионник) - больше 3 лет. Думаю что вполне себе хватит. При 20 секундах.


    1. SleepingUp Автор
      13.08.2023 08:22

      А какой модуль из готовых посоветуете? На какой микросхемке смотреть? Ну чтобы остаться в той же концепции DIY, подключил и работает?


      1. LAutour
        13.08.2023 08:22

        Подходящую по объему микру из i2c FM24CLxx. В качестве платки для быстрого подсоедиения берем стандартный плату переходник soic8 на dip8 или платку от модуля на простой i2c eeprom. Программно FRAM совместима с EEPROM.


  1. maximlubyanov
    13.08.2023 08:22

    Спасибо за статью, очень интересно.

    Но если вы не в курсе, есть такая широко известная в узких кругах штука, как tBeacon - это практически оно самое.


    1. NutsUnderline
      13.08.2023 08:22

      Спасибо за наводку, ознакомился. Продавец не блещет качеством инфы, магазин аля ali. LoRa вроде как есть и вроде только еще будет.


    1. SleepingUp Автор
      13.08.2023 08:22

      Да в курсе конечно, но мне же "попрограммировать, а не ехать", а там просто готовый продукт предлагают купить. А я наоборот ничего не пытаюсь продать ))


  1. NutsUnderline
    13.08.2023 08:22
    +1

    Спасибо автору за первую статью, именно с нее я залез с ушами в эти темы и уже почти год как копаюсь-изучаю. Так что да - инфлюенсер, без преувеличения.

    По итогу архитектурно вся эта cистема не поражает изяществом. в Ebyte стоит свой дополнительный проц для UART протокола, довольно примитивный, который потом еще и софтврарным uart на arduio обрабатывается. В то же время на arduino существует масса библиотек которые позволяют напрямую подключатся к микросхемам LoRa по SPI, это может быть и модуль ebyte и какой нить hoper, так же nicerf модули не без интересные модули делает. Как большая тонкость, чтобы на этих модулях стоял термокомненсированный источник частоты.

    При желании с железом можно вообще не париться, так как у Lilgo относительно недорого есть готовые платы ESP32 + GPS + Lora . Т.е bluethoth-WiFi для смартфона, GPS разных видов, ну и радиоканал. Правда GPS у них старенькие, поэтому я выбрал вариант без GPS, а GPS - отдельным модулем. На основе этих плат есть занятный проект SoftRF: как бы общественный трекер и с пробросом в Интернет на карту


    1. SleepingUp Автор
      13.08.2023 08:22

      Спасибо! )

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

      По поводу готовых плат вот эту Liligo имеете в виду? https://aliexpress.ru/item/1005005252748010.html, там вон есть вариант "SX1268 433 IPEX M8N", с нормальным GPS. Просто когда я заказать хотел они чот стоили конски и проще было из отдельных модулей собрать прототип для экспериментов, сейчас под готовый скетч наверное уже можно попробовать кликнуть, спасибо что напомнили.


      1. NutsUnderline
        13.08.2023 08:22

        Нет, я тоже ленивый програмист, но мне они для другого нужны - свой проц себя оправдывет, взял на пробу E22-400T30D и E280-2G4T12S

        Магазин не уверен что официальный, официальный вроде "lilygo Official Store", у них на сайте лучше посмотреть. Я для трекера взял (бы) TTGO LoRa32 V2.1_1.6 и какойнить GPS на ublox 10 - подешевле и лучше выходит.


        1. SleepingUp Автор
          13.08.2023 08:22

          Кликнул какую-то платку-комбайн на которой есть всё, попробую ) На гитхабе тоже попросили такую добавить


          1. LAutour
            13.08.2023 08:22
            +1

            Есть еще интересная штука как Heltec HT-CT62 (ESP32C3 + SX1262 в одном компактном модуле). Но сам с ней не работал.


            1. NutsUnderline
              13.08.2023 08:22

              ну это кому что (антенну то еще приделать надо, питание) но в целом да

              однако замечу что в коментариях по железу к разным проектам читал что у heltec есть претензии к качеству (изготовления модулей?)


              1. LAutour
                13.08.2023 08:22

                У меня к их модулю CubeCell есть претензии: у них явный софтовый баг с таймингами задержек boot относительно reset при автоперепрошивке UART переходником с RTS, DTR, но они предлагают его исправлять внешним аппартным костылем. У ESP32 подобных проблем нет.