Скромная заметочка про RESOURCE и PINIO / PINIO_BOX

На днях получило популярность видео о том, как здорово можно сделать управление практически любым видеопередатчиком с пульта, просто управляя кнопкой. Видео интересное и познавательное, но особенно английская версия (а немедленно была записана и русскоязычная, что очень здорово) примечательна тем, что сразу вспоминается школа, или в крайнем случае первый курс института: студент бодро рапортует правильный ответ, мало что понимая и объясняя. Дальше — хуже, так как студенты — а мы, слушающие это видео, и есть студенты, так как материала не знаем — могут попробовать воспроизвести бесстрастному преподавателю, коим выступает суровая реальность, то, что они усвоили, и на любой вопрос за рамками усвоенного от коллеги ответить уже не смогут. Почему 40? Ведь ответ на «вечный вопрос» — 42… На будущее скажу, что и 42 тоже сработает!

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

Лабораторные мыши

Для детального освоения темы я предлагаю читателю взглянуть — не без трепета — на схему ниже:

stm32f1 распиновка

Сейчас мне многие предъявят, мол, чего это я тут F1 поставил, с ним никто работать не будет. Но тут я подловлю вас на некотором незнании материала: можете открыть схему для F3 в том же корпусе, и вы удивитесь, на сколько похожи эти процессоры по распиновке. Для наших задач сейчас в первую очередь важны названия ножек и их номера, а на схеме для F1 видны еще и функции, как UART (наши любимые TX/RX), к примеру.
Давайте знакомиться со следующим участником. В операционную приглашается мой любимый полетник для тинивупов — Eachine Tiny, полное название которого длинее, чем это предложение.

Предвосхищая распросы о том, почему именно этот полетник мой любимый, отвечу сразу: он легкий (2.1гр), компактный, простой, как мыльница, и лишен всяких недостатков многих All-inclusive решений, вроде отваливающихся приемников и невнятного управления. Минус — мы подключаем приемник самостоятельно.

Постановка задачи

Теперь давайте поставим задачу: мы хотим управлять неким периферийным устройством с нашего пульта. Это может быть прожектор, который вы подключите с помощью мосфета, может быть сброс валентинки любимой девушке (придумайте сами, как это реализовать), или, возможно, вы просто хотите управлять своей камерой с пульта. Для начала нам надо определиться с тем, какие ноги мы можем использовать для данной задачи, а какие — нет. Да-да, не думаете же вы, что все 48 ножек процессора используются всегда во всех сетапах? В примерах на видео предлагали использовать пины пищалки, но мы решили разобраться в проблеме поглубже, поэтому будем использовать вообще случайный свободный пин! Да и площадки для пищалки не нашлось на моем полетничке, так что нам остается придумать решение самостоятельно.
Скажу, на будущее, что паяться к ножке процессора — то еще удовольствие, поэтому для своих задач я использовал ноги UART2, который у меня нигде не используется.

Управление ресурсами

Скриншот betaflight после команды resource Скриншот betaflight после команды resource

Подключаем полетник и открываем консоль betaflight (я только что прошил его, чтобы было проще и понятнее). Набираем команду resource list и видим список ножек с назначенными им задачами. Список пестрит свободными ножками (FREE), однако не спешите радоваться. Наберите resource и вы увидите иную картину, где, к примеру, свободной ножке A14 назначен вполне себе такой TX2. Если вы готовы распрощаться с одним из UART и вам не жалко эту ножку, то можете освободить ее от задачи и использовать — будет проще подпаяться. Но я решил пойти чуть более сложным путем, чтобы у нас получился более полноценный мануал. Давайте исходить из того, что я очень жадный, и все UART мне нужны. Тогда остается использовать какую-то свободную ножку. Мы же разберем случай, когда нам все-таки придется освободить ресурс и отобрать у ножки родную функцию.
Для микрохирургии я выбрал ногу мотора 8 — B01. Мой вуп и на 7 моторах будет летать прекрасно, поэтому я решил, что 8й мне точно не нужен (UART, напоминаю, жалко просто для примера). Обращаю внимание читателя на то, что на схеме ножка B01 обозначается PB1: номера соответствуют, но ведущего нуля нет и буква P стоит перед обозначением ножки. Освобождаем ресурс:

resource MOTOR 8 none

Проверяем результат командами resource и resource list. В первой мы увидим FREE напротив ножки B01, а во второй увидим, что мотора 8 больше нет в списке ресурсов.

Ножки свободного назначения PINIO

Далее назначаем ножке B01 специальный ресурс PINIO, коих предусмотрено 4, а значит всего 4 ножками мы сможем управлять сами. Мы назначаем первому PINIO:

resource PINIO 1 B01

Теперь надо немного поковыряться с тем, что есть PINIO и PINIO_BOX. PINIO — это просто страшное слово для обозначения ножки свободного назначения, а PINIO_BOX — это привязка ножки к функции, которая будет значениями ножки управлять. Грубо говоря, ножкой мотора у нас управляет PID контроллер и всякая логика, ножкой TX1 управляет UART1. Аналогично, ножке свободного назначения PINIO можно назначить управляющим сигналом что-то, что нам нужно, как вариант — ARM статус, или одно из пользовательских значений, управляемых с пульта.
Давайте, для начала, глянем, что там уже стоит:

get PINIO_BOX

pinio_box = 255,255,255,255
Array length: 4

Консоль возвращает массив из 4х чисел, разделенных запятой. По умолчанию все числа равны 255 — это пустые значения.
Нас интересуют 4 значения для пользовательских функций (USER1..USER4), а кому-то полезным окажется ARM (самое простое — диод, включающийся на заармленном коптере).

USER1 40
USER2 41
USER3 42
USER4 43
ARM 0
AIRMODE 28

Полный список значений доступен любому страждущему в файле src/main/interface/msp_box.c в исходниках betaflight.

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

set PINIO_BOX = 40,255,255,255

Так мы для PINIO 1 назначили 40 функцию, которая является пользовательской функцией USER1. Не забываем сохранить изменения:

save

После перезагрузки у нас на вкладке Modes должен появиться режим USER1, для значения которого мы указываем свой диапазон и канал приемника. Поздравляю, если вы не заснули или не сожгли ничего — вы только что научились работать с PINIO и сможете не только управлять своим видеопередатчиком с пульта, но и сделать, к примеру, вот такой тинивуп:

Newbeedrone police whoop