iNAV work around

От переизбытка интелекта и приятной цены купил BETAFLIGHTF4.
Захотелось его в iNav и еще и в режиме самолета. Лучше бы крыла, было бы проще.
Но жертвенный пенолет уже ждет.
Список задач:
Есть 8канальные приемники с PWM выходом (реально 6 каналов)
Есть PWM-to-PPM конвертер от дядюшки Ляо.
Все остальное тоже есть.
Только вот BETAFLIGHTF4 далеко не самый подходящий для этой задачи мозг.

Полезная инфа(из документации к iNav):
 Как скомпилить в докере:
1) надо установить докер.
2) стянуть образ:
C:\work\my_projects\iNav\inav_flight_controller\inav>docker build -t inav-build .

3) Стянуть исходники
4) Скомпилить исходники.
docker run --rm -v c:/work/my_projects/iNav/inav_flight_controller/inav:/home/src/ inav-build make TARGET=BETAFLIGHTF4
или
docker run --rm -v c:/install/inaw/inav:/home/src/ inav-build make TARGET=BETAFLIGHTF4
в зависимости от того где лежат исходники iNav

Выяснить, что софт BETAFLIGHTF4 хочет не-инверсный PPM.
Понять, что конвертор дает инверсный PPM.
Поругаться с утенком.
Найти исходники конвертора PWM to PPM. Это оказался ArduPPM. А их версий в исходниках чуть больше одной. Гораздо больше. Да еще и под слегка разное железо.
Подобрать подходящую версию.
Найти как инвертировать ШИМ.
Отключить лишние 2 канал (из 8, потому что у меня 6ти канальный приемник)
Установить АVR Studio.
Понять что она не нужна.
Понять что она все же нужна, но компилить надо через внешний Makefile.
Убедиться, что она не поддерживает мой программатор.
Найти avrdude.
Скопмилить, прошить, запустить. Повторить до полной работоспособности и получения необходимых характетистик.
Светодиод действительно стал медленно моргать, когда есть сигналы с приемника.
Утенок в шоке.
(решение с исходниками и пояснениями на почте)

PWM to PPM
https://github.com/GaloisInc/ardupilot-mega/blob/master/Tools/ArduPPM/ATMega328p/manual.txt

Запустить контроллер.
Подключить PPM выход из конвертера.
Убедиться, что все шесть каналов отлично и стабильно видятся.
Начать все настраивать.
Понять, что у контроллера только 4 выхода PWM, первые два заняты моторами,  которые никак не хотят реконфигурироваться в серво выходы.
Полезть в исходники.
Убедиться, что именно у BETAFLIGHTF4 в таргете так все и сконфигурировано. И совершенно правильно ничего не хочет реконфигурироваться.
Первые S1 и S2 назначены на моторы и без вариантов.
S3 и S4 могут быть сконфигурированны на серво.
Понять, что 2 серво как бы не хватает для самолета(ну если без особых извращений. )
Очень хочется 3 сервы. Может можно использовать канал LED?
Убедиться, что так просто LED испльзовать нельзя, по той же причине, что и моторы.
Поругать утенка, за то , что не сказал раньше.
Полезть в таргет MATEK405.
Порадоваться многообразию возможностей реконфигурации.
Много думать и решить поправить код в BETAFLIGHTF4 по аналогии с MATEK405.
Очень не хочется читать даташит на таймеры с целью выяснения почему в MATEK405 их так беззаботно ремапят. А в BETAFLIGHTF4 аскеза и прочий минимализм.

Понять, что на новом компе нет гита и докера.
Установить гит, скачать исходники iNav:
https://github.com/iNavFlight/inav

Скачать и установить докер.(google)
 Пофиксить код:
file: inav\src\main\target\BETAFLIGHTF4\target.c
заменить TIM_USE_FW_MOTOR на TIM_USE_FW_SERVO:


