Usando el Wiimote en Debian

Introducción

Utilizar el mando de la Wii, el Wiimote, para manejar el ordenador, como si de otro dispositivo se tratase, no es algo nuevo. Desde hace casi un par de años, los usuarios de Windows tenían el GlovePIE. Sin embargo, no tardó mucho en aparecer una alternativa para sistemas GNU/Linux. He esperado hasta que el proyecto ha adquirido un buen grado de madurez para poder ser usado sin demasiada complicación.

Wiimote es posible en Linux

Encontraréis un montón de tutoriales sobre esto mismo en la red. Sin embargo, he querido hacer uno donde recoja todo tipo de información y el usuario no tenga que navegar por más páginas cada vez que le asalte un nuevo problema.

No todo será tan fácil como instalar y usar, pero tampoco muy complicado para una persona atenta 🙂

WCiid: El Programa

WCiid es el responsable de esta “magia”. En realidad no se trata de un solo programa. WCiid son un conjunto de programas:

  • libcwiid: es la biblioteca (API) que contiene las funciones para poder interactuar con el mando de la Wii.
  • wminput: driver para controlar los eventos de Wiimote y usarlo para manejar el ratón, joystick, etc.
  • wmgui: programa para comprobar el funcionamiento del Wiimote.

Instalación

Quizás imaginas que ahora toca la parte de compilación y rompedura de cabeza. Pues no. Lo bueno es que tenemos todos estos programas disponibles en los repositorios unstable y testing (lenny) de Debian (en Ubuntu están disponibles en los repositorios desde la 7.10). Así que, para instalarlos, bastará un:

#apt-get install libcwiid1 wminput wmgui

Y se instalará todo lo necesario, junto con sus dependencias.

Configuración

Lo cierto es que no es todo tan simple, todavía hay que hacer un poquito más antes de ver cómo el puntero del ratón se mueve mediante el Wiimote, pero es muy sencillo, ya verás.

Módulo uinput

La rama 2.6.x del kernel de Linux incorpora el driver uinput, que ayuda a los usuarios a inyectar datos al propio kernel. Esto es muy útil a la hora de crear aplicaciones para personalizar la entrada de dispositivos inalámbricos como pueden ser joysticks, teclados o el propio Wiimote.

Uinput está configurado como módulo que se puede cargar en la mayoría de los kernel Linux. Así que para cargarlo tendremos que hacer, como root:

# modprobe uinput

Esto lo tendremos que hacer cada vez que queramos usarlo. ¿Que nos parece un coñazo? No hay problema, podemos indicar que el sistema lo cargue por nosotros cada vez que arranque. Para ello, hay que añadirlo en el fichero /etc/modules:

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.

loop
sbp2
uinput # Aquí lo ponemos

Bluetooth

Adaptador USB de Bluetooth
Este paso es fundamental. La comunicación entre la Wii y el Wiimote se hace a través del protocolo Bluetooth, así que nuestro equipo debe estar equipado para entenderlo o comprar algún adaptador de Bluetooth por USB que no cuestan más de 5 euros. Precisamente, el de la imagen de la derecha, es el que tengo (un poco aparatoso, sí, pero tenéis adaptadores “mini”).

Instalamos las herramientas necesarias para que el Bluetooth pueda comunicarse con el resto de dispositivos Bluetooth:

# apt-get install bluez-utils

Si queremos hacer una comprobación de que nuestra interfaz de Bluetooth está funcionando, hacemos:

# hciconfig

Veremos algo similar a esto:

hci0:	Type: USB
	BD Address: 00:80:5A:46:9F:2D ACL MTU: 384:8 SCO MTU: 64:8
	UP RUNNING PSCAN ISCAN 
	RX bytes:1559579 acl:64293 sco:0 events:198 errors:0
	TX bytes:2114 acl:75 sco:0 commands:77 errors:0

Para este ejemplo, hci0 sería la interfaz de bluetooth.

