OCULTAR MENU LATERAL >>

Usar un Gamepad o un Joystick en Ubuntu

Uno de los motivos en los que el sistema Windows es todavía superior a cualquier distribución de Linux es la calidad y compatibilidad de juegos que hay disponibles para uno u otro sistema.

Aunque es una brecha que poco a poco se va cerrando, la tendencia de la mayoría de desarrolladores es crear los videojuegos para la plataforma de Microsoft, y eso implica otros efectos secundarios como, por ejemplo, que la mayoría de fabricantes de herramientas para jugar (gamepad, joystick, volantes,...) den la espalda al resto de sistemas operativos.

Por suerte, en Linux hay una gran comunidad de desarrolladores que trabaja a destajo con cada problema que se les presenta y este no iba a ser menos. En los últimos años cada vez hay más títulos de calidad jugables en plataformas Linux (ya sea de forma nativa, mediante emuladores, con reimplementaciones de las librerías de Windows,...) y eso ha provocado que cada vez sean más los que desean usar sus mandos sobre este sistema.

En Ubuntu, hasta hace bien poco, no había un soporte por defecto para hacerlo, pero ahora ya trae instalados un grupo de software que se encargan de ello para cualquier dispositivo que funcione a través de USB (aunque sean inalámbricos). Por lo general basta con conectar y los dispositivos son detectados y configurados automáticamente.

Si no tuviéramos esos software instalados los añadiremos del siguiente modo:
  1. Abrimos una Terminal (aplicaciones->Accesorios->Terminal).
  2. Instalamos los paquetes necesarios:
     ~$ sudo apt-get install joystick evtest gamepad


En el caso de mandos de este tipo (gamepad, joystick, volantes,...), para comprobar que los dispositivos fueron detectados y que pueden ser usados, haremos lo siguiente:
  1. Abrimos una Terminal (aplicaciones->Accesorios->Terminal).
  2. Comprobamos qué dispositivos hay conectados a nuestros puertos USB:
     ~$ lsusb
    Esto debe dar una salida parecida a la que indico a continuación, donde se pueden ver listados todos los dispositivos USB, entre los cuales se encontrará cualquier control de videojuegos que hayamos conectado (marqué en rojo uno para que lo distingáis):
    Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 004 Device 006: ID 044f:d008 ThrustMaster, Inc. 
    Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Si no tenemos claro cuales son nuestros dispositivos podemos lanzar el comando "lsusb" antes de conectar cualquier mando y luego hacerlo tras conectarlos para ver la diferencia.

    Si no aparece en la lista alguno de los controles que hemos conectado es porque no fue detectado. Habrá que comprobar su estado físico y si fue bien enchufado.
  3. Una vez comprobado que los dispositivos (gamepad, joystick,...) están correctamente conectados, vamos a ver si el módulo del Kernel que se encarga de controlarlos está cargado. Para ello listamos el módulo buscado, el cual se llama "joydev":
     ~$ lsmod | grep joydev
    Esto debe dar una salida parecida a la que indico a continuación:
    joydev                  8767  0
    Si no está correctamente cargado no veremos tal salida. Entonces tendremos que hacer:
     ~$ modprobe joydev
    Y volver a comprobar si fue cargado.
Con eso debería bastar para que los mandos funcionen, si es que no lo hacían ya desde el principio.

Pero puede que los mandos no funcionan correctamente en los juegos. Es posible que debamos calibrarlos. Para ello, antes de explicar como hacerlo, veamos algunos conceptos necesarios:
  • Fichero controlador del mando

    En Linux, cada dispositivo almacena su configuración en uno o más ficheros. Los ficheros asociados a cada dispositivo para videojuegos suelen ser:
    • /dev/input/js0
    • /dev/input/js1
    • /dev/input/js2
    • ...
    Esto quiere decir que si conectamos, por ejemplo, 2 gamepad al equipo, la configuración del primero será guardada en "/dev/input/js0" y la del segundo en "/dev/input/js1".
  • Tipos de controles en dispositivos para videojuegos

    Los dispositivos para videojuegos poseen 2 tipos de controles:
    • Botones. Cada botón es un control que sólo puede adquirir 2 valores: pulsado o sin pulsar. Por lo general se refieren a los botones A, B, X, Triángulo, Start,...
    • Axes. Cada axis es un control que puede adquirir diferentes valores. Tiene preestablecido un valor mínimo y un valor máximo, y puede adquirir cualquiera de los posibles entre ambos. Por lo general se refieren a los gatillos, las crucetas (suelen tener 2 axes, Norte-Sur y Este-Oeste),...
    Internamente, el software instalado en Ubuntu para soportar estos dispositivos numera botones y Axes. Es decir, para cada dispositivo conectado tendremos: Botón 0, Botón 1, Botón 2,... Axis 0, Axis 1, Axis 2,...
  • Número total de axes y de botones

    El número de botones y axes viene dado por el dispositivo. Así pues hay dispositivos con 2 axis, con 3, con 4,... con 8, con 9,...; con 1 botón, con 2,..., con 7, con 8,...

    Además, en ocasiones un mismo dispositivo puede aceptar diferentes configuraciones en torno al número de axes y botones. Por ejemplo, puede que un gamepad acepte 2 tipo de configuración:
    • 9 axes y 9 botones, o
    • 7 axes y 8 botones (en este caso lo más probable es que algunos axes del mando cumplan funciones repetidas; y que ocurra lo mismo con los botones, 2  o más botones cumplan el mismo cometido).
    Por todo esto es recomendable conocer la configuración de axes y botones de nuestros dispositivos antes de calibrarlos. Para ello deberemos recurrir al fabricante (manuales, servicio de atención,...).


