Проект FlyBeeper mini BT

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

Характеристики

Итоговое устройство имеет:

  • Бародатчик SPL06/DPS310/BMP280 по SPI 8 МГц с опросом 60 раз/сек и трансляцией BLE по запросу или подписке в отдельный стандартный сервис 0x181A Environmental Sensing: 0.2 pps температура 0х2A6E, 10 pps давление 0x2A6D и 1 pps расчетная высота 0x2A6C. В будущем планируется настройка частоты передачи каждого параметра по подписке до 20 раз в сек. Дополнительно давление можно получить через Nordic UART Service по протоколу NMEA PRS или POV — добавил для поддержки старых летных программ. В реальном полете отличий в реакции между используемыми датчиками нет. Лишь «на земле» заметно, что более новый SPL06 менее шумный (используется начиная с версии 1.6).
  • 4 кнопки на прерываниях GPIO с трансляцией BT в отдельном сервисе GATT, можно использовать в приложении на смартфоне для манипуляций с картой, например. Использовал сервис 0x1815 Automation IO Service и внутри для кнопок характеристика 0x2A56 Digital передает один байт — битовую маску состояний. Также реализован интерфейс HID keyboard для поддержки xcTrack.
  • Пьезоэлектрическая пищалка с малым потреблением с отдельной микросхемой управления громкостью. Частота управляется МК через модуляцию PWM, а громкость отдельными выводами GPIO. Всего 3 уровня громкости, впрочем тут всё как у mini2, только добавил режим тишины. Пьезоэлемент — основной потребитель энергии батареи. Величина громкости значительно влияет на срок работы от батареи (в 2 раза между 1 и 3 уровнями и в 3 раза между режимом тишины 0 и максимумом 3).
  • Настройка «по воздуху» через web-приложение. Частота, время цикла и заполнение звука варио в 12 точках в зависимости от скороподьъемности могут быть изменены пользователем. Отсечка на начало подъема и начало снижения. Возможность симуляци прямо на устройстве. Также в планах графический интерфейс для наглядной и быстрой настройки кривых.
  • Тихий режим на земле — звук варио активируется только при изменении высоты примерно на 1.5 метра относительно высоты на которой устройство было включено. Режим активируется через настройки, по-умолчанию выключено.
  • Частота светодиода в зависимости от варио — чем выше вертикальная скорость тем выше чатота магания светодиода. Данный режим позволяет визуально получать инормацию о скороподъемности. Режим активируется через настройки, по-умолчанию выключено.
  • Питание от CR2032 позволяет использовать прибор при низких температурах, где обычные литиевые батареи замерзают. Прибор потребляет в среднем лишь 1.3 мА в режиме с активным блютус подключением что позволяет надеяться на 120+ часов работы на средней громкости. Начиная с версии 1.6 прибор комплектуется датчиком SPL06 что снизило потребление до 0,8 мА с активным BLE, 0.6 мА при отсутствии соединения. Таким образом в беззвучном режиме как внешний BLE датчик давления прибор проработает до 250 часов (емкость стандартной батареи 210 мАч).
  • Чтение уровня заряда батареи через SAADC для CR2032 или обычный ADC через делитель на резисторах для литиевой батареи (для будущих проектов). Трансляция BT уровня заряда % в стандартный GATT 0x180F Battery Service.
  • BLE 5 — максимальная эффективность передачи данных на единицу затраченной энергии. Передатчик работает с минимально необходимой мощностью динамически адаптируясь к расстоянию до приемника. Большая скорость, маленькие пакеты, планирование передачи и сон между пакетами.
  • Бонусом получаем возможность перепрошивки «по воздуху» OTA. Обновление прошивки без проводов, см. ниже.

Печатная плата

Плату удалось развести на площади всего 25х25 мм, высота пирога меньше 8 мм вместе с батареей.

Корпус

На лицевой части 4 кнопки по углам и отверстие под LED индикатор по середине. На задней под крышкой держатель батареи. По бокам прорезь 13 мм под ленту липучку или страховочную стропу.

Испытательные полеты с креплением на свободные концы показали, что дизайн с прорезями для кнопок негативно влияет на датчик давления. Тестовая печать корпуса из мягкого нейлона без прорезей под кнопки была успешной. Кнопки работают, а симуляция потока подтвердила улучшение в стабилизации давления при обдувании со скоростью 10 м/с вдоль и поперек корпуса. Однако требуется провести еще много симуляций для отимизации при обдувании под разными углами.

Блютус

Особенность BLE части в том, что все данные передаются по классической схеме через сервисы GATT, однако на текущий момент программ, поддерживающих такое соединение не много. Это не касается конечно моих карт maps.flybeeper.com — там доступно и управление кнопками и барометрическая высота. А с учетом высокой скорости передачи данных — вплоть до 20 раз/сек можно не только очень точно рассчитывать скороподъемность, но даже пикать смартфоном без видимых задержек.

Эмуляция UART/COM/Serial реализована через Nordic UART Service и текстовый протокол PRS. Но мне бы хотелось, чтобы сообщество двигалось вперед и не цеплялось за пережитки древнего последовательного порта родом из 1969 года. Использование эмуляции ворует как пропускную способность канала, так и вычислительные способности с обеих сторон. Я надеюсь мне удастся убедить коллег разработчиков летного софта поддержать стандарты протокола блютус.

Поддерживаемое ПО

  • 29.05.2024 xcTrack v.0.9.11.10+ поддержка бародатчика (ESS) и батареи
  • 20.05.2024 SeeYou Navigator v.3.0.6+ поддержка бародатчика (ESS) и батареи
  • 08.04.2024 Flyskyhy v.8.2+ поддержка бародатчика (ESS), батареи и управления громкостью
  • 12.12.2023 xcTrack beta поддержка бародатчика (ESS)
  • 28.09.2023 xcTrack поддержка кнопок (HID)
  • 23.09.2023 FlyMe поддержка бародатчика
  • 29.08.2023 xcTrack, SeeYou и др. поддержка бародатчика по текстовому протоколу PRS (UART)
  • 28.08.2023 maps.flybeeper.com поддержка кнопок (AIO)
  • 16.08.2023 maps.flybeeper.com поддержка бародатчика (ESS)
  • 14.08.2023 xcTrack обещание поддержки бародатчика (ESS)
  • 01.08.2023 SeeYou Navigator интерес, в том числе кнопки

Если вы пользователь и заметили отсутствующее в списке ПО, которое вы используете — напишите комментарий внизу, и я попробую связаться с разработчиками. Если вы разработчик, для вас есть раздел ниже.

Обновеление прошивки

Обновление «по возуху» OTA использует SMP Service. Надеюсь в скором времени появится реализация протокола для web-приложения, а пока лучшим решением будет использование популярного приложения nRF Connect for Mobile. Устанавливаем и запускаем приложение. На вкладке Scan ищем устройство с именем FBminiBT и жмем connect. На открывшейся вкладке рядом с кнопкой disconnect жмем на иконку DFU. Выбирайем в файловой системе предварительно скачанный файл прошивки app_update.bin. Вибираем режим Test and Confirm или Confirm only и жмем Ok. Через 15 сек файл будет передан, проверен и устройство перезагрузится. Последняя версия прошивки на сайте конфигуратора тут.

История

Этот проект был начат в 2017 году. Идея проекта взять старый добрый вариометр пищалку на ATmega и запустить на МК с поддержкой блютус. Был выбран nrf52 и куплена DK. В то время нужно было писать код на Segger, а библиотека блютус была в виде статичного кода, который нужно было линковать со своим. Каким образом при этом отправлять МК в сон и просыпаться каждые 16 мс для чтения данных с бародатчика при работающем блютусе я тогда не разобрался. Проект был заброшен пока в 2023 году не обратил внимание на набирающий обороты RTOS Zephyr. Nordic официально поддерживает его и продвигает вместо Segger и Keil. За пять лет они хорошо потрудились и запустили свой МК на платформе arduino. Но именно Zephyr раскрывает весь потенциал МК и решает основную мою проблему — блютус + сон + жесткий тайминг по чтению данных из бародатчика.

Очень необычное чувство кода запускаешь RTOS на МК. Вытесняющая многозадачность, потоки, задачи, мьютексы и семафоры, шина данных, драйвера. Конфигуратор ядра аля линукс, модульная структура. Всё как на взрослом ПК. Вот только весь код, включающий в себя GPIO,SPI,PWM,ADC,FLASH,OTA,DFU,BLE,GATT всё это вместе с ОС умещается в 200 кБ.

Про мое отношение к безынерционным вариометрам

Являюсь пилотом параплана с 2014 года. Альпы 100ч/год. На земле махать безынерционным вариометром очень увлекательное занятие — вау эффект. А вот в воздухе эти 1 см/сек совершенно бесполезны, скорее наоборот, из-за турбулентности и совершенно естественных движений параплана в нестабильной атмосфере (в стабильной мы летим только вниз) просто необходимо применять минимальное сглаживание, а следовательно будет задержка. Тут главное баланс. Задержка не должна быть больше 1 сек. При рабочих величинах 1-2 м/с задержка должна быть меньше. Мои вариометры дают в этом случае 0,5 сек. Обращаю внимание на важность задержки окончания подъема. Одна секунда за границей потока при скорости 36 км/ч или 10 м/с отдаляет вас на 10 метров, т.е. 5 сек задержки отдаляют вас от потока на 50 м, а это средняя величина радиуса моей спирали. У многих простых вариометров, особенно программных, 5 сек — норма, т.к. встроенные в смартфоны бародатчики часто малочувствительны и опрашиваются с частотой 5 Гц. У новых до 25 Гц, но тенденция к влагозащищенности сильно снижает чувствительность.

Получается что колебания около 0 м/с в реальных условиях должны сглаживаться, а при 1 м/с и выше у безынерциальных систем нет особых преимуществ кроме более короткой фазы окончания подъема. При этом возникает новый потребитель батареи и ресурсов — IMU. Опрашивать его придется гораздо чаще. Значит спать МК будет мало, а потреблять больше. И вычислений на порядок больше. Это всё не имеет значения если у вас крупный прибор с дисплеем, но для крохотной пищалки IMU — это переход на аккумуляторное питание и кратное усложнение со снижением надежности, а значит всё это будет заложено в цену. Она будет в 2 раза больше и прибор будет больше размером. Но никто не запрещает приложению на смартфоне использовать встроенный IMU в дополнение к данным бародатчика и такие примеры уже есть.

Почему нет перезаряжаемой литиевой батареи

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

Самый главный плюс — это гораздо более широкий диапазон рабочих температур. Литиевые батареи (не путать с литиевыми аккумуляторами) работают и при -15 за бортом и при +40. Форм-фактор компактного прибора предполагает возможность фиксации на свободных концах, где он будет эффективно обдуваться и охлаждаться, а литиевые аккумуляторы при температурах близких к нулю практически перестают отдавать ток, сильно падает напряжение и они отключаются защитой. У таблеток нет никакой защиты. Их кривая разряда просто смещается вниз и падает токовая отдача, т.е. придется ограничить громкость. Прибор может показать что разряжен (если не использует поправку на температуру), однако продолжит работать. Его напряжение падает до 2 В только при полном разряде независимо от температуры, а минимальное рабочее напряжение для МК = 1.7 В.

Экономия места. Для разъема зарядки нужно место на плате. Хороший прочный разъем занимает уйму места. Сюда же нужно добавить место для микросхемы контроля заряда + обвязка + контакты для подключения самой батареи + BMC батареи + LDO или DC-DC регулятор для понижения и стабилизации 3.3 В.

Надежность. Литиевые аккумуляторы вздуваются, особенно при перегреве на солнце. Даже если корпус останется цел, придется отдавать прибор мастеру на замену аккумулятора.

Цена и доступность. CR2032 есть в любом минимаркете и на ближайшей заправке по цене около 1 евро.

Безопасность. В некоторых странах существует запрет к перевозке устройств, оснащенных литиевыми аккумуляторами. И мы все видели как они горят. CR2032 даже нагреться толком не может при коротком замыкании. Все потому что они рассчитаны на питание маломощной нагрузки с большим сопротивлением, таким, как у этого вариометра — 1.3 мА.

Срок службы. Среднестатистическому пилоту, такому как я нужно 100 часов в год. Это позволяет мне просто менять батарею в начале сезона безотносительно того, сколько там осталось от старого. Всегда в кокпите лежит ещё одна резервная, на случай брака или неуёмной тяги к полетам.

Энергоэффективность. Отсутствие промежуточных регуляторов, защит и т.п., питание непосредственно от батареи позволяет снизить потери как в активном режиме так и во время сна.

Надежность. Тут всё просто — меньше элементов — меньше рисков.

Почему нет солнечной панельки

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

Проблема 1 — аккумулятор. Чтобы хранить энергию солнца нужен резервуар. Либо это суперконденсатор, либо аккумулятор. Первый интересен, но пока он не зарядится работать ничего не будет. У него высокий саморазряд, а напряжение изменяется линейно, а значит пока вы не зарядите его на 50% работать схема не будет. Вы пришли на старт, расчехлили оборудование, а прибор пустой и чтобы зарядить его до рабочего напряжения нужно время. Убрав же обратно в рюкзак он гарантированно разрядится. Тут тонкая грань, но заманчиво — нужно экспериментировать с емкостью ионистра и размером панели. Потребление прибора всего 1.3 мА, но это среднее значение. В режиме передачи или во время работы зуммера кратковременно потребляется 15 мА. А для таких токов нужен буфер. Аккумулятор же требует обвязки — см. выше.

Проблема 2 — размер. Если мы всё же решились на аккумулятор, то нам нужно 4.2 В + падение на диоде защиты от обратных токов + запас для работы микросхемы управления. Обычно требуют солнечную батарею на пиковые 5.5 В. И когда мы пытаемся найти такую, оказывается что её стандартный массовый размер начинается минимум от 50х30 мм, а чаще 60х40 мм. Если нужно меньше, то это дизайн под заказ с соответствующей ценой. Напомню, размер платы моего прибора 25х25 мм.

Почему нет корпуса из литого пластика

Как ни странно, но времени на разработку корпуса уходит больше чем на разработку платы. Там куча мелких деталей, вырезов, замков, пазов, фасок. Оптимизация под литьевой пластик и под 3D печать отличаются, причем у литьевого больше ограничений как по мне. Литьевой пластик к которому все привыкли требует изготовление форм и эта часть стоит около 1000$. После этого стоимость отливки из этих форм — действительно мала. При моих масштабах производста я скорее выпущу новую модель чем формы окупятся.

Другой вариант — использование готовых корпусов от всяких флешек, повербанков и т.п. Выглядит это совсем не как прибор и функционал не соответствует. Разработка превращается в подгонку под корпус, а не наоборот.

3D печать позволяет мне быть очень гибким и быстро вносить улучшения. К тому же, качество печати неуклонно улучшается, а цены падают. Пожалуй самая оптимальная технология — это SLS печать нейлоновым порошком.

Для разработчиков

BLE

Используется стандартный сервис 0x181A Environmental Sensing и характеристика давление 0x2A6D. Частота отправки данных по подписке 10 pps. Проверить работу BLE устройства можно на сайте googlechrome. При включенном модуле bluetooth на вашем мобильном или стационарном устройстве жмем start notification и в списке должны увидеть мой FBminiBT. Подключаемся и в Live Output должны увидеть что-то похожее на это (далее вывод с реального устройства):

Requesting Bluetooth Device...
Connecting to GATT Server...
Getting Service...
Getting Characteristic...
> Notifications started
> 0x2e 0x3b 0x0f 0x00
> 0x27 0x3b 0x0f 0x00
> 0x26 0x3b 0x0f 0x00
> 0x25 0x3b 0x0f 0x00
> 0x25 0x3b 0x0f 0x00

Здесь мы видим пакеты давления uint32_t little endian. Чтобы получить давление в Паскалях, нужно Pa = value.getUint32(0)/10, например, последняя строчка 0x25 0x3b 0x0f 0x00 = 0x0f3b25/10 = 99818.1 Pa.

Прибор передает давление и по классической схеме через эмуляцию UART/COM/Serial.

Используется сервис Nordic UART Service (6e400001-b5a3-f393-e0a9-e50e24dcca9e) с характеристикой (6e400003-b5a3-f393-e0a9-e50e24dcca9e). При подписке на эту характеристику активируется передача давления в текстовом формате. По-умолчанию, это протокол PRS.

PRS XXXXX\n 

Где XXXXX — давление в Па в HEX 101325 Па = 18BCDh => «PRS 18BCD\n»
Также поддерживается формат POV — меняется через конфигуратор.

Важно. Если внешнее приложение подписывается на характеристику давление 0x2A6D в сервисе Environmental Sensing, то передача давления в текстовом виде через сервис Nordic UART Service останавливается для предотвращения дублирования данных.

Симуляция

Если у вас еще нет FBminiBT, то для добавления его поддержки в ваше приложение FBminiBT можно симулировать при помощи nrf connect для смартфона. На вкладке Advertiser нужно создать пакет, как показано на первом скриншоте и включить как показано на втором без лимитов до отмены. После можно подключиться к этому смартфону с другого устройства. Можно использовать googlechrome, второй nrf connect в режиме Scan или ваше собственное приложение. После установления соединения на первом смартфоне откроется новый экран где на вкладке Server можно отправлять тестовые пакеты — третий скриншот. Самостоятельно через равные промежутки времени, как это делает FBminiBT, отправлять уведомления nrf connect не будет. Это делается вручную по кнопке отправить. При отправке нового значения выбрать UINT32 (LE) и указать десятичное значение, например, 998181. Программа сама преобразует значение в правильную байтовую последовательность.

Кнопки

Для кнопок используется сервис 0x1815 Automation IO Service и внутри для кнопок характеристика 0x2A56 Digital Input , доступная для чтения и подписки на уведомления. Она отдает один байт UINT8, представляющий двух-битовый массив (порядок массива lettle endian). Каждые два бита которого отвечает за состояние одной кнопки начиная с младшего. 0b00000001 — нажата кнопка 1. Устройство имеет 4 кнопки. Это определено в дескрипторе 0x2909 Number of Digitals. Соответственно если нажать все кнопки одновременно, то получим значение 0b01010101. Подробнее о состояниях в Automation IO Service 1.0 Specification (п. 3.1.1). Я использую лишь состояния 0b00 — отпущена и 0b01 — нажата. Уведомления оправляются по изменению, т.е. отдельное уведомление о нажатии и отдельное об отпускании кнопки. Это позволяет обнаруживать и долгий клик и двойной и одновременное удержание нескольких кнопок. Когда внешнее приложение подписывается на уведомления изменения состояния кнопок, внутренние функции этих кнопок, таких как изменение громкости, отключаются.

На первом скриншоте ниже реальное устройство и его характеристики, включен режим уведомлений, кнопки отпущены. На втором нажата кнопка 2. На третьем включена симуляция FBminiBT — нажата кнопка 1.

Изначально для кнопок генерировал свой UUID сервиса и характеристики, потом заменил характеристику на используемую в демо коде от nordic, затем использовал сервис Human Interface Device, но оказалось он в черном списке при подключении через браузер. Тогда переключился на AIOS и стандартную характеристику Digital. Теперь весь BLE стэк отвечает стандартам блютус.

Кроме AIOS реализована полноценная HID keyboard. Эта технология требует подключения с авторизацией и шифрованием. В режиме спаривания устройств при запросе кода необходимо нажать на кнопку питания на устройстве (та что с кругом). Нажатие в этом режиме кнопки с квадратом отменит операцию. При этом кнопки будут доступны в любых приложениях Android или Windows. По-умолчанию нажатие кнопок соответствует нажатию F1F4 на клавиатуре.

Батарея

Стандартный сервис 0x180F Battery Service и характеристикой 0x2a19 Battery Level. Отдает процент заряда батареи. Планирую добавить температурную компенсацию. Пока 50% соответствует 2.78 В.

Настройки

За настройки отвечает сервис 904baf04-5814-11ee-8c99-0242ac120000. Начиная с версии hw 0.16 внутри сервиса набор характеристик. Каждая характеристика отвечает за одну настройку прибора. У каждой значимой характеристики есть два дискриптора. User Format Descriptor содержит название настройки. Presentation Format Descriptor содержит структуру, которая описывает как интерпретировать значение характеристики (см. Bluetooth Core Specification [Vol 3] Part G, Section 3.3.3.5). Ниже несколько примеров, которые показывают, что настройки можно менять не только через специализированный конфигуратор но и сторонними приложениями, умеющими работать по стандартам bluetooth.

Описывать все не буду, но вот одна особая характеристика 904baf04-5814-11ee-8c99-0242ac120002 отвечает за запись buzzer_simulate_vario_value. Запись INT16 LE значения 0 отключает симуляцию. Запись, например, 100 включит звук варио на устройстве, соотвествующий 1.00 м/с подъема.

Заметки для производства

Схема подключения программатора

P20 nRF52-DK           FBminiBT Board
VDD ------+-------------> VDD
         /
VTG ----+
GND ------------+-------> GND
SWD IO -----------------> SWD IO
SWD CLK ----------------> SWD CLK

На внешнюю плату подавать питание нельзя, оно поступит с программатора. DK при отключении VDD будет видеть встроенный чип, при подключении — внешний. Программировать можно через SEGGER J-Flash. Создать новый проект, выбрать нужный МК, затем Target -> Connect и бросить прошивку. Можно штатно прошить через VS Code + nRF Connect.

После первичной прошивки все последующие обновления возможны по воздуху OTA. Для этого требуется app_update.bin — файл и загрузчик защищены сертификатом, поэтому «чужой» файл не запишется. Для прошивки установить nrf connect, после сканирования и подключения перейти на вкладку устройства, нажать кнопку DFU, найти и выбрать файл новой прошивки. Должен пойти график загрузки как на этом скриншоте выше. После валидации напишет Done. Процесс занимает меньше минуты.

Последнее обновление 30.05.2024 в 17:29

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *