Está en la página 1de 5

30/11/13

Arduino + Matlab: adquisicin de datos

We choose the Moon


Ingeniera aplicada incluso a cosas a las que probablemente no debera aplicarse.
Acerca de Bio El equipo

Engineers like to solve problems. If there are no problems handily available, they will create their own problems.
~ Scott Adams

Arduino + Matlab: adquisicin de datos


Jorge Garca Tscar Viernes, 15 de julio de 2011 A la hora de empezar con cualquier proyecto de aplicacin prctica, una de las cuestiones principales suele ser enlazar la parte terica (hbilmente trabajosamente programada en nuestro entorno informtico preferido) como algoritmos de tratamiento de datos, sistemas de control automtico, etc., con el mundo real. Hasta no hace mucho, la nica manera de poder trabajar con datos fsicos consista en atracar una gasolinera y adquirir un sistema comercial de adquisicin de datos (DAQ) como los de National Instruments; afortunadamente hoy en da hay alternativas uno o dos rdenes de magnitud ms asequibles: una de ellas es el popular microcontrolador Arduino. Uno de los ejemplos ms bsicos consiste en leer datos de un sensor conectado al Arduino y transmitirlos al PC mediante comunicacin serie; sin embargo, este ejemplo tiene dos limitaciones: se limita a un nico sensor y los datos se leen numricamente en pantalla, pero no es posible adquirirlos ni trabajar con ellos. Por eso me ha parecido interesante compartir este ejemplo, que me ha costado unos cuantos dolores de cabeza! El objetivo ser pues leer una seal analgica de dos (extensible fcilmente a ms) sensores (en este caso potencimetros) y transmitirla a Matlab, a fin de poder trabajar con ella.

wechoosethemoon.es/2011/07/15/arduino-matlab-adquisicion-de-datos/

1/19

30/11/13

Arduino + Matlab: adquisicin de datos

Configuracin de Arduino
En primer lugar, vamos a preparar el Arduino. Conectamos los potencimetros entre los pines de +5V y Gnd (neutro) y sus pines centrales (que por tanto presentarn un voltaje entre +5V y 0V) a las entradas analgicas A0 y A1 del Arduino, de esta manera:

Fig1: conexin de los potencimetros al Arduino Por supuesto, cualquier otro sensor analgico sirve exactamente igual para este ejemplo. A continuacin, hemos de programar el Arduino, para que recoja la informacin de A0 y A1 y la enve via serie; el formato del envo consiste en: valor de A0, coma, valor de A1 y retorno de carro + lnea nueva (debido a que se usa la funcin Serial.println() al final) 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 / /d e f i n i rv a r i a b l e s i n to u t 1=0 ; i n to u t 2=0 ; v o i ds e t u p ( ){ / /i n i c i a l i z a rp u e r t os e r i e S e r i a l . b e g i n ( 9 6 0 0 ) ; } v o i dl o o p ( ){ / /l e e rp i n e s o u t 1=a n a l o g R e a d ( A 0 ) ; o u t 2=a n a l o g R e a d ( A 1 ) ; / /e n v i a r S e r i a l . p r i n t ( o u t 1 ) ; S e r i a l . p r i n t ( " , " ) ; S e r i a l . p r i n t l n ( o u t 2 ) ; / /e s p e r a r d e l a y ( 2 0 ) ; }
2/19

wechoosethemoon.es/2011/07/15/arduino-matlab-adquisicion-de-datos/

30/11/13

Arduino + Matlab: adquisicin de datos

Configuracin de Matlab
Una vez configurado el Arduino, los datos se enviarn por la propia conexin USB, pero simulando un puerto serie que deberemos conocer (desde la propia interfaz de Arduino se puede averiguar). En este caso, en el entorno Windows, el puerto ser el COM4. El primer paso ser crear un objeto serie en Matlab y abrirlo para empezar a leer: 1 2 3 4 5 6 7 % b o r r a rp r e v i o s d e l e t e ( i n s t r f i n d ( { ' P o r t ' } , { ' C O M 4 ' } ) ) ; % c r e a ro b j e t os e r i e s=s e r i a l ( ' C O M 4 ' , ' B a u d R a t e ' , 9 6 0 0 , ' T e r m i n a t o r ' , ' C R / L F ' ) ; w a r n i n g ( ' o f f ' , ' M A T L A B : s e r i a l : f s c a n f : u n s u c c e s s f u l R e a d ' ) ; % a b r i rp u e r t o f o p e n ( s ) ;

El siguiente paso es preparar la medida, ajustando dos parmetros: el tiempo total de medida, y la velocidad de capturas por segundo. ste ltimo parmetro hay que estimarlo, pero haremos que que el programa nos devuelva el valor real, con lo que si ste se aleja de lo estimado ser inmediato corregirlo. 1 2 3 %p a r m e t r o sd em e d i d a s t m a x=1 0 ;%t i e m p od ec a p t u r ae ns r a t e=3 3 ;%r e s u l t a d oe x p e r i m e n t a l( c o m p r o b a r )

