miércoles, 18 de noviembre de 2015

RECEPCIÓN DE DATOS POR PUERTO SERIAL Y GRAFICACIÓN EN MATLAB

Una de las formas que tienen las tarjetas arduino para comunicarse con otros dispositivos es mediante protocolo UART, la mayoría de tarjetas traen incorporado un circuito que convierte esos datos enviados por protocolo UART a protocolo RS232, esto lo hace emulando un puerto serial en el computador al cual se conecta la tarjeta.


Para esta práctica lo que se propone es tomar datos por medio de uno de los canales análogos de arduino y luego estos datos enviarlos por protocolo serial al computador, después de este proceso en el software MATLAB se establecerá la conexión con dicho puerto serial virtual para recibir los datos enviados por arduino y por último se procede a graficar los datos recibidos.


Lo primero que se necesita para realizar esta práctica es escribir el programa (Sketch) de arduino, en este programa se debe:

  • Configurar la comunicación serial.
  • Tomar un dato por uno de los canales análogos de arduino.
  • Enviar el dato por protocolo serial.
  • Dependiendo de la velocidad de muestreo que se requiera es necesario hacer un retardo en el programa.

Las líneas de programación del sketch para este proyecto se pueden ver a continuación.




Como se puede apreciar el programa que se realizo en arduino contiene muy pocas líneas, esto se hizo con el único fin de reducir la cantidad de procesos que debe realizar el arduino y con esto tener un poco mas de confianza al tener que determinar la velocidad de muestreo utilizada, aunque no va a ser exacta por la cantidad de procesos internos que lleva a cabo el microcontrolador si se puede aproximar la velocidad de muestreo al tiempo de retardo que se da entre cada muestra tomada.

El programa en MATLAB consta de una función que recibe el numero de muestras que el programa va a tomar para hacer la gráfica en el mismo instante que va recibiendo los datos desde la tarjeta de arduino. A continuación se van a mostrar y explicar partes de la función escrita en MATLAB:


Se declara la función con el nombre ADC_Serial y entre los paréntesis el nombre de la variable que va a recibir el número de muestras que el usuario requiere tomar. Esta función luego será llamada desde el Command Window de MATLAB con el nombre de la función y el número de muestras a tomar, por ejemplo para tomar 500 muestras se debería escribir lo siguiente:




En las siguientes líneas lo que se hace es borrar cualquier rastro anterior que quede en el puerto COM que se vaya a utilizar, esto se hace borrando por completo el puerto, luego se vuelve a crear un nuevo puerto COM, se declara la velocidad en baudios a la que se va a realizar la comunicación y por último se abre ese puerto que se acaba de crear.






Es importante tener en cuenta que el nombre del puerto depende de cómo lo haya nombrado su computador al momento de conectar la tarjeta arduino, si quieren revisar lo pueden hacer desde el administrador de dispositivos de su computador y luego buscar puertos COM y LPT.


En las siguientes líneas lo que se hace es configurar la ventana en la cual se va a mostrar la grafica resultado, por lo tanto se le da un nombre a la ventana, títulos tanto de la gráfica como de los ejes, entre otros parámetros.






Lo siguiente es crear un ciclo con el cual se van a ir tomando una a una las muestras enviadas por el arduino, además de eso se hace la conversión del valor entregado por el ADC de arduino a un valor de voltaje y por último se realiza la grafica del voltaje.



El método utilizado para graficar y que se acaba de mostrar en las líneas anteriores puede llegar a ser nocivo cuando se requieren tomar un número demasiado elevado de muestras, esto es debido a que al estar tomando datos y graficando cada una de esas muestras en cada ingreso al ciclo, se puede crear una sobrecarga del equipo y puede empezar a mostrar fallos. Por lo tanto si no desean mostrar la grafica “En tiempo real” si no que prefieren primero tomar todos los datos y luego de terminar este proceso si graficar, pueden eliminar del ciclo la línea que grafica la señal y la pueden colocar fuera del ciclo justo al terminar este.

Lo último que se hace dentro de esta función creada en MATLAB es cerrar y borrar el puerto mediante los comandos fclose y delete tal como se puede ver a continuación.


