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.