You are on page 1of 5

30/11/13

Arduino + Matlab: adquisición de datos

We choose the Moon
Ingeniería aplicada incluso a cosas a las que probablemente no debería 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: adquisición de datos
Jorge García Tíscar Viernes, 15 de julio de 2011 A la hora de empezar con cualquier proyecto de aplicación práctica, una de las cuestiones principales suele ser enlazar la parte teórica (hábilmente trabajosamente programada en nuestro entorno informático preferido) como algoritmos de tratamiento de datos, sistemas de control automático, etc., con el mundo real. Hasta no hace mucho, la única manera de poder trabajar con datos físicos consistía en atracar una gasolinera y adquirir un sistema comercial de adquisición de datos (DAQ) como los de National Instruments; afortunadamente hoy en día hay alternativas uno o dos órdenes de magnitud más asequibles: una de ellas es el popular microcontrolador Arduino. Uno de los ejemplos más básicos consiste en leer datos de un sensor conectado al Arduino y transmitirlos al PC mediante comunicación serie; sin embargo, este ejemplo tiene dos limitaciones: se limita a un único sensor y los datos se leen numéricamente 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 señal analógica de dos (extensible fácilmente a más) sensores (en este caso potenciómetros) y transmitirla a Matlab, a fin de poder trabajar con ella.

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

1/19

S e r i a l . para que recoja la información de A0 y A1 y la envíe via serie. A continuación. el formato del envío consiste en: valor de A0. p r i n t ( " . / /e s p e r a r d e l a y ( 2 0 ) .es/2011/07/15/arduino-matlab-adquisicion-de-datos/ . Conectamos los potenciómetros entre los pines de +5V y Gnd (neutro) y sus pines centrales (que por tanto presentarán un voltaje entre +5V y 0V) a las entradas analógicas A0 y A1 del Arduino. S e r i a l . i n to u t 2=0 . p r i n t l n ( o u t 2 ) . hemos de programar el Arduino. 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 ) . } 2/19 wechoosethemoon. vamos a preparar el Arduino. " ) . b e g i n ( 9 6 0 0 ) .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 . coma.30/11/13 Arduino + Matlab: adquisición de datos Configuración de Arduino En primer lugar. valor de A1 y retorno de carro + línea nueva (debido a que se usa la función Serial. cualquier otro sensor analógico sirve exactamente igual para este ejemplo. } 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 ) . 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 . de esta manera: Fig1: conexión de los potenciómetros al Arduino Por supuesto.

i=1 . 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 ' } . ' L i n e W i d t h ' . con lo que si éste se aleja de lo estimado será inmediato corregirlo. ' C o l o r ' . 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 núcleo del programa es el bucle de medida. a=a x e s ( ' X L i m ' . n a n . 9 6 0 0 . pero haremos que que el programa nos devuelva el valor real. l 1=l i n e ( n a n . ' T e r m i n a t o r ' . 2 ) . 2 ) . [ 05 . % 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 ' . 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 ) . ' C R / L F ' ) .%t i e m p od ec a p t u r ae ns r a t e=3 3 . n a n . l 2=l i n e ( n a n . ' 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 ' ) . ajustando dos parámetros: el tiempo total de medida. que es lo que pasaría si intentásemos utilizar la función plot() dentro del bucle. ' C o l o r ' . De esta manera Matlab no se saturará. y creamos dos objetos gráficos de tipo línea. los datos se enviarán por la propia conexión USB. y la velocidad de capturas por segundo. imprimiremos el dato de capturas por segundo que hemos estimado arriba. Al salir del bucle. Abrimos una nueva ventana y unos nuevos ejes. { ' C O M 4 ' } ) ) . 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 ' . % a b r i rp u e r t o f o p e n ( s ) . en el entorno Windows. 1 ] ) . v 2=z e r o s ( 1 . ' L i n e W i d t h ' . ' b ' .%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 continuación preparamos la figura en la que leeremos la señal de ambos potenciómetros. t=0 . ' C a p t u r a ' ) . midiendo el tiempo de ejecución y actualizando los dos objetos línea creados anteriormente: los datos Y serán los voltajes medidos hasta el momento y los datos X el tiempo de ejecución. [ 0t m a x ] . 3/19 wechoosethemoon. 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 m a x * r a t e ) . ' Y L i m ' .30/11/13 Arduino + Matlab: adquisición de datos Configuración de Matlab Una vez configurado el Arduino. El siguiente paso es preparar la medida. En este caso. pero simulando un puerto serie que deberemos conocer (desde la propia interfaz de Arduino se puede averiguar). ' r ' . ' B a u d R a t e ' .es/2011/07/15/arduino-matlab-adquisicion-de-datos/ . en el cual iremos leyendo del puerto serie los datos en el formato que hemos especificado. que iremos actualizando a medida que tengamos los datos. Éste último parámetro hay que estimarlo. w a r n i n g ( ' o f f ' .

s e t ( l 1 . [ 4 . cerramos el puerto serie (para que otras aplicaciones lo puedan utilizar) y eliminamos el objeto serie que hemos creado en el primer paso. x ) . obtendríamos una figura semejante a esta: wechoosethemoon. t . % d ' ) ' . ' X D a t a ' . 1 s a v e f i g u r e ( ' c a p t u r a _ m u l t i ' . Resultado y ejemplo de captura Con el código del ejemplo. 53 ] . ' p o ' . v 2 ( i ) = a ( 2 ) * 5 / 1 0 2 4 . s e t ( l 2 . ' s ' . i / t ) . Si queremos. 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 . d r a w n o w %s e g u i r i=i + 1 . 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 ) .es/2011/07/15/arduino-matlab-adquisicion-de-datos/ 4/19 . ' % d . d e l e t e ( s ) . v 1 ( i ) = a ( 1 ) * 5 / 1 0 2 4 . Para esto yo uso una maravillosa función externa creada por Aslak Grinsted (que tiene un nombre como un poco Harry Potter). %l e e rd e lp u e r t os e r i e a=f s c a n f ( s . c l e a rs .30/11/13 Arduino + Matlab: adquisición 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 . f p r i n t f ( ' % gsd ec a p t u r aa% gc a p / s\ n ' . x ) . ' Y D a t a ' . i / r a t e . ' X D a t a ' . %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 ) . v 2 ( 1 : i ) . ' Y D a t a ' . podemos salvar la figura en forma de PDF (vectorial) o cualquier otro formato que queramos. v 1 ( 1 : i ) . ' d p d f ' ) Por último.

salvarlos en formato Excel.es/2011/07/15/arduino-matlab-adquisicion-de-datos/ 5/19 . graficarlos frente a otras variables. También. en un alarde de esplendor multimedia. como se puede intuir observar al final del vídeo: Y para finalizar. etc. ya podemos analizarlos de cualquier manera que se nos ocurra: podemos realizar un análisis espectral mediante transformada rápida de Fourier. sería de agradecer que si a alguien le es de alguna (remota) utilidad. realizar un test de correlación. tenemos un muy borroso vídeo de todo el montaje en acción. capturando la figura anterior.30/11/13 Arduino + Matlab: adquisición de datos Por supuesto. que es automáticamente sincronizada en Dropbox. una vez recogidos los datos en las variables v1 y v2. deje un link de agradecimiento hacia aquí =) wechoosethemoon. adjunto ambos códigos completos en un cómodo .zip.