domingo, 10 de octubre de 2010

Interactuando con el WiiMote desde Python

El mando de Wii es a día de hoy un cachivache muy capaz de interactuar con el PC, tanto por que funciona a través de bluetooth, como porque sus capacidades impolsaron a la scene a estudiarlo.
El detalle es que después de ver un problema recurrente con estas consolas, que hacían falta pilas para usar el mando incluso cuando al final para jugar solo se utilizaran los que se conectan por cable a la consola, decidí escribir un script que permitiese conectarse a la consola y que, al menos, moviera el cursor y pulsara el boton principal [A] para poder solventar estos casos.

Nota: Hay una librería C para interactuar con el mando, llamada libcwiid

Aunque dicho script aún no está escrito, es más fácil conseguir un mando para trastear y explorar la forma con la que se comunica con la consola que una consola directamente, con ese motivo se escribió este código [pymote.py]. Conecta el dongle/pincho/chuzo bluetooth y comenzemos...



El código utiliza pybluez, no debería ser un problema obtenerlo [http://people.csail.mit.edu/albert/bluez-intro/x45.html]

El archivo provee una clase llamada pymote, esta se inicializa con 3 valores (solo 1 necesario):
- baddr: Dirección bluetooth del mando, este es obligatorio
- name: Nombre del dispositivo, este no se utiliza aún
- debug: Mensajes de depuración, por defecto a False

Una vez creado, el objeto se conecta al mando, y inicia el speaker (por comodidad), el objeto provee estas funciones:
- get_next: Recupera el siguiente paquete de datos
- close: Cierra las conexiones bluetooth
- is_connected: True si las conexiones están abiertas, False si están cerradas
- toogle_mute: Silencia/Da voz al speaker, el valor actual está definido en el atributo mute
- toogle_speaker: Activa/Desactiva el speaker, al activarlo se le da voz automáticamente, el valor actual está definido en el atributo speaker
- set_leds: Pone los leds en el estado definido por el atributo led, se especifica como funciona a continuación de esta lista
- toogle_led: Activa/Desactiva un led concreto
- toogle_rumble: Activa/Desactiva la vibración, el valor actual está definido en el atributo rumble
- req_stat: "Pregunta" el estado actual al mando

El resto de funciones son para uso interno o aún no están acabadas.
El atributo led es un array de 4 elementos (uno por cada led), si el bit 0 (si es impar) está activado, el led está encendido, en caso contrario, estará apagado, el estado por defecto es [ 0, 1, 1, 0], los leds 2 y 3 activados (simplemente para no confundirlo con una conexión a una consola "real").

Un problema es que el objeto no devuelve los paquetes ya decodificados, sino como los manda el wiimote, aunque el formato es bastante simple. Este script [ctrlmote.py] hace al anterior útil (de cara al usuario), dando una interfaz al con en mando (en modo texto), y interpretando los paquetes que envía. Si se ejecuta sin argumentos muestra los dispositivos disponibles:

Si se le da un nombre, se intentará conectar a ese dispositivo:


Eso es todo, cuando consiga hecharle la mano a una Wii para trastear, intentaré programar el script que funciona como el WiiMote. Hasta entonces...

[Referencias]
http://wiibrew.org/wiki/Wiimote
http://people.csail.mit.edu/albert/bluez-intro/index.html

No hay comentarios:

Publicar un comentario