jueves, 4 de diciembre de 2014

ARDUINO + MATLAB Lectura de dos potenciómetros en tiempo real


A mayor comodidad se desea enlazar datos obtenidos desde ARDUINO a MATLAB, o viceversa. En este post desarrollaré el primer caso.



Los datos a leer serán de dos potenciómetros conectados a la placa ARDUINO en entradas analógicas.



El código para Arduino es el siguiente:

int potenc1 = 0; int potenc2= 1; int entrada1=0; //potenciometro en entrada analogica A0 int entrada2=1; //potenciometro en entrada analogica A1 void setup() {       Serial.begin(9600); }   void loop() {       potenc1= analogRead(entrada1);    potenc2= analogRead(entrada2);    Serial.print(potenc1);    Serial.print(",");    Serial.println(potenc2);    delay(60); }


Es importante mencionar que la comunicación serial se activa con el comando: Serial.begin(9600); en el void setup() y se envían datos con Serial.println(valor_a_leer); en el void loop().

Además no olvidar que los datos a visualizar pueden ser por parte de Arduino ó (en este caso) por Matlab, NO AMBOS AL MISMO TIEMPO.

Bueno, ahora el código que debe realizarse en Matlab es el siguiente:
(en base al código realizado por Geekytheory)

Considerar que se debe hacer el código en un Script



function arduinomatlab(n)

global v1 v2

v1=zeros(1,n);
v2=zeros(1,n);

delete(instrfind({'Port'},{'COM5'}));
s = serial('COM5','BaudRate',9600,'Terminator','CR/LF');
warning('off','MATLAB:serial:fscanf:unsuccessfulRead');

fopen(s);

muestras=1;

figure('Name','Captura');

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

while muestras<=n
    ylim([0 5.1]);
    xlim([muestras-10 muestras+10]);
    valor=fscanf(s, '%d,%d')';
    
    v1(muestras)=(valor(1)*5/1024);
    v2(muestras)=(valor(2)*5/1024);
    plot(muestras, v1(muestras),'*-b');
    plot(muestras, v2(muestras),'*-r');
    drawnow
    muestras=muestras+1;
    

end

fclose(s);
delete(s);
clear s;

end
    

NOTA: COM5 es un ejemplo del puerto a utilizar. La mayoría de los usuarios utiliza Windows y Arduino, en este sistema operativo, utiliza los COM#. En mi caso utilizo Mac y utilizo '/dev/cu.usbmodemfd121' como puerto, pero hice ese cambio para que se entienda más fácil y rápido. Por tanto, el puerto depende de cuál utilizaste para cargar el programa a la placa Arduino.

El código hace referencia a una función: arduinomatlabpot(n). El valor n es el número de muestras que se desea observar y obtener.


¿CÓMO EJECUTAR EL PROGRAMA?

  • Guardar este Script con el nombre de arduinomatlabpot.
  • Dirigirse en la carpeta donde se guardó el Script. (en mi caso lo guardé en una carpeta arduinoIO)

  • Ejecutar los siguientes comandos


                 



Como se puede observar al ejecutar los comandos de global v1 y v2 se crean variables en el Workspace. Éstos no tienen un tamaño definido, en otras palabras están vacíos pero listos para contener información.

A continuación, se ejecutara la función que creamos: arduinomatlabpot(200) (Recordando que 200 es el número de muestras a leer, es un valor a disposición de ustedes).


Directamente aparecerá una ventana que en tiempo real graficará los valores de los potenciómetros para visualizar y obtener sus respectivos datos.



Habiendo cumplido la obtención de los 200 datos, podrán ver en el Workspace que las variables v1 y v2 ahora sí tienen un tamaño: vector de 1x200.

Si gustan conocer los valores que tienen dentro estos vectores sólo se debe ejecutar v1 o v2 en la VENTANA DE COMANDOS.







Estas variables se podrán utilizar para variedad de análisis en MATLAB (como por ejemplo IDENT, claro que los vectores no deben ser de dos potenciómetros, sino de salida y entrada de un sistema).







No hay comentarios:

Publicar un comentario