TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
30 de Octubre de 2014, 11:23:21

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
350482 Mensajes en 39328 Temas por 41073 Usuarios
Último usuario: rodo555
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Misceláneas - Interés General
| |-+  Off Topic (Moderadores: Azicuetano, xocas, aitopes)
| | |-+  programa para graficar señales [pedido]
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] 2 Marcar como favorito Imprimir
Autor Tema: programa para graficar señales [pedido]  (Leído 5110 veces)
gera
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 2136



« : 18 de Mayo de 2009, 23:49:35 »

Buenas amigos!!!
Alguien conoce algun programa simple para graficar señales en tiempo real q entren por el puerto serie (o usb cdc)?? preferentemente en linux, pero si no no importa.
Se que podria usar matlab o labview, pero son programas pesadisimos y q requieren algo de conocimiento, el cual no tengo Sad
Lo necesito para ver la señal de un acelerometro.
Muchas gracias!!!
En línea


"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein
alexysar
PIC16
***
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 206



WWW
« Respuesta #1 : 19 de Mayo de 2009, 11:39:33 »

En linux lo más facil ( aunque trabajoso), es hacerte la aplicación vos. Lo podes hacer en los lenguajes tipicos de linux como C ó Perl

En c una idea que se me ocurre, es algo asi:

Código
GeSHi (c):
  1. main()
  2. {
  3. fd=open("\dev\tty",RD_ONLY);
  4.  
  5. do{
  6. n=read(fd,bufer_serie,1);
  7. graficar(bufer_serie);
  8.  
  9. }while(*bufer_serie!=EOF);
  10.  
  11.  
  12. }

fijate que es sencillo leer el puerto serie, ahora lo más dificil viene a la hora de graficar. Una función sencilla que se me ocurre, aunque no gráfica, imprime en la consola el valor del puerto seria asi:

Código
GeSHi (c):
  1. void graficar(char *bufer_serie)
  2. {
  3. printf("%x ",bufer_serie[0]);
  4. }
  5.  

Si vos lo queres graficar en tiempo real, si o si, podes usar x-cursore para graficar en una consola. Este tema lo explican en la guia GULP de linux para C que se consigue en internet.
Otra opción aunque no es en tiempo real seria mandar todo el bufer a un archivo y luego graficarlo con openoffice planilla de calculos, con el diagrama de barras por ej.

Algo mucho más facil e inmediato es bajarte el free-serial-port-monitor que se consigue en internet pero no es para linux (que yo sepa). Esta aplicación no grafica pero te muestra los datos que ingresan por el puerto serie en hexa ( algo parecido a la idea de la función que te pase de linux). Si no es en tiempo real, podes graficarlas con Excel.

Lo más profesional, como vos decis, es  Matlab. Seguramente hay otras aplicaciones comerciales que hagan lo mismo pero es mejor aprender Matlab ( no es tan dificil como parece) y tine aplicaciones muy diversas en ingenieria.

Nota: El programa que te pase es solo una idea, ni siquiera probe si compila( de hecho no compila porque no puse ni los includes, ni la iniciación de variables), pero te sirve para seguir la idea.
« Última modificación: 19 de Mayo de 2009, 11:53:22 por alexysar » En línea
gera
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 2136



« Respuesta #2 : 19 de Mayo de 2009, 12:44:53 »

Gracias alexysar!!!
Tendria q ver si puedo hacer una llamada a gnuplot para q me grafique los datos q voy recolectando... pero dudo q pueda hacerlo en tiempo real ya q le tengo q pasar como parametro una funcion o un archivo entero.
Me parece q lo mas facil por ahora es entrarle al matlab. Pasa q el profe q nos dio eso el año pasado no se lucio mucho y bueh... pero no es nada q un buen tutorial o guia no pueda resolver jaja.
saludos!!
En línea


"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein
cerebro
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 734


NO A LAS PAPELERAS!


« Respuesta #3 : 19 de Mayo de 2009, 13:27:27 »

 Confused....
Esta bueno utilizar Matlab si vas a procesar los datos en la pc si vos querés visualizarlo a pesar de ser muy fácil de utilizar yo optaría por hacer mi propia aplicación.
yo lo he realizado con builder (borland c++) para eso utilice
http://www.activexperts.com/activcomport/
pegale una hojeada  wink
En línea

LAS MALVINAS SON ARGENTINAS!
IAO
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Venezuela Venezuela

Mensajes: 694



« Respuesta #4 : 24 de Mayo de 2009, 08:44:54 »

Hola....

Mira yo conseguí uno que se llama DynaPlot3, te digo que funciona bien
pero hay que saber como llamar sus funciones que me enredó un poco.

Es un .ocx, trae ejemplos VB6, .Net, C#, Delphi, VC6 y otros.....

Espero te sirva....
En línea

"No hay caminos para lograr la PAZ. La PAZ es el camino"... (Mahatma Gandhi).
Mentes Superiores discuten Ideas, Proyectos. Mentes Promedio discuten Acontecimientos y Sucesos. Mentes Pobres discuten sobre Personas.
marito
PIC16
***
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 217



« Respuesta #5 : 31 de Mayo de 2012, 21:04:08 »

Hola Gera! Conseguiste programa para graficar las señales del puerto serie?

Yo consegui un programita de parallax que grafica en una planillla de excel, pero no logro que me funcione en windows 7.

Necesitaría usar un programita para ajustar las mediciones que estoy haciendo con un giróscopo y un acelerómetro.

En línea
rivale
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Mexico Mexico

Mensajes: 1662


Rivale


« Respuesta #6 : 31 de Mayo de 2012, 22:26:56 »

marito, porque no usas la terminal "octopus" del amigo LAbmouse

http://www.todopic.com.ar/foros/index.php?topic=38196.0
http://www.todopic.com.ar/foros/index.php?topic=35482.0
En línea

"Nada es imposible, no si puedes imaginarlo"
gera
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 2136



« Respuesta #7 : 31 de Mayo de 2012, 23:25:21 »

Marito, al final me hice yo mismo un programita en processing. Tengo dos, uno que grafica la curva en funcion del tiempo, y otro que grafica la inclinacion mostrando unos rectangulos.
Si sabes usar processing, puedo mandarte los sketchs.
Saludos!!
En línea


"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein
rivale
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Mexico Mexico

Mensajes: 1662


Rivale


« Respuesta #8 : 31 de Mayo de 2012, 23:29:48 »

Con permiso de Gera, te pongo el programa que hizo wink
http://www.todopic.com.ar/foros/index.php?topic=35513.msg295919#msg295919.

creo que te serviria para probar tu filtrado del angulo
En línea

"Nada es imposible, no si puedes imaginarlo"
marito
PIC16
***
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 217



« Respuesta #9 : 01 de Junio de 2012, 09:15:01 »

Rivale, Gera muchas gracias por sus respuestas!

Rivale, en el octoplus se pueden graficar flotantes? porque estaba leyendo que recibe datos de 8 bits.

Gera, estoy buscando información a ver si me pongo a aprender processing. De igual manera tengo que focalizar en la medición con el giro y el acelerómetro, pero voy a ir viendo algo
En línea
rivale
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Mexico Mexico

Mensajes: 1662


Rivale


« Respuesta #10 : 01 de Junio de 2012, 11:40:49 »

solo acepta variables de 8 bits, pero quizas podrias escalar tu angulo para que 0 sea el angulo menor y 255 sea el angulo mayor
En línea

"Nada es imposible, no si puedes imaginarlo"
marito
PIC16
***
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 217



« Respuesta #11 : 01 de Junio de 2012, 11:57:27 »

creo que perdería resolución.

Estoy viendo el otro link con el terminal echo en labview, creo que ese permite flotantes y voy a poder hacer un ajuste más fino. Usaste ese programita?
En línea
gera
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 2136



« Respuesta #12 : 01 de Junio de 2012, 12:21:27 »

