26 февраля 2017

Самодельный беспроводной USB-адаптер для симулятора повышенной точности

Расскажу о том, как я сделал свой беспроводной USB-адаптер повышенной точности для симулятора. USB-адаптер был опробован в Heli-X, FPVFreeRider и LiftOff и показал прекрасный результат, оправдал все мои ожидания!


Перепробовав несколько вариантов USB-адаптеров для симулятора, стал искать возможность сделать такой самостоятельно. Ни один из продаваемых USB-адаптеров меня не устраивал по причине малой точности. То есть, на полный ход стика приходилось очень малое количество шагов. Например в последнем от OrangeRX было всего 168 шагов. Это самое большое, что я видел, и этого ужасно мало для нормального управления моделью в симуляторе.

Наткнулся в интернете на интересный проект самодельного USB-адаптера на базе маленькой платки Arduino Leonardo. Взял его за основу и немного переделал под себя. Во первых, отказался от прямой модификации файлов дистрибутива Arduino, использовав внешнюю библиотеку для работы с джойстиком. Во вторых, исключил деление исходных данных пополам. Это позволило более точно учитывать длину PPM-импульса. В третьих, сделал возможность задавать мертвую зону, чтобы исключить дребезг значений в около-нулевой зоне стика. Ну и конечно же, припаял к USB-адаптеру маленький приемник FrSky на 8 каналов с CPPM-выходом для беспроводного управления.


USB-адаптер может подключаться к тренерскому разъему вашего передатчика. Сигнальный провод надо подключить к четвертому выводу USB-адаптера.


Чтобы сделать USB-адаптер беспроводным, потребуется приемник с CPPM-выходом, подходящий для вашего передатчика. Вот небольшой список для примера: FrSky 8СH, DEVO 8CH, FlySky 8CH, RadioLink 10CH, DSMX 6CH, Futaba S-FHSS 7CH. Есть и другие варианты, можно выбрать любой с CPPM-выходом. Схема соединения предельно проста. На приемник нужно подать питание 5 вольт и подсоединить выход приемника к четвертому выводу USB-адаптера.


После монтажа можно подключить USB-адаптер к компьютеру и выполнить привязку приемника к передатчику. Не буду подробно останавливаться на этом моменте, у каждого данная процедура проходит по своему, в зависимости от модели передатчика и приемника. Я подключил USB-адаптер к передатчику DEVO10 с прошивкой Deviation и установленным модулем 4-в-1. Конфигурация модели очень простая.

Подключаем USB-адаптер к компьютеру и приступаем к программированию. Я подробно расскажу, как сделать USB-адаптер максимально настроенным для каждого индивидуального случая. Сложного тут ничего нет, разберется даже школьник:)

Перед началом работы нужно скачать и установить среду разработки Arduino IDE. Лучше скачать архив и распаковать его в отдельный каталог. Там есть выбор под все современные системы. Распаковать можно в любое удобное место. Затем запускаем исполняемый файл и попадаем в среду Arduino. Выбираем в меню "Инструменты" плату "Arduino Leonardo" и чуть ниже выбираем виртуальный COM-порт, к которому подключена плата.


Закрываем среду разработки. Надо установить дополнительную библиотеку для работы с джойстиком. Идем по ссылке, скачиваем, распаковываем и выполняем файл deploy.sh или deploy.bat в зависимости от операционной системы. По итогу, библиотека должна оказаться внутри каталога Arduino, который будет расположен в вашем домашнем каталоге, а не в том, куда распаковали среду разработки.


Если у вас Windows и самодельный USB-адаптер планируется использовать в симуляторе FPVFreeRider или любом другом, основанном на библиотеке Unity3D (а их большинство), то надо изменить одну строчку в файле установленной библиотеки для работы с джойстиком.


Открываем файл Joystick.cpp внутри каталога ...\Arduino\libraries\Joystick\src, находим строчку:

#define JOYSTICK_AXIS_MINIMUM -32767

и заменяем ее на:

#define JOYSTICK_AXIS_MINIMUM 0

Дело в том, что FPVFreeRider в Windows получает данные с джойстика в обход системы и никакая системная калибровка джойстика не нужна. Но тут есть маленький подвох. Симулятор FPVFreeRider понимает значения с осей джойстика в диапазоне от 0 до 32767, а системный джойстик может работать в диапазоне -32767 до 32767. Поэтому, если ваш джойстик может выдавать отрицательные значения, то у вас будут проблемы с его калибровкой в FPVFreeRider. Это касается только Windows, в других системах такой проблемы нет и ничего менять не надо.

Скачиваем код скетча, открываем его в среде Arduino и сразу же загружаем в USB-адаптер кнопкой "Загрузка". Все должно пройти без проблем и ошибок.


В общем, USB-адаптер уже может работать, но пока что не настроен. Надо определить максимальное, минимальное и центральное значения PPM-импульса, поступающего на вход адаптера с приемника или тренерского разъема. В передатчике все каналы должны быть выставлены +/-100% и убраны все триммеры в ноль. В Ubuntu значения можно получить, выполнив в консоли простую команду:

# cat /dev/ttyACM0

Для Windows придется установить бесплатную программу TeraTerm. Распаковываем и запускаем ttermpro.exe. Создаем новое соединение, выбираем виртуальный COM-порт, подтверждаем и видим на экране шесть колонок цифр. Это данные шести каналов, которые получает USB-адаптер со своего входа.


Шевелим стиками и смотрим на цифры. Надо определить и записать минимальное, максимальное и значение в центральном положении стика. Значения могут немного плыть на 1-4 единицы. Для минимального надо выбрать максимально минимальное. Для максимального минимально максимальное, для среднего - среднее. Например, у меня минимальное значение гуляет в диапазоне 2210-2214, значит беру 2214. Максимальное гуляет 3810-3812, беру 3810. Среднее гуляет 3011-3013, беру 3012.

Если все получилось, то в программе можно отключить вывод данных, поставив комментарий на следующую строку. Было:

#define SERIALOUT

Стало:

// #define SERIALOUT

Подставляем полученные значения в переменные ниже.

#define MIN_PULSE_WIDTH 2214 // Minimal pulse
#define CENTER_PULSE_WIDTH 3012 // Middle pulse
#define MAX_PULSE_WIDTH 3810 // Maximal pulse

Если у вас Windows, то меняем значение переменной USB_STICK_MIN на ноль. Для других операционных систем оставляем как есть.

#define USB_STICK_MIN 0

Заливаем скетч в USB-адаптер и проверяем его работу. В Ubuntu это можно сделать в программе jstest-gtk. Если она не установлена, то ставим:

# sudo apt-get install jstest-gtk

В самой программе заходим в калибровку и сбрасываем значения кнопкой Raw Events.


Значения должны изменяться от -32767 до 32765. В около-нулевой зоне стика будет небольшой дребезг. Надо добиться того, чтобы эти значения гуляли как в положительную зону, так и в отрицательную. Придется подкорректировать переменные MIN_PULSE_WIDTH, CENTER_PULSE_WIDTH и MAX_PULSE_WIDTH несколько раз, чтобы добиться нужного результата. При этом не должно быть холостого хода стика в крайних положениях. Калибровку выполнять не надо, а еще лучше сохранить обнуленные значения командой:

# sudo jscal-store /dev/input/js0

В Windows проверку диапазона работы USB-адаптера можно выполнить с помощью программы Joystick Tester. Значения по осям должны изменяться от 32767 до 65535, а центр должен быть на значении 49150. Как я уже говорил, это сделано для того, чтобы FPVFreeRider смог нормально работать с USB-адаптером.


На этом этапе уже можно считать настройку USB-адаптера завершенной и проверять его работу в различных симуляторах. Но можно пойти дальше, если есть желание:)

Переменная CENTER_PULSE_JITTER убирает дребезг в около-нулевой зоне стика. При нулевом значении фильтр не работает. Если не нравится наличие небольшого дребезга, то можно поставить значение от 5 до 10. Большие значения лучше не ставить, иначе потеряется чувствительность в около-нулевой зоне.

Переменная RC_CHANNELS_COUNT отвечает за количество входящих каналов. У меня с приемника идет восемь каналов, поэтому весь скетч сформирован именно под это число. Это можно изменить, но придется еще глубже залезать в дебри кода.

Следующая строка формирует собственно джойстик с заданными параметрами:

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_JOYSTICK, 2, 0, true, true, true, true, true, true, false, false, false, false, false);

Третий параметр, там где стоит цифра 2, задает количество кнопок джойстика. Начиная с пятого параметра идет определение наличия осей. Шесть раз подряд true - это шесть осей USB-адаптера. Потом идет false - запрет оси. Всего можно задать 11 осей. Например, для USB-адаптера без кнопок и с четырьмя осями будет вот такая строка:

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_JOYSTICK, 0, 0, true, true, true, true, false, false, false, false, false, false, false);

Переменная NEWFRAME_PULSE_WIDTH отвечает за определение паузы в микросекундах между PPM-пакетами. Лучше ее не изменять.

Следующий блок задает пороговые значения по осям:

Joystick.setXAxisRange(USB_STICK_MIN, USB_STICK_MAX);
Joystick.setYAxisRange(USB_STICK_MIN, USB_STICK_MAX);
Joystick.setZAxisRange(USB_STICK_MIN, USB_STICK_MAX);
Joystick.setRxAxisRange(USB_STICK_MIN, USB_STICK_MAX);
Joystick.setRyAxisRange(USB_STICK_MIN, USB_STICK_MAX);
Joystick.setRzAxisRange(USB_STICK_MIN, USB_STICK_MAX);

Если осей меньше шести, то количество строк можно сократить. Для четырех осей будет так:

Joystick.setXAxisRange(USB_STICK_MIN, USB_STICK_MAX);
Joystick.setYAxisRange(USB_STICK_MIN, USB_STICK_MAX);
Joystick.setZAxisRange(USB_STICK_MIN, USB_STICK_MAX);
Joystick.setRxAxisRange(USB_STICK_MIN, USB_STICK_MAX);

В следующем блоке происходит преобразование полученных на входе значений в данные джойстика:

Joystick.setXAxis(stickValue(rcValue[ROLL]));
Joystick.setYAxis(stickValue(rcValue[PITCH]));
Joystick.setZAxis(stickValue(rcValue[THROTTLE]));
Joystick.setRxAxis(stickValue(rcValue[YAW]));
Joystick.setRyAxis(stickValue(rcValue[AUX1]));
Joystick.setRzAxis(stickValue(rcValue[AUX2]));
Joystick.setButton(0, rcValue[AUX3] > CENTER_PULSE_WIDTH);
Joystick.setButton(1, rcValue[AUX4] > CENTER_PULSE_WIDTH);

Последние две строки формируют значения кнопок. Первый параметр в этой строке - это номер кнопки. Нумерация идет с нуля. Если оставить четыре оси и убрать кнопки, то блок будет выглядеть так:

Joystick.setXAxis(stickValue(rcValue[ROLL]));
Joystick.setYAxis(stickValue(rcValue[PITCH]));
Joystick.setZAxis(stickValue(rcValue[THROTTLE]));
Joystick.setRxAxis(stickValue(rcValue[YAW]));

Можно еще немного подчистить код, убирая лишние данные, но пусть это будет "домашним заданием" для желающих копнуть еще глубже:)

Самый лучший способ сравнить работу обычного USB-адаптера и самодельного - это тест на точность полета. Как нельзя лучше для этого подходит трасса на детской площадке в симуляторе FPVFreeRider. Смотрите сами. С адаптером от OrangeRX я раза с десятого смог записать весь полет. Очень сложно было удержаться на трассе.


Признаюсь честно, я был в шоке от того, как работает самодельный USB-адаптер! С удивлением обнаружил, что в FPVFreeRider я могу пролетать сложную трассу на довольно большой скорости, легко и непринужденно проходить все ворота. В Heli-X точность управления достигла небывалых высот. Наконец-то стало возможным отрабатывать элементы, требующие ювелирной работы шагом. С LiftOff не очень заладилось. USB-адаптер работал прекрасно, но сам симулятор какой-то не очень качественный. Может быть это от системы зависит и в Ubuntu он у всех работает с проблемами.

На следующем этапе попробую заставить работать USB-адаптер с приемником через шину S.BUS. Это должно еще больше поднять точность управления в симуляторе. Успешных тренировок!

