Gráficas en tiempo real: SimPlot (parte 1)

Para uno de mis proyectos requería una herramienta que me permitiera graficar los datos obtenidos a través del ADC del microcontrolador para poder caracterizar (y supervisar) a la planta de un proceso, que en este caso no es más que la temperatura interna del refrigerador de mi casa.

Tenía dos opciones: escribir mi propia herramienta, o buscar una que se adecuara a mis necesidades. Y como un golpe de suerte me encontré con SimPlot, una pequeña aplicación escrita en VisualBasic que recibe datos (de hasta cuatro canales) en forma serial y los imprime en la pantalla, y nada más. No obstante su simplicidad, es extremadamente útil.

Esta aplicación puede servir como punto de partida para un software más grande y ambicioso, por lo que  si alguien lo desea entonces puede descargar el código fuente para adaptarlo a sus preferencias y necesidades. En mi caso, y por el momento, sólo requiero las gráficas.

Los datos que deseamos graficar deben ser enviados por el puerto serial de la PC y deben seguir un protocolo específico, pero muy simple.

Configuración del puerto serial: Baud rate especificado por el usuario, 8 bits de datos, sin paridad, y 1 bit de stop; en mi caso utilicé 115200,8,N,1 (como nota al márgen, la página original de SimPlot no especifica nada acerca de los 8,N,1, pero dado que esa es la configuración que siempre uso, mágicamente todo funcionó a la primera, así que he asumido que esa es la configuración estándar).

Paquetes: Los datos que queremos graficar se envían por paquetes

|HEADER | SIZE | PAYLOAD| HEADER | SIZE | PAYLOAD|  HEADER | SIZE | PAYLOAD|…

HEADER: es el valor 0xCDAB

SIZE: es el tamaño en bytes del payload

PAYLOAD: son los datos (de cada canal) que realmente queremos graficar

Hay que tomar en cuenta que los tres campos anteriores son enteros de 16 bits sin signo en forma “little endian” (primero el byte menos significativo. P. ej. en el caso del valor 0xCDAB primero se transmite el ‘AB’ y luego el ‘CD’, ver la salida en la imagen más adelante). En un procesador de 8 bits el tamaño del entero es de 16 bits, así que no hay ningún problema; sin embargo, en un procesador de 32 bits habrá que indicarle al compilador que vamos a utilizar un “entero corto”:

short int bufer[16]; /* búfer de 16 "enteros  cortos" */

Lo anterior lo necesité ya que estoy trabajando con el microcontrolador LPC2129.

Un ejemplo simple

Notar que cada marca y modelo de microcontrolador se programa en forma diferente, por lo que  este ejemplo mostrará un pseudocódigo que indique los pasos necesarios, y cada lector deberá hacer las modificaciones pertinentes.

Supongamos que queremos graficar el canal 0 del ADC de nuestro micrcontrolador, entonces:

main() 
  short int bufer[6]; /*número de canales * 2 + 4*/;
  int val; 
  system_init(): 
  adc_init();
  uart_init(115200,8,N,1);
  for(;;){
    val=adc_read(0);
    bufer[0]=0xCDAB; /*header*/;
    bufer[1]=2; /* número de canales * 2 */
    bufer[2]=(short int) val; /*el valor leído en el canal 0 del ADC*/
    serial_write((uint8_t *)bufer, 6); /*transmite el paquete completo*/
    pause(100); /*un paquete se transmite, en mi caso, cada 100 ms*/
    }
}

La gráfica se ve así:

Y los datos, tal cual salen del microcontrolador, se ven así:

En la siguiente parte del tutorial mostraré cómo enviar más canales (hasta 4), y cómo se configura SimPlot.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s