Всем привет! Пару лет назад я попробовал сделать прототип… Хотя нет, начну с начала.
Все началось с той самой статьи про котика! После того, как несколько знакомых прислали мне на неё ссылку, я подумал что штука может оказаться интересной, и запилил прототип трекера - просто посмотреть как оно вообще может работать. Оно заработало, я опубликовал проект и пообщался с теми кто пробовал его собрать.
Собственно, за первый прототип до сих пор немного стыдно, но зато он позволил собрать хотелки, пожелания и ожидания от тех людей, которые сами реально собирали это устройство. Для меня как для обычного инженера, не избалованного популярными 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, но заработает и без них. Но если что-то сгорит или не будет работать — я этого не советовал!
После подключения хочется убедиться, что все собрано правильно, для этого в каталоге hardware-tests есть скетчи для тестирования LoRa и GPS.
Там все уже сконфигурировано, нужно только запустить скетч и посмотреть в мониторе, что он выдает. Тест LoRa конфигурирует плату на дефолтные параметры, так что если в выдаче что-то отличается от картинки, то “чек вайринг”, как говорится.
Разумеется, собирать надо минимум два устройства, иначе не интересно. Если постараться, то все можно запихнуть в небольшой корпус. Для тестов лучше использовать внешнюю GPS антенну.
Конфигурирование скетча
Собрали, проверили подключение, а теперь загружаем себе скетч самого трекера. Я специально сделал его одним файлом, чтобы не было соблазна что-то потерять при установке. Да, спагетти-код, но не волнуйтесь: всё что вам там будет нужно, находится в его начале.
Устанавливаем библиотеки "EByte LoRa E220 by Renzo Mischianty" и "TinyGPSPlus by Mikal Hart" из встроенной библиотеки, если ещё не сделали этого раньше. Это, кстати, еще одно отличие новой версии кода, я переписал Аглору с библиотеки, которую нужно было устанавливать самостоятельно на ту, которая устанавливается двумя кликами мышки.
Необходимый минимум, который нужно будет сделать, это вписать уникальное имя каждому трекеру. В новом приложении скорее всего будет возможность делать это с телефона (но это не точно, пока думаю, стоит ли), а пока вот так.
#define NAME_LENGTH 6
char MY_NAME[NAME_LENGTH] = "Rick";
Длина поля (да и вообще версия скетча) должна быть одинаковой для всех ваших трекеров, иначе они не будут между собой дружить.
Всё! Легко и просто! После этого можно нажать кнопку заливки скетча в плату, подключить блютус и перейти к разделу установки программы на телефон.
Но это лёгкий путь, мы же с вами прогуляемся по настройкам дальше.
Чуть ниже увидите еще одну важную строчку:
#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 пишет при компиляции, сколько места будут занимать переменные.
Для случаев, когда выключение питания не должно приводить к потере данных, я реализовал вариант их хранения в постоянной памяти 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/