Veamos ahora como calibrar un dispositivo:
  1. Nos aseguramos de que el dispositivo está correctamente instalado (tal y como se explicó más arriba).
  2. Abrimos una Terminal (Aplicaciones->Accesorios->Terminal)
  3. Lanzamos el comando "jcal" con el parámetro "-c" (o con "--calibrate"), que sirve para calibrar el dispositivo, y con la ruta del fichero correspondiente al mando que deseamos configurar (por ejemplo "/dev/input/js0"). Debemos asegurarnos de no pulsar nada en el mando hasta que sea necesario:
    NOTA: Recuerda que "/dev/input/js0" es el fichero de configuración del dispositivo a calibrar. En caso de que queramos calibrar otro (si tenemos más de uno) deberemos cambiarlo por el correspondiente.
     ~$ jcal -c /dev/input/js0
    La salida de este comando será algo así:
    Joystick has 9 axes and 12 buttons.
    Correction for axis 0 is none (raw), precision is 0.
    Correction for axis 1 is none (raw), precision is 0.
    Correction for axis 2 is none (raw), precision is 0.
    Correction for axis 3 is none (raw), precision is 0.
    Correction for axis 4 is none (raw), precision is 0.
    Correction for axis 5 is none (raw), precision is 0.
    Correction for axis 6 is none (raw), precision is 0.
    Correction for axis 7 is none (raw), precision is 0.
    Correction for axis 8 is none (raw), precision is 0.
    
    Calibrating precision: wait and don't touch the joystick.
    Done. Precision is:                                               255,  255 Axis 4:  255,  255 Axis 5:  128,  128 Axis 6:  128,  128 Axis 7:    0,    0 Axis 8:    0,    0 
    Axis: 0:     0
    Axis: 1:     0
    Axis: 2:     0
    Axis: 3:     0
    Axis: 4:     0
    Axis: 5:     0
    Axis: 6:     0
    Axis: 7:     0
    Axis: 8:     0
    
    Move axis 0 to minimum position and push any button.
    Axis 0:      128
    Como podemos ver, en la primera línea indica el número de axes y botones detectados (lo he marcado en rojo para que se vea mejor).
    A continuación toma los valores cada axis y cada botón estando el mando en reposo (por eso no debíamos pulsar nada en el mando mientras se realizada tal medición).
    Por último comienza la calibración manual. Se irá pidiendo para cada axis los siguientes valores en este mismo orden:
    • Valor mínimo. Debemos mover el axis correspodiente hasta conseguir que el indicador de la consola ofrezca el valor mínimo (normalmente 0 ó -1).
    • Valor central. Debemos mover el axis correspodiente hasta conseguir que el indicador de la consola ofrezca el valor medio (normalmente 128 ó 0).
    • Valor máximo. Debemos mover el axis correspodiente hasta conseguir que el indicador de la consola ofrezca el valor máximo (normalmente 255 ó 1).
    Es necesario conocer la configuración de axes, pero para quien no conozca cual es cada axis, podemos ir probando hasta ver con cual modificamos el valor de la pantalla. Si en los manuales los axes son nombrados por ejemplo como "X Axis", "Y Axis", Z Axis", "ZR Axis",... podemos obtener el orden en que son configurados mediante el siguiente comando:
     ~$ jstest /dev/input/js0
    Éste devolverá algo así:
    Driver version is 2.1.0.
    Joystick (Thrustmaster Run'N' Drive Wireless) has 9 axes (X, Y, Z, Rx, Ry, Rz, Throttle, Hat0X, Hat0Y)
    and 12 buttons (BtnX, BtnY, BtnZ, BtnTL, BtnTR, BtnTL2, BtnTR2, BtnSelect, BtnStart, BtnMode, BtnThumbL, BtnThumbR).
    Testing ... (interrupt to exit)
    Axes:  0:-32767  1:-32767  2:-32767  3:-32767  4:-32767  5:-32767  6:-32767  7:     0  8:     0 Buttons:  0:off  1:off  2:off  3:off  4:off  5:off  6:off  7:off  8:off  9:off 10:off 11:off
    Podemos ver en orden los axes y botones (según sus nombres dados por el fabricante), junto con el número de cada tipo que fueron detectados (lo he marcado en rojo para que se vea mejor).

    Como ayuda, decir que las asignaciones numéricas habituales para un gamepad estándar son las siguientes:
    • Axis 0. Valores horizontales para la cruceta inferior izquierda del gamepad.
    • Axis 1. Valores verticales para la cruceta inferior izquierda del gamepad.
    • Axis 2. Valores horizontales para la cruceta inferior izquierda del gamepad.
    • Axis 3. Valores para el gatillo superior izquierdo del gamepad.
    • Axis 4. Valores para el gatillo superior derecho del gamepad.
    • Axis 5. Valores verticales para la cruceta inferior derecha del gamepad.
    • Axis 6. Valores gatillo a la derecha de la cruceta principal del gamepad.
    • Axis 7. Valores horizontales para la cruceta principal del gamepad.
    • Axis 8. Valores verticales para la cruceta principal del gamepad.
