Arduino es una herramienta para hacer que los ordenadores puedan sentir y controlar
el mundo físico a través de tu ordenador personal. Es una plataforma de desarrollo de
computación física (physical computing) de código abierto, basada en una placa con un
sencillo microcontrolador y un entorno de desarrollo para crear software (programas)
para la placa.
Puedes usar Arduino para crear objetos interactivos, leyendo datos de una gran
variedad de interruptores y sensores y controlar multitud de tipos de luces, motores y
otros actuadores físicos. Los proyecto de Arduino pueden ser autónomos o
comunicarse con un programa (software) que se ejecute en tu ordenador (ej. Flash,
Processing, MaxMSP). La placa puedes montarla tu mismo o comprarla ya lista para
usar, y el software de desarrollo es abierto y lo puedes descargar gratis.
El lenguaje de programación de Arduino es una implementación de Wiring, una
plataforma de computación física parecida, que a su vez se basa en Processing, un
entorno de programación multimedia.
-Arduino UNO
-Arduino Leonardo
-Arduino Due
-Arduino Yun
-Arduino Robot
-Arduino Esplora
-Arduino Mega
-Arduino Mini
-Arduino Nano
-Arduino Micro
-Arduino Pro
-Arduino Ethernet
Se supone que la programación en Arduino es divertida, pero puede resultar frustrante y lenta
en el caso de tareas tales como la representación gráfica de datos de sensores o la
incorporación en los proyectos de rutinas avanzadas de matemáticas, procesamiento de
señales o control.
El paquete de soporte de MATLAB para Arduino permite escribir programas de MATLAB que
leen y escriben datos en los dispositivos Arduino y otros dispositivos conectados, tales como
Adafruit Motor Shield, I2C y SPI. Ya que MATLAB es un lenguaje interpretado de alto nivel, la
programación resulta más fácil que con C/C++ y otros lenguajes compilados, de forma que se
pueden ver resultados de las instrucciones de E/S inmediatamente, sin necesidad de
compilación. MATLAB incluye miles de funciones matemáticas, de ingeniería y de
representación gráfica integradas que permiten analizar y visualizar con rapidez los datos
recopilados en el dispositivo Arduino.
Para conectar la tarjeta Arduino UNO, como si fuera una tarjeta de interfaz o de transferencia
de datos, con el IDE MATLAB, siga los siguientes pasos:
1. Descarge el archivo “ArduinoIO.zip”. También está disponible en esta carpeta de
Google Docs, que comparto con ustedes.
2. Descomprimir el archivo en la carpeta deseada en el equipo. Preferiblemente en
carpeta Matlab, que está en “Mis Documentos”. De esta forma, los M-files, quedan
disponibles inmediatamente, en el directorio corriente del entorno de Matlab.
3. Asumiendo que ya tiene instalado el IDE ARDUINO, abra desde este entorno, el archivo
“adiosrv.pde” que está dentro de la carpeta “adiosrv” , que a su vez está dentro de la
carpeta “pde” , una de las que se descomprimió.
4. Cargue en la tarjeta, este programa. Este sketch, contiene el código necesario para que
la tarjeta Arduino “escuche” los comandos ejecutados desde Matlab, ejecute
instrucciones, interactúe con dispositivos conectados a la tarjeta y transfiera datos
desde sensores y dispositivos, hacia Matlab.
5. Una vez cargado el programa en la tarjeta Arduino, es recomendable cerrar el IDE
ARDUINO, para que Matlab pueda acceder al puerto serial que se abre cuando se
conecta la tarjeta.
6. Abrir el programa Matlab.
7. En la carpeta del “Current Directory”, debe estar el m-file “install_arduino”. Ejecutar
para que se realice la comunicación. Asegúrese que la tarjeta Arduino esté conectada y
activa.
8. Verifique el puerto COM utilizado por la tarjeta para la configuración de esta. El
número de puerto se puede consultar accediendo a: Mi
PC/Propiedades/Hardware/Administrador de Dispositivos. En esta ventana, ubique los
puertos COM disponibles (COM & LPT), expanda el menú para ver en qué puerto COM
está conectado Arduino UNO R3.
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 (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 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.
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:
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 int out1 = 0;
2 int out2 = 0;
3
4 void setup() {
5 // inicializar puerto serie
6 Serial.begin(9600);
7 }
8
9 void loop() {
10 // leer pines
11 out1 = analogRead(A0);
12 out2 = analogRead(A1);
13 // enviar
14 Serial.print(out1);
15 Serial.print(",");
16 Serial.println(out2);
17 // esperar
18 delay(20);
19 }
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 %borrar previos
3 delete(instrfind({'Port'},{'COM4'}));
4 %crear objeto serie
5 s = serial('COM4','BaudRate',9600,'Terminator','CR/LF');
6 warning('off','MATLAB:serial:fscanf:unsuccessfulRead');
7 %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 el programa nos devuelva el valor real, con lo que si éste se aleja de lo estimado
será inmediato corregirlo.
1 % parámetros de medidas
2 tmax = 10; % tiempo de captura en s
3 rate = 33; % resultado experimental (comprobar)
1
2 % preparar la figura
3 f = figure('Name','Captura');
4 a = axes('XLim',[0 tmax],'YLim',[0 5.1]);
5 l1 = line(nan,nan,'Color','r','LineWidth',2);
6 l2 = line(nan,nan,'Color','b','LineWidth',2);
7
8 xlabel('Tiempo (s)')
9 ylabel('Voltaje (V)')
10 title('Captura de voltaje en tiempo real con Arduino')
11 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 % inicializar
2 v1 = zeros(1,tmax*rate);
3 v2 = zeros(1,tmax*rate);
4 i = 1;
5 t = 0;
6
7 % ejecutar bucle cronometrado
8 tic
9 while t<tmax
10 t = toc;
11 % leer del puerto serie
12 a = fscanf(s,'%d,%d')';
13 v1(i)=a(1)*5/1024;
14 v2(i)=a(2)*5/1024;
15 % dibujar en la figura
16 x = linspace(0,i/rate,i);
17 set(l1,'YData',v1(1:i),'XData',x);
18 set(l2,'YData',v2(1:i),'XData',x);
19 drawnow
20 % seguir
21 i = i+1;
22 end
23 % resultado del cronometro
24 clc;
25 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 útil función externa creada por Aslak Grinsted.
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
2 %% Limpiar la escena del crimen
3 fclose(s);
4 delete(s);
clear s;
RESULTADO
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.
EJEMPLOS
Codificación
%la velocidad de adquisición es de 33 muestras x segundo
%borrar previos
delete(instrfind({'Port'},{'COM7'}));
%crear objeto serie
s=serial('COM7','BaudRate',9600,'Terminator','CR/LF');
warning('off','MATLAB:serial:fscanf:unsuccessfulRead');
%abrir puerto
fopen(s);
% parámetros de medidas
tmax = 10;
% tiempo de captura en s
rate =39; % resultado experimental (comprobar)
% preparar la figura
f = figure('Name','Captura');%creamos la figura y le damos nombre y captura
a = axes('XLim',[0 tmax],'YLim',[0 5.1]); % le damos el tamaño aos ejes
l1 = line(nan,nan,'Color','r','LineWidth',2); %nan:trazo nimguno(con nan no
agregamos ningun razo)
xlabel('Tiempo (s)')
ylabel('Voltaje (V)')
title('Captura de voltaje en tiempo real con Arduino')
grid on
hold on % congelamos la pantalla para agregar los puntos
% inicializar
v1 = zeros(1,tmax*rate); % creamos el vector
i = 1;
t = 0;
% ejecutar bucle cronometrado
tic % funcion cronometro tiempo de inicion tiempo de testeo toc
while t<tmax
t = toc; % cronometro aqui calculamos cuanto tiempo demora desde q se
inicion en tic
% leer del puerto serie
a = fscanf(s,'%d')'; % lee la funcion y lo lleva a data texto
v1(i)=a(1)*5/1024;
% dibujar en la figura
x = linspace(0,i/rate,i);
set(l1,'YData',v1(1:i),'XData',x); % con set modificamos las propiedades
dentro del parentesis
drawnow % redibuja lo q cambio
% seguir
i = i+1;
end
% resultado del cronometro
clc;
fprintf('%g s de captura a %g cap/s \n',t,i/t);% cerificamos frecuencia
,#muetras y tiempo
ESQUEMA
PRUEBA