Подключение игрового USB руля или геймпада

Материал из virt2real wiki
Перейти к: навигация, поиск

Содержание

Общая информация

Геймпад/джойстик

Практически всё аналогично работе с 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 для различных рулей


Наглядное видео с рулём