Podemos seguir usando más programas incluidos en bluez-utils para, por ejemplo, buscar dispositivos que tengan activado el bluetooth:

tempwin@nzxt-trinity:~$ hcitool scan
Scanning ...
	00:1A:89:7B:86:F6	             paatRi...[!]
	00:1E:35:19:A0:72 	Nintendo RVL-CNT-01

¡Anda! Si ahí tenemos el mando de Wii 🙂 Bueno, y también podríamos mandarle cosillas a Patri 😛

wmgui

Wmgui nos permite comprobar el funcionamiento del Wiimote. No es más que una interfaz donde se muestran los controles del mando y se van encendiendo a medida que se pulsan y otras cosillas. Podemos lanzarlo desde un terminal simplemente tecleando $ wmgui. También lo tendréis en los menús de aplicaciones de vuestro gestor de escritorio favorito.

wmgui - Interfaz para comprobar el funcionamiento del Wiimote

Si vamos a FileConnect nos pedirá que pulsemos los botones 1 y 2 del mando para establecer la conexión entre el mando y el ordenador, igual que hacemos con la Wii. Sin soltarlos, pulsamos OK y, después de un rato, si todo va bien, podremos empezar a tocar botones del mando y ver cómo se iluminan en verde su correspondencia en la ventana del wmgui. Con este programa podemos hacer muchas más cosas: encender los LEDs azules del mando, hacer que vibre, etc. En el menú Settings podemos indicar de qué parte del mando queremos recibir información: Acc Data, IR Data, y Ext Data, para poder ver la información completa de los acelerómetros, del puntero y de las extensiones, respectivamente (por ejemplo, el Nunchuck). Y en el menú Controls, bueno, os lo dejo para que juguéis un poco 🙂

wminput

Venga, ahora voy a lo interesante, que seguro que después de tanta parrafada ya no os quedan uñas que comer 😛

Wminput es el programa que nos permitirá mover el ratón con el mando de Wii y que podamos usar sus botones para determinadas acciones. Es muy probable (aunque puede no ser necesario) que tengamos que dar los permisos necesarios para que un usuario del sistema pueda usar el driver uinput (¿te acuerdas de él?). Editamos el fichero, como root, /etc/udev/rules.d/91-permission.rules (lee el manual que puede que en tu distribución cambie el nombre del fichero) y añadimos al final:

KERNEL=="uinput", GROUP="nuestro-usuario"

Otra opción es escribir:

KERNEL=="uinput", MODE="0666"

Reiniciamos udev:

# /etc/init.d/udev restart

Y, ahora, vamos a hacer magia. En un terminal escribimos $ wminput -w. Hacemos lo que nos indica: pulsamos los botones 1 y 2 hasta que aparezca Ready. Si inclinamos el mando… ¡el puntero se mueve! Espera, pero esto es un timo, estarás pensando. Da igual a donde apunte, que no me hace caso. Efectivamente, sólo están funcionando los acelerómetros del mando, pero no los infrarrojos. Tranquilidad 🙂

Para que podamos usar los infrarrojos necesitamos la barra sensora de la Wii. Espera, ¿es que no hay más posibilidades? Por supuesto. Veamos, la barra sensora de la Wii no son más que dos grupos de LEDs situados a ambos lados que se iluminan y le dan una referencia al Wiimote y así poder saber dónde estamos apuntando. Esto lo podemos emular con dos puntos de luz que podemos conseguir comprando otros LEDs, con unas velas o mecheros, una linterna, etc. En mis experimentos he probado con la bombilla de la habitación (tiene que estar encendida, obviamente) y con un mechero. A diferencia de la barra sensora, el CWiid permite el uso de un sólo punto de luz, así que no tendréis que tener vuestro ordenador rodeado de velas como si de un santuario se tratase 😛

Cuando hayáis conseguido ese “punto de luz”, ejecutamos el wminput de esta otra manera:

$ wminput -w -c ir_ptr

