Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Беспроводной геймпад dualshock 3 как геймпад от xbox.  (Прочитано 11580 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн altwazar

  • Автор темы
  • Активист
  • *
  • Сообщений: 375
    • Просмотр профиля
С появлением стима под линукс вопрос о поддержке геймпадов стал только актуальнее. Настроить контроллер можно в режиме big picture, но к сожалению некоторые игры отказываются работать с отличными от xbox 360 геймпадами. Здесь я опишу способ использования dualshock 3 по блютусу в качестве контроллера от иксбокса, может кому пригодится.

Пробовал под ubuntu 13.10.
Блютус адаптер: Asus usb-bt211. Проверенный донгл для подключения гейпадов от ps3. Пойдет любой адаптер, за редкими исключениями.
sixad — демон из  менеджера джойстиков qtsixa, нужен для подключения по блютусу. Ставил из ppa:falk-t-j/qtsixa по гайду https://help.ubuntu.com/community/Sixaxis.
xboxdrv — продвинутый драйвер для геймпадов xbox. Использовал для имитации родного контроллера.

1. Подключение dualshock 3 по блютусу:

Добавление ppa:
sudo apt-add-repository ppa:falk-t-j/qtsixa

Установка sixad:
sudo apt-get update
sudo apt-get install sixad

Что бы связать адаптер с геймпадом оба должны быть подключены по usb:
sudo sixpair

Если все пройдет удачным, вывод команды будет подобный этому:
Current Bluetooth master: xx:xx:xx:xx:xx:xx
Setting master bd_addr to xx:xx:xx:xx:xx:xx
После этого можно отключить dualshock от usb, с запущенным sixad его теперь можно использовать без провода.
Запуск sixad:
sudo service sixad start
Геймпад подключается нажатием кнопки PS по центру. Мигают индикаторы — идет поиск и подключение. Когда контроллер будет готов к использованию он провибрирует и будет гореть только одна лампочка. Отключить его можно зажав кнопку PS пока не погаснет индикатор.

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

2. Дуалшок как xbox-пад.
Для этого потребуется xboxdrv:
sudo apt-get install xboxdrv
Он поддерживает из коробки не только с геймпады от микрософта, но и множество других. Dualshock 3 по usb можно использовать с ним и без sixad, достаточно запустить xboxdrv с параметром --mimic-xpad.
Так же его можно использовать с любым /dev/input/event устройством, нужно только задать необходимые привязки. Мои настройки для подключенного по блютусу через sixad дуалшока:
ds3.xboxdrv:
# Playstation 3 Wireless Controller (sixad)
# ========================

[xboxdrv]
# Using the 'by-id' name is recomment, as it is static, while an
# /dev/input/eventX name can change depending on what other USB
# devices you use.
#evdev = /dev/input/event10

# This displays events received from the controller, if you are
# working on a configuration you want to set this to true:
#evdev-debug = true

# Grabbing the device prevents other applications from accessing it,
# this is needed most of the time te prevent applications from
# receiving events twice.
evdev-grab = true

[evdev-absmap]
ABS_X = X1
ABS_Y = Y1

ABS_Z = X2
ABS_RX = Y2

ABS_#12 = LT
ABS_#13 = RT

[evdev-keymap]
BTN_TL = LT
BTN_TR = RT
BTN_DEAD = X
KEY_#300 = Y
KEY_#302 = A
KEY_#301 = B

BTN_BASE5 = LB
BTN_BASE6 = RB

BTN_THUMB = TL
BTN_THUMB2 = TR

BTN_TOP = start

BTN_TRIGGER = back

BTN_A = guide

BTN_TOP2    = du
BTN_PINKIE  = dr
BTN_BASE    = dd
BTN_BASE2   = dl

[axismap]
-Y1=Y1
-Y2=Y2

[calibration]
LT=0:127:255
RT=0:127:255


Теперь после запуска xboxdrv --detach-kernel-driver --mimic-xpad --evdev /dev/input/event_НОМЕР_ДУАЛШОКА --silent --config ПУТЬ_К_ФАЙЛУ_КОНФИГУРАЦИИ в системе появится новый геймпад, идентичный проводному джойстику от xboxa. Но есть две проблемы: игры видят два гейпада и иксбоксовский идет вторым, после перезапуска устройство может иметь другое имя.

Не придумал грамотного способа справиться с этим через правила udev, пользуюсь пока таким:
1. Создал правило /etc/udev/rules.d/99-dualshock3.rules
ENV{ID_INPUT_JOYSTICK}=="1", KERNEL=="event*", MODE="0660", SYMLINK+="input/by-id/noname-event%n"
ENV{ID_INPUT_JOYSTICK}=="1", KERNEL=="js*", MODE="0664", SYMLINK+="input/by-id/noname-js%n"
Таким образом при подключении геймпадов получаю симлинки вида /dev/input/by-id/noname-event* и /dev/input/by-id/noname-js*, которые затем использую в скрипте.
Все файлы находятся в одной директории: ds3.xboxdrv (файл с настройками, содержимое выше), emulatexbox.sh (все подключенные джойстики замещаются иксбоксовским вариантом), killxbox.sh (возвращает все назад).
emulatexbox.sh
#!/bin/bash
cd "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
for i in /dev/input/by-id/noname*
do
        chmod go-rw $i
done
for i in /dev/input/by-id/noname-event*
do
        xboxdrv --detach-kernel-driver --mimic-xpad --evdev $i --silent --config ./ds3.xboxdrv&
done
killxbox.sh
#!/bin/bash
cd "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
killall -s KILL xboxdrv
for i in /dev/input/by-id/noname-js*
do
        chmod g+rw $i
        chmod o+r $i
done
for i in /dev/input/by-id/noname-event*
do
        chmod g+rw $i
done

Нужны права рута. Меняют атрибуты доступа к файлам, что бы отключить не нужные геймпады.

Работает в проблемных играх: bastion, trine 2 (с тремя геймпадами), bit trip runner 2, brutal legend, mark of the ninja, teleglitch: die more edition (см. ниже).
Bastion - в игре нельзя выбрать нужный контроллер. Если подключен еще один джойстик, то могут возникнуть проблемы.
Teleglitch: die more edition - по умолчанию не совместим с иксбоксовским геймпадом. Для работы xboxdrv нужно запустить без параметра --mimic-xpad, но добавить --dpad-as-button. Управление в big picture в этом случае будет кривое.


Не работает в играх:
Steel Storm: Burning Retribution - поддерживает геймпад xbox только под windows, во время портирования под линуксом поддержку геймпада делали под Logitech Rumblepad2 (ссылка). Возможно работает и с другими геймпадами от logitech, игра крашится с несовместимыми контроллерами.

Метод костыльный, но красивый вариант пока не придумал. Может кто поделится своим опытом?
« Последнее редактирование: 17 Январь 2014, 21:59:08 от altwazar »

Оффлайн tinitun

  • Любитель
  • *
  • Сообщений: 70
    • Просмотр профиля
 altwazar вопрос как заставить работать Mad Head MH-8001 usb в ubuntu, в винде у меня во всех играх работало через x360ce(XBOX 360 Controller emulator) в ubuntu не нашел такого. Можно ли заставить работать в ubuntu геймпад в играх не через qjoypad.

Оффлайн altwazar

  • Автор темы
  • Активист
  • *
  • Сообщений: 375
    • Просмотр профиля
У меня нет Mad Head MH-8001, но если он определяется системой и работает эмуляция через qjoypad, то метод в моем посте тоже должен работать (только sixad ему не нужен).
По хорошему он должен определяться стимом из коробки. Можно запустить режим big picture в настройках найти конфигурацию геймпада. Тогда он будет работать в играх на sdl в стиме.
Можно так же использовать стимовскую настройку в нестимовских sdl играх. После конфигурации в файле .steam/steam/config/config.vdf "SDL_GamepadBind", взять от туда значение и присвоить его переменной SDL_GAMECONTROLLERCONFIG. Выглядеть это будет так:
export SDL_GAMECONTROLLERCONFIG="030000004c0500006802000011010000,Sony PLAYSTATION(R)3 Controller,a:b14,b:b13,y:b12,x:b15,start:b3,guide:b16,back:b0,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpleft:b7,dpdown:b6,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b8,righttrigger:b9,"
Если игры работают только с контроллером от xbox, то придется повозиться. Эмуляцию можно сделать используя xboxdrv для устройства /dev/input/event*, которое должно появиться при подключении джойстика. У меня в посте есть содержимое файла ds3.xboxdrv, там задаются бинды моего джойстика к xboxовскому. С левой стороны параметр моего джойстика, с правой стороны соответствующий элемент управления контроллера xboxa. Посмотреть код клавиш своего геймпада можно через evtest или запустив:
xboxdrv --evdev --debug /dev/input/eventНОМЕРПосле этого уже править конфигурационный файл:

Раздел [evdev-absmap] - привязка осей.
X1,Y1 - левый стик, по вертикали и горизонтали.
X2,Y2 - правый стик, по вертикали и горизонтали.
LT, RT - левый и правый триггер (оси).
DPAD_X, DPAD_Y - крестовина, по горизонтали и вертикали. Тут есть одна особенность, нажатия на крестовину у xboxa передаются как оси с максимальным отклонением. Такую ересь делают только на xbox совместимых джойстиках, если на твоем джойстике нажатия на крестовину передается как нажатие на кнопку, тогда эти параметры указывать здесь не надо.

Раздел [evdev-keymap] - нажатия на клавиши
LT, RT - триггеры как кнопки.
X, Y, A, B - соответствующие кнопки на xboxовсовском геймпаде.
LB, RB - верхние боковые кнопки.
TL, TR - нажатие на стики.
start, back - соответствующие кнопки на xboxовсовском геймпаде.
guide - центральная кнопка с логотипом xbox.
du, dr, dd, dl - крестовина вверх, вправо, вниз, влево. Если назначить DPAD_X, DPAD_Y в первом разделе не получилось.

В разделе [axismap] у меня инвертированы вертикальные оси на стиках (-Y1=Y1), так как на моем геймпаде они идут в другом направлении.
В разделе [calibration] меняется минимальное, начальное и максимальное положение осей. На дуалшоке отпущенный тригер передает нулевое значение, на xbox контроллере обратное максимальному.

После этого запускать xboxdrv как у меня в гайде. Тот еще геморрой, возможно когда-нибудь напишут графическое приложение для настройки любого контроллера.
« Последнее редактирование: 17 Январь 2014, 12:35:28 от altwazar »

Оффлайн tinitun

  • Любитель
  • *
  • Сообщений: 70
    • Просмотр профиля
спасибо за ответ, буду пробовать.

Оффлайн Haron Prime

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 11313
  • Arch Linux & XMonad
    • Просмотр профиля
atom90,
Цитировать
2. На форуме ЗАПРЕЩЕНО
2.3.
Флудить и заниматься флеймом, а так же оставлять сообщения, не относящиеся к теме обсуждения.
сообщение удалено
+ 15%
sudo ls -a | grep brain > /dev/head

Оффлайн iaks

  • Участник
  • *
  • Сообщений: 217
    • Просмотр профиля
Вот блин, к Android джой приконнектился, а к лубунте никак.

Джой не оригинальный

Может есть еще какие методы беспроводного подключения этого зверя?

Пользователь решил продолжить мысль 17 Август 2014, 19:01:47:
По проводу все нормально работает
Lubuntu
Xubuntu

Оффлайн altwazar

  • Автор темы
  • Активист
  • *
  • Сообщений: 375
    • Просмотр профиля
Вот блин, к Android джой приконнектился, а к лубунте никак.

Не получилось подключить по блютусу с помощью sixad?

Оффлайн iaks

  • Участник
  • *
  • Сообщений: 217
    • Просмотр профиля
Да, при подключении через sixad светодиоды после отключения джойстика начинают быстро мигать, а потом все тухнут (((

Lubuntu
Xubuntu

Оффлайн altwazar

  • Автор темы
  • Активист
  • *
  • Сообщений: 375
    • Просмотр профиля
Возможно не работает с тем блютус адаптером, что у тебя.
На всякий случай надо проверить, прошел ли sixpair и запущен ли сервис sixad.

Оффлайн iaks

  • Участник
  • *
  • Сообщений: 217
    • Просмотр профиля
Возможно не работает с тем блютус адаптером, что у тебя.
На всякий случай надо проверить, прошел ли sixpair и запущен ли сервис sixad.

 Как это можно сделать?



Пользователь решил продолжить мысль [time]17 Август 2014, 20:31:56[/time]:
sudo sixpair

Выдает одинаковые мак-адреса


sudo service sixad start
 * Starting sixad 

Нажимаю кнопку PS с отключенным джоем -> светодиоды помигали и потухли все  :-\

Пользователь решил продолжить мысль 17 Август 2014, 20:42:12:
/dev/hidrawX  - отсутствует  это нормально?

« Последнее редактирование: 17 Август 2014, 20:42:12 от iaks »
Lubuntu
Xubuntu

Оффлайн altwazar

  • Автор темы
  • Активист
  • *
  • Сообщений: 375
    • Просмотр профиля
Нажимаю кнопку PS с отключенным джоем -> светодиоды помигали и потухли все  :-\
Он так поступает, когда не нашел к чему подключиться. Но в чем проблема тут я не знаю.

Оффлайн iaks

  • Участник
  • *
  • Сообщений: 217
    • Просмотр профиля
У меня вот вот это не работает:

(Нажмите, чтобы показать/скрыть)

когда в терминале вбиваю
sudo killall hcid hidd
Выдает
hcid: процесс не найден
hidd: процесс не найден

ввожу
hidd --server --nocheck -n
получаю
Can't listen on HID control channel: Permission denied

Из-за этого не работает джой?
Lubuntu
Xubuntu

 

Страница сгенерирована за 0.065 секунд. Запросов: 25.