miércoles, 5 de marzo de 2014

Conectar WiiMote de Nintendo a la Raspberry

Para conectar el mando de la Nintendo Wii a la Raspberry lo primero que se necesita, además del mando, es un dispositivo bluetooth por USB. Para ver una lista de dispositivos compatibles, aunque la mayoría lo serán, os sugiero mirar en el siguiente enlace: http://elinux.org/RPi_VerifiedPeripherals


Paso 1: Actualizar los repositorios de software de Raspbian y actualizar el software instalado, que nunca esta de mas.

sudo apt-get update
sudo apt-get upgrade

Paso 2: Instalar los drivers de bluetooth: la comunicación con el mando de Wii se hace por medio de bluetooth.

sudo apt-get install --no-install-recommends bluetooth  

la opción --no-install-recommends es para no instalar cosas que en un principio son innecesarias como impresoras bluetooth, etc.

Paso 3: Ahora necesitamos el paquete python-cwiid.

sudo apt-get install python-cwiid

Paso 4: Ahora es el momento de enchufar el dispositivo bluetooth al USB y probar que la comunicación con el mando de la Wii funciona. Tarda unos segundos en reconocer y poner en funcionamiento el dispositivo bluetooth.
Antes de nada comprueba que el servicio de bluetooth esta funcionando:

sudo /etc/init.d/bluetooth status

Si recebes el siguiente mensaje es que el servicio está funcionando:
[ ok ] bluetooth is running.

Si no es así prueba a reiniciar el servicio con /etc/init.d/bluetooth restart o reiniciando la raspberry.

Una vez comprobado que el servicio funciona presiona los botones 1 y 2 del mando de la Wii a la vez, veras que los led azules empiezan a parpadear. Ahora en la consola escribe el siguiente comando:

hcitool scan

y si todo esta bien verás un mensaje como el siguiente:

Scanning ... 00:19:1D:8F:BA:F7 Nintendo RVL-CNT-01

Apunta en algún sitio la dirección mac del dispositivo (00:19:1D:8F:BA:F7).

Paso 5: Instalación de wminput

sudo apt-get install wminput

Paso 6: Es momento de tomarnos un rato de las cosas que se pueden configurar en wminput para determinar la forma en que el Wiimote se va a comportar, los ficheros de configuración se encuentran en /etc/cwiid/wminput, vienen varios ejemplos para probar y al final lo interesante es hacerte tu propia configuración. Al final de la entrada publicaré la mía que la he orientado al uso con Mame (en entradas futuras explicaré esto). 

Para probar las distintas configuraciones hay que ejecutar el siguiente comando:
wminput -c <nombre_fichero_configuracion> -d 00:19:1D:8F:BA:F7

Nota: para hacer funcionar las configuraciones de ir-ptr. que es la forma clásica de mover el puntero del ratón en la Wii, se necesitan al menos una fuente emisora de infrarrojos que el mando pueda leer e interpretar, puede ser un led IR o una vela con llamita (la vela solo funciona hasta un metro de distancia). Y no pienses en encender tu Wii para que funcione la barra de ir, puesto que la Wii competirá con la Raspberry para tomar el control del Wiimote, y no funcionará correctamente.

Paso 7: Lo único que queda es hacer que el mando de la Wii empiece a funcionar una vez que se inicia sesión en el entorno gráfico, si así se desea, yo particularmente lo tengo desactivado al inicio y tengo un icono en el escritorio para activarlo, voy a explicar las dos formas:

    Paso 7a: Auto arranque con las X, crear un fichero en ~/.config/autostart, yo le he llamado wiiremote.desktop, con el siguiente contenido:
[Desktop Entry]
Name=Wii Remote Service
Comment=Converts Wii Remote to Mouse
GenericName=WiiRemote
Exec= /usr/bin/wminput -c default 00:19:1D:8F:BA:F7
X-GNOME-Autostart-Delay=20
Type=Application
Encoding=UTF-8


    Paso 7b: Icono en el escritorio, en este caso hay que crear un fichero en ~/Desktop con el siguiente contenido
[Desktop Entry]
Name=wii_player1
Comment=MAME remote controler
Exec=wminput -c player1 -d 00:19:1D:8F:BA:F7
Icon=/usr/share/pixmaps/idle.xpm
Terminal=false
MultipleArgs=false
Type=Application
Categories=Application;Games;
StartupNotify=true

Como se puede ver en ambos se lanza el comando wminput pero estoy usando diferentes configuraciones, esto es porque cuando lo puse automático quería usar el Wiimote como ratón para el escritorio y la configuración player1 la uso para jugar con el MAME.


Os pongo el fichero de configuración que uso para usarlo como mando arcade (player1):
#ir_ptr

include buttons
include nunchuk_alg

#Habilitar cuando tenga emisor ir
#Plugin.ir_ptr.X        = ABS_X
#Plugin.ir_ptr.Y        = ABS_Y

# You can set Plugin.led.Led[1->4] to 1
# to have that led be active all the time
Plugin.led.Led1 = 1

# Setting battery to 1 enables the battery check function
# By default the keypress is A + B
# You can change this by setting Plugin.led.Button to any
# wiimote or attachment button
Plugin.led.Battery = 1

En este fichero incluyo otros dos con mas configuraciones son buttons y nunchuk_alg y además le digo que encienda el Led 1 para identificarle como mando 1 y que me diga el estado de las pilas cuando se presiona A+B.

fichero buttons:
#buttons

Wiimote.A               = BTN_LEFT
Wiimote.B               = BTN_RIGHT
Wiimote.Up              = KEY_UP
Wiimote.Down    = KEY_DOWN
Wiimote.Left    = KEY_LEFT
Wiimote.Right   = KEY_RIGHT
Wiimote.Minus   = KEY_BACK
Wiimote.Plus    = KEY_FORWARD
Wiimote.Home    = KEY_HOME
#Wiimote.1              = KEY_PROG1
#Wiimote.2              = KEY_PROG2
Wiimote.1               = BTN_A
Wiimote.2               = BTN_B

Nunchuk.C               = BTN_LEFT
Nunchuk.Z               = BTN_RIGHT

Classic.Up              = KEY_UP
Classic.Down    = KEY_DOWN
Classic.Left    = KEY_LEFT
Classic.Right   = KEY_RIGHT
Classic.Minus   = KEY_BACK
Classic.Plus    = KEY_FORWARD
Classic.Home    = KEY_HOME
Classic.A               = BTN_LEFT
Classic.B               = BTN_RIGHT
#Classic.X              =
#Classic.Y              =
#Classic.ZL             =
#Classic.ZR             =
#Classic.L              =
#Classic.R              =


fichero nunchuk_alg:
#plugin for nunchuk stick
Plugin.nunchuk_stick2btn.Up     = KEY_UP
Plugin.nunchuk_stick2btn.Down   = KEY_DOWN
Plugin.nunchuk_stick2btn.Left   = KEY_LEFT
Plugin.nunchuk_stick2btn.Right  = KEY_RIGHT

Nunchuk.C               = KEY_TAB
Nunchuk.Z               = KEY_ESC
 
Espero que os sirva de ayuda.