A continuacin preparamos la figura en la que leeremos la seal de ambos potencimetros. Abrimos una nueva ventana y unos nuevos ejes, y creamos dos objetos grficos de tipo lnea, que iremos actualizando a medida que tengamos los datos. De esta manera Matlab no se saturar, que es lo que pasara si intentsemos utilizar la funcin plot() dentro del bucle. 1 2 3 4 5 6 7 8 9 1 0 1 1 %p r e p a r a rl af i g u r a f=f i g u r e ( ' N a m e ' , ' C a p t u r a ' ) ; a=a x e s ( ' X L i m ' , [ 0t m a x ] , ' Y L i m ' , [ 05 . 1 ] ) ; l 1=l i n e ( n a n , n a n , ' C o l o r ' , ' r ' , ' L i n e W i d t h ' , 2 ) ; l 2=l i n e ( n a n , n a n , ' C o l o r ' , ' b ' , ' L i n e W i d t h ' , 2 ) ; x l a b e l ( ' T i e m p o( s ) ' ) y l a b e l ( ' V o l t a j e( V ) ' ) t i t l e ( ' C a p t u r ad ev o l t a j ee nt i e m p or e a lc o nA r d u i n o ' ) g r i do n h o l do n

El ncleo del programa es el bucle de medida, en el cual iremos leyendo del puerto serie los datos en el formato que hemos especificado, midiendo el tiempo de ejecucin y actualizando los dos objetos lnea creados anteriormente: los datos Y sern los voltajes medidos hasta el momento y los datos X el tiempo de ejecucin. Al salir del bucle, imprimiremos el dato de capturas por segundo que hemos estimado arriba. 1 2 3 4 5 %i n i c i a l i z a r v 1=z e r o s ( 1 , t m a x * r a t e ) ; v 2=z e r o s ( 1 , t m a x * r a t e ) ; i=1 ; t=0 ;
3/19

wechoosethemoon.es/2011/07/15/arduino-matlab-adquisicion-de-datos/

30/11/13

Arduino + Matlab: adquisicin de datos

6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5

%e j e c u t a rb u c l ec r o n o m e t r a d o t i c w h i l et < t m a x t=t o c ; %l e e rd e lp u e r t os e r i e a=f s c a n f ( s , ' % d , % d ' ) ' ; v 1 ( i ) = a ( 1 ) * 5 / 1 0 2 4 ; v 2 ( i ) = a ( 2 ) * 5 / 1 0 2 4 ; %d i b u j a re nl af i g u r a x=l i n s p a c e ( 0 , i / r a t e , i ) ; s e t ( l 1 , ' Y D a t a ' , v 1 ( 1 : i ) , ' X D a t a ' , x ) ; s e t ( l 2 , ' Y D a t a ' , v 2 ( 1 : i ) , ' X D a t a ' , x ) ; d r a w n o w %s e g u i r i=i + 1 ; e n d %r e s u l t a d od e lc r o n o m e t r o c l c ; f p r i n t f ( ' % gsd ec a p t u r aa% gc a p / s\ n ' , t , i / t ) ;

Si queremos, podemos salvar la figura en forma de PDF (vectorial) o cualquier otro formato que queramos. Para esto yo uso una maravillosa funcin externa creada por Aslak Grinsted (que tiene un nombre como un poco Harry Potter). 1 s a v e f i g u r e ( ' c a p t u r a _ m u l t i ' , ' s ' , [ 4 . 53 ] , ' p o ' , ' d p d f ' )

Por ltimo, cerramos el puerto serie (para que otras aplicaciones lo puedan utilizar) y eliminamos el objeto serie que hemos creado en el primer paso. 1 2 3 4 % %L i m p i a rl ae s c e n ad e lc r i m e n f c l o s e ( s ) ; d e l e t e ( s ) ; c l e a rs ;

Resultado y ejemplo de captura


Con el cdigo del ejemplo, obtendramos una figura semejante a esta:

wechoosethemoon.es/2011/07/15/arduino-matlab-adquisicion-de-datos/

4/19

30/11/13

Arduino + Matlab: adquisicin de datos

Por supuesto, una vez recogidos los datos en las variables v1 y v2, ya podemos analizarlos de cualquier manera que se nos ocurra: podemos realizar un anlisis espectral mediante transformada rpida de Fourier; graficarlos frente a otras variables, realizar un test de correlacin, salvarlos en formato Excel, etc. Tambin, en un alarde de esplendor multimedia, tenemos un muy borroso vdeo de todo el montaje en accin, capturando la figura anterior, que es automticamente sincronizada en Dropbox, como se puede intuir observar al final del vdeo:

Y para finalizar, adjunto ambos cdigos completos en un cmodo .zip; sera de agradecer que si a alguien le es de alguna (remota) utilidad, deje un link de agradecimiento hacia aqu =)
wechoosethemoon.es/2011/07/15/arduino-matlab-adquisicion-de-datos/ 5/19