sábado, 21 de septiembre de 2013

Wii Nunchuk & Arduino

Hoy toca hablar de una “herramienta” que puede dar mucho de sí a la hora de trabajar con Arduino, que por pocos €uros podemos conseguir en cualquier tienda de videojuegos y consolas, y es el mando Nunchuk de la Wii (Si, el pequeñito), y la idea es conectarlo al Arduino para poder utilizarlo en nuestros proyectos. Vamos al lío.
Este mando además de los botones y el mando analógico, tiene un acelerómetro de 3 ejes dentro, que es lo que lo convierte en una herramienta bastante útil y ahora veremos porque.
Muchos no sabrán lo que es un acelerómetro a pesar de que aquellos con smartphones y móviles de gama alta los utilizan a diario.
Entonces, lo primero que hay que preguntar es: ¿Qué es un acelerómetro? (¿Lógico, no? :shock: )
Pues sigue leyendo para saberlo! 
Tiramos de Wikipedia y vemos:
“Se denomina acelerómetro a cualquier instrumento destinado a medir aceleraciones.”
Bien, me quedo igual que antes, ¿eso que significa?
Existen varios tipos de acelerómetros con diferentes usos, pero a nosotros solo nos interesa el uso del acelerómetro que tiene dentro el mando Nunchuk y que se utiliza para determinar la posición de un cuerpo (del mando en este caso), midiendo la aceleración y conociendo la posición inicial y velocidad con la que se desplaza, podemos calcular la posición final. 
Nosotros no calcularemos nada, lo hará acelerómetro del mando, el LIS3L02AL (Datasheet), que es un acelerómetro de 3 ejes, y por tanto, nos dirá en qué posición se encuentra el mando en un plano de coordenadas X, Y, Z, como se puede ver en la siguiente imagen:

Hablando claro, el acelerómetro nos dirá en que posición del Eje X, Y y Z se encuentra el mando cuando lo giramos a la derecha, a la izquierda, hacia adelante, hacia atrás, si está del revés o del derecho.
Todo esto sumado a que además del acelerómetro, el mando dispone de 2 botones y un joystick analógico de 2 ejes, y que en conjunto, su precio es bastante más reducido que comprarlo todo por separado.
Por si fuera poco, y esto es de lo más interesante, todo el conjunto se puede controlar con tan solo 2 pines de nuestro Arduino más la alimentación, así que, pasemos a ver como se conecta y utiliza, ¿No?
El mando se conecta mediante el bus I2C y funciona a 3,3Vy puestos a facilitarnos las cosas, en la web de Arduino hay una librería para poder controlarlo con muy pocas líneas de código.
El pinout del conector del mando (Pragprog):
Donde Clock sería el pin SCL, y Data el pin SDA,  del bus I2C correspondientes a los pines analógicos A5 y A4 del Arduino respectivamente.
Yo opté por conectarlo insertando unos cables en el conector y en el Arduino, aunque existe un adaptador específico diseñado para conectar el mando al Arduino, que podemos comprar en muchas tiendas online.
Dicho esto, no hay más que conectarlo de acuerdo a lo visto anteriormente y comenzar a utilizarlo! Para ello, descargamos la librería WiiChuck de la web de Arduino o de aquí mismoLibrería WiiChuk (Para la versión de Arduino 1.0) y veamos como mostrar por el puerto serie los valores de todos los elementos del mando, mediante el siguiente sketch:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "Wire.h"       //Libreria I2C
#include "WiiChuck.h"   //Libreria WiiChuck
WiiChuck chuck = WiiChuck();  //Instancia de WiiChuck
void setup()
{
Serial.begin(9600);    //Iniciamos comunicacion serie
chuck.begin();         //Iniciamos WiiChuck
}
void loop()
{
chuck.update();        //Actualizamos los valores y los imprimimos por pantalla.
Serial.println("-----------------------");
Serial.print("Eje X: "); Serial.print((int)chuck.readAccelX()); Serial.println();
Serial.print("Eje Y: "); Serial.print((int)chuck.readAccelY()); Serial.println();
Serial.print("Eje Z: "); Serial.print((int)chuck.readAccelZ()); Serial.println();
Serial.println();
Serial.print("Joystick X: "); Serial.print((int)chuck.readJoyX()); Serial.println();
Serial.print("Joystick Y: "); Serial.print((int)chuck.readJoyY()); Serial.println();
Serial.println();
Serial.print("Boton Z: "); Serial.print((int)chuck.zPressed()); Serial.println();
Serial.print("Boton C: "); Serial.print((int)chuck.cPressed()); Serial.println();
Serial.println();
Serial.println("-----------------------");
delay(2000);
}
Si conectamos y cargamos correctamente, debemos ver por el puerto serie, cada 2 segundos, los valores correspondientes a los ejes X, Y y Z del acelerómetro, los ejes X e Y del joystick analógico y los valores de los botones C y Z, así:
Llegados a este punto, controlando todos los elementos del mando, la imaginación de cada uno y los proyectos que realicen determinarán el uso que le demos, sin duda se pueden hacer muchas cosas.
Yo para hacer algunas pruebas, he conectado el mando y 14 leds a los pines digitales del Arduino, para ir encendiendo y apagando los leds de acuerdo a la posición lateral del mando, mapeando el valor del eje X del acelerómetro.
Aquí dejo la forma de conectarlo, el sketch y un pequeño vídeo de funcionamiento :
Sketch: WiiChukLeds.ino (Para la versión de Arduino 1.0)
Vídeo funcionando!

No hay comentarios:

Publicar un comentario