11 marzo 2007

Controlando Linux con el mando de la Wii

kumo me ha puesto sobre la pista, y como buen geek no he podido evitarlo: había que investigar :)

De momento la cosa está en pañales, pero promete, y mucho. La cuestión es establecer una conexión vía Bluetooth entre el mando de la Wii y el sistema para controlar éste a través de aquél, como con cualquier otro HID.

Lo primero, como es lógico, es contar con un adaptador de Bluetooth y tener implementada la pila de protocolos BT (bluez). Tras esto comprobamos que podemos detectar el mando (debemos ponerlo en modo sync):



Una vez comprobado esto, tenemos que preparar el sistema. Primero el software que necesitamos:
  • Ya hemos nombrado la pila de protocolos (apt-get install bluetooth bluez-utils)

  • PyBluez, un conjunto de wrappers Python sobre Bluetooth (apt-get install python-bluez).

  • Python-Xlib, interfaz para Python del protocolo X11 (apt-get install python-xlib).

  • Es recomendable PyGame (apt-get install python-pygame) para poder observar la respuesta del sistema a los movimientos del mando.

Hay que parchear Python. Para ello editamos el archivo /usr/share/python-support/python-xlib/Xlib/protocol/display.py y buscamos la línea donde dice:

recv = self.socket.recv(2048)

En mi caso está en la línea 531. Lo sustituimos por

recv = self.socket.recv(4096)

Cargamos (tirando de modprobe) los módulos uinput y evdev. Si no los teneis, ya sabeis, toca recompilar. Tras esto comprobamos que se ha creado el dispositivo uinput:

find /dev -name uinput

Si no lo teneis en /dev/misc/uinput lo linkais desde donde lo tengais, ya que PyBluez querrá acceder al dispositivo en esa ruta. Hay que darle permisos para los usuarios (chmod 666 /dev/misc/uinput).

Ya casi están los preparativos. Falta configurar el servidor X. Para ello editamos el archivo /etc/X11/xorg.conf y añadimos un InputDevice:

Section "InputDevice"
Identifier "Wiimote"
Driver "evdev"
Option "Name" "Nintendo Wiimote"
EndSection


y en la sección ServerLayout añadimos la línea

InputDevice "Wiimote"

Listo. Reiniciamos el servidor X (invoke-rc.d [gdm|kdm|xdm] restart) y a otra cosa, mariposa. Uséase, a por el controlador.

WMD (Wiiwanna Motte Dammiit!) es un script en Python que actua como controlador para el Wiimote, usando PyBluez como wrapper para la comunicación Bluetooth, como seguramente ya habríais imaginado a juzgar por el software que hemos instalado. La última versión es la 0.1.2, aunque he tenido problemas con ella y he usado la 0.1.1. Por cierto, el WMD could make your Wii explode! del disclaimer es una coña marinera, que nadie se me acojone :D

En fin, éste es un vídeo con el resultado. Como veis la cosa, como digo más arriba, está en pañales aún, pero con un potencial increíble.



Como podeis observar, el control sobre el puntero es muy primitivo. En la ventana de PyGame podemos observar los gráficos con los movimientos del mando (rojo para movimientos en horizontal, azul en vertical y verde para profundidad) y la consola devuelve el botón que se pulsa. El botón HOME detiene el script e interrumpe la comunicación entre el mando y el sistema.

Por el momento, la sensibilidad es demasiado alta y no se tiene un buen control del puntero. De hecho, cuesta dirigirlo a donde quieras. No he conseguido que los botones produzcan ninguna acción, como lanzar un icono, mover una ventana, etcétera. También he probado el ejecutable xev para ver qué eventos me devolvía, pero no recibe señales del mando. Total, nada útil de momento. Pero veremos cómo evoluciona el asunto, porque esto promete muy mucho. Y por favor, si alguien ha llegado más lejos, agradecería muchísimo un comentario por su parte. Seguiremos investigando ;)

3 comentarios:

Anónimo dijo...

y todos esos videos que se han visto utilizando el mando de wii? no eran en linux?

kirazuel dijo...

Hasta donde yo sé, de momento se ha conseguido algo con Windows. Con Linux, esto es lo que hay (o cosas como ésta, que es lo mismo pero de otra forma).

Hay por ahí un vídeo de alquien que en teoría controla Beryl en un sistema multipantalla con el Wiimote, pero es un fake como una casa.

Anónimo dijo...

Mira por donde, la WII va a resultar aun mas entretenida de lo que parecia.

Por lo que he leido, basicamente se trata de un linux con una gui propietaria, asi que en teoria, serian posible un montno de movidad interconectando linux con los mandos. e incluso instalar en algun momento, alguna distro especifica en la maquina.

Hay que seguir investigando.