Некоторое время назад я стал относительно счастливым обладателем аппаратуры с телеметрией, производства всемирноизвестной в узких кругах фирмы футаба. К сожалению, эргономика данной телеметрии оставляет желать лучшего. Мне не хватило удобной индикации о том, что батарейка закончилась. Штатное решение с ext.voltage датчиком не выдерживает никакой критики: при любом нагруженном маневре напряжение просаживается ниже порога и приводит к срабатыванию алярма. Частично решить проблему мог бы гистерезис, но он не предусмотрен футабой. Более-менее эту проблему решает сторонний датчик eFuelGauge, который считает mAh, но это плохо работает если используются батарейки разной емкости. Являсь давним пользователем jlog2, я знал, что из jive едет отладочная информация, в которой есть как напряжение, так и ток. Поэтому я подумал, что используя эти данные можно будет компенсировать провалы напряжения и отдать в телеметрию ровный график разряда. Конечно, внутреннее сопротивление разных батареек различно, но его можно оценить по току и просадке напряжения при начальной раскрутке ротора.
Таким образом, надо было выбрать микроконтроллер и написать прошивку, которая бы анализировала данные jlog, обрабатывала их и передавала бы в sbus2. При этом, по возможности обойтись готовыми компонентами, которые легко приобрести. Задача осложнилась тем, что в sbus используется инвертированный uart и мало микрокотроллеров такое умеет, а внешний инвертор делать не хотелось. Выбор в итоге пал на довольно популярную плату на базе stm32f103c8t6. У этого чипа нет инвертора uart, но eго производительности хватает чтобы сделать програмную эмуляцию.
После написания прошивки получился следющий результат:
Это телеметрия напряжения с одного полета, которая писалась аппаратурой. Красным цветом сырые данные, зеленым отфильтрованные. Алярм, естественно, настроен на зеленые данные.
Для сборки понадобятся:
- плата на базе stm32f103c8t6
- stlink v2
- резистор на 330-560 Ом
Перед тем, как прошивать плату надо запустить в отдельном терминале свежий (0.10) openocd:
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg
$ git clone http://github.com/delamonpansie/jitel
$ git submodule update
$ git submodule init
$ make -C libopencm3
$ make
$ make flash
- 1-3: Curr-1678, компенсированное значение напряжения, сырые ток и емкость
- 4: SBS-1RM, обороты. Для корреткной работы надо выборать тип "magnetic" и выставить gear rate
- 8-15: Kontroik ESC, данные с Jive, кроме температуры и BEC.
Описание протокола jive: настройки для порта обычные, 9800,8n1. Посылки идут каждые 100ms и состоят из 25 16-битных значений. Первые четыре байта magic, далее идут параметры, часть из которых передается в каждом фрейме, часть с периодическими паузами. Я сумел понять где передаются: ток и напряжение bec, ток и напряжения силовой батарейки, обрототы на моторе. Подозреваю, что магический константа для оборотов свзязаны с кол-вом полюсов мотора, но доказать не могу. Мне не удалось понять, где передается температура, но, честно говоря, не очень-то и старался. Детальное описание структуры есть в исходниках.
В детальном описании sbus2 не вижу смысла: желающие могут воспользоваться следующими ссылкой: https://sites.google.com/site/sbus2diy/home
Устройство программного инвертора следующее: вход от sbus подается на ногу PB4; на PB4 висит EXTI прерывание, которое по изменению уровня дергает PA4 в инверсии; PA4 закорочено с PA3, которое является входом от USART2. В обратную сторону аналогично.