Graficar con Kst

.





Veamos la forma más sencilla (que he encontrado hasta ahora) de graficar datos recibidos de nuestro Arduino en "real time". Tiene la ventaja sobre excel, que está preparado para trabajar con gran cantidad de datos, ya que excel está limitado a 32.000 puntos en gráficos 2D.
Otra gran ventaja... es gratuito!! Se encuentra disponible para entorno Windows y Linux.

Para ello nos ayudaremos de dos softwares gratuitos:
Si se trabaja con linux, no se necesita Realterm, ya que se puede capturar directamente todo lo recibido por el puerto serie a un archivo.

 
Según la propia web: " Kst es la herramienta más rápida para graficar gran volumen de datos en real-time y con funcionalidades básicas para el análisis."
Gracias a KST, dispondremos de posibilidad de disponer varias vetanas, múltiples gráficas, PSD, zoom, histogramas, ...
Ejemplo demo de pantalla (extraido de la web de Kst):





La idea es:
1) Usar Realterm para capturar todo lo recibido por el puerto serie a un archivo de texto.
2) Plotear dicho archivo de texto con la ayuda de KST.

En Realterm sólo tenemos que abrir el puerto serie correnspondiente a nuestro Arduino.
Mi programa de ejemplo de Arduino, esta preparado para enviar datos de forma continua, cuando se recibe una "C" y detener el envio, cuando se recibe una "F".
 
 
--------- CÓDIGO ARDUINO ---------

extern volatile unsigned long timer0_overflow_count;
float fanalog0;
int analog0;
unsigned long tiempo;
byte serialByte;

void setup() {

   Serial.begin(9600);
   Serial.println("Empezamos...");
}

void loop() 
{

  while (Serial.available()>0){  
    serialByte=Serial.read();
    if (serialByte=='C'){        
      while(1){
        analog0=analogRead(0);
        // Convierto a milivoltios
        fanalog0=(analog0)*(5000.0/1023);
        // Recojo ticks del timer0 => 1 tick cada 4 us (usado en millis )
        tiempo=(timer0_overflow_count << 8) + TCNT0;
        // Convierto a us
        tiempo=tiempo*4;
        //Lo envio para simular archivo tipo *.csv
        Serial.print(tiempo);
        Serial.print(';',BYTE);
        Serial.println(fanalog0,DEC);
        if (Serial.available()>0){
          serialByte=Serial.read();
          if (serialByte=='F')  break;
        }
      }
    }
  }
}


--------- FIN DEL CODIGO ---------




Por lo que en la pestaña Send, le enviaremos el caracter ASCII => C
Veremos como empezamos a ver en la parte superior los datos recibidos.
Después en la pestaña Capture, seleccionar la ruta del archivo donde se capturan los datos y pulsamos Start Overwrite. Si Direct Capture está seleccionado, dejaremos de ver los datos recibidos (acelera el proceso).



(click sobre la imagen para ver en tamaño completo)


Ahora con el archivo creado y actualizandose con los datos recibidos, sólo nos queda irnos a Kst.
Alli, pulsamos sobre Data Wizard y elegimos la ruta donde se encuentra nuestro archivo.
En Configure, elegimos cual es nuestro limitador de columnas, en mi ejemplo " ; ".



(click sobre la imagen para ver en tamaño completo)

En las siguientes pantallas, configuramos que queremos crear una gráfica siendo X la primera columna (tiempo en us) e Y la segunda columna (mV entrada analógica 0).


Ya tenemos nuestro gráfico!!!  el cual se irá actualizando a la medida que se vayan recibiendo nuevos datos (hay un pequeño retraso, no es instantaneo).
A continuación, un ejemplo de una señal capturada de un potenciómetro, para realizar este pequeño tutorial.



(click sobre la imagen para ver en tamaño completo)


Podremos usar Kst para ver los datos en real-time ó abrir datos grabados anteriormente.
Veamos un video demostrativo:








Espero que sea de utilidad este mini-tutorial.


.

