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.






El código lo podemos encontrar también con formato y número de líneas en:




/*  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. 
edit post