Hacemos lo mismo de antes y cuando veamos Ready, empezad a mover el mando, ¿a que ahora sí es más preciso? Pues ya sabéis lo necesario para que el Wiimote funcione como en la Wii, pero con vuestra Debian.

Posibilidades del Wiimote

¡Qué bien! Soy capaz de mover el ratón con el Wiimote. Pero, ¿qué utilidad tiene esto?, pensarás. Quizás lo que no sabías es que se pueden configurar los botones del mando para que ejecuten una acción determinada. Imagínate, jugar al Half-Life con el Wiimote o usarlo de mando a distancia, cambiar los canales de televisión, reproducir música, etc. Parece ahora algo más útil, ¿verdad? 😉

Los archivos de configuración del wminput se guardan en /etc/cwiid/wminput/. Dentro de él podremos ver ejemplos de posibles configuraciones para los mandos de la Wii. Lo bueno de todo esto es que podemos crear nuestros propios ficheros de configuración para poder usar el Wiimote como nos dé la gana. Estos ficheros de configuración tienen el siguiente aspecto:

# Configuración para MPlayer

Wiimote.B       = KEY_ESC
Wiimote.A       = KEY_SPACE # Pausa
Wiimote.Up      = KEY_UP
Wiimote.Down    = KEY_DOWN
Wiimote.Left    = KEY_LEFT
Wiimote.Right   = KEY_RIGHT
Wiimote.Minus   = KEY_9 # Volume Down
Wiimote.Plus    = KEY_0 # Volume Up
Wiimote.Home    = KEY_F # Pantalla completa
Wiimote.1       = KEY_O # OSD

Como podemos ver, a la izquierda aparecen los nombres de los botones del Wiimote (descriptivos por sí mismos) y a la derecha la tecla que queremos emular. Por ejemplo, de acuerdo al fichero de arriba, si yo pulso el botón A del Wiimote, me pausará el vídeo que estoy reproduciendo con el MPlayer, que será lo mismo que pulsar la barra espaciadora del teclado.

Para usarlos, hay que llamar al wminput de esta otra manera:

$ wminput -w -c ruta/al/archivo/de/configuración

Para saber qué nombre tiene cada tecla o botón del ratón, podemos echar un vistazo al fichero /usr/include/linux/input.h, se entiende perfectamente qué nombre se le da a cada tecla o evento del ratón. Os voy a poner algunos ejemplos más, además del que uso para el MPlayer:

Para los emuladores de SNES, como snes9x y ZSNES:

# Configuración SNES

Wiimote.A       = KEY_X
Wiimote.B       = KEY_S
Wiimote.Up      = KEY_LEFT
Wiimote.Down    = KEY_RIGHT
Wiimote.Left    = KEY_DOWN
Wiimote.Right   = KEY_UP
Wiimote.Minus   = KEY_TAB
Wiimote.Plus    = KEY_ENTER
Wiimote.Home    = KEY_ESC
Wiimote.1       = KEY_C
Wiimote.2       = KEY_D

Para el emulador de recreativas por excelencia, MAME:

# Configuración xMAME

Wiimote.A       = KEY_P         # Pausa
Wiimote.B       = KEY_5         # Credit
Wiimote.Up      = KEY_LEFT
Wiimote.Down    = KEY_RIGHT
Wiimote.Left    = KEY_DOWN
Wiimote.Right   = KEY_UP
Wiimote.Minus   = KEY_2         # Player 2
Wiimote.Plus    = KEY_1         # Start
Wiimote.Home    = KEY_ESC       # Salir
Wiimote.1       = KEY_LEFTCTRL  # Ctrl
Wiimote.2       = KEY_LEFTALT   # Alt

Espero que se vaya entendiendo la idea. Por supuesto, no sólo estamos limitados al Wiimote, también podemos configurar el Nunchuck o el mando clásico de Wii. El límite es tu imaginación 🙂

Enlaces relacionados

Un comentario en “Usando el Wiimote en Debian

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *