Jugando con el Wiimote y GNU/Linux
El Wiimote es el control remoto de la Wii y parte de su originalidad consiste en incorporar un acelerómetro en el control de un videojuego. Esto unido a otras características como el módulo de radio Bluetooth y que al tratarse de un elemento de consumo fabricado en masa es relativamente barato, abre muchas posibilidades de juego más allá de la propia Wii.
Características del Wiimote
El Wiimote es un mando inalámbrico similar a un mando a distancia y alimentado por dos baterías estándar AA. Incorpora una docena de pulsadores que se pueden ver en la fotografía y otros detalles un poco más ocultos:
- Un acelerómetro ADXL330
- Cámara de infrarrojos
- Cuatro leds
- Un vibrador
- Un altavoz
- Una memoria flash
- Un conector para mandos complementarios como el Nunchuk
- Un módulo de radio Bluetooth
De todos estos elementos los más innovadores son el acelerómetro, la cámara de infrarojos y el módulo de comunicaciones Bluetooth.
Acelerómetro
El ADXL330 (data sheet) es un sensor capaz de percibir aceleraciones en los tres ejes (X,Y,Z). Sus caracteristicas más relevantes son:
- 3 ejes: X,Y,Z
- Rango de -3g a 3g
- 1 Byte de resolución por eje
- Respuesta DC, lectura de la gravedad
- Excelente estabilidad térmica
- Se supone que sobrevive a un choque de 10000g (ojo, sobrevive el acelerómetro no el Wiimote ni su usuario!)
Recordando un poco de física elemental tenemos:
- La aceleración y la fuerza están relacionadas por la masa: F=m*a
- Tanto la fuerza como la aceleración son magnitudes vectoriales. El acelerómetro entregará una señal proporcional a la componente de cada eje
- Si derivamos respecto al tiempo tenemos: posición -> velocidad -> aceleración -> sobreaceleración o tirón. Integrando podemos hacer el camino contrario
- A efectos prácticos, en la superficie de la tierra podemos suponer que todo está sometido a una fuerza de gravedad constante y dirección bien conocida: 1g = 9.8m/s2
- Un sólido rígido en el espacio tiene 6 grados de libertad: 3 traslaciones y 3 rotaciones
Dada la orientación del acelerómetro en el Wiimote quedan dispuestos sus tres ejes sensibles. De los seis grados de libertad las tres traslaciones se pueden detectar de forma directa a partir de los datos del acelerómetro. Y, esto es algo más ingenioso, dos rotaciones se pueden deducir a partir de la lectura de la gravedad.
Cuando el Wiimote descansa en reposo y orientado con la mayoría de botones hacia arriba, en Z podemos leer 1g (si manteniendo la orientación estuviese en caída libre en Z leeríamos 0g).
Cuando se hace un giro sobre el eje Y, la lectura de Z disminuye a medida que la fuerza de gravedad tiene una componente menor sobre el eje y la lectura de X aumenta (en uno u otro signo dependiendo del sentido del giro) a medida que la proyección de la gravedad sobre X es cada vez mayor. Lo mismo ocurre cuando X es el eje de giro con Y. Pero es imposible detectar el giro cuando se realiza sobre Z, ya que en este caso tanto X e Y son perpendiculares a la fuerza de gravedad.
Por lo tanto los datos proporcionados por el acelerómetro permiten:
- Determinar movimientos (las tres traslaciones y las rotaciones sobre X e Y)
- Determinar la orientación de dos angulos
Cámara de infrarojos
Durante el juego con el Wiimote y la Wii, es básico poder determinar la orientación y sus variaciones (y por tanto el movimiento) en los giros sobre el eje Z. Esta información se obtiene a partir de la cámara del Wiimote y la llamada "barra de sensores".
La barra de sensores está formada por diez leds infrarojos que no se ven a simple vista pero que la cámara de infrarojos del Wiimote puede percibir sin problemas. La barra de sensores se debe instalar encima o debajo de la pantalla y actúa como referencia absoluta para determinar la orientación del mando de la Wii.
La cámara de infrarojos tiene un sensor con una resolución de 1014x307 y una profundidad de color de 1 bit. Sus capacidades no son suficientes para hacer fotos de recuerdo, pero bastan para reconocer la baliza y por tanto deducir:
- La distancia entre Wiimote y barra de sensores
- El ángulo de giro respecto al eje Z (que es el que no se puede deducir a partir de los datos del acelerómetro)
- El ángulo de giro respecto al eje X
De esta manera se dispone de un sistema de seguimiento adecuado para mover un cursor por la pantalla apuntando con el mando de la Wii.
Bluetooth y protocolo de comunicaciones, CWiid
La comunicación entre el Wiimote y la Wii se realiza a través de Bluetooth utilizando un protocolo cerrado. Dicho protocolo ha sido deducido mediante técnicas de ingeniería inversa y en la actualidad se encuentran disponibles bibliotecas como Cwiid (GPL) que permiten la interacción entre un ordenador con GNU/Linux y el Wiimote (incluidos sus mandos complementarios nunchuk y classic).
Con CWiiid es posible recibir los datos de los pulsadores, acelerómetros, e infrarojos. Además de poder ordenar, entre otras cosas, al Wiimote el encendido/apagado de leds y/o vibrador. Se incluyen dos herramientas wmgui y wmdemo que permiten monitorizar los sensores del Wiimote. Y wminput que proporciona un mecanismo para escribir plugins que controlen el puntero de GNU/Linux a partir de los sensores del Wiimote.
Los plugins incluidos en la versión 0.6.0 son:
- acc
- Controla el cursor mediante los acelerómetros del Wiimote. El usuario debe hacer giros sobre los ejes X e Y
- ir_ptr
- Controla el cursor utilizando la cámara de infrarojos y la barra de sensores
- nunchuk_acc
- Controla el cursor mediante los acelerómetros del Nunchuk
Plugin nunchuk_analog para wminput
Y gracias a que me he encontrado con todo esto libre, he podido escribir un pequeño plugin para controlar el cursor con la palanca analógica del Nunchuk. Que evidentemente no es tan innovador como el uso de los acelerómetros y/o cámaras/balizas IR pero se adapta perfectamente a la función de controlar un cursor en 2D.
El Nunchuk tiene forma ergonómica y además de la palanca analógica incluye los pulsadores C y Z que se pueden utilizar como los dos botones del ratón. Tal vez esto pueda servir a personas con movilidad reducida.
cwiid-0.6.0_with_analog_nunchuk_plugin.tgz