Tutorial - Graficación de funciones (Primera parte)

Usaremos como referencia un tutorial anterior (ver el siguiente link: "Comunicación serial (Primera parte)"), vamos a leer el valor de la resistencia de un potenciómetro conectado al pin A0 de Arduino. Éstos datos se van a mostrar a través de Processing usando una librería graficadora para mostrar los datos usando dos ejes Y y X tal como sería el caso de una función.

La conexión es la siguiente:
# PIN A0 : Arduino UNO => PIN CENTRAL : Potenciómetro
# GND : Arduino UNO => EXTREMO : Potenciómetro
# 5V : Arduino UNO => EXTREMO : Potenciómetro

El programa usado para el Arduino es el que se muestra:
/* PROGRAMA DE PRUEBA DE COMUNICACION SERIAL
   CONEXION:
             Arduino (A0) : Pin central potenciometro
             Arduino (GND): Pin extremo potenciometro
             Arduino (5V) : Pin extremo potenciometro
   
   El siguiente programa nos ayuda a realizar la lectura del votlaje del potenciometro y mostrarlo por puerto serial.
   
   Autor: Carolina G.
   http://beetlecraft.blogspot.pe/
  
   El siguiente programa es de uso publico, cualquier modificacion o mal uso del mismo que pudiera ocasionar el mal funcionamiento
   de la plataforma de uso de la misma no es responsabilidad del autor
*/
int sensor = 0; // Indica el pin de entrada analogico
int val = 0;    // Variable de almacenamiento del valor del potenciometro

void setup() {
  Serial.begin(9600); // Inicia el Puerto Serial
}

void loop() {
  val = analogRead(sensor) / 4; // Lee el valor del potenciometro y lo convierte en 1 byte (0 a 255)
  Serial.write(val);            // Envia la variable al puerto serial
  delay(100);                   // Espera 100 milisegundos
}
Al abrir el Monitor Serial de Arduino obtenemos el siguiente resultado:


La librería que buscaremos es "gwoptics", para ello, debemos la buscaremos en "Sketch - Import library - Add library" para saber un poco más puede entrar al siguiente link "Descargar librerías en Processing".


Luego damos click en "Install".


Esperamos que la librería se descargue.


El programa que usaremos en Processing es el siguiente:
/* 
   PROGRAMA PARA GRAFICACION CON PROCESSING
   CONEXION:
             Arduino (A0) : Pin central potenciometro
             Arduino (GND): Pin extremo potenciometro
             Arduino (5V) : Pin extremo potenciometro
    
   El siguiente programa nos ayuda a realizar la lectura del voltaje del potenciometro. 
   El sketch de graficos usa cadenas en código ASCII desde el puerto serial a 9600 baud y 
   la grafica. Debe recibir valores de 0 a 255 y luego pasar a una nueva línea
 
   Autor: Carolina G.
   http://beetlecraft.blogspot.pe/
   
   El siguiente programa es de uso publico, cualquier modificacion o mal uso del mismo que 
   pudiera ocasionar el mal funcionamiento de la plataforma de uso de la misma no es 
   responsabilidad del autor
*/
 
// Configuracion de la libreria de Graph2D
import org.gwoptics.graphics.graph2D.Graph2D;
import org.gwoptics.graphics.graph2D.LabelPos;
import org.gwoptics.graphics.graph2D.traces.Line2DTrace;
import org.gwoptics.graphics.graph2D.traces.ILine2DEquation;

Graph2D g; // Creacion del objeto para Graph 2D

import processing.serial.*; // libreria para uso de puerto serial

Serial puerto; // El puerto serial
int xPos = 70; // Posicion horizontal del grafico
float val;     // Data que se recibe del puerto serial, tipo float

void setup () {
  size(500, 370);  // Tamano de la pantalla
  background(100); // Color de la pantalla de fondo
  
  String ArduinoPuerto = Serial.list()[0];        // Encuentra el primer puerto serial para iniciar la comunicacion
  puerto = new Serial(this, ArduinoPuerto, 9600); // Inicio de la comunicacion con el primer puerto encontrado

  g = new Graph2D(this, 400, 300, false); 
  
  // Definicion de los ejes Y y X
  g.setYAxisMin(0); // Valor minimo del eje Y
  g.setYAxisMax(5); // Valor maximo del eje Y
  g.setYAxisLabel("Voltaje"); // Rotulado del eje Y
  
  g.setXAxisMin(0);  // Valor minimo del eje X
  g.setXAxisMax(5); // Valor maximo del eje X
  g.setXAxisLabel("Tiempo"); // Rotulado del eje X

  g.setXAxisTickSpacing(0.5); // Resolucion del espaciamiento del eje X
  g.setYAxisTickSpacing(0.5); // Resolucion del espaciamiento del eje Y
  
  g.position.x = 70; // Offset del eje X
  g.position.y = 20; // Offset del eje Y
}
 
void draw () {
  lectura(); // Rutina de adquisicion de datos del potenciometro
  
  float val_mod = val; // Modificacion del dato leido
  val_mod = 50 + (350 - 50)/(5 - 0) * val_mod; // Extrapolacion lineal para poder ubicar el grafico
  
  println("Valor del potenciometro: " + val); // Muestra el dato en el puerto serial
  println("Valor modificado: " + val_mod);    // Muestra el dato en el puerto serial modificado
  
  g.draw(); // Graficacion de los ejes
  stroke(24, 237, 235); // Color de la linea 
  
  // Tipos de graficaciones
  // line(xPos, height - val_mod, xPos, height - 50); // Dibuja la linea
  // point(xPos, height - val_mod); // Dibuja puntos
  // ellipse(xPos, height - val_mod, 0.5, 0.5); // Dibuja por elipses
  
  println("Valor modificado: " + val_mod); // Muestra el dato en el puerto serial modificado
  
  if (xPos >= 470) { // Verifica que hemos llegado al limite de pantalla
    xPos = 70;       // Reseteo de la posicion a la posicion inicial
    background(100); // Fondo de pantalla
  } 
  else { xPos++; } // Nos movemos en la posicion horizontal 
}

void lectura() {
  if (puerto.available() > 0) {   // Si hay datos en el buffer del puerto serial
    val = puerto.read();          // Lectura de los datos del puerto serial
    val = map(val, 0, 255, 0, 5); // Conversion del valor leido
  }
}
El primer resultado es el siguiente:


Si quitamos "//" a la línea siguiente:
  // Tipos de graficaciones
  line(xPos, height - val_mod, xPos, height - 50); // Dibuja la linea
  // point(xPos, height - val_mod); // Dibuja puntos
  // ellipse(xPos, height - val_mod, 0.5, 0.5); // Dibuja por elipses
El resultado es:


Si quitamos "//" a la línea siguiente:
  // Tipos de graficaciones
  // line(xPos, height - val_mod, xPos, height - 50); // Dibuja la linea
  point(xPos, height - val_mod); // Dibuja puntos
  // ellipse(xPos, height - val_mod, 0.5, 0.5); // Dibuja por elipses
El resultado es:


Si quitamos "//" a la línea siguiente:
  // Tipos de graficaciones
  // line(xPos, height - val_mod, xPos, height - 50); // Dibuja la linea
  // point(xPos, height - val_mod); // Dibuja puntos
  ellipse(xPos, height - val_mod, 0.5, 0.5); // Dibuja por elipses
El resultado es:


Autor: 

No hay comentarios:

Publicar un comentario