En el siguiente link pueden descargar y observar más detenidamente la función escrita en MATLAB debidamente comentada.


El resultado de esta práctica lo pueden observar a continuación.


Graficar dos  señales


Hasta el momento solo se ha mostrado y explicado como graficar una sola señal enviada desde un dispositivo electrónico (Arduino, Pic, Psoc, etc) hacia el computador, ¿Pero qué pasa cuando se requiere graficar más de una señal?, ¿Qué hay que cambiar en el código para graficar mas señales?

A continuación se va a mostrar el procedimiento para poder graficar dos señales, procedimiento que en realidad es muy sencillo y que bastará solamente con modificar una de las líneas del código que ya se ha explicado anteriormente y agregar un par de ciclos.

El comando que se encarga de tomar los datos enviados desde el dispositivo externo es el fscanf, con este comando se puede tomar más de un dato a la vez, por lo tanto la línea de código en la que se encuentra este comando es la que se va a tener que modificar para poder recibir datos de mas señales y posteriormente poder graficar más de una señal.

Hasta ahora la línea de código se encuentra como se observa en la siguiente imagen:


El comando fscanf recibe como parámetros el puerto por el que se van a recibir los datos y el tipo de datos que va a recibir, para este caso el ‘%d’ significa que va a recibir un dato de tipo entero, entonces lo que habría que hacer es indicarle a MATLAB que se va a recibir otro dato y su respectivo tipo, por lo tanto si se quieren recibir dos datos enteros la línea de código quedaría como a se muestra a continuación.


Al escribir ‘%d%d’ se indica que se van a recibir dos datos de tipo entero que corresponderían a dos valores de dos señales diferentes, con este simple cambio ya se tendrían los datos requeridos para poder graficar las dos señales.

Sin embargo hay que tener en cuenta que esos datos estarían quedando guardados de forma intercalada dentro del mismo vector, por lo tanto es recomendable antes de realizar la gráfica separar los datos en un vector diferente para cada señal, eso se puede lograr haciendo dos ciclos for uno para que guarde los valores de las casillas impares (Señal1) y otro para que guarde los valores de las casilla pares (Señal 2). 



Luego de haber realizado estos ciclos para separar los valores de las dos señales en dos vectores diferentes si se puede proceder a graficar por medio del comando plot.

Donde vectorM es una variable que contiene los números desde el 1 hasta el números de muestras que se van a mostrar en el eje X, voltaje1 y voltaje2 son las dos señales que se quieren graficar.

Luego de realizar este proceso ya se pueden observar los resultados de la gráfica de las dos señales adquiridas.



IMPORTANTE TENER EN CUENTA


  • Como en cada muestra se van a tomar dos valores (uno de cada señal), el numero de muestras que se va a tomar por cada señal va a disminuir a la mitad respecto a las que se indican cuando se llama a la función en MATLAB, por lo tanto si se requiere tomar 1000 muestras de cada señal, cuando se vaya a hacer el llamado a la función se tiene que especificar que se van a tomar 2000 muestras.

  • No se recomienda realizar el proceso de “Grafica en tiempo real” ya que al estar tomando más datos, requiere un mayor esfuerzo de la maquina y pueden llegar a presentarse retardos en la adquisición y graficación y posteriores fallos en los resultados, por lo tanto se recomienda primero tomar todos los datos que se requieran y luego de esto si graficar al final en un solo proceso.

  • El archivo de programación de Arduino, Pic o el dispositivo que vayan a utilizar para enviar los datos hacia el computador, también varia pero lo único que tienen que cambiar es que envíe un dato más por el puerto serial.


Si quieren descargar los archivos de MATLAB y Arduino para este ejercicio de tomar datos y graficar dos señales (completamente comentados), pueden hacerlo en los siguientes links:




Otra opción que pueden tomar si quieren capturar y graficar los datos con MATLAB es utilizar la herramienta Simulink, este proceso es mucho mas sencillo que el descrito en esta publicación, así que si les interesa este método con simulink, pueden seguir el siguiente link donde les explicamos como hacerlo.


TOMAR DATOS POR PUERTO SERIAL COM Y GRAFICAR CON SIMULINK DE MATLAB