Arduino + Matlab_ adquisición de datos

Embed Size (px)

Citation preview

  • 8/13/2019 Arduino + Matlab_ adquisicin de datos

    1/5

    30/11/13 Arduino + Matlab: adquisicin de datos

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

    We choose the Moon

    Ingeniera aplicada incluso a cosas a las que

    probablemente no debera aplicarse.

    AcercadeBioEl equipo

    Engineers like to solve problems. If there are noproblems 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 seenlazar laparte terica (hbilmente trabajosamente programada en nuestro entorno informtico preferido) comoalgoritmos 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 yadquirir un sistema comercial de adquisicin de datos (DAQ) como los de National Instrumentsafortunadamente hoy en da hay alternativas uno o dos rdenes de magnitud ms asequibles: una de ellas es e

    popular microcontrolador Arduino.

    Uno de los ejemplosms bsicos consiste en leer datos de un sensor conectado al Arduino y transmitirlos al PCmediante comunicacin serie; sin embargo, este ejemplo tiene dos limitaciones: se limita a un nico sensor y losdatos 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 casopotencimetros) y transmitirla a Matlab, a fin de poder trabajar con ella.

    http://arduino.cc/en/Tutorial/AnalogReadSerialhttp://wechoosethemoon.es/2011/07/15/arduino-matlab-adquisicion-de-datos/http://wechoosethemoon.es/el-equipo/http://wechoosethemoon.es/bio-jor/http://wechoosethemoon.es/http://wechoosethemoon.es/http://wechoosethemoon.es/http://arduino.cc/en/Tutorial/AnalogReadSerialhttp://arduino.cc/http://www.ni.com/http://wechoosethemoon.es/author/jorge/http://wechoosethemoon.es/2011/07/15/arduino-matlab-adquisicion-de-datos/http://wechoosethemoon.es/el-equipo/http://wechoosethemoon.es/bio-jor/http://wechoosethemoon.es/acerca/http://wechoosethemoon.es/
  • 8/13/2019 Arduino + Matlab_ adquisicin de datos

    2/5

    30/11/13 Arduino + Matlab: adquisicin de datos

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

    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 analgicasA0 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, hemosde programar el Arduino, para que recoja la informacin de A0 y A1 y la enve via serie; el formato del envoconsiste 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)

    123456789

    1011121314151617181920

    // definir variablesintout1 =0;intout2 =0;voidsetup() { // inicializar puerto serie Serial.begin(9600);}

    voidloop() { // leer pines out1 =analogRead(A0); out2 =analogRead(A1); // enviar Serial.print(out1); Serial.print(","); Serial.println(out2); // esperar delay(20);}

    http://i0.wp.com/wechoosethemoon.es/wp-content/uploads/leer_serial_multi_sketch_bb.png
  • 8/13/2019 Arduino + Matlab_ adquisicin de datos

    3/5

    30/11/13 Arduino + Matlab: adquisicin de datos

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

    Configuracin de Matlab

    Una vez configurado el Arduino, los datos se enviarn por la propia conexin USB, pero simulando un puertoserie que deberemos conocer (desde la propia interfaz de Arduino se puede averiguar). En este caso, en eentorno Windows, el puerto ser el COM4. El primer paso ser crear un objeto serie en Matlab y abrirlo paraempezar a leer:

    El siguiente paso es preparar la medida, ajustando dos parmetros: el tiempo total de medida, y la velocidad decapturas por segundo. ste ltimo parmetro hay que estimarlo, pero haremos que que el programa nosdevuelva el valor real, con lo que si ste se aleja de lo estimado ser inmediato corregirlo.

    A continuacin preparamos la figura en la que leeremos la seal de ambos potencimetros. Abrimos una nuevaventana y unos nuevos ejes, y creamos dos objetos grficos de tipo lnea, que iremos actualizando a medida quetengamos los datos. De esta manera Matlab no se saturar, que es lo que pasara si intentsemos utilizar lafuncin plot() dentro del bucle.

    El ncleo del programa es el bucle de medida, en el cual iremos leyendo del puerto serie los datos en el formatoque hemos especificado, midiendo el tiempo de ejecucin y actualizando los dos objetos lnea creadosanteriormente: los datos Y sern los voltajes medidos hasta el momento y los datos X el tiempo de ejecucin. Asalir del bucle, imprimiremos el dato de capturas por segundo que hemos estimado arriba.

    1234567

    %borrar previosdelete(instrfind({'Port'},{'COM4'}));%crear objeto series = serial('COM4','BaudRate',9600,'Terminator','CR/LF');warning('off','MATLAB:serial:fscanf:unsuccessfulRead');%abrir puertofopen(s);

    123

    % parmetros de medidastmax = 10; % tiempo de captura en srate = 33; % resultado experimental (comprobar)

    123456789

    1011

    % preparar la figuraf = 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 onhold on

    12345

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

  • 8/13/2019 Arduino + Matlab_ adquisicin de datos

    4/5

    30/11/13 Arduino + Matlab: adquisicin de datos

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

    Si queremos, podemos salvar la figura en forma de PDF (vectorial) o cualquier otro formato que queramosPara esto yo uso una maravillosa funcin externa creada por Aslak Grinsted (que tiene un nombre como un

    pocoHarry Potter).

    Por ltimo, cerramos el puerto serie (para que otras aplicaciones lo puedan utilizar) y eliminamos el objeto serieque hemos creado en el primer paso.

    Resultado y ejemplo de captura

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

    6789

    10111213141516171819202122232425

    % ejecutar bucle cronometradoticwhilet

  • 8/13/2019 Arduino + Matlab_ adquisicin de datos

    5/5

    Y para finalizar, adjunto ambos cdigos completos en un cmodo .zip; sera de agradecer que si a alguien le esde alguna (remota) utilidad, deje un link de agradecimiento hacia aqu =)

    http://wechoosethemoon.es/wp-content/uploads/leer_serial_multi.zip