20 февраля 2017

RunCam 3 - в продаже!

Появился анонс экшен-камеры RunCam 3 на banggood.com! Цена в $99.99 вполне гуманна и совпадает с рекомендованной производителем. С учетом пойнтов и купонов будет еще вкуснее:)


Камера RunCam 3 специально создавалась для установки на гоночный квадрик. Прорезиненный корпус, линза, защищена стеклом Gorilla Glass 3, угол обзора 155 градусов. В комплекте есть мягкое крепление для установки на гоночный квадрик. Характеристики не топовые, зато цена идеально подходит под условия эксплуатации! Однозначный MUST HAVE! Камера RunCam 3 обязательно побывает в моих руках, о чем и расскажу позже.

18 февраля 2017

Ожидаемые экшен-камеры Foxeer

Компания Foxeer планирует представить новую камеру в форм-факторе  GoPro Session с отличными данными.


Характеристики камеры намного более многообещающие, чем у RunCam 3. Наличие режима SuperView делает эту камеру более привлекательной для съемки FPV-полетов. Но это еще не все новинки. Готовится продолжение серии Foxeer Legend - Foxeer Legend 3.


Пока только видно, что у камеры появился LCD-экран. Камера может снимать в режиме 4K. Других данных нет.

Кстати, камера RunCam 3 представлена официально и на нее стала известна цена $99,99 - довольно гуманно. В комплекте с камерой идет мягкое крепление на гоночный квадрик. В сети появилось детальное сравнение с Gopro Session 5. Даешь больше камер хороших и разных!

15 февраля 2017

Emax RS2306 - моторы экстремальной мощности

Наконец-то появился анонс новых моторов Emax RS2306. Моторы из серии "прощай аккумулятор":)


Только первая партия будет с белым ротором, остальная продукция будет с черным. Моторы будут в двух вариантах с разным kV: 2400 и 2750. Хоть и заявлена поддержка только до пяти банок, моторы могут легко работать и на шести. В сети попалось довольно старое видео с предварительной версией этих моторов, но по нему можно оценить, что это такое. Смотреть с 3.05.


Максимальная тяга моторов Emax RS2306 под 2 килограмма! Это очень-очень много для гоночного квадрика 210-го размера с пятидюймовыми пропеллерами. На четырех банках можно даже не пробовать, аккумулятор закончится раньше, чем квадрик успеет набрать высоту:) В общем, все идет к тому, что гоночные квадрики будут летать на шести банках и это не предел!

08 февраля 2017

Стики для передатчика на гироскопах - реально?

Вот уже несколько дней работаю над созданием USB-свистка для симулятора с высокой точностью на базе платки Arduino Leonardo. Все бы ничего, но небольшой дребезг значений в около-нулевой зоне немного не нравится. Причину его я знаю, но это навело меня на совсем другие мысли.

Если проследить всю цепочку сигнала с передатчика от стиков до конечного потребителя (мотор или сервопривод), то вырисовывается такая картина: стики - передатчик - приемник - контроллер - регулятор - мотор. На всем этом пути только стики являются аналоговыми, все остальные связи с недавних пор стали цифровыми. В стиках установлены переменные резисторы, которые могут иметь нелинейные характеристики, дребезг, износ резистивного слоя, люфт оси резистора. Да и значение сопротивления, кроме этих факторов, может зависеть от температуры, влажности, погрешности измерения. В общем, переменные резисторы на осях стика - единственное слабое место, мешающее достичь хорошей точности  определения угла наклона стика.

Немного могут исправить ситуацию использование датчиков Холла вместо резисторов. В них нет трущихся частей, погрешность измерения значительно выше, но есть нелинейность в выходном сигнале. Да и все равно контроллеру передатчика нужно оцифровывать данные с датчиков Холла, что тоже увеличит погрешность измерений.

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

