bclose

Arduino y el Nunchuk de la Wii

Aprendiendo a utilizar los componentes de Nunchuk

Objetivos

 

 

    • Presentar el Nunchuk.
    • Ver que dispositivos contiene.
    • Aprender a conectar y programar el Nunchuk.
    • Explicar qué es y cómo funciona un acelerómetro.

 

Material requerido.

Imagen de Arduino UNO

Arduino Uno o similar. Esta sesión acepta cualquier otro modelo de Arduino.

conexiones

Cables  de protoboard macho hembra.

nunchuk wiiUn Nunchuk con adaptador de pines.

 

EL NUNCHUK

 

En esta ocasión vamos a presentar un dispositivo que nos puede dar mucho juego a la hora de realizar proyectos con nuestro Arduino, sobre todo en aquellos relacionados con la robótica.  Estamos hablando del Nunchuk de la Wii. El pequeño de los dos mandos que utiliza normalmente esta consola, el que no parece un mando de la tele.

nunchuk wii

Y es que este mando integra en poco espacio y con un diseño estupendo, un joystick, dos botones y  un acelerómetro (si no os suena no os preocupéis, ya hablaremos de este último). Tiene un precio muy razonable, de hecho los tenéis en la tienda de esta misma página por unos 11 euros, y además viene con un adaptador con una tira de pines para facilitar la conexión.

El Nunchuck funciona mediante el bus I2C, así que solo vamos a necesitar un par de cables para controlarlo, además de los propios para la alimentación del mando. Sólo tenéis que tener en cuenta que en teoría funciona a 3.3V, y por lo demás el – va a tierra, d (data) a SDA y c (Clock) a SCL, que en el Arduino Uno corresponden a los pines A4 y A5.

 
  • La forma correcta de colocar el adaptador en la toma del Nunchuk es con los pines hacia el lado del adaptador que no tiene una hendidura.
  • De todas formas, siempre podéis hacerlo por prueba y error. Si al ejecutar el programa no funciona, le dais la vuelta y listo.  
keyes nunchuk kduino

Y como casi siempre, hay algunas librerías que nos van a facilitar mucho la programación. Hay varias aunque todas son bastante parecidas, pero nosotros hemos utilizado esta: wiichuck. Esta vez tenemos que incluirla de una manera diferente a la que solemos hacerlo. Lo que tenéis que hacer es descomprimir el archivo que habéis descargado dentro de la carpeta “libraries” que está en el directorio en el que instalasteis el IDE.

 

EL JOYSTICK Y LOS BOTONES

 

Bueno, pues toca meternos en harina, y vamos a empezar por el joystick y los dos botones, que son los componentes del mando con los que más familiarizados estamos.

Vamos a hacer un programa que nos permita ver en el monitor serie las medidas del joystick y si los botones están pulsados o no. Como veréis, la programación es muy sencilla gracias a la librería que estamos utilizando.

#include "Wire.h" //Libreria I2C
#include "WiiChuck.h" //Libreria WiiChuck

WiiChuck chuck = WiiChuck(); //Creamos la instancia de WiiChuck

void setup()
{
 Serial.begin(115200); //Configuramos la velocidad del puerto serie
 chuck.begin(); //Iniciamos WiiChuck

}

void loop()
{
 delay(20);
 chuck.update(); //Actualizamos los valores

 //Imprimimos los valores por pantalla

 Serial.print("Eje X: ");
 Serial.print(chuck.readJoyX()); //Eje X del Joystick
 Serial.print(" ");
 Serial.print("Eje Y: ");
 Serial.print(chuck.readJoyY()); //Eje X del Joystick
 Serial.print(" ");

 //Boton Z
 if (chuck.buttonZ)
 Serial.print("Z");
 else
 Serial.print("-");

 Serial.print(" ");

 //Boton C
 if (chuck.buttonC)
 Serial.println("C");
 else
 Serial.println("-");
}

Aquí podéis descargar el programa completo: nunchuk_joystick_botones. Y si abrimos el monitor serie veremos algo como esto:

nunchuk joy botones pantalla

 

EL ACELERÓMETRO

 

