miércoles, 2 de enero de 2013

Joystick de PS3 (Dualshock 3 / Sixaxis) por bluetooth en Debian GNU/Linux



Este artículo explica los pasos para configurar un mando de PS3 en Linux, permitiendo que funcione como ratón y mapeando ciertos botones del mando a eventos del teclado.

Conectado con el cable, el mando de la PS3 funciona directamente en Linux, sin hacer nada, pero para que funcione por bluetooth es necesario seguir unos pasos, ya que no sigue el estándar de dispositivos de entrada de Bluetooth.

Para que funcione correctamente vamos a usar el proyecto QtSixA.

No existen paquete para Debian, por lo que debemos compilar el fuente del proyecto con los siguientes comandos:

aptitude -r install bluetooth libusb-dev libbluetooth-dev pyqt4-dev-tools libjack-jackd2-dev pkg-config checkinstall build-essential
wget http://sourceforge.net/projects/qtsixa/files/QtSixA%201.5.1/QtSixA-1.5.1-src.tar.gz
tar xfvz QtSixA-1.5.1-src.tar.gz
cd QtSixA-1.5.1
make
mkdir -p /var/lib/sixad/profiles
checkinstall
update-rc.d sixad defaults
/etc/init.d/sixad start

Conectamos el mando con el cable USB y ejecutamos el siguiente comando:

sixpair

Si obtenemos un mensaje como el siguiente todo ha ido correctamente:

Current Bluetooth master: DE:AD:BE:EF:00:00
Setting master bd_addr to: 00:1F:81:00:06:20

Ahora podemos desconectar el cable USB y pulsar el botón "PS" del joystick.

Si se ha detectado correctamente, en el log del sistema (var/log/messages) aparecerán un par de líneas como las siguientes:

Jan 2 00:36:40 mipc kernel: [ 5598.272211] usb 2-1: USB disconnect, address 3
Jan 2 00:36:48 mipc kernel: [ 5605.974295] input: PLAYSTATION(R)3 Controller (00:23:45:0A:04:37) as /devices/virtual/input/input17

Para desconectar y apagar el mando, pulsar el botón "PS" del mando durante más de 12 segundos.

Para poder usar el joystick como ratón y mapear los botones con eventos del teclado hay varias opciones.
Podemos usar la misma aplicación QtSixA, que permite definir varios perfiles para distintos juegos o aplicaciones.
Otra opción en la misma línea es usar el proyecto QJoyPad.
Y otra opción es usar las opciones que nos ofrece el propio servidor X, que es la que se describe a continuación.

El primer paso será ejecutar lo siguiente:

aptitude -r install xserver-xorg-input-joystick

Y editamos el fichero "/usr/share/X11/xorg.conf.d/50-joystick.conf" añadiendo el siguiente contenido:

Option "MapButton1" "none" # Select
Option "MapButton2" "none" # Analog left button
Option "MapButton3" "none" # Analog right button
Option "MapButton4" "key=67" # Start (F1)

Option "MapButton5" "key=111" # Up (Up)
Option "MapButton6" "key=114" # Right (Right)
Option "MapButton7" "key=116" # Down (Down)
Option "MapButton8" "key=113" # Left (Left)

Option "MapButton9" "none" # R1
Option "MapButton10" "none" # R2
Option "MapButton11" "none" # L1
Option "MapButton12" "none" # L2

Option "MapButton13" "button=1" # Triangle (Mouse left click)
Option "MapButton14" "button=3" # Circle (Mouse right click)
Option "MapButton15" "key=36" # X (Return)
Option "MapButton16" "key=9" # Square (Escape)

Option "MapButton17" "none" # PS

Option "MapAxis1" "mode=relative axis=+1x deadzone=5000" # Analog left
Option "MapAxis2" "mode=relative axis=+1y deadzone=5000" # Analog left
Option "MapAxis3" "mode=relative axis=+1zx deadzone=5000" # Analog right
Option "MapAxis4" "mode=relative axis=+1zy deadzone=5000" # Analog right
Option "MapAxis5" "mode=none" # Motion sensor
Option "MapAxis6" "mode=none" # Motion sensor
Option "MapAxis7" "mode=none" # Motion sensor

Para ver los códigos que aplican a cada tecla ejecutamos el siguiente comando:

xmodmap -pk

Ahora debemos reiniciar el servidor X y ya tenemos configurado el mando.

Bibliografia:

http://qtsixa.sourceforge.net/
http://www.pabr.org/sixlinux/sixlinux.en.html
http://www.raspians.com/Knowledgebase/ps3-dualshock-controller-install-on-the-raspberry-pi/
http://www.x.org/archive/X11R7.5/doc/man/man4/joystick.4.html
http://qjoypad.sourceforge.net/

--

4 comentarios:


  1. Para que aparezca minimizada la interfaz:

    https://bugs.launchpad.net/qtsixa/+bug/1046153

    ResponderEliminar
  2. En Debian Jessie se puede configurar el joystick de PS3 sin usar ningún software externo a los repositorios oficiales.
    Primero hay que instalar los paquetes bluez y bluedevil (en el caso de KDE, para Gnome creo que es bluemon).
    Entrar en la sesión de un usuario conectamos el mando con el cable al ordenador. Y en el syslog deben aparecer las trazas de detección del mando, finalizando con unas líneas con el texto sixpair.
    Desconectamos el mando y le damos al botón de encender el joystick. Nos aparecerá un mensaje en el icono de bluetooth de la bandeja del escritorio pidiendo autorización para conectarse. Emparejamos y ya funciona el mando en modo joystick.

    Suerte!!

    ResponderEliminar
  3. Añado el fichero de configuración para XBMC.
    Se debe guardar un fichero "~/.xbmc/userdata/keymaps/joystick.PS3.xml" con el siguiente texto:

    <?xml version="1.0" encoding="UTF-8"?>
    <keymap>
    <global>
    <joystick name="PLAYSTATION(R)3 Controller">
    <button id="1">Info</button> <!-- Select -->
    <button id="2">ContextMenu</button> <!-- L3 -->
    <button id="3">CodecInfo</button> <!-- R3 -->
    <button id="4">Play</button> <!-- Start -->
    <button id="5">Up</button> <!-- D-Pad Up -->
    <button id="6">Right</button> <!-- D-Pad Right -->
    <button id="7">Down</button> <!-- D-Pad Down -->
    <button id="8">Left</button> <!-- D-Pad Left -->
    <button id="9">SkipPrevious</button> <!-- L2 -->
    <button id="10">SkipNext</button> <!-- R2 -->
    <button id="11">Rewind</button> <!-- L1 -->
    <button id="12">FastForward</button> <!-- R1 -->
    <button id="13">ParentDir</button> <!-- Triangle -->
    <button id="14">Back</button> <!-- Circle -->
    <button id="15">Select</button> <!-- X -->
    <button id="16">OSD</button> <!-- Square -->
    </joystick>
    </global>
    </keymap>

    --

    ResponderEliminar
  4. Debian 10:

    $ cat /usr/share/X11/xorg.conf.d/50-joystick.conf
    Section "InputClass"
    Identifier "joystick catchall"
    MatchIsJoystick "on"
    MatchDevicePath "/dev/input/event*"
    Driver "joystick"

    #begin tony

    Option "MapButton1" "key=36" # X (Return)
    Option "MapButton2" "key=9" # Circle (Escape)
    Option "MapButton3" "button=3" # Triangle (Mouse right click)
    Option "MapButton4" "button=1" # Square (Mouse left click)

    Option "MapButton5" "none" # L1
    Option "MapButton6" "none" # R1
    Option "MapButton7" "none" # L2
    Option "MapButton8" "none" # R2

    Option "MapButton9" "none" # Select
    Option "MapButton10" "none" # Start
    Option "MapButton11" "none" # PS

    Option "MapButton12" "none" # Analog left button
    Option "MapButton13" "none" # Analog right button

    Option "MapButton14" "key=111" # Up (Up)
    Option "MapButton15" "key=116" # Down (Down)
    Option "MapButton16" "key=113" # Left (Left)
    Option "MapButton17" "key=114" # Right (Right)

    Option "MapAxis1" "mode=relative axis=+1x deadzone=5000" # Analog left
    Option "MapAxis2" "mode=relative axis=+1y deadzone=5000" # Analog left
    Option "MapAxis3" "mode=relative axis=+1zx deadzone=5000" # Analog right
    Option "MapAxis4" "mode=relative axis=+1zy deadzone=5000" # Analog right
    Option "MapAxis5" "mode=none" # Motion sensor
    Option "MapAxis6" "mode=none" # Motion sensor
    Option "MapAxis7" "mode=none" # Motion sensor

    #end tony

    EndSection

    ResponderEliminar