GRAFICANDO SEÑAL DEL ADC DE ARDUINO EN PROCESSING PARTE 1
En este tutorial veremos cómo graficar el voltaje leido por el adc de arduino en processing. Aquí usaremos la comunicación serial para mandar el valor de la conversión a processing para que se pueda graficar.
Aquí el truco consiste en ir leyendo y almacenando los valores en un array cuyo tamaño es igual al ancho de la pantalla creada en processing. Cada vez que llegue un nuevo valor desde arduino a processing iremos eliminando el el valor mas antiguo del array y almancenando en dicha posicion el valor actual. Esto hará que la gráfica se vaya desplazando.
El código en arduino se muestra a continuación:
void setup()
{
Serial.begin(9600);
}
void loop()
{
int valor=analogRead(A0);
Serial.println(valor);
}
El código en processing se muestra a continuación:
///////////////////////////////////////////////////////////
// TALLER DE ARDUINO 2014
// Grafica de una señal de voltaje
//////////////////////////////////////////////////////////
import processing.serial.*;
float adc0; //variable que almacena el valor del adc0 actual
float[] xvals; // arreglo que almacena los valores del adc0 de arduino
float voltaje; //variable que contiene el voltaje actual medido
Serial port; // creamos un objeto serial puerto
void setup()
{
size(400, 400); //frame de 400x400
// la longitud del arreglo sera el ancho del frame
xvals = new float[width];
// creamos una variable font y asignamos un tipo de font
PFont font;
font = loadFont("Arial-Black-30.vlw");
textFont(font); //cargamos el font a nuestro texto
///////////////////////////////////////////////////////
//defininimos parametros para la comunicacion serial
port = new Serial(this, "COM21", 9600);
port.bufferUntil('\n');
////////////////////////////////////////////////////
}
void draw()
{
background(0); //fondo negro
strokeWeight(2);
stroke(0,255,255);
//////////////////////////////////////////////////////////
// deplazamos a la izquierda nuestro arreglo //
// con el objetivo de introducir un nuevo valor al final//
//////////////////////////////////////////////////////////
for(int i=1;i<width;i++)
{
xvals[i-1]=xvals[i];
}
/////////////////////////////////////////////////////////
//graficamos la señal
//////////////////////////////////////////////////////////
for(int i=1;i<width;i++)
{
strokeWeight(5);
stroke(255,0,0);
point(i, height -xvals[i]);//invertimos
}
//nota: recordar que el eje y en processing es invertido
//por ello hay que hacer height-xvals
//////////////////////////////////////////////////////////
//mostramos los voltajes correspondientes a las señales
fill(255,255,0);
textAlign(CENTER);
text(voltaje+" VOLTIOS",200,320);
///////////////////////////////////////////////////////////
}
///////////////////////////////////////////////////////////
//////////////////EVENTO POR SERIAL////
///////////////////////////////////////////////////////////
void serialEvent (Serial port)
{
//leemos los datos hasta encontrar un '\n'
//almacenamos en string cadena
String cadena = port.readStringUntil('\n');
//si la cadena no esta vacia(es decir que recibio datos) entonces
if (cadena!= null)
{
//quitamos los espacios en blanco de la cadena en caso los tenga
cadena = trim(cadena);
float senal=float(cadena);
voltaje = map(senal, 0, 1023, 0, 5);
//mapeamos el valor leido del adc (0-1023) a la escala de nuestro frame
//los valors se mostraran en el ejey "y", asi que debemos escalar respecto a height
adc0 = map(senal, 0, 1023, 0, height);
}
//añadimos los nuevos valores que han llegado al final de arreglo
xvals[width-1]=adc0;
}
Aqui mostramos un video de lo que sería :