Labview es una muy buena opcion. Yo opte por processing porque soy usuario de linux.
Processing es muy facil de usar, si sabes Java (o C en su defecto) te va a resultar muy familiar el lenguaje. Te podes bajar el IDE/compilador de processing.org. No hace falta instalacion ni nada. Esta es una version vieja del programa que uso para calibrar los sensores:


Recibe tres numeros (flotantes o enteros) separados por coma con un salto de linea al final. Tambien tengo un programa que grafica las 3 curvas en el tiempo.
En línea


"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein
marito
PIC16
***
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 217



« Respuesta #13 : 01 de Junio de 2012, 12:41:04 »

Buenísimo esa aplicación! Voy a descargar el processing.

Me podrías enviar la aplicación? Así empiezo con esa a modo de ejemplo

P.D. que señal usaste para el robot??? La azul!!!???
En línea
marito
PIC16
***
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 217



« Respuesta #14 : 02 de Junio de 2012, 13:02:23 »

Hola Gera!

Ya estoy usando el processing. Lo que quiero hacer es recibir señales del puerto serie. El tipo de datos es flotante, pero para comenzar estoy mandando un entero. Leyendo el dato desde un terminal, el dato llega de manera correcta, pero en el processing no puedo leer el dato. El código de mi sketch es el que sigue:

Código:
import processing.serial.*;
Serial puerto;
int dato;

void setup() {
   puerto = new Serial(this, Serial.list()[0], 56000);
   
}

void serialEvent(Serial puerto)
{
 dato = puerto.read();
 }



void draw(){
 
println(dato);

}

En el terminal recibo el dato 171, pero en el processing leo el dato 32. Cual puede ser mi problema?
En línea
gera
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 2136



« Respuesta #15 : 02 de Junio de 2012, 14:16:28 »

Marito, lo que pasa es q por el puerto serie tenes q enviar el dato codificado en ascii como una cadena, luego en processing lo lees y lo convertis al tipo de dato q quieras (entero, flotante..).
Te paso mi programa en processing:
Código:
import processing.serial.*;
Serial myPort;  // The serial port

float acc_angle=0;
float gyro_angle=0;
float angle=0;

void setup()
{
  size(650,300);
  println(Serial.list());
  myPort = new Serial(this, Serial.list()[0], 9600);
  myPort.write("m\r");
}


void draw ()
{
  while (myPort.available() > 0)
  {
    String recibido = myPort.readStringUntil('\n');
    if (recibido != null)
    {
      float[] val = float(split(recibido,","));
      drawGraph(val);
    }
  }
}

void drawGraph(float[] val)
{
  float x_acc = (val[0]-513)/97;
  float y_acc = (val[1]-500)/105;
  float z_acc = -(val[2]-511)/103;
  float gyro = -(val[3]-455)/67; //*0.015;
  float dt=0.1;
 
  acc_angle = atan(z_acc/y_acc);
  gyro_angle += gyro * dt;
 
  angle = (0.95)*(angle + gyro * dt) + (0.05)*(acc_angle);

 
  stroke(0);
  background(255);
  rectMode(CENTER);
  textSize(14);
 
  pushMatrix();
    fill(255,100,100);
    translate(100, 200);
    text("acc angle = " + degrees(acc_angle) + "º" ,-90,-100);
    rotate(acc_angle);
    rect(0, 0, 100, 30);
  popMatrix();

  pushMatrix();
    fill(100,255,100);
    translate(300, 200);
    text("gyro angle = " + degrees(gyro_angle) + "º" ,-90,-100);
    rotate(gyro_angle);
    rect(0, 0, 100, 30);
  popMatrix();

  pushMatrix();
    fill(100,100,255);
    translate(500, 200);
    text("filtered angle = " + degrees(angle) + "º" ,-90,-100);
    rotate(angle);
    rect(0, 0, 100, 30);
  popMatrix();
 

  /*strokeWeight(10);
  line(width/2 , height/2 +100, width/2 + v.x , height/2 + v.y +100);*/
}

En el pic tengo un programa que envia las lecturas del acelerometro y gyro sin procesar en este formato:
Código:
printf("%li,%li,%li,%li,%li,\n",val[0],val[1],val[2],val[3],val[4]);

