Una vez que ya tenemos claro la teoría, hay que juntar todos esos conocimientos y crear un pequeño programa. A continuación os muestro un código funcional, el cual no me ha dado ningún problema.
He añadido un apartado al comienzo del código de personalización por si se tubiera que modificar algo.
/* Código basado en el de Chad Phillips de www.windmeadow.com en 2007.
Se ha modificado para no tener que decodificar los datos.
Jorge Torregrosa. 2011
*/
#include <Wire.h>
//-------------------------OPCIONES PERSONALIZACIÓN--------------------------
#ifndef NOA_h
#define NOA_h
// Datos específicos del Nunchuk
#define DIR_DISPOSITIVO 0x52
#define DIR_MEMORIA1 0xF0
#define DIR_MEMORIA2 0xFB
#define DATOS_INICIO 0x55
#define ENVIO_INIC 0x00
#define NUM_BYTES_RECIBIR 6
// Número de actualizaciones por segundo
#define FREC_ACTUALIZACION 10
// 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200 bps
#define VEL_SERIAL 19200
// Activar envío de datos por serial al pc. 1=Activado 0=Desactivado
#define ACTIVAR_SERIAL 1
#endif
//----------------------------------------------------------------------------
uint8_t datos[6]; // Array que almacena los datos recibidos del Nunchuk
int decod[7]; // Array que almacena los datos decodificados y listos para utilizar
int cnt = 0; // Contador para contar el número de datos recibidos
void inic_Nunchuk()
{
Wire.beginTransmission (DIR_DISPOSITIVO); // Transmite al dispositivo
Wire.send (DIR_MEMORIA1); // Envía la dirección de memoria
Wire.send (DATOS_INICIO); // Envía datos necesarios de inicio
Wire.send (DIR_MEMORIA2); // Envía la dirección de memoria
Wire.send (ENVIO_INIC); // Envía byte de inicio de transmisión
Wire.endTransmission (); // Detiene la transmisión
}
void pet_Datos ()
{
Wire.beginTransmission (DIR_DISPOSITIVO); // Transmite al dispositivo 0x52
Wire.send (ENVIO_INIC); // Envía 0 (decimal)
Wire.endTransmission (); // Detiene la transmisión
}
void decodificar_Datos ()
{
decod[0]=datos[0]; // Stick eje X
decod[1]=datos[1]; // Stick eje Y
decod[2]=datos[2] * 4; // Aceleración eje X
decod[3]=datos[3] * 4; // Aceleración eje Y
decod[4]=datos[4] * 4; // Aceleración eje Z
decod[5]=1; // Botón Z
decod[6]=1; // Botón C
if ((datos[5] >> 0) & 1)
decod[5] = 0;
if ((datos[5] >> 1) & 1)
decod[6] = 0;
if ((datos[5] >> 2) & 1)
decod[2] += 2;
if ((datos[5] >> 3) & 1)
decod[2] += 1;
if ((datos[5] >> 4) & 1)
decod[3] += 2;
if ((datos[5] >> 5) & 1)
decod[3] += 1;
if ((datos[5] >> 6) & 1)
decod[4] += 2;
if ((datos[5] >> 7) & 1)
decod[4] += 1;
}
void imprimir_Serial ()
{
Serial.print ("Stick X= ");
Serial.print (decod[0], DEC);
Serial.print ("\t");
Serial.print ("Stick Y= ");
Serial.print (decod[1], DEC);
Serial.print ("\t");
Serial.print ("Aceleracion = (");
Serial.print (decod[2], DEC);
Serial.print (",");
Serial.print (decod[3], DEC);
Serial.print (",");
Serial.print (decod[4], DEC);
Serial.print (")\t");
Serial.print ("Boton Z= ");
Serial.print (decod[5], DEC);
Serial.print ("\t");
Serial.print ("Boton C= ");
Serial.print (decod[6], DEC);
Serial.print ("\t");
Serial.print ("\r\n");
}
void setup ()
{
if(ACTIVAR_SERIAL)
Serial.begin (VEL_SERIAL); // Inicia salida Serial
Wire.begin (); // Une el bus I2C con la dirección 0x52
inic_Nunchuk (); // Inicializa el Nunchuk
}
void loop ()
{
Wire.requestFrom (DIR_DISPOSITIVO, NUM_BYTES_RECIBIR); // Solicita datos del Nunchuk
while (Wire.available ()) // Mientras que bytes restantes sea >= 1
{
datos[cnt] = (Wire.receive ()); // Recibe un byte de información
cnt++;
}
if (cnt >= 5) // Si se han recibido 6 bytes, entonces jugamos con ellos
{
decodificar_Datos(); // Decodifica los datos y los hace manejables
if(ACTIVAR_SERIAL)
imprimir_Serial(); // Imprime datos por Serial
//------------------------------Código personalizado----------------------
//------------------------------------------------------------------------
}
cnt = 0;
pet_Datos (); // Envía la petición para recibir más bytes
delay (1000/FREC_ACTUALIZACION);
}
Donde se indica "Código personalizado" será donde nosotros podamos hacer lo que queramos con los datos leidos.
Y hasta aquí llegamos en el post, es un código básico. Libres estáis de ampliarlo.