const timerHardware_t timerHardware[] = {
    DEF_TIM(TIM4, CH3, PB8,  TIM_USE_PPM,                               0, 0), // PPM

    // Motors
    DEF_TIM(TIM3,  CH3,  PB0,  TIM_USE_MC_MOTOR | TIM_USE_FW_MOTOR,      0, 0), // S1_OUT D1_ST7
    DEF_TIM(TIM3,  CH4,  PB1,  TIM_USE_MC_MOTOR | TIM_USE_FW_SERVO,      0, 0), // S2_OUT D1_ST2
    DEF_TIM(TIM8,  CH4,  PC9,  TIM_USE_MC_MOTOR | TIM_USE_FW_SERVO,      0, 0), // S3_OUT D1_ST6
    DEF_TIM(TIM8,  CH3,  PC8,  TIM_USE_MC_MOTOR | TIM_USE_FW_SERVO,      0, 0), // S4_OUT D1_ST1

Скопилить докером.
Убедиться, что прошика 2.6.0 не поддерживается конфигуратором 2.5.0
Попить с утенком чаю.
Откатиться в исходниках iNav на release 2.5.1 версию.
Пофиксить код.
Скомпилить докером.
Зашить в контроллер.
Установить модель "самолет" при первом коннекте с конфируратором.
 Похвалить утенка. Он старался.
На месте мотора 2 теперь серва 2.
Убедиться, что к этому моменту полностью разрядился акумулятор на RC пульте.
Найти зарядку LiFePo.
Найти переходник на акб пульта.
Заряжать час.
Радостно все подключить.
Настроить все выходы PWM в iNav.
Включить питание.
Все серво правильно работаю.
Серва, подключенная к каналу мотора, гудит и не реагирует на стик.
Поговорить с утенком. О жизни. Вдумчиво.
Все отключить.
Вспомнить, что есть еще канал LED.
Залезть в исходники iNav.
Вернуть все в исходное состояние.
В том же файле:
file: inav\src\main\target\BETAFLIGHTF4\target.c
добавить поддержку серво в LED канал:

Было:
// LED strip
    DEF_TIM(TIM4,  CH1, PB6,  TIM_USE_LED,                              0, 0), // D1_ST0

Стало:
// LED strip
    DEF_TIM(TIM4,  CH1, PB6,  TIM_USE_LED | TIM_USE_FW_SERVO,                              0, 0), // D1_ST0

Скомпилить докером.
Зашить в контроллер.
Установить модель "самолет" .
Утенок доволен. Кажется он что то задумал.
Видим канал 2 для серво. И два мотора.
Протестировать. Убедиться, что все серва шевелятся.
Итого:
Канал:
S1  MOTOR 1
S2  MOTOR 2   - можно отключить
S3  SERVO 3    -    +ROLL STAB
S4  SERVO 4    -    - ROLL STAB
LED CHANEL   (S0) SERVO 2    - PITCH STAB

Все можно менять местами, кроме моторв. Так уж больно сильное шаманство.
Утенок доволен.

Захотелось( ну как захотелось - необходимость) видеть RSSI .
Нет у меня канала PPM, который его показывает, но есть вывод PWM.
Оказывается, на плате BETAFLIGHTF4 уже есть интегратор, который преобразует PWM в некое подобие аналогового сигнала. Вход в него, это такая контактная точка на плате с надписью rssi.
Но, что как бы уже привычно для меня и утенка, подключен он к PC3 (ну типа третий калал ADC), который даже и не думал никто в софте инициализировать.
Так что надо еще раз применить магию. Утенок согласен.

Как включить RSSI с точки rssi:
Во первых надо вообще разрешить использование аналогового RSSI:
Under CLI :
  • enable using the RSSI_ADC feature : feature RSSI_ADC
  • set the RSSI_SCALE parameter (between 1 and 255) to adjust RSSI level according to your configuration.
Т. к  у нас RSSI подключено к PC3, то по аналогии с другими конфигами это, похоже, канал, который у наск вовсе не определен - ADC_CHANNEL_3_PIN.

Надо дабавить его в target.h
target.h
"
#define USE_ADC
#define ADC_CHANNEL_1_PIN     PC1
#define ADC_CHANNEL_2_PIN     PC2
#define ADC_CHANNEL_3_PIN
#define CURRENT_METER_ADC_CHANNEL ADC_CHN_1
#define VBAT_ADC_CHANNEL     ADC_CHN_2
#define RSSI_ADC_CHANNEL            ADC_CHN_3
"
скомпилить и перешить контроллер.

Далее в миксере в Inav Configurator включить аналоговый RSSI, а в CLI сменить ADC канал rssi :
"
set vbat_adc_channel = 2
set rssi_adc_channel = 0
set current_adc_channel = 1
set airspeed_adc_channel = 0
"

set rssi_adc_channel = 3
save

Включить инверсию RSSI, если надо:

set rssi_min = 100
set rssi_max = 0
save

Утенок сказал, что сигнал RSSI начал отображаться.

Ура. Вчера полетал. Сильный ветер, такой, что модель против ветра летела только на полном газу. Летал в HORIZONT моде. Отлично. PID поставил на PITCH = 45  и ROLL 45.
Но PITCH можно, наверное, уменьшить. Самолет дрожал, но не совсем понятно, то ли это потому, что против ветра начиналась вибрация, то ли перерегулировака. В будущем выберу хорошую погоду и подберу ПИДы.

Смотрел в окно. Долго. Много думал. Вспомнил, что в каморке уже третий год лежит goDiscover
летающее крыло. Качество его изготовления и удобность всяко лучше моего пенолета из клея, палок и пены. Решил все переставить на него. Как стало понятно даже утенку, лишний канал серво не нужен. Достаточно двух. 
Переставил полентный контроллер на режим летающего крыла. Пришли модули Lora на 868Мгц. Пришел от китайцев NanoVNA2. Два дня развлекался конструированием антенн и их настройкой на 2450Мгц для видео канала. Теперь буду развлекаться антеннами на 868 Мгц.
Все собрал. Осталось только добавить Лору. 
Утеноку очень интересно, как это все будет летать.

Spinning a 10x7 with a Racerstar Racing Edition 3508 BR3508 700KV.
Ура. Я просто мечтал чем нибудь заморочиться. 
BETAFLIGHTF4 имеет 4 выходных PWM канала. Плюс один канал можно сотворить из LED.
И того, каналы 0 и 1 это только моторы. Без вариантов. На каналы 2,3,4 можно подключать сервы. Утенок сказал, что MiniTalon на хвост требует еще один канал, который взято негде.
То есть,  канал 2 на левый элерон, канал 3 на правый элерон( что бы мы могли наклоняться и поворачивать) а вот на хвост остается только канал 4 . А вот серв там две и им нужны инверсные сигналы управления. Утенок предложил добавить маленький контроллер, который будет декодировать PWM канала 4 и генерировать два инверсных PWM канала для хвостовых серв. 

Берем Nucleo STM32L432 board ( потому что есть в ящичке и потому что маленькая.) И назначаем порт PA8 как EXTI8  ( вход прерывания) По прерыванию, callback функция проверяет уровни сигнала на ножке, если уровень высокий, то пришел входной импульс и можно запустить TIM1 для измерения его длинны. Если уровень низкий, то останавливаем TIM1, считываем значение таймера и обнуляем его счетчик. Если время импульса от 1 до 2 мсекунд, ( ну пусть от 0.5 до 2.5) то можно его обрабатывать и посылать дальше в таймеры  6 и 7, генерирующие инверсные выходные импульсы на ножки PA6 и PA7. При неизвестном входном импульсе, процессор устанавливает длительность выхдных импульсов равными 1.5 мс.
(или можно запомнить последнее валидное состояние. Пусть утенок подумает. )
> Вы здесь.














Комментарии

Популярные сообщения из этого блога

How to build coil for Minelab Explorer. DIY

Вычисление азимута и расстояния между двумя точками