Programación en Processing (Práctica)

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.

No hay comentarios:

Publicar un comentario