SOLUCIONES A PROBLEMAS CONOCIDOS Y USOS ALTERNATIVOS:
  • La computadora confunde los axes del mando con el mouse, produciendo un comportamiento anómalo de éste.

    Esto ocurre por un conflicto entre el driver del dispositivo y el sistema de detección automática de teclado y mouse de Ubuntu. Para solucionarlo podemos ayudarnos de esta página:
    https://help.ubuntu.com/community/Joystick_lshal_outputs_done

  • El mando no funciona correctamente en los juegos porque no hay permisos de acceso a su fichero de configuración.

    Podemos probar a cambiar los permisos de acceso al fichero mediante:
    NOTA: Recuerda que "/dev/input/js0" es el fichero de configuración del dispositivo a calibrar. En caso de que queramos calibrar otro (si tenemos más de uno) deberemos cambiarlo por el correspondiente.
     ~$ sudo chmod 666 /dev/input/js0

  • Queremos usar el mando para tratar con programas que no lo admiten.

    Esto ya es rizar el rizo. Consiste en usar el mando para manejar, por ejemplo, Vlc (como mando a distancia), juegos que sólo admiten control por teclado,...

    Para ello instalaremos el paquete "joy2key", el cual permite mapear los controles por teclado de un programa hacia el mando y luego crearemos un fichero de mapeo con la configuración para cada programa que queramos usar con él:
    1. Instalamos la suite:
       ~$ sudo apt-get install joy2key
    2. Creamos el fichero de configuración:
       ~$ cd ~
       ~$ gedit joy2keyrc
      Añadimos al fichero las siguientes líneas para cada programa:
      START A_L_I_A_S
      -X
      -dev D_I_S_P_O_S_I_T_I_V_O
      -B_O_T_O_N T_E_C_L_A
      -A_X_I_S T_E_C_L_A
    3. Donde:
      • A_L_I_A_S es el nombre del programa (por ejemplo: VLC, Firefox,...)
      • B_O_T_O_N es el nombre del botón que queremos configurar (por ejemplo: button0, button1,...)
      • A_X_I_S es el nombre del axis que queremos configurar (por ejemplo: axis0, axis1,...)
      • D_I_S_P_O_S_I_T_I_V_O es el nombre del fichero del dispositivo que queremos usar (por ejemplo: /dev/input/js0, /dev/input/js1,...)
      • T_E_C_L_A es la tecla a mapear (por ejemplo: s, k, 5, ?, Space, Shift_L, Left, Right, Up, Down,...)
    Ahora cuando queramos usar "joy2key" lo lanzaremos mediante:
    joy2key -rcfile joy2keyrc -config A_L_I_A_S
    Donde A_L_I_A_S es el nombre del programa que queremos usar.

    Podemos crear un acceso directo a este comando en cualquier lugar para evitar tener que abrir una consola cada que queramos usarlo.

  • Un mando que no fue correctamente recalibrado y no podemos realizar una calibración mediante el comando estándar.

    Podemos conocer otros modos de calibración mediante "jcal" lanzando el siguiente comando:
     ~$ jscal -h



