mirror of https://github.com/OpenIPC/wiki.git
47 lines
6.0 KiB
Markdown
47 lines
6.0 KiB
Markdown
## Использование аппаратуры как джойстика для передачи каналов RC через mavlink
|
||
|
||
### Теория
|
||
Программы наземных станций, такие как Mission Planner или QGroundControl, способны распознавать подключенные джойстики либо аппаратуры в режиме usb-джойстика и
|
||
передавать на полетный контроллер значения осей в пакете RC_CHANNELS_OVERRIDE (#70). Однако, QGC передает только первые 4 канала (две оси), остальное можно назначить только на кнопки,
|
||
а MP может это делать только под Windows, что не всегда удобно. Я написал простейшее приложение для регистратора, которое распознает подключенный джойстик и отправляет пакеты [RC_CHANNELS_OVERRIDE](https://mavlink.io/en/messages/common.html#RC_CHANNELS_OVERRIDE) в версии протокола mavlink 2 для поддержки 18 каналов напрямую в порт telemetry_tx, который обычно опубликован на 127.0.0.1:14650 регистратора. Порт, адрес, время между отправками пакетов, число осей и устройство в системе можно переназначить, смотрите `rcjoystick -h`.
|
||
|
||
```
|
||
Usage:
|
||
[-v] verbose;
|
||
[-d device] default '/dev/input/js0';
|
||
[-a addr] ip address send to, default 127.0.0.1;
|
||
[-p port] udp port send to, default 14650;
|
||
[-t time] update RC_CHANNEL_OVERRIDE time in ms, default 50;
|
||
[-x axes_count] 2..9 axes, default 5, other channels mapping to js buttons from button 0;
|
||
[-r rssi_channel] store rx packets per second value to this channel, default 0 (disabled);
|
||
[-i interface] wlan interface for rx packets statistics, default wlan0;
|
||
|
||
```
|
||
|
||
Например, отправлять можно не в telemetry_tx, а в mavlink_routerd, если вам так нужно. Пакет для сборки в buildroot от OpenIPC [тут](rcjoystick).
|
||
|
||
### Запускаем
|
||
Нам необходимо ядро и rootfs с поддержкой usb-hid на регистраторе. Для этого [прошейте](notes_start_hi3536ev100) их из [`/hi3536dv100`](hi3536dv100) каталога.
|
||
~~Необходимо обеспечить запуск модуля `hid-generic.ko`, для этого добавьте `modprobe hid-generic.ko` в [`S95hisilicon`](hi3536dv100/etc/init.d/S95hisilicon).~~ В свежесобранном ядре модуль `hid-generic.ko` загружается автоматически.
|
||
|
||
Далее нужно скопировать бинарник [`rcjoystick`](hi3536dv100/usr/bin/rcjoystick) в /usr/bin регистратора, через WinSCP и назначить права на исполнение: `chmod +x /usr/bin/rcjoystick`.
|
||
Перезагружаемся, подключаем аппаратуру к регистратору по usb и пробуем в консоли запустить `rcjoystick -v`. Если все прошло хорошо, то на экране мы должны увидеть значения осей при изменении положения стиков и переключателей, а в программе телеметрии, например в QGC (analyse tools > Mavlink inspector > RC_CHANNELS_RAW) должны изменяться каналы. Для запуска на постоянную можно прописать его в отдельный сервис [`S99rcjoystick`](hi3536dv100/etc/init.d/S99rcjoystick), главное чтобы он запускался после wifibroadcast.
|
||
|
||
### RSSI
|
||
|
||
Также в rcjoystick была добавлена функция инжекции аналога rssi (числа полученных от воздушной части пакетов в секунду) для хоть какого то индикатора качества приема, так как отдельный сервис для этого заводить нет желания и смысла, учитывая невысокий уровень регистратора. В rcjoystick уже есть большая часть необходимого для инжекции.
|
||
|
||
Указываем `-r 16` и, если интерфейс wfb не wlan0, то и его `-i wlanX` и в указанный канал будет попадать число принятых наземкой пакетов в секунду. У меня оно в районе 800, вы можете увидеть свое применив ключ verbose (`-v`). Далее указываем на полетнике:
|
||
```
|
||
RSSI_TYPE 2
|
||
RSSI_CHANNEL 16
|
||
RSSI_CHAN_LOW 0
|
||
RSSI_CHAN_HIGH 800 //ваше обычное значение, примерно среднее, не максимальное и не минимальное.
|
||
```
|
||
Значение будет отправлено на полетник, где он его обработает и установит 0..99 в rssi.
|
||
|
||
Проект пока в стадии тестирования, поэтому [присылайте](https://t.me/+BMyMoolVOpkzNWUy) свои отзывы о попытках и пожелания.
|
||
|
||
### Текущие проблемы
|
||
Иногда наблюдаются кратковременные фризы, если активно долбить оба стика во всех направлениях. Дебаг говорит, что от драйвера не приходят в это время события о перемещении. Этот эффект не наблюдается, если использовать ["радиоудлинитель" джойстика](sbus-to-usb-joystick) в виде arduino pro micro, которая парсит SBUS от вашего приемника и переводит в usb-hid-joystick.
|