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.
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.
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:
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