Допустим, разместим двух-осевой гироскоп на стике и попробуем снимать с него данные. Но при этом пульт придется держать абсолютно неподвижно, чтобы данные по отклонению стика были адекватные. Бред какой-то получается. А что если на корпус пульта установить еще один гироскоп? Тогда можно будет снимать данные с гироскопа, установленного на осях стика и гироскопа, установленного на корпусе передатчика. Если не трогать стики, то данные должны совпадать. Логично? Но если пошевелить стик, то данные с гироскопов будут отличаться. И они будут отличаться как раз на величину угла наклона стика! Вот оно значение! Как бы пульт не гулял в руках оператора, но разница в данных с гироскопов и будет реальным значением отклонения стика. Все просто! Никаких движущихся частей, никаких аналоговых данных, чистая цифра! Как думаете, идея стоящая?

Реализовать можно двумя способами. Первый способ - с помощью небольших платок с гироскопами и какого-нибудь контроллера под Arduino. Нужна только программа обработки данных с гироскопов и преобразования данных в значения, понятные контроллеру передатчика. Таким способом можно приспособить гироскопы к любому пульту. Но этот способ не очень хорош тем, что понижает точность данных, увеличивает их дискретность из-за преобразования. Но для эксперимента вполне подойдет. Не нужно будет глобально переделывать пульт.

Второй способ более правильный и предполагает подключение гироскопов непосредственно к контроллеру передатчика через SPI-шину. В этом случае вся обработка ляжет на плечи процессора пульта, но не будет промежуточного преобразования данных, что позволит повысить точность. Такой вариант более сложен и потребует модификации прошивки пульта. Это можно проделать с прошивкой Deviation для передатчиков DEVO.

К сожалению я не очень силен в программировании, чтобы реализовать хотя бы первый способ. Есть желающие попробовать? Давайте обсудим в комментариях!


RunCam 3 - первое видео

Перед Новым Годом появился анонс новой экшен-камеры RunCam3 в форм-факторе GoPro Session, а сегодня появилось первое видео сравнения этой камеры с GoPro Session 5.


По видео видно, что угол обзора у камер одинаков. Специально сводил кадры в графическом редакторе для сравнения. Для съемок FPV-полетов на гоночном квадрике это важно. Звук у RunCam3 не такой отфильтрованный, как у GoPro Session 5. Высоких частот больше, но и ветер не досаждает. Цветопередача у RunCam3 не понравилась. У GoPro Session 5 намного лучше и глубже цвета. А с другой стороны и ценовая категория у камер разная. Ладно, подождем начала продаж и будем посмотреть:) Кстати, релиз обещают в марте. Ждать недолго.

BetaFlight 3.1.5

Я был уверен, что следующего релиза с исправлениями ждать придется недолго:)
Встречаем - BetaFlight 3.1.5!


Список изменений:
  • Вернули назад старую miltiwii экспоненту
  • Исправлен вывод 6 на мотор для SIRINFPV
  • Для VTX Smart Audio исправлена строка статуса для пользовательской настройки частоты
  • Исправлен сломанный стандартный PWM
  • Изменено значение по умолчанию поправки датчика тока у BFF3 // По умолчанию Serial RX включен на UART2
  • Наличие CD-карты доступно в списке ресурсов
  • Появилась настройка указания первого AUX-канала для проброса канала с приемника на выводы полетного контроллера в функции CHANNEL_FOWARDING
  • Исправлено меню выбора мощности для передатчика Tramp
  • Упрощены параметры anti_gravity_gain (отключено по умолчанию)
  • Внесены множественные изменения по управлению передатчиком Tramp через MSP
  • Исправлена ошибка отображения седьмого канала в сетке RaceBand для передатчика Tramp (показывало F8)
  • Перестали учитываться данные из параметров min_throttle и max_throttle в режиме удержания высоты
Тут же обновил прошивку для проверки. Несмотря на изменения для функции CHANNEL_FOWARDING, управление переключением частоты Eachine ET526 с пульта так и не заработало. Во вкладке Motors видно, что данные должны меняться, но на выходе полетного контроллера их нет. Печаль...

02 февраля 2017

BetaFlight 3.1.3

Да что же такое-то, можно каждый день писать только про обновление прошивки BetaFlight:) Только вчера появилась версия 3.1.1, а сегодня уже вышла 3.1.2 и следом релиз BetaFlight 3.1.3!


Список изменений:
  • Исправлена ошибка в расчете, когда min_throttle может влиять на команду газа с пульта
  • Заменена старая, еще со времен multiwii, экспонента газа на новую версию с выполнением операций с плавающей точкой
  • Немного упрощены команды в командной строке
  • Уменьшены некоторые значения по умолчанию, такие как новый параметр anti_gravity_gain
  • Небольшие оптимизации в работе PID-контроллера
  • Исправления для Iterm новой опции anti_windup_gain axis
Что-то мне подсказывает, что скоро снова будет еще немного изменений...

01 февраля 2017

Гонки по FPV - близнецы встретились

Сегодня забрал у друга квадрик для обновления прошивки. Наконец-то близнецы из одинакового комплекта встретились!


Про их сборку рассказывал здесь, здесь, здесь и здесь. На обоих квадриках поднимал напряжение, чтобы на HUBOSD не пропадало видео, сделал возможность прошивать HUBOSD без программатора, обновил прошивку в регуляторах до BLHeli_S-16.65, обновил прошивку BetaFlight до версии 3.1.1 и синхронизировал настройки.


На днях обещали потепление до +8 градусов на несколько дней. Так что наконец-то выберемся полетать!

Кстати, у первого квадрика  до сих пор не заменен корпус у камеры. Камера была закреплена слабо и чуть ли не болталась. Я придумал, как ее зафиксировать. По два слоя толстого автомобильного скотча с каждой стороны в районе крепежных отверстий, затянул и все. Получилась очень надежная фиксация, сдвинуть можно с трудом!

В настройках BetaFlight решил попробовать поднять частоту работы до 4/4. До этого было 4/2. Попробую так полетать, посмотрю на стабильность. В общем, жду погоды...

BetaFlight 3.1.1

Сегодня появился корректирующий релиз прошивки BetaFlight 3.1.1 для полетных контроллеров гоночных квадриков.


Новые функции:
  • Для команды переназначения ресурсов больше не требуется сначала освобождать ресурс установкой опции NONE (теперь можно вставлять ваши настройки в командную строку)
  • Добавлена поддержка нового полетного контроллера KISS все-в-одном - KISSCC
  • Добавлено больше опций настройки и предупреждений в OSD
  • Добавлена IBUS-телеметрия
  • Добавлен вывод данных BlackBox через OSD (CMS)
  • Добавлено управление видео-передатчиком через MSP
Исправления:
  • Улучшена обработка Iterm при порывах ветра
  • Исправлен вывод команды diff с новыми параметрами OSD
  • Упрощение командной строки у полетных контроллеров на F1- и F3-процессорах для увеличения объема доступной памяти
  • Исправления для полетного контроллера REVONANO
  • Небольшие оптимизации кода прошивки
  • Улучшена конфигурация по умолчанию (увеличено значение по умолчанию для Idle Offset и нового параметра для борьбы с порывами ветра)
  • Исправлено переключение режимов OSD
  • Исправлено переопределение моторов для RCExplorer
  • Исправлена ошибка при загрузке с неправильным переопределением ресурсов
А проблему с пробросом канала с приемника на выход полетного контроллера так и не исправили...

OrangeRX USB Wireless Dongle - беспроводной USB-свисток для симулятора

Давно интересуюсь темой беспроводного подключения передатчика к симулятору. Сегодня расскажу об еще одной попытке приспособить для этого промышленный продукт. Речь пойдет о беспроводном USD-свистке от OrangeRX.


USB-свисток выпускается в двух вариантах: с протоколом DSM2/DSMX и с протоколом FrSky. У меня первый вариант. Для него есть небольшое руководство на английском.

С привязкой USB-свистка к передатчику никаких проблем не возникло. В пульте DEVO-10 с прошивкой Deviation выставил протокол DSMX, 10 каналов. Если выставить меньшее количество каналов, то не все оси будут работать! На USB-свистке зажал кнопку сбоку и вставил его в USB-разъем. В пульте нажал Bind и все. USB-свисток завелся сразу и без проблем. Даже если его выдернуть из USB-разъема, то привязка к передатчику сохранится.


