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,3V, y 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í mismo Librerí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:

#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!

Uno de los usos más interesantes que podemos darle, es el de controlar los movimientos de un robot, como ha hecho Alex (@TCRobotics) y podemos ver en el siguiente vídeo como controla todos los aspectos de su robot “Orugas” mediante el mando Nunchuk:

:D

About these ads

31 pensamientos en “Wii Nunchuk & Arduino

  1. Pingback: arduino | Pearltrees

  2. Hola,

    Por si os interesa, Editorial Estribor acaba de publicar un libro, en español, sobre Arduino: “30 Proyectos con Arduino”.

    Si queréis, podéis echarle un vistazo en http://www.editorialestribor.com

    Tiene bastante buena pinta y parece que la editorial se va a dedicar a publicar libros de este tipo en español.

    Saludos.

  3. Hola, tengo un problema, el programa me ejecuta, segun yo conecto bien el nunchuck pero a la hora de desplegar la información solo me imprime los valores de referencia y no la lectura del nuchuck, he estado buscando el problema por toda la red pero no encuentro nada, me podrias ayudar?
    t

    • Daniel Gutierrez, no entiendo bien tu problema, que valores de referencia son los que te muestra?

      Revisa bien todas las conexiones, y otra cosa a tener en cuenta es, el nunchuk es original de Nintendo?

      Ya que ha habido casos de nunchuks “piratas” que vienen sin el acelerómetro interno, y no funcionan demasiado bien.

      En cualquier caso, si puedes ampliar la información de tu problema, vemos que podemos hacer, dinos que es exactamente lo que te imprime el serial monitor.

      Saludos!!

      • Gracias por contestar, lo que hice fue abrir la libreria de wiichuck, intentar analizar la información y encontrar alguna pista, lo que encontre es que dan valores de referencia como en el eje x -510, y = -490 y z= -460, repito eso bajo la libreria, ahora al conectar mi wii chuck original :) lo hago con cable amarillo en analogo 5, verde analogo 4, blanco masa y rojo 3.3 v, e igual probe simulando la placa sin cortar es decir voltaje en el analogo 3 y grnd en analogo 2, sin embargo no obtengo ninguna lectura :( ejecuto el programa y cada 2 segundos “lee” el wii chuck pero nungun valor cambia //sad face…. tengo un arduino mega 2560.

        De antemano te lo agradesco

  4. Daniel Gutierrez, no se que puede ser el problema que tienes, por lo que veo, has cortado el conector del mando y estás utilizando solo los cables, no?

    Hace tiempo compré un wii nunchuk en el chino, y al cortar el conector los colores de los cables no se correspondían con los típicos colores (Rojo: Tensión, Negro/Blanco: GND, etc), por lo que probando combinaciones, no conseguí hacerlo funcionar (A saber si no lo he quemado cortocircuitándolo).

    Lo único que se me ocurre es que tengas los cables mal conectados. Intercambia los cables del bus I2C y haz la prueba, ten cuidado con los cables de tensión.

    Saludos!

    • Diegoarmanleon, la librería la puedes descargar desde este mismo post, exactamente donde pone “Librería WiiChuk (Para la versión de Arduino 1.0)” entre la imagen del conector del Wiichuk y el código del sketch de ejemplo.

      Saludos!

      • oye tengo un problema al compilar con el chuck.begin(); sera porque yo tengo el arduino 1 y el sketck es para el 1.0?

  5. Yo tengo el mismo problema que Daniel Gutierrez, solo que el primer dia que lo probre me funcionaba. Despues de hacer pruebas para intentar que la informacion apareciese en un LCD, resulta que ahora solo impreme esos valores de referencia (x=-510 y=-490….). Incluso si desconecto el Nunchuk. he pensado que el Arduino puede haberse quedado con esos valores “grabados”, y no se que puedo hacer. Los otros programas me van bien, es solo al nitentarlo con este que se queda “tonto”.

    Agradeceria mucho la ayuda para este proyectillo.

    • Linkx, desconozco el problema que puede ser, yo no tuve problemas para imprimir en el puerto serie del Arduino.

      Si puedes enviar o colgar el esquema que estás utilizando aquí para que pueda verlo, es posible que el LCD esté conectado en algún pin o esté “chocando” el código con la librería del Nunchuk.

      Un saludo!

      • Bueno, como te digo la primera vez si funcionaba, pero ahora ni conectando solo el nunchuk coge los valores.

        La LCD (PC1602F) esta conectada como aqui ( http://luckylarry.co.uk/wp-content/uploads/2009/09/arduino-lcd-screen-layout-key.jpg ) aparece, solo que en vez de los pins 5 y 4 estan puestos 7 y 6.

        El programa es el siguiente:

        #include “Wire.h” //Libreria I2C
        #include “WiiChuck.h” //Libreria WiiChuck
        #include

        WiiChuck chuck = WiiChuck(); //Instancia de WiiChuck
        LiquidCrystal lcd(12, 11, 7, 6, 3, 2);

        void setup()
        {
        Serial.begin(9600); //Iniciamos comunicacion serie
        chuck.begin(); //Iniciamos WiiChuck
        lcd.begin(16, 2);
        }

        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);
        }

        He conseguido que los valores que recoge (los de referencia) salgan en la LCD, aunque se ven muy mal, va a saltos y no se entiende. Supongo que haria falta cambiar el sketch para que los nombres permanezcan mientras los valores cambian…

        Gracias por contestar.

        • Linkx, desconozco porqué te da el error, ya que debería poder imprimir los valores correctamente en el LCD.

          En cuanto tenga un rato lo montaré nuevamente para comprobar a ver porqué da ese fallo y te cuento.

          Saludos!

        • Nada, que no hay manera. Ahora ni siquiera me aparecen en la LCD los valores de referencia. Escomo si no sintiese que conecto el Nunchuk, lo ejecuto sin conectarlo y me da los mismos valores una y otra vez. Me parece rarisimo porque al principio funcionaba! En youtube he visto muchos ejemplos de lo que quiero hacer (imprimir en una LCD los valores del acelerometro), pero la gente no pone el programa para ejecutarlo. Aunque teniendo en cuenta que no me funciona sin razon aparente (tanto el Nunchuk con la consola como el Arduino con la LCD y otras funciones funciona perfectamente), me parece que voy a tener que hacer otra cosa…

        • Linkx, sin montar el circuito no puedo imaginarme el problema.

          A ver si saco algo de tiempo y lo monto y te digo algo estos días.

          Un saludo!

        • Tranquilo, esta solucionado. Resulta que tenia conecta el Clock y el DAta a los pines DIGITALES 4 y 5, y no a los analogicos A4 y A5! perdona por las molestias.

          Lo que si me pasa es que veo imposible poner por ejemplo “Eje X” de manera constante en la LCD, y que lo que vaya cambiando sean los valores numericos. Por que sino aparece todo seguido, pisando unos a otros y no se puede poner ordenado los 3 ejes o asi.

        • Linkx, estupendo, fallos que tenemos todos, suele pasar jeje, mientras que no se intercambien los cables de alimentación y GND, no habrá mucho problema.

          Que LCD utilizas? Un display de caracteres, 16×2 por ejemplo?

          Prueba a poner este código:

          void loop()
          {
          chuck.update();

          lcd.setCursor(0,0);
          lcd.print(“Eje X”);

          lcd.setCursor(6,0);
          lcd.print(” “);

          lcd.setCursor(6,0);
          lcd.print((int)chuck.readAccelX());

          delay(100);
          }

          Eso imprimirá el número y no lo pisará cuando vuelva a imprimirlo ya que imprimirá por pantalla un espacio en blanco antes.
          Ese código solo imprime el eje X, repitelo con eje Y, Z y botones.

          Ya me cuentas.

          Un saludo!

        • Muchas gracias de verdad, pero ahora me pasa otra “incidencia”. Resulta que pongo X: Y: Z: de manera constante, pero los valores, al pasar de neatibo a positibo, se les queda la ultimo cifra del negatibo y el positibo parece 10 veces mas grande. Te pongo el trozo de programa:

          lcd.setCursor(0,0); lcd.print(“X:”); lcd.setCursor(3,0); lcd.print(” “);
          lcd.setCursor(3,0); lcd.print((int)chuck.readAccelX());

          lcd.setCursor(9,0); lcd.print(“Y:”); lcd.setCursor(12,0); lcd.print(” “);
          lcd.setCursor(12,0); lcd.print((int)chuck.readAccelY());

          lcd.setCursor(0,1); lcd.print(“Z:”); lcd.setCursor(3,1); lcd.print(” “);
          lcd.setCursor(3,1); lcd.print((int)chuck.readAccelZ());

          Supongo que sera una tonteria, pero no queda “enseñable”, jeje

        • Linkx, aumenta el espacio en los LCD.print(” “); o imprime en LCD.setcursor(2,0);

          Así juegas con los caracteres que se sobreponen.

          Saludos!

  6. Pingback: Wii Nunchuk & Arduino | tec2eso23 | Scoop.it

  7. #include “Wire.h” //Libreria I2C
    #include “WiiChuck.h” //Libreria WiiChuck

    No entiendo por que se supone que sustituya esto?

  8. Buenas, os paso el video que he colgado con los movimientos de un par de servos mediante el control de nunchuck. Evidentemente mi más sincero agradecimiento al autor de la Web, de la que me he vuelto seguidor.

    Un saludo

    • Pablo, genial!!!

      Te ha quedado estupendo, muy bien pensado el control manual con los botones además del control con acelerómetro.

      Enhorabuena! y Gracias!

      P.D.: Yo me he vuelto seguidor de tu canal de Youtube, tienes muy buenos proyectos!

      Un saludo!

  9. hola buenas tardes disculpa una pregunta… que programa usaste para visualizar los valores correspondientes a los ejes X, Y y Z del acelerómetro. es que lo ocupo para un proyecto que estoy usando un Wii Nunchuk con un juego que fue creado en Unity 3D

Deja un comentario!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s