Ya explicada la parte teórica, continuaremos con el desarrollo de una aplicación gráfica en Processing para ver visualmente los datos del Nunchuk.


Podemos visualizar el código con formato y número de líneas en:

/*
   Arduino + Nunchuk + Processing
  
   Ejemplo de lectura de datos desde Arduino + Nunchuk con Processing en tiempo real.
  
   www.proyectonoa.blogspot.com
  
   Jorge Torregrosa. 2011
  
*/


import processing.serial.*;

Serial puerto;         
byte[] inBuffer=new byte[7];           // Array de datos sin normalizar
int[] datos=new int[7];                // Array de datos normalizados

PFont fontA;                           // Fuente a utilizar

void serialEvent(Serial puerto){
  puerto.readBytes(inBuffer);          // Vuelca el contenido del buffer en "inBuffer"
  puerto.clear();                      // Limpia el buffer
  normalizarBytes();                   // Normaliza los bytes que recibimos por serial
  normalizarStick();                   // Normaliza los datos del stick
}

void normalizarBytes(){
  for (int i=0;i<7;i++)
  {
    if (inBuffer[i]<0)
    {
      datos[i]=inBuffer[i]+256;
    }
    else
    {
      datos[i]=inBuffer[i];
    }
  }
}

void normalizarStick(){
  if (datos[0]>132 || datos[0]<132)
  {
    datos[0]=datos[0]-132;         // 132 es la posición de equilibrio de mi stick en eje X. Puede variar.
  }
  else
  {
    datos[0]=0;
  }

  if (datos[1]>119 || datos[1]<119)
  {
    datos[1]=datos[1]-119;      // 119 es la posición de equilibrio de mi stick en eje X. Puede variar.
  }
  else
  {
    datos[1]=0;
  }
}

void setup(){
  size(600, 500, JAVA2D);                      // Tamaño de la ventana

  String portName = Serial.list()[1];          // Nombre del puerto Serial
  puerto = new Serial(this, portName, 9600);   // Establece puerto Serial y velocidad de transmisión
  puerto.bufferUntil('\n');                    // Almacena datos en el buffer a partir de recibir un '\n'

  fontA=loadFont("Aharoni-Bold-20.vlw");       // Carga la fuente
  textFont(fontA, 20);                         // Establece fuente por defecto y el tamaño
  textAlign(CENTER);                           // establece la referencia del texto en el centro de este
}

void draw() {
  background(#4B49A0);                // Cambia color de fondo
  smooth();                           // Habilita suavizado de formas
 
  fill(#FFFFFF);                      // Establece color de relleno      

  rect(15, 15, 570, 470);             // Cuadro de fondo


  rect(75, 400, 24, -datos[2]);       // Gráfico aceleración eje X
  rect(115, 400, 24, -datos[3]);      // Gráfico aceleración eje Y
  rect(155, 400, 24, -datos[4]);      // Gráfico aceleración eje Z


  if (datos[5]==1)
    fill(#000000);
  rect(460, 360, 45, 35);             // Botón Z
  fill(#FFFFFF);

  if (datos[6]==1)
    fill(#000000);
  ellipse(482, 330, 35, 30);          // Botón C
  fill(#FFFFFF);

  ellipse(325, 350, 100, 100);        // Circunferencia stick
  fill(#000000);
  ellipse(325+0.35*datos[0], 350-0.35*datos[1], 25, 25);    // Círculo posición stick


  // TEXTOS

  text("c", 482, 335);
  text("z", 482, 383);

  text(datos[2], 87, 415);
  text(datos[3], 127, 415);
  text(datos[4], 167, 415);

  text("x", 87, 450);
  text("y", 127, 450);
  text("z", 167, 450);

  text("( " + datos[0] + " , " + datos[1] + " )", 325, 420);

  textFont(fontA, 40);
  text("Proyecto NOA", 300, 100);
  textFont(fontA, 15);
  text("www.proyectonoa.blogspot.com", 300, 150);
  textFont(fontA, 20);
}


En el siguiente post haremos una demostración en video de la aplicación.
edit post