В компьютере USB-свисток определяется как восьми-осевой джойстик без кнопок с названием "Cypress USB dsmx HID". При первом подключении насторожило полное отсутствие дребезга в около-нулевой зоне. Провел калибровку и оказался в полном недоумении. Мертвая зона была порядка 8% хода стика в каждую сторону! Целый вечер сидел и в настройках пульта вырезал эту огромную мертвую зону. А проблема-то была совсем в другом. Мертвая зона образовалась в процессе калибровки. Когда в настройках джойстика руками выставил нормальные значения, то мертвая зона исчезла, но и дребезг не появился! Когда стики находятся по центру и откалиброваны в пульте, то джойстик показывает нулевые значения по осям.


Экспериментальным путем выяснил, что джойстик имеет 168 шагов на каждую ось. Вроде бы маловато, но в симуляторе это не ощущается. Модель управляется гладко и точно, без ступенек.

Для настройки джойстика в Ubuntu потребуются две программы: joystick и jstest-gtk. Обе устанавливаются одной командой:

# sudo apt-get install joystick jstest-gtk

Затем в jstest-gtk делаются настройки, как на скриншоте выше, и результат сохраняется командой:

# sudo jscal-store /dev/input/js0

При следующем подключении USB-свистка данные калибровки автоматически подтянутся.

В Windows получилась примерно такая же картина. USB-свисток откалибровался без мертвой зоны. Все каналы работали. Никакие драйвера не потребовались.


USB-свисток проверил в симуляторах Heli-X, FPVFreeRider и LiftOff на системе Ubuntu. В Heli-X заработало все сразу и без проблем. С FPVFreeRider и LiftOff USB-свисток не заработал. Стал искать причину. Как оказалось, на симуляторах, созданных с помощью платформы Unity3D, кривовато определяется наличие джойстика в системе, по крайней мере в Ubuntu. На Windows не удалось проверить, но в руководстве написано, что там все должно работать без проблем.

Решение проблемы в Ubuntu придумал практически сразу, благо в наличии был старый USD-свисток, с которым работали все симуляторы. Вот как старый USB-свисток видится в системе:

# udevadm info /dev/input/js0
P: /devices/pci0000:00/0000:00:14.0/usb3/3-13/3-13.4/3-13.4:1.0/0003:06F7:0003.0024/input/input53/js0
N: input/js0
S: input/by-id/usb-WAILLY_PPM-joystick
S: input/by-path/pci-0000:00:14.0-usb-0:13.4:1.0-joystick
E: DEVLINKS=/dev/input/by-id/usb-WAILLY_PPM-joystick /dev/input/by-path/pci-0000:00:14.0-usb-0:13.4:1.0-joystick
E: DEVNAME=/dev/input/js0
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-13/3-13.4/3-13.4:1.0/0003:06F7:0003.0024/input/input53/js0
E: ID_BUS=usb
E: ID_FOR_SEAT=input-pci-0000_00_14_0-usb-0_13_4_1_0
E: ID_INPUT=1
E: ID_INPUT_JOYSTICK=1
E: ID_MODEL=PPM
E: ID_MODEL_ENC=PPM
E: ID_MODEL_ID=0003
E: ID_PATH=pci-0000:00:14.0-usb-0:13.4:1.0
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_13_4_1_0
E: ID_REVISION=0107
E: ID_SERIAL=WAILLY_PPM
E: ID_TYPE=hid
E: ID_USB_DRIVER=usbhid
E: ID_USB_INTERFACES=:030000:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=WAILLY
E: ID_VENDOR_ENC=WAILLY
E: ID_VENDOR_ID=06f7
E: MAJOR=13
E: MINOR=0
E: SUBSYSTEM=input
E: TAGS=:seat:uaccess:
E: USEC_INITIALIZED=945499616162

Старый USB-свисток явно определяется как джойстик и симуляторы его подхватывают. А вот как выглядит в системе USD-свисток от OrangeRX:

# udevadm info /dev/input/js0
P: /devices/pci0000:00/0000:00:14.0/usb3/3-13/3-13.4/3-13.4:1.0/0003:0451:16A5.0025/input/input54/js0
N: input/js0
E: DEVNAME=/dev/input/js0
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-13/3-13.4/3-13.4:1.0/0003:0451:16A5.0025/input/input54/js0
E: ID_BUS=usb
E: ID_INPUT=1
E: ID_INPUT_ACCELEROMETER=1
E: ID_MODEL=USB_dsmX_HID
E: ID_MODEL_ENC=USB\x20dsmX\x20HID
E: ID_MODEL_ID=16a5
E: ID_PATH=pci-0000:00:14.0-usb-0:13.4:1.0
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_13_4_1_0
E: ID_REVISION=0100
E: ID_SERIAL=Cypress_USB_dsmX_HID
E: ID_TYPE=hid
E: ID_USB_DRIVER=usbhid
E: ID_USB_INTERFACES=:030000:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=Cypress
E: ID_VENDOR_ENC=Cypress
E: ID_VENDOR_ID=0451
E: MAJOR=13
E: MINOR=0
E: SUBSYSTEM=input
E: USEC_INITIALIZED=945649611930

Ничего себе, определяется, как набор акселерометров! Да, инженеры из OrangeRX еще те шутники:) И никакого намека на то, что это много-осевой джойстик. Вот поэтому симуляторы и не подхватывают этот USB-свисток. Пришлось убедить систему, что перед ней все таки джойстик, а не набор акселерометров. Это можно сделать через простое правило для подсистемы udev. Следующие две команды создают такое правило и применяют его к системе:

# sudo echo 'SUBSYSTEM=="input", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="16a5", ENV{ID_INPUT_ACCELEROMETER}="0", ENV{ID_INPUT_JOYSTICK}="1"' >/etc/udev/rules.d/52-input-joystick.rules
# sudo udevadm control -R

Теперь снова проверим, как USD-свисток от OrangeRX видится в системе:

# udevadm info /dev/input/js0
P: /devices/pci0000:00/0000:00:14.0/usb3/3-13/3-13.4/3-13.4:1.0/0003:0451:16A5.0026/input/input55/js0
N: input/js0
S: input/by-id/usb-Cypress_USB_dsmX_HID-joystick
S: input/by-path/pci-0000:00:14.0-usb-0:13.4:1.0-joystick
E: DEVLINKS=/dev/input/by-id/usb-Cypress_USB_dsmX_HID-joystick /dev/input/by-path/pci-0000:00:14.0-usb-0:13.4:1.0-joystick
E: DEVNAME=/dev/input/js0
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-13/3-13.4/3-13.4:1.0/0003:0451:16A5.0026/input/input55/js0
E: ID_BUS=usb
E: ID_FOR_SEAT=input-pci-0000_00_14_0-usb-0_13_4_1_0
E: ID_INPUT=1
E: ID_INPUT_ACCELEROMETER=0
E: ID_INPUT_JOYSTICK=1
E: ID_MODEL=USB_dsmX_HID
E: ID_MODEL_ENC=USB\x20dsmX\x20HID
E: ID_MODEL_ID=16a5
E: ID_PATH=pci-0000:00:14.0-usb-0:13.4:1.0
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_13_4_1_0
E: ID_REVISION=0100
E: ID_SERIAL=Cypress_USB_dsmX_HID
E: ID_TYPE=hid
E: ID_USB_DRIVER=usbhid
E: ID_USB_INTERFACES=:030000:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=Cypress
E: ID_VENDOR_ENC=Cypress
E: ID_VENDOR_ID=0451
E: MAJOR=13
E: MINOR=0
E: SUBSYSTEM=input
E: TAGS=:seat:uaccess:
E: USEC_INITIALIZED=946869574054

Ну вот, совсем другое дело! Теперь, вместо набора акселерометров, этот USB-свисток стал определяться как джойстик. После этой простой процедуры без проблем заработали симуляторы FPVFreeRider и LiftOffUSD-свисток от OrangeRX в них видится, калибруется и работает.

Здесь приведу свою конфигурацию для передатчика DEVO-10 с прошивкой Deviation. На тумблере RUDD D/R находится режим для калибровки джойстика, когда каналы ниже четвертого управляются с крутилок AUX4 и AUX5. Остальное можно переназначить на свой вкус.

Данный USD-свисток от OrangeRX понравился больше, чем старый. Пока что полетаю с ним. Извиняюсь за большое количество текста, многим оно будет не очень интересно. Но мне хотелось во всем разобраться и рассказать об этом, как можно подробнее. Удачных тренировок!