Подключение игрового USB руля или геймпада
Содержание |
Общая информация
Геймпад/джойстик
Практически всё аналогично работе с USB рулём, только не требуется перевод в нативный режим.
Руль
Далее следует описание работы с USB рулями на примере руля Logitech Drive Force GT.
Подключение
Подключение производится путём втыкания провода питания руля в розетку 220В, а шнура с разъёмом USB - в разъём micro-USB Виртурилки через USB-OTG переходник.
Для большинства рулей Logitech драйвер уже есть в составе прошивки Виртурилки, так что после подключения в консоли должны появиться примерно такие сообщения:
[root@virt2real ~]# usb 1-1: new full-speed USB device number 2 using musb-hdrc usb 1-1: New USB device found, idVendor=046d, idProduct=c294 usb 1-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0 usb 1-1: Product: Driving Force GT input: Driving Force GT as /devices/platform/musb-davinci/musb-hdrc.0.auto/usb1/1-1/1-1:1.0/input/input0 logitech 0003:046D:C294.0001: input: USB HID v1.00 Joystick [Driving Force GT] on usb-musb-hdrc.0.auto-1/input0 logitech 0003:046D:C294.0001: Force feedback support for Logitech Gaming Wheels
После этого в каталоге /dev/input появятся управляющие файлы устройства,
# ls /dev/input by-id/ by-path/ event0 js0
Файлы event0 и js0 и есть управляющие файлы для нашего руля. В подкаталогах by-id и by-path содержатся символьные ссылки на управляющие файлы для облегчения ориентирования (в случае подключения сразу нескольких девайсов).
Переключение режимов
Изначально все игровые USB работают в стандартном режиме (это сделано для совместимости различных игровых устройств). В этом режиме руль (независимо от своей крутизны) может крутиться максимум на один оборот (на пол-оборота влево-вправо от нейтрали). Если техническое устройство руля позволяет вращение на несколько оборотов, необходимо перевести руль в нативный режим. Помимо угла поворота, в стандартном режиме доступны не все кнопки, имеющиеся на руле. Для полноценного доступа ко всем кнопкам надо, опять же, переводить руль в нативный режим.
Например, привод моего тестового руля Logitech Driving Force GT позволяет рулю поворачиваться на 900 градусов, но только в нативном режиме. Чтобы переключить режим - надо воспользоваться утилитой LTWheelConf. Описание утилиты и метод установки на Виртурилку см. в конце текста.
Для переключения руля в нативный режим в консоли Виртурики вводим команду
ltwheelconf --wheel DFGT --nativemode
В консоли появятся сообщения наподобие таких
usb 1-1: USB disconnect, device number 4 usb 1-1: new full-speed USB device number 5 using musb-hdrc usb 1-1: New USB device found, idVendor=046d, idProduct=c29a usb 1-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0 usb 1-1: Product: Driving Force GT input: Driving Force GT as /devices/platform/musb-davinci/musb-hdrc.0.auto/usb1/1-1/1-1:1.0/input/input3 logitech 0003:046D:C29A.0004: input,hidraw0: USB HID v1.11 Joystick [Driving Force GT] on usb-musb-hdrc.0.auto-1/input0 logitech 0003:046D:C29A.0004: Force feedback support for Logitech Gaming Wheels
Всё, руль в нативнов режиме и может крутиться на много оборотов.
Для переключения в обычный режим можно отключить-подключить руль к порту USB или (если руль в нативном режиме) дать команду Reset драйверу.
ltwheelconf --wheel DFGT --reset
Установка автонейтрали
По дефолту, руль не сопротивляется вращению и не автоцентруется. Автоцентровку и силу обратной связи можно задать утилитой ffset из пакета linuxconsoleutils. Подробнее про установку пакета и про использование команд см. в конце текста.
Установим руль в центральное положение и зададим силу обратной связи 30%
ffset -a 30
Руль должен прокрутиться нужное количество оборотов и установиться в центральное положение. При попытке отклонить руль - он будет слегка сопротивляться.
Мониторинг состояния
Запустить опрос состояния руля можно командой evtest (из пакета input-tools) или её двойником - командой jstest из пакета linuxconsoletools
# jstest --normal /dev/input/js0 Driver version is 2.1.0. Joystick (Driving Force GT) has 4 axes (X, Y, Hat0X, Hat0Y) and 12 buttons (Trigger, ThumbBtn, ThumbBtn2, TopBtn, TopBtn2, PinkieBtn, BaseBtn, BaseBtn2, BaseBtn3, BaseBtn4, BaseBtn5, BaseBtn6). Testing ... (interrupt to exit)
Вместо --normal можно указать --event, тогда будут отображаться сообщения о изменениях осей. В общем, тут много вариантов, пробуйте.
Для проверки обратной связи можно запустить утилиту fftest из пакета linuxconsoletools или утилиту ffcfstress из того же пакета.
Дополнительные утилиты и софт
Утилита переключения режимов для рулей Logitech
LTWheelConf http://github.com/TripleSpeeder/LTWheelConf
Имеется в составе Virt2real SDK. Установить на Виртурилку можно из пакетов
opkg-cl update opkg-cl install ltwheelconf
Для получения информации о возможных ключах запуска надо запустить утилиту ltwheelconf без указания параметров
ltwheelconf 0.2.7 - Configure Logitech Driving Force Pro, G25, G27 wheels ltwheelconf Copyright (C) 2011 Michael Bauer This program comes with ABSOLUTELY NO WARRANTY. General Options: -h, --help This help text -v, --verbose Verbose output Use -vv to get debug messages from libusb -l, --list List all found/supported devices Wheel configuration: -w, --wheel=shortname Which wheel is connected. Supported values: -> 'DF' (Driving Force) -> 'MR' (Momo Racing) -> 'MF' (Momo Force) -> 'DFP' (Driving Force Pro) -> 'DFGT' (Driving Force GT) -> 'G25' (G25) -> 'G27' (G27) -n, --nativemode Set wheel to native mode (separate axes, full wheel range, clutch pedal, H-shifter) -x, --reset Reset the wheel. This is basically the same like unplugging & replugging it. Note: -> Requires wheel to be in native (-n) mode! -r, --range=degrees Set wheel rotation range (up to 900 degrees). Note: -> Requires wheel to be in native (-n) mode! -a, --autocenter=value Set autocenter bypassing hid driver. Value should be between 0 and 255 (0 -> no autocenter, 255 -> max autocenter force). Together with the rampspeed setting this allows much finer control of the autocenter behaviour as using the generic input interface. Note: -> Requires parameter '--rampspeed' -s, --rampspeed Use in conjuntion with the --autocenter parameter. Specify how fast the autocenter force should increase when rotating wheel. Value should be between 0 and 7 Low value means the centering force is increasing only slightly when turning the wheel. High value means the centering force is increasing very fast when turning the wheel. -b, --altautocenter=value Set autocenter force using generic input interface. Value should be between 0 and 100 (0 -> no autocenter, 100 -> max autocenter force). Use this if --autocenter does not work for your device. Note: -> Requires parameter '--device' to specify the input device -> Only works with kernel >= 2.6.39 -> The rampspeed can not be influenced using this method -g, --gain=value Set forcefeedback gain. Value should be between 0 and 100 (0 -> no gain, 100 -> max gain). Note: -> Requires parameter '--device' to specify the input device -d, --device=inputdevice Specify inputdevice for force-feedback related configuration (--gain and --altautocenter) Note: You can freely combine all configuration options. Examples: Put wheel into native mode: $ sudo ltwheelconf --wheel G25 --nativemode Set wheel rotation range to 900 degree: $ sudo ltwheelconf --wheel G27 --range 900 Set moderate autocenter: $ sudo ltwheelconf --wheel DFP --autocenter 100 --rampspeed 1 Disable autocenter completely: $ sudo ltwheelconf --wheel G25 --autocenter 0 --rampspeed 0 Set native mode, disable autocenter and set wheel rotation range of 540 degrees in one call: $ sudo ltwheelconf --wheel G25 --nativemode --range 540 --autocenter 0 --rampspeed 0 Contact: michael@m-bauer.org
Например, для руля Logitech Driving Force GT
ltwheelconf --wheel DFGT --nativemode
Утилиты linuxconsoletools
Установить утилиты
opkg-cl update opkg-cl install linuxconsoleutils
ffcfstress
ffset
fftest
jscal
jstest
Программный доступ
С
Пример, сделаный на базе jstest. Читает события джойстика/руля. Если задан порт - подключается к серверу host:port и отправляет туда все события руля или джойстика.
Приложение примерно, использовалось в реальных некоторых проектах, но к универсальному виду так и не приведено - обычно модифицируется под команды конкретного руля или джойстика.
https://github.com/virt2real/othersoft/tree/master/joystick
Формат запуска:
# ./joyevents Usage: -d /dev/input/eventX -h <host> -p <port> -v -d <devicename> Joystick event device name -h <host> Command server host -p <port> Command server port -v Verbose joystick output
параметр | пример | назначение |
---|---|---|
d <devicename> | -d /dev/input/event0 | файл событий устройства джойстик/руль |
h <host> | -h localhost | хост сервера, на который надо отправлять координаты джойстика/руля |
p <port> | -p 2222 | порт сервера, на который отправлять координаты |
v | -v | отображать локально все события джойстика/руля |
NodeJS
Можно использовать библиотеку https://github.com/JayBeavers/node-joystick
Однако при не самом быстром процессоре, который стоит на Виртурилке, чтение джойстика/руля из скрипта на NodeJS не самый удачный выбор, т.к. сильно загружает процессор.
Если всё же требуется использование именно NodeJS - лучше использовать связку - программа на С (см. выше), которая отправляет состояние джойстика/руля в NodeJS через сокет (в идеале - вообще через UDP).
Дополнительные ссылки
Примеры настройки утилиты LTWheelConf для различных рулей