Salu2,
elSant0

ALGUNOS ARTICULOS RELACIONADOS

6 comentarios:

Anónimo dijo...

hola como estas tengo este joystick http://www.shark-net.com.ar/to/index.php/es/p-gaming/83/283 y no puedo hacerlo funcionar bien en ubuntu 10.04, podrias agregar a la pagina alguna foto indicando cual es fisicamente un axis, me confunde no saber que son los axis, son la palancas? o son las flechas arriba , abajo , izquierda etc? cuando dice mover el axis 0 depues el 1 que tengo que mover, las flechas arriba, abajo ect, o las palancas podrias poner fotos para saber cuales son los axis fisicamente, estaria bueno que pongas fotos de que palancas hay que mover cuando pide mover los axis,y presionar boton,espero que puedas ayudarme hace casi un mes que estoy tratando de hacer funcionar bien mi joystick en ubuntu 10.04
Tengo conectados dos joystick iguales es necesario hacerlo con uno solo conectado?
chau gracias

elSant0 dijo...

Hola Anónimo. No incluyo imágenes señalando axes y botones en ningún mando porque este tutorial es válido para cualquier control (incluídos volantes, pistolas,...) y en cada control los axes y botones se reparten de un modo diferente. Lo que podría ayudarte a tí podría confundir a otros y viceversa.

En general:
- Los axes se refieren a palancas, gatillos, botones direccionales,... Pero ten en cuenta que, por ejemplo, la palanca direccional de un joystick se compone de 2 axes (uno para Norte-Sur y otro para Este-Oeste).
- Los botones se refieren a simples pulsadores, normalmente llamados A, B, C, Start, Cuadrado, Triangulo, Circulo, X, Pause, 1, 2, 3,...

No conozco la configuración de tu mando. Si el fabricante no te proporcionó información acerca de sus axes y botones y no sabes cual debes pulsar al calibrarlo, puedes ir probando hasta ver con cual modificas el valor que aparece en pantalla (tal y como indico en el tutorial).

Respecto a lo de desconectar los joystick, al conectarlos se crea su fichero de configuración, uno diferente para cada mando. Este fichero es necesario indicarlo al calibrar, por lo que tu decides si estás calibrando un mando u otro. Cada vez que desconectes un mando su fichero de configuración se borrará.

Salu2 y suerte

Anónimo dijo...

hola a mi me sucede cuando ejecuto joy2key -rcfile joy2keyrc -config dice en la consola "cannot open rc file"

por que aparece esto?

elSant0 dijo...

Anónimo(19/09/11)@ El mensaje traducido al castellano viene a decir: "no se ha podido abrir fichero rc".

El fichero rc es "joy2keyrc", el cual lo creamos, e introducimos en el mismo la configuración específica de cada programa que queremos usar con el mando (o joystick).

Puede que el problema te surja porque estás ejecutando el comando desde un directorio diferente a aquel en el se encuentra tu fichero "joy2keyrc". En este caso no lo encuentra y por eso no puede abrirlo.
Otra opción es que no hayas creado el fichero correctamente, en cuyo caso te recomiendo volver a hacerlo (eliminando previamente el anterior fichero creado).

Salu2

Anónimo dijo...

hola como estas logre que funcionen las palancas de mi joystick bastante bien , es la primera vez que puedo hacerlo, me podrias decir en que archivo queda guardala la calibracion de las palancas , archivo o carpeta , asi puedo guardar una copia ahora que funcionan bien las palancas , y para ver como estan puestos los axis , que seguro en ese archivo debe estar como se debe poner correctamente,chau muchas gracias por hacer este tutorial crei que nunca me funcionarian los joystick en linux.

Anónimo dijo...

Hola, muy buena la página, Quisiera comentarte que la palanca derecha en left 4 dead 1 solo me anda arriba y abajo pero cuando quiero moverme de lado a lado no anda. Ya he probado varios números en el archivo de la carpeta cfg el 360controller.cfg y nada no hay caso no me anda. joy_advaxisz 6 //z-axis controls GAME_AXIS_YAW (look left and right) el ultimo número que probé. Podrías decirme por favor qué es lo que estoy haciendo mal? Te agradecería una pronta respuesta porque no se si seguis contestando en este blog. Desde ya muchas gracias.

Publicar un comentario

Escribe aquí tus valoraciones, dudas, sugerencias,... Son sólo unos instantes y ayuda a mejorar el blog.