Estoy mandando 5 enteros porq el ADC convierte a valores enteros, pero podes enviar flotantes tranquilamente, fijate en el codigo de processing que convierte todo a flotante en esta linea:
Código:
float[] val = float(split(recibido,","));

Aca va otro programa similar, pero que grafica en funcion del tiempo:
Código:
import processing.serial.*;
Serial myPort;  // The serial port
int i = 0;      // counter


void setup()
{
  size(800, 600);       
  println(Serial.list());
  myPort = new Serial(this, Serial.list()[0], 9600); // Serial.list()[0] modify that number if don't works
  background(255,255,255);
 
  //myPort.write(83);
}


void draw ()
{
  while (myPort.available() > 0)
  {
    String a0 = myPort.readStringUntil('\n');
   
    if (a0!=null)
    {
      float[] val = float(split (a0, ","));
      //println (val[0] + "," + val[1] + "," + val[2]);
      drawGraph_accel(val[0]*100,val[1]*100,val[2]*100);  //100 is a scale factor
    }
  }
}

void drawGraph_accel (float d_ax, float d_vx, float d_px)
{
  stroke(255,0,0,70);
  line(i, height/4, i, height/4 - d_ax);
  stroke(0,0,255,70);
  line(i, height/4*2, i, height/4*2 - d_vx);
  stroke(0,255,0,70);
  line(i, height/4*3, i, height/4*3 - d_px);
 
  if (i >= width-2)
  {
    i = 0;
    background(255,255,255);
  }
  else
  {
    i++;
  }
}

Podes modificar el programa a tu gusto para q se adapte a tus necesidades. cualquier duda avisame.
Saludos!
En línea


"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein
marito
PIC16
***
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 217



« Respuesta #16 : 02 de Junio de 2012, 19:34:06 »

Gera muchas gracias por tu excelente explicación!

El %Li es para transmitir valores enteros en acsii?

Como haces la conversión de entero o flotante a acsii?

Como se definen variables acsii?
« Última modificación: 02 de Junio de 2012, 19:41:34 por marito » En línea
gera
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 2136



« Respuesta #17 : 02 de Junio de 2012, 20:17:56 »

Marito, el printf se encarga de convertir los valores. %li es para imprimir enteros largos (long int). Si la variable que queres imprimir es un flotante, tenes que usar %f.
En línea


"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein
marito
PIC16
***
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 217



« Respuesta #18 : 03 de Junio de 2012, 11:10:18 »

Ah! Para enteros largos yo tengo que usar %lu, enteros %u y flotantes %f.

Para la prueba que estoy haciendo, estoy enviando un entero (%u) ya que por lo que leí en la ayuda de processing, se reciben enteros (16bits - 0..255) desde el puerto serie. Pero enviando el entero 171 desde mi pic con la instrucción:

Código:
printf(" %u ", datoentero);

Recibo un 32 en el processing con el comando

 
Código:
dato = puerto.read();

En línea
gera
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 2136



« Respuesta #19 : 03 de Junio de 2012, 13:19:39 »

Es que lo estas leyendo mal.  Lo que hace read() es leer un solo caracter, cuando tu dato tiene 3 caracteres. Ademas lee ese dato como un entero, y tendrias q leerlo como cadena. La funcion que tenes q usar es readStringUntil().
Aca te dejo la referencia de ambas:
http://processing.org/reference/libraries/serial/Serial_read_.html
http://processing.org/reference/libraries/serial/Serial_readStringUntil_.html

En tu cadena tenes q poner un salto de linea al final (un punto o algo), entonces a readStringUntil() le pasa como parametro ese caracter para que sepa que ahi termina el dato. En el pic haces:
Código:
printf("%u\n",datoentero);

Y en processing
Código:
String myString = null;
...
myString = myPort.readStringUntil(lf);

Saludos!
En línea


"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein
TODOPIC
   

 En línea
Páginas: [1] 2 Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.20 | SMF © 2006-2008, Simple Machines XHTML 1.0 válido! CSS válido!
Página creada en 1.336 segundos con 23 consultas.