Между постами о развитии России, иногда хочется поделиться личными достижениями, ведь все же мое главное дело сейчас не "Сделано у нас", и 90% своего времени я трачу на задачи связанные со службой. И порой иногда удается сделать что-то, о чем хочется рассказать, и что скоро будет наводить ужас на врага.
Вообще, началось всё с довольно тривиальной задачи. Я давно хочу начать делать FPV дроны для сбросов. Но не для этих пукалок ВОГов, а для нормальных таких сбросов, по взрослому. И тут нам волонтеры подогнали 4 крупных FPV дрона. И делов-то - приладить туда камеру поворотную, чтобы вниз могла смотреть, и сброс на сервоприводе. Пустяки.
Кратко расскажу как это вообще делается в принципе. Обычно у полетного контроллера (FC) есть 8 выводов для моторов, из них 4 занято, но целых 4 свободно, и на них можно повесить сервоприводы, переназначив туда пины контроллера. Тогда они начинают работать как ШИМ (Широтно-импульсная модуляция - регулирование основанное на подаче на электродвигатель импульсов напряжения с фиксированной амплитудой, но различной длительностью). Первым делом я так и сделал. Но оказалось не всё так просто.
Я хотел повесить это дело на трехпозиционный переключатель на пульте. У нас итак дефицит всяких кнопочек на пульте, и логично выглядело: шелк тумблер вниз - камера смотрит вниз - прицелились - щелк еще раз тумблер вниз - пошел сброс. Но это так не работает.
Во-первых, как оказалось, так реализовать нельзя, чтобы клац тумблером - работал один серво, клац второй раз - работает второй серво. Нифига, первый тоже работает при этом. Если два серво привязать к одному переключателю (в терминах FC это AUX), то на оба положения AUX реагируют оба серво.
Во-вторых, нельзя поменять направление серво. В моем случае получилось так, на верхнее положение мой сброс открыт, на нижнее он закрыт. А мне надо наоборот. И выход - физически переделать сброс, перевернув сервопривод. Там, кстати, на Гитхабе целое обсуждение этого поведения Betaflight, и в новой версии 4.6 они даже что-то исправили, но она пока не вышла. Да и делать это надо через smix reverce, а для этого... короче это не подходит, и все равно не решает проблему 1.
В-третьих, после долгих манипуляций FC просто сгорел нахрен. Вместе с ESC.
Я достал из своих запасов контроллер Mamba F405 MK2 - довольно популярный и качественный FC. Все припаял, захожу в CLI, ввожу resource и вижу... что у него только 4 пина под моторы, а не 8 как обычно. Свободных нет.
Да где наша не пропадала, там есть 2 LED, подцепимся к ним... но это не работает, так как эти пины не связаны с таймером, и на них ШИМ не заводится.
Короче, оказалось что у Mamba вообще нет ни одного ШИМ выхода, серво там цеплять вообще не к чему. Точнее там есть CAM_CONTROL, но физически площадку на плате я так и не нашел, в распиновке она не указана. Да и один ШИМ не спасет отца русской демократии.
Вообще, я из-за невозможности реализовать это на одном AUX был готов уже сделать это на двух, один управляет камерой, другой сбросом. Но тут совсем облом, тут просто некуда прицепить серво. Тупик? Нет, конечно можно взять другой контроллер. Но ёпт, опять все 12 проводов моторов перепаивать? В ЛЛ мне выпишут анафему.
Короче, тут я вспомнил про Arduino. Это решало вообще все вопросы. Во-первых, ШИМ там 6 штук (ну то есть можно подключить 6 сервоприводов). Во-вторых, программно можно их заставить делать что угодно, работать как угодно и в любую сторону. И легко повесить их на один AUX.
Вопрос в том, как из FC прочитать значение AUX из Arduino, чтобы узнать положение переключателя. И это оказалось довольно несложно. Я давно задумывался, что означает переключатель в первом столбце на вкладе "Порты" в Betafliht. Что за "Конфигурация и MSP" такая.
Оказалось, что он нужен для того, чтобы на этом UART включить протокол MSP (MultiWii Serial Protocol). Он позволяет общаться с FC извне, многое о нем узнавать, и даже им управлять через стандартный порт UART.
У MSP есть команда MSP_RC (105) которая возвращает значения AUX. Его надо распарсить, и вытащить из него в моём случае значение AUX5. И дальше простая логика:
AUX5 = 1000...1400 - камера прямо - сброс закрыт
AUX5 = 1400...1800 - камера вниз - сброс закрыт
AUX5 = 1800...2000 - камера вниз - сброс отрыт
Добавил контроль чексуммы, так как иногда приходит в ответ мусор. И сброс может, упс, и открыться просто так, хотя ты ничего не нажимал. Потом добавил еще проверку - сброс открывается только если пришло два одинаковых ответа подряд. Потом моя паранойя заставила добавить еще проверку, что перед открытием сброса была опущена камера - просто быстро клацнуть вниз переключателем - сброс не сработает.
Ну и, мне это всё так понравилось, что я еще и добавил вывод положений серво на экран в очки через OSD.
Применение Arduino открывает очень широкие возможности! Можно организовать любую логику работы нескольких серво, и даже можно реализовать управление дроном - через MSP можно управлять стиками, а значит наводить птичку. Понятно, что Arduino не потянет компьютерное зрение и распознавание целей, но для этого можно использовать уже что-то более мощное, Raspberry Pi, например, главное принцип, который мне теперь понятен.
А еще я на дроне реализовал переключение каналов видео-передатчика 1.2ГГц c пульта по нажатию кнопки, при том, что программное управление у этого видеопередатчика (через протоколы Trump или SmartAudio) не предусмотрено. Но это уже другая история.
И все таки, подписывайтесь на Телеграм «Сделано у нас» тут, а на сообщество на Пикабу можно подписаться здесь, это умиротворит мою душу, и придаст мотивации в новых начинаниях на благо нашей Победы.