El otro componente que incluye este mando es un acelerómetro. Y, ¿qué es un acelerómetro? Pues un instrumento para medir aceleraciones (sí, no me he quedado calvo con esto…) , y quién más y quién menos lo usamos todos los días, porque nuestros preciados smartphones contienen uno. En nuestro caso, al igual que en los teléfonos, el acelerómetro del Nunchuk es capaz de medir aceleraciones en los 3 ejes: X, Y, Z.

movimiento nunchuk arduino

Estos dispositivos pueden tener muchas aplicaciones, por ejemplo, para hacer saltar un airbag de un coche en caso de que detecte una aceleración muy fuerte. Incluso creo que están intentando usarlo para desarrollar aplicaciones en los móviles, de forma que si tienes un accidente, por ejemplo una caída en moto, el móvil detecte ese cambio brusco en la aceleración y envíe un mensaje de socorro inmediato.

Pero nosotros lo vamos a utilizar con otro fin, que es el de determinar la posición del mando a partir de las medidas de las aceleraciones. Y es q si recordamos nuestras clases de física, resulta que la fuerza de la gravedad provoca una aceleración en todos los cuerpos en la superficie de la Tierra de 9,8.

Por lo tanto si tenemos el acelerómetro en posición horizontal, paralelo al suelo, deberíamos tener esa aceleración en el eje Z y una aceleración de 0  en los otros dos ejes. Pero si inclinamos el acelerómetro en cualquier dirección (ejes X o Y), estás medidas cambiarán. Pues a partir de estas tres medidas podemos calcular utilizando la trigonometría el ángulo de los ejes X e Y y determinar la posición del mando.

¿Y qué pasa con el eje Z? Pues que es imposible saber la posición en este eje con un acelerómetro, ya que la aceleración de la gravedad es paralela a este eje.

yaw-pitch-roll
 
  • Normalmente los acelerómetros se combinan con giroscopios (ya hablaremos de ellos en otro momento) para tener medidas más exactas, pero en este caso nos bastará con el acelerómetro.
  • Para saber la posición en el eje Z necesitaríamos un magnetómetro que actúe a modo de brújula y nos indique la posición del Norte.  

No vamos a entrar a explicar el cálculo de los ángulos a partir de las lecturas, porque no queremos aburrir a nadie; y además la librería lo va a hacer por nosotros.

La programación va a ser igual de sencilla que en el apartado anterior, pero usando otras funciones de la librería. Además habrá que incluir la librería math.h, necesaria para el cálculo de los ángulos.

#include <math.h>
#include "Wire.h" //Libreria I2C
#include "WiiChuck.h" //Libreria WiiChuck

WiiChuck chuck = WiiChuck(); //Creamos la instancia de WiiChuck

void setup()
{
 Serial.begin(115200);
 chuck.begin();
}

void loop()
{
 delay(20);
 chuck.update();

 Serial.print("Posicion: Eje X: ");
 Serial.print(chuck.readRoll()); //Posicición eje X
 Serial.print(" Eje Y: ");
 Serial.print(chuck.readPitch()); //Posición eje Y
 Serial.print(" *** ");

 Serial.print("Lecturas: ");
 Serial.print((int)chuck.readAccelX()); //Lectura eje X
 Serial.print(" ");
 Serial.print((int)chuck.readAccelY()); //Lectura eje Y
 Serial.print(" ");
 Serial.println((int)chuck.readAccelZ()); //Lectura eje Z
}

Aquí tenéis el programa completo: nunchuk_acelerometro, y el resultado en el monitor serie, en el que mostramos tanto las medidas del acelerómetro como la posición de los ejes X e Y. Si inclináis el mando en esos veréis como cambian las medidas y la posición en los ejes X e Y.

monitor serie acelerómetro nunchuk

 

Resumen de la sesión

 

En esta sesión hemos aprendido varias cosas importantes:

 
    • Hemos presentado el Nunchuk, un dispositivo que incluye elementos muy útiles por poco precio y siendo muy fácil de utilizar.
    • Hemos aprendido a programar el joystick y los botones del Nunchuk.
    • Sabemos lo que es un acelerómetro y cómo utilizarlo para obtener la posición del Nunchuk.
 

No Comments

Give a Reply

WordPress Anti-Spam by WP-SpamShield