31 comentarios:

  1. Hola
    felicidades por esta buena iniciativa, Me preguntaba que version del kst has utilizado, pq la que he bajado no me permite seleccionar el archivo de datos, :-S

    ResponderEliminar
  2. Kst v2.0

    ¿Usas versión de linux o windows? Sólo he probado en win.

    Saludos

    ResponderEliminar
  3. hola como has hecho que el kst lea continuamente sin tocar nada?¿

    ResponderEliminar
  4. Excelente entrada.

    Estoy intentando capturar los datos del puerto serie en linux con la ayuda de ttylog, pero no consigo escribir en un archivo.

    Como lo haces tu?

    Gracias y un saludo

    ResponderEliminar
  5. yo ya e probado en linux y pues...funciona igual jeje por si alguien le interesa, me parece muy bien que ahora este esto en windows... jejeje sin discriminar claro =)... felicidades

    ResponderEliminar
  6. ¿Cómo puedo visualizar siempre los 20 últimos valores?
    No se cómo hacerlo, supongo que habrá que tocar en Edit Plot>Range y en expression, pero no se cómo se utilizan las expresiones, no me funciona nada de lo que pongo.

    Gracias!

    ResponderEliminar
  7. en linux como haces el archivo que va a leer kst??

    ResponderEliminar
    Respuestas
    1. Puedes pasarte por mi otro post => http://real2electronics.blogspot.co.uk/2011/09/arduino-adc-muestreo-alta-velocidad.html

      Eliminar
  8. Es un trabajo muy bueno el que estan haciendo muchachos.
    desde Verona - roberto
    info@termovisione.eu

    ResponderEliminar
  9. mil bendiciones para usted, gracias x compartir sus conocimientos, esto es de mucha ayuda y evita que utilice excel para cada proyecto de control de mis cursos de ingenieria, "el hombre es libre el conocimiento es libre"

    ResponderEliminar
  10. Hola, gracias por el aporte. La verdad soy nuevo en esto del Arduino. Pero tengo una duda, ¿para que funciona el while (1). Espero alguien me pueda ayudar. Gracias

    ResponderEliminar
    Respuestas
    1. Lo que hace es no salir nunca del while, ya que siempre la condicion es TRUE (1). Es decir, es un bucle infinito.

      Eliminar
  11. ME SALE ERROR EN EL BYTE

    Serial.print(';',BYTE);

    LA PALABRA CLAVE /BYTE/ NO ESTA SOPORTADA

    ayuda porfavor , necesito para un trabajo de la universidad

    ResponderEliminar
    Respuestas
    1. A partir de la versión 1.0, no está soportado BYTE. Puedes ojear la info en la web de Arduino sobre Serial.print y Serial.write.
      Saludos

      Igor

      Eliminar
    2. mismo error, no me resulta nada por eso :/

      Eliminar
    3. Descarga cualquier version de IDE Arduino que no comienze con 1, ejemplo: 1.0.3, 1.0.1, descargate cualquiera que sea 0022, 0023 etc... con esto solucionas el error del byte no soportado

      Eliminar
    4. Cambiándolo por Serial.write(';'); ya funciona ;)

      Eliminar
  12. me preguntaba si podria leer dos o mas valores por separado , por ejemplo dos o mas sensores . gracias

    ResponderEliminar
    Respuestas
    1. Si podrías, cada columna es un parámetro diferente.

      Eliminar
  13. Disculpa cómo se le puede hacer para que kst lea los datos continuamente como en tu video, ya que solo me grafica los datos que se encuentran en el txt al momento de crear el grafico, muchas gracias.

    ResponderEliminar
  14. Igor,

    Antes que nada felicitarte por tu excelente tutorial me ha servido mucho para el proyecto que estoy desarrollando, ya que puedo monitorear en linea la termocuplas que le he instalado a mi reactor para producir biogas. La unica pregunta que te haria y si los datos que grafico en tiempo real los puedo pasar a excel, gracias y saludos desde El Salvador.

    ResponderEliminar
    Respuestas
    1. Hola Carlos,

      Muchas gracias por sus comentarios.
      Si te fijas, estas grabando los datos en un fichero de texto (formato *.csv). Dicho archivo es el que "alimenta" la entrada de datos del KST. También podrías abrir dicho fichero con el Excel.
      Recomiendo también la lectura de mi otro post => http://real2electronics.blogspot.co.uk/2011/09/arduino-adc-muestreo-alta-velocidad.html

      Saludos,


      Igor

      Eliminar
    2. Hola Igor,

      Gracias por tu pronta respuesta, respecto a tu otro tutorial esta muy interesante y creo que dedicare mi tiempo libre a leer todos tus tutoriales ya que como ingenierio quimico no tengo muchos conocimientos en estos temas y por eso que te repito que fue de muchisima ayuda tu post de graficar en linea.

      Felicitaciones por tu trabajo y el de tus colaboradores.

      Saludos.

      Eliminar
  15. Gracias por tu tutorial podrias por favor poner un esquema de la conexión del arduino, y estoy usando arduino UNO.

    Gracias

    ResponderEliminar
  16. Hola amigo.

    Muy pero muy bueno tu tutorial. Explicas todo muy bien.

    Quisiera saber si hay alguna forma de hacer lo que tu haces con el Kst, pero conectando arduino a Matlab, y en especifico a Simulink.

    Lo que pasa es que al conectar arduino a simulink me genera muchos problemas y quisiera lograr un muestreo de alta velocidad en simulink, como tu lo haces con kst.

    Espero que me puedas ayudar...

    ResponderEliminar
  17. Hola,
    Estoy haciendo un datalog con un arduino uno y saco los datos con Realterm y KST en el ordenador. Al poco rato de empezar a crear los graficos en KST me aparece un mensaje que dice:

    "Error while reading ASCII file"
    "The file could not be read because not enough memory is available."
    "Try setting a file buffer limit in the configuration options."

    Que puede ser? como lo puedo solucionar?

    Gracias

    ResponderEliminar
  18. Hola. Muy buen post. Intente hacerlo, me grafica correctamente, pero no lo hace en tiempo real. solo se actualiza la grafica si apreto -stop capture- y luego -start append- desde el real term. Tenes ieda que puede sucederme?
    Desde ya gracias

    ResponderEliminar
    Respuestas
    1. Saludos, estoy igual que el comentario anterior como podria automatizar ese parametro

      Eliminar
    2. encontre tambien que el kst 2 ya no existe esa opcion de actualizacion automatica, viene un icon de un ciclo verde si quieres actualizar asi, solo que despues de un rato al parecer se satura y ya no funciona...

      un saludo

      Eliminar
  19. Hola, antes que todo muchas gracias por tan buen aporte.
    Mi pregunta es ¿en que parte del programa controlo los intervalos de muestro? ¿como puedo saber cuales son los pasos de muestro? ¿debo ocupar interrupciones internas (timmer de arduino) si es que quiero distintos intervalos de muestreo?
    Gracias de antemano.
    J. Garcia

    ResponderEliminar