Vous êtes sur la page 1sur 5

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

<a href=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 d e 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. Configuración de Arduino En primer lugar, vamos a preparar el Arduino. 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, de esta manera: " id="pdf-obj-0-23" src="pdf-obj-0-23.jpg">

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.

Configuración de Arduino

En primer lugar, vamos a preparar el Arduino. 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, de esta manera:

<a href=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 d e 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. Configuración de Arduino En primer lugar, vamos a preparar el Arduino. 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, de esta manera: " id="pdf-obj-0-35" src="pdf-obj-0-35.jpg">

Fig1: conexión de los potenciómetros al Arduino

Por supuesto, cualquier otro sensor analógico sirve exactamente igual para este ejemplo. A continuación, hemos de programar el Arduino, para que recoja la información de A0 y A1 y la envíe

via serie; el formato del envío consiste en: valor de A0, coma, valor de A1 y retorno de carro +

línea nueva (debido a que se usa la función Serial.println() al final)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

// definir variables int out1 = 0;

int out2 = 0;

void setup() {

// inicializar puerto serie

Serial.begin(9600);

}

void loop() {

// leer pines

out1 = analogRead(A0);

out2 = analogRead(A1); // enviar

Serial.print(out1);

Serial.print(",");

Serial.println(out2);

// esperar

delay(20);

}

Configuración de Matlab

Una vez configurado el Arduino, los datos se enviarán por la propia conexión 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

%borrar previos

delete(instrfind({'Port'},{'COM4'}));

%crear objeto serie

s = serial('COM4','BaudRate',9600,'Terminator','CR/LF');

warning('off','MATLAB:serial:fscanf:unsuccessfulRead'); %abrir puerto fopen(s);

El siguiente paso es preparar la medida, ajustando dos parámetros: el tiempo total de medida, y la velocidad de capturas por segundo. Éste último parámetro 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

% parámetros de medidas

tmax = 10; % tiempo de captura en s

rate = 33; % resultado experimental (comprobar)

A continuación preparamos la figura en la que leeremos la señal de ambos potenciómetros. Abrimos una nueva ventana y unos nuevos ejes, y creamos dos objetos gráficos de tipo línea, que iremos actualizando a medida que tengamos los datos. De esta manera Matlab no se saturará, que es lo que pasaría si intentásemos utilizar la función plot() dentro del bucle.

1

2

3

4

5

6

7

8

9

10

11

% preparar la figura f = figure('Name','Captura'); a = axes('XLim',[0 tmax],'YLim',[0 5.1]); l1 = line(nan,nan,'Color','r','LineWidth',2);

l2 = line(nan,nan,'Color','b','LineWidth',2);

xlabel('Tiempo (s)')

ylabel('Voltaje (V)') title('Captura de voltaje en tiempo real con Arduino') grid on

hold on

El núcleo 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 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. Al salir del bucle, imprimiremos el dato de capturas por segundo que hemos estimado arriba.

1

2

3

4

5

% inicializar

v1 = zeros(1,tmax*rate); v2 = zeros(1,tmax*rate); i = 1; t = 0;

6

% ejecutar bucle cronometrado

tic while t<tmax t = toc; % leer del puerto serie
10 a = fscanf(s,'%d,%d')';

7

8

9

  • 11 v1(i)=a(1)*5/1024;

  • 12 v2(i)=a(2)*5/1024;

  • 13 % dibujar en la figura
    14 x = linspace(0,i/rate,i); set(l1,'YData',v1(1:i),'XData',x);

  • 15 set(l2,'YData',v2(1:i),'XData',x);

  • 16 drawnow

17

18

19

20

21

22

23

24

25

% seguir

i = i+1;

end % resultado del cronometro

clc;

fprintf('%g s de captura a %g cap/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 función externa creada por Aslak Grinsted (que tiene un nombre como un poco Harry Potter).

  • 1 savefigure('captura_multi','s',[4.5 3],'po','-dpdf')

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 %% Limpiar la escena del crimen

  • 2 fclose(s);

  • 3 delete(s);

  • 4 clear s;

Resultado y ejemplo de captura

Con el código del ejemplo, obtendríamos una figura semejante a esta:

17 18 19 20 21 22 23 24 25 % seguir i = i+1; end %maravillosa función externa creada por Aslak Grinsted (que tiene un nombre como un poco Harry Potter ). savefigure('captura_multi','s',[4.5 3],'po','-dpdf') 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 %% Limpiar la escena del crimen 2 fclose(s); 3 delete(s); 4 clear s; Resultado y ejemplo de captura Con el código del ejemplo, obtendríamos una figura semejante a esta: 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 análisis espectral mediante transformada " id="pdf-obj-3-59" src="pdf-obj-3-59.jpg">

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 análisis espectral mediante transformada

rápida de Fourier; graficarlos frente a otras variables, realizar un test de correlación, salvarlos en formato Excel, etc.

También, en un alarde de esplendor multimedia, tenemos un muy borroso vídeo de todo el montaje en acción, capturando la figura anterior, que es automáticamente sincronizada en Dropbox, como se puede intuir observar al final del vídeo: