Герой сегодняшней статьи - РУД (Ручка Управления Двигателем) от Thrustmaster HOTAS Cougar.
Так почему же наш герой нуждается во второй жизни? Ответ прост. Он привязан к основному джойстик кабелем, будто сиамский близнец. Его нельзя подключить к компьютеру напрямую, поэтому любое его использование подразумевает, что комплект будет использоваться целиком. Учитывая плачевное состояние базы в стоке, а также того факта, что я буду мигрировать героя прошлых статей в базу от Thrustmaster Warthog, вполне оправдано желание сделать РУД самостоятельным девайсом. Этим мы сегодня с вами и займёмся.
Железо
Для данного проекта нам понадобится:
- Микроконтроллер с аппаратной поддержкой USB. Наиболее простой вариант - контроллер на чипе ATMEGA 32U4. Я остановился на Pro Micro аналоге от Amperkot c Type-C разъёмом. На момент написания статьи найти можно здесь.
Вполне очевидно, что нам понадобиться паяльник с паяльными расходниками вроде флюса и припоя, бокорезы для резки и зачистки проводов и опционально, прямые руки (подозреваю, что с ними выйдет лучше и быстрее). Как вариант, можно купить джамперы, микроконтроллер с припаянной гребёнкой и обойтись вообще без пайки.
Начинаем с разборки базы РУДа. откручиваем восемь болтов на основании и снимаем крышку.
Видим кабель, которые присоединяется к плате и выходит наружу. Помяну добрым словом конструкторов, что вывели все интересующие нас разъёмы на 16-контактную гребёнку. Помянём их ещё более добрым словом, так как вывели они контакты по порядку.
| 1 | 2 |
| 3 | 4 |
| 5 | 6 |
| 7 | 8 |
| 9 | 10 |
| 11 | 12 |
| 13 | 14 |
| 15 | X |
С подключением мне так же очень сильно помогла данная схема, так же найденная на просторах интернета.
Как же в итоге работает РУД?
- Пин № 1 - это пин для подключения высокого уровня. Подключаем к пинам VCC или 5V на микроконтроллере.
- Пины №№ 5 и 15 - низкий уровень, или земля. Подключаем к пинам GND на микроконтроллере.
- Пины №№ 10, 11, 12, 13, 14 - на эти пины выводится информация об осях на РУДе. 10 и 11 - оси курсора X и Y, 12 - нижний энкодер ANT, управляющий углом места РЛС, 13 - верхний энкодер MAN, позволяющий вводить базу цели при использовании ВПУ, либо управлять масштабом прицельного контейнера, 14 - положение рычага тяги.
Оставшиеся пины образуют матрицу. В нормальном положении кнопки подтягиваются к плюсу (VCC микроконтроллера). Подавая на один из пинов в строке (2, 3 и 4) логический ноль, а на оставшиеся - логическую единицу, мы сможем считать в этот момент нажата ли кнопка, относящаяся к пину в этой строке и колонке (пины колонн - 6, 7, 8, 9).
К примеру, если мы хотим считать положение кнопки T3, нам нужно выставить логический ноль на пине 2, выставить логическую единицу на пинах 3 и 4, после чего считать информацию с 7 пина. 1 - означает, что кнопка не нажата, а 0 - что нажата. Для T8 порядок действий тот же, за исключением того, что мы подаём логический ноль на пин 3 вместо 2 (считываем значение так же с пина 7).
Подключение
Безжалостно режем провода у основания кабеля. Как вариант, можно купить джамперы, и оставить базовый кабель в живых (если он вам по какой-то причине нужен). В описании контролера Pro Micro на сайте Amperkot написано, что на нём 4 пина с аналоговым входом-выходом, которые мы будем использовать для подключения наших осей. Не верьте этому, пинов с цифро-аналоговым преобразователем там целых 9 штук
Я подключал контакты следующим образом:
- 1 контакт на гребёнке => VCC
- 2 контакт на гребёнке => 2
- 3 контакт на гребёнке => 3
- 4 контакт на гребёнке => 4
- 5 контакт на гребёнке => GND
- 6 контакт на гребёнке => 6
- 7 контакт на гребёнке => 7
- 8 контакт на гребёнке => 8
- 9 контакт на гребёнке => 9
- 10 контакт на гребёнке => A1
- 11 контакт на гребёнке => A2
- 12 контакт на гребёнке => A3
- 13 контакт на гребёнке => 10
- 14 контакт на гребёнке => A0
- 15 контакт на гребёнке => GND
После этого устанавливаем микроконтроллер в корпусе, хотя бы на двусторонний скотч, подключаем провод к микроконтроллеру и идём писать софт, чтобы микроконтроллер мог понять, что мы от него хотим.
Софт
Я использовал для написания кода среду разработки Platformio под VSCode, но поскольку большинству будет проще загрузить скетч под Arduino IDE - портирую скрипт и под него. Полагаю, что вы сможете загрузить прошивку самостоятельно. Найти можно как версию под platformio, так и скетч под Arduino IDE.
Вкратце, что делает наш микроконтроллер.
Каждую итерацию он пробегает по всем наших контактам и считывает с них значения. Однако использовать сырые данные для осей невозможно, их нужно обработать:
- Первым делом - переопределить диапазон там, где он нужен. Может случиться, что энкодер не будет доходить до минимального и максимального значения, и мы будем получать не 0 и 1024, а 120 и 780. Команда map занимается тем, что модифицирует входное значение так, чтобы оно было 0 на минимальной позиции и 1024 на максимальной
- Следующее что нам нужно это отфильтровать шум с осей. Я использовал для этого фильтр экспоненциальное бегущее среднее с адаптивным коэффициентом, взятый мной с сайта AlexGyver.
- и наконец, передать эти данные по USB.
В коде довольно много констант для ручной настройки под конкретный РУД. Отдельно стоит упомянуть throttle_deadzone. Это позиция, соответствующая режиму Military, то есть максимальная тяга без форсажа.
Заключение
Остались небольшие штрихи. Нужно выфрезеровать разъём под USB-B, установить его и тем самым унифицировать данный девайс с моим остальным сетапом. Кроме того, есть мысли кардинально переделать девайс, сделать большую длину рычага и возможность аутентично, с наклоном, перемещать ручку между позициями Cutoff <> Idle, а также на форсаж.
Ключевые слова
- Thrustmaster Cougar Throttle USB
- Thrustmaster Cougar Throttle USB Standalone