Práctica 6a

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 5

Práctica 6.

Creación de una interfase gráfica de usuario (GUI) para adquisición de datos


con Arduino y Matlab.
Introducción
Frecuentemente se desea realizar un registro de los datos adquiridos en algún proceso de medición de una variable.
En la siguiente sección se presenta una conexión sencilla entre la plataforma Arduino Uno y Matlab empleando
una intefase gráfica de usuario para graficar los datos adquiridos.

Primero se graficará un objeto aún no definido L1 que crea la interfase gráfica en la que trabajará.

L1 = line(nan, nan, 'Color', 'r', 'LineWidth', 2);

Este comando crea una línea aún no definida (nan) de color rojo y un poco más gruesa. Se establecen los límites
de la gráfica y la rejilla mediante

Fs = 50; % Frecuencia de muestreo


N = 1000; % Tamaño del vector
r = zeros(N,1); % Vector de entrada

t = linspace(0, (N-1)/Fs, N); % Vector de tiempo


ylim([0 5]);
xlim([0 (N-1)/Fs]);
grid on;

donde N es el tamaño del vector, Fs la frecuencia de muestreo y r es el vector de datos que se graficará y se
inicializa con ceros. El comando linspace genera un vector de puntos igualmente espaciados entre 0 y N y se
utilizará para la escala de tiempo.

Para comenzar la adquisición de datos es necesario inicializar la tarjeta Arduino y escribir los comandos en un
lazo while infinito.

ard = arduino;
tic
while 1
if toc > 1/Fs
tic
r(1:end-1) = r(2:end);
r(end) = readVoltage(ard, 'a0');
set(L1,'XData',t,'YData',r);
drawnow
end
end

La función tic, junto con toc, permite conocer el tiempo de ejecución de los comandos entre ambas funciones, y
se utilizará para generar bases de tiempo que permitan medir los periodos de muestreo de una manera informal.
El vector de datos que se graficará, r, se desplaza una posición a la izquierda para que el último dato del vector
contenga el valor capturado por la tarjeta de adquisición de datos dentro del lazo while. Se escribe el dato en la
línea L1 mediante el comando set y se actualiza la gráfica con la instrucción drawnow.
Con estas instrucciones genere una función en un nuevo script poniendo como encabezado la palabra function
nombre_de_funcion como encabezado, donde nombre_de_funcion es el nombre que se elige para la función. Es
conveniente incluir las instrucciones close all, clear y clc, inmediatamente después del encabezado para asegurarse
de limpiar el puerto, cerrar todas las ventanas adicionales que pudieran estar abiertas y limpiar el espacio de
trabajo antes de ejecutar el resto de las instrucciones. No olvidar incluir una instrucción end al final para indicar
el término de la función.

Ejecutar el programa cambiando los valores de tensión en el pin A0 de la tarjeta Arduino, ya sea mediante un
puente entre A0 y las terminales de tierra, GND, 3.5V y 5V, mediante potenciómetro o una fuente de alimentación
externa cuidando de no exceder el límite máximo de 5V que soporta la tarjeta como entrada.

Para eliminar los mensajes de error que aparecen al cerrar la ventana gráfica, se añade un botón de paro en la
interfase de usuario y se modifica la condición del lazo while quedando el programa de la siguiente manera:

function nombre_de_funcion
close all
clear
clc

L1 = line(nan, nan, 'Color', 'r', 'LineWidth', 2);


Fs = 50; % Frecuencia de muestreo
N = 1000; % Tamaño del vector
r = zeros(N,1); % Vector de entrada
t = linspace(0, (N-1)/Fs, N); % Vector de tiempo
ylim([0 5]);
xlim([0 (N-1)/Fs]);
grid on;

ard = arduino;
Parar = false;
uicontrol('Style','pushbutton','String','Fin',...
'Callback', @Boton);

tic
while ~Parar
if toc > 1/Fs
tic
r(1:end-1) = r(2:end);
r(end) = readVoltage(ard, 'a0');
set(L1,'XData',t,'YData',r);
drawnow
end
end

function Boton(obj, ~)
Parar = obj.Value;
end
end
2. Realizando mediciones de temperatura.
Utilice el siguiente script para capturar datos de un sensor de temperatura LM35 que mide la temperatura de una
resistencia de 10 a 1/2 W conectada a una fuente de 5V. Conecte la fuente de tensión en la entrada a1.

function AdquisicionTemp

clear
close all
clc

L1 = line(nan, nan, 'Color', 'r', 'LineWidth', 2);


L2 = line(nan, nan, 'Color', 'b', 'LineWidth', 2);
Fs = 10; % Frecuencia de muestreo
N = 1000; % Tamaño del vector
r = zeros(N,1); % Vector de entrada
c = zeros(N,1); % Vector de salida

t = linspace(0, (N-1)/Fs, N); % Vector de tiempo


ylim([0.15 0.3]);
xlim([0 (N-1)/Fs]);
grid on;

ard = arduino;
Parar = false;
uicontrol('Style','pushbutton','String','Fin',...
'Callback', @Boton);
tic

while ~Parar
if toc > 1/Fs
tic
r(1:end-1) = r(2:end);
r(end) = readVoltage(ard, 'a1');

c(1:end-1) = c(2:end);
c(end) = readVoltage(ard, 'a0');

set(L1,'XData',t,'YData',r);
set(L2,'XData',t,'YData',2);

drawnow
end
end

function Boton(obj, ~)
Parar = obj.Value;
end
end
3. Simulando un sistema en tiempo discreto.
A continuación se simulará el comportamiento de un sistema de segundo orden subamortiguado y discretizado,
empleando como entrada o señal de excitación los datos generados por la tarjeta de adquisición de datos y se
observará su respuesta o señal de salida en otro trazo dibujado en el mismo gráfico.

Supongamos un sistema cuya función transferencia sea:

𝐶(𝑠) 8
= 2
𝑅(𝑠) 𝑠 + 2𝑠 + 8

El equivalente discreto de la función se obtiene mediante la instrucción de Matlab c2d como:

Gz = c2d(G,1/Fs,’zoh’);

que para la frecuencia de muestreo de Fs = 50 cps resulta:

𝐶(𝑧) 0.001578 z + 0.001558


=
𝑅(𝑧) 𝑧 2 − 1.958 𝑧 + 0.9608

y convertida en ecuación en diferencias quedaría:

𝑐(𝑘) = 0.001578 𝑟(𝑘 – 1) + 0.001558 𝑟(𝑘 – 2) − 1.958 𝑐(𝑘 – 1) − 0.9608 𝑐(𝑘 − 2)

expresada en forma general, de manera que permita cambiar la frecuencia de muestreo:

𝑐(𝑘) = 𝑏1 𝑟(𝑘 – 1) + 𝑏0 𝑟(𝑘 – 2) – 𝑎1 𝑐(𝑘 – 1) – 𝑎0 𝑐(𝑘 − 2)

Modificando el programa anterior para incluir esta función quedaría como:

function nombre_de_funcion
L1 = line(nan, nan, 'Color', 'r', 'LineWidth', 2);
L2 = line(nan, nan, 'Color', 'b', 'LineWidth', 2);

Fs = 50; % Frecuencia de muestreo


N = 1000; % Tamaño del vector

r = zeros(N,1); % Vector de entrada


c = zeros(N,1); % Vector de salida
t = linspace(0, (N-1)/Fs, N); % Vector de tiempo
ylim([0 5]);
xlim([0 (N-1)/Fs]);
grid on;

ard = arduino;
Parar = false;
uicontrol('Style','pushbutton','String','Fin',...
'Callback', @Boton);

%%%%%%%%%%%%%%%%%%%%%%%%%
G = tf(8,[1 2 8]);
Gz= c2d(G,1/Fs,'zoh');
n = Gz.num{1};
d = Gz.den{1};
b1= n(2);
b0= n(end);
a1= d(2);
a0= d(end);
%%%%%%%%%%%%%%%%%%%%%%%%%

tic
while ~Parar
if toc > 1/Fs
tic
r(1:end-1) = r(2:end);
r(end) = readVoltage(ard, 'a0');
c(1:end-1) = c(2:end);
c(end) = -a1*c(end-1)-a0*c(end-2)+b1*r(end-1)+b0*r(end-2);
set(L1,'XData',t,'YData',r);
set(L2,'XData',t,'YData',c);
drawnow
end
end

function Boton(obj, ~)
Parar = obj.Value;
end
end

Experimentar cambiando la frecuencia de muestreo Fs = 10 y el tamaño del vector N = 100, como también con
Fs = 1 y N = 10.

También podría gustarte