Beruflich Dokumente
Kultur Dokumente
OBJETIVOS
Entrenar al estudiante en el uso de sistemas de comunicación entre Matlab y Arduino para
aplicaciones de adquisición de datos
Aprender comandos para la transformación de sistemas continua a sistemas discretos
REFERENCIAS
Andrew Knight Basics of MATLAB and Beyond. Chapman and Hall/CRC; 1 edition, 1999.
Fernandez del Busto y Ezeta, Ricardo., "Análisis y diseño de sistemas de control digital", Mc
Graw Hill, 2013, ISBN: 978-607-15-0773-0
http://www.mathworks.com
SESIÓN SIMULACIÓN
INTRODUCCIÓN
TRANSIENT RESPONSE
For discrete systems, we can analyze the system behaviors from different pole locations in the z-plane. The
characteristics in the z-plane can be related to those in the s-plane by the following expression.
numDz = 1;
denDz = [1 -0.3 0.5];
sys = tf(numDz,denDz,-1); % the -1 indicates that the sample time is undetermined
pzmap(sys)
axis([-1 1 -1 1])
zgrid
Control Digital
Lab. No.3 – Discretización y adquisición de datos 2
sys = tf(numDz,denDz,1/20);
step(sys,2.5);
den(z)=z^2-1,8096z+0,9048
1.4
num=[0.0952 0];
den=[1 -1.8096 0.9048]; 1.2
T=0.1;
n=100; 1
y(kT)
tempo=(0:1:n-1)*T;
yk=dstep(num,den,n); 0.8
figure(1)
plot(tempo,yk,'*r') 0.6
xlabel('kT [segundos]')
0.4
ylabel('y(kT)')
title('Respuesta a una entrada 0.2
escalon')
grid 0
0 1 2 3 4 5 6 7 8 9 10
kT [segundos]
Control Digital
Lab. No.3 – Discretización y adquisición de datos 3
step(H,'-',Hd,'--')
Discretize the following delayed transfer function using zero-order hold on the input, and a 10-Hz sampling
rate.
h = tf(10,[1 3 10],'IODelay',0.25);
hd = c2d(h,0.1)
hd =
Control Digital
Lab. No.3 – Discretización y adquisición de datos 4
load iddata1
sys1c = tfest(z1,2);
sys1d = c2d(sys1c,0.1,'zoh');
sys2d = tfest(z1,2,'Ts',0.1);
compare(z1,sys1d,sys2d)
D2C
Hc = d2c(H)
Hc =
121.7 s + 1.405e-12
---------------------
s^2 + 12.04 s + 776.7
Discretize the resulting model, Hc, with the default zero-order hold method and sample time 0.1s to return
the original discrete model, H.
c2d(Hc,0.1)
ans =
z-1
-------------
z^2 + z + 0.3
Sample time: 0.1 seconds Discrete-time transfer function.
Hc2 = d2c(H,'tustin');
Control Digital
Lab. No.3 – Discretización y adquisición de datos 5
Discretize the resulting model, Hc2, to get back the original discrete-time model, H.
c2d(Hc2,0.1,'tustin');
SESIÓN EXPERIMENTAL
INTRODUCCIÓN
Como se puede ver en la descripción que se presenta desde MathWorks, MATLAB® es un entorno de
programación con infinidad de posibilidades, que ayuda a resolver los problemas de cálculo técnico incluso
más rápidamente que otros lenguajes de programación. MATLAB es extremadamente potente, por lo que
suele ser complicado a veces, desarrollar aplicaciones estructuradas, en esta guía se presenta un Script para la
comunicación con Arduino en tiempo real, cabe anotar que no es la única solución, ya que la diversidad de
pensamiento y las potentes herramientas del programa lo hacen versátil en su uso y aplicación.
Para comenzar, lo que se quiere hacer es, leer con Arduino los datos de un potenciómetro que se tiene
conectado al pin analógico número 0. Se obtendrán valores entre 0 y 1023, los cuales se enviarán a través del
Puerto Serial hacia MATLAB, que los recogerá y los procesará a voltios. Se puede decir, que se va a realizar
un muestreo de valores, los cuales se van a representar en una gráfica.
En la anterior gráfica muestra los valores que Arduino ha obtenido del potenciómetro, el cual se ha ido
moviendo para ver la variación en cada muestra. Arduino envía a Matlab valores entre 0 y 1023 pero, como
ya se mencionó antes, desde Matlab se ha hecho la conversión a Voltios, aunque también se podría haber
hecho desde Arduino.
Desarrollo de la práctica
1. Descargar desde matworks o desde el PLAD la aplicación que permite a Matlab comunicarse con
Arduino (ArduinoIO.zip).
Control Digital
Lab. No.3 – Discretización y adquisición de datos 6
2. Descomprima el archivo, ArduinoIO, en su interior hay una serie de carpetas y archivos, por ahora nos
interesa la carpeta pde.
3. Abra el programa Arduino haciendo click sobre el ícono que se muestra en la figura.
Una vez el programa despliegue la ventana de inicio de Arduino, dar click en la barra de menú Archivo
=> Abrir, en la ventana de búsqueda que se despliega, ubicar la carpeta pde contenida en la carpeta
descargada ArduinoIO, dentro de esta carpeta se encuentra el archivo adioes.pde, cargar el archivo en la
tarjeta Arduino, luego cerrar el programa, ya el arduino ha quedado configurado para comunicarse con
Matlab. Recuerde que se debe configurar el puerto de comunicación del arduino para poder programarlo.
En la barra de menú, ir a Herramientas => Tarjeta para seleccionar la tarjeta que se va a usar y en
Herramientas => Puerto serial para ver el puerto al que se conectó el Arduino.
4. El siguiente paso es abrir Matlab y desde la ventana de comandos, ejecutar el archivo install_arduino
que se encuentra en la carpeta ArduinoIO, vale aclarar que dicha carpeta debe estar instalada en el
directorio de trabajo de Matlab, para que pueda ser reconocida.
5. De esta manera queda listo y configurado el sistema para poder realizar la comunicación entre los
dispositivos y Matlab.
6. Para probar la conexión de Matlab con Arduino, desde la ventana de comandos de Matlab, ejecute la
siguiente instrucción: ax = arduinno(‘COMX’). X es el número del puerto al que se conectó el arduino.
Si la conexión es correcta, aparecerá un listado de cómo están configurad los puertos de arduino.
7. El paso a seguir es realizar una aplicación script que permita la toma de datos de un proceso, bien sea
para una base de datos o para la identificación de sistemas.
¡Con esta pequeña explicación se procede a programar el script en MATLAB para establecer la
comunicación Puerto Serie! (Este script es propuesto por el profesor, pero no es la única solución)
Para comenzar, se creará el siguiente srcipt en Matlab, el cual podrá ser ejecutado desde la Ventana de
Comandos (Command Window),
Lo primero que se va a escribir en el script serán los comandos para borrar todo rastro de figuras y datos que
hayan podido haber quedado por ahí, así como el borrado del command Windows. Existe una instrucción que
permite borrar/limpiar el puerto, esto con el fin de encontrar errores de puerto en uso y cosas así, esta
instrucción es la siguiente:
delete(instrfind({'Port'},{'COM1'}));
El paso siguiente será crear toda la lógica de intercomunicación entre Matlab y Arduino, para lo cual se
ejecuta:
Control Digital
Lab. No.3 – Discretización y adquisición de datos 7
1. La conexión “Attempting connection”, ax = arduino(‘COM1’) p.e.
2. Frecuencia de muestreo Fs.
3. Número de muestras N
4. Crear vectores de almacenamiento y tiempo [y t].
5. Configurar ejes para la gráfica. [ylim xlim].
6. Para una mejor presentación, se ha creado un botón de control ‘Parar’, con uicontrol.
7. Por último se crea un ciclo while, el cual, dependiendo del compás tic-toc, tomará los datos.
8. Dentro del lazo while se tomarán los datos y se graficarán.
9. El comando y(1:end-1) = y(2:end), permitirá mover los ejes de atrás hacia adelante.
clc
close all
clear all
delete(instrfind({'Port'},{'COM1'}));
an = arduino('COM1'); %Puerto donde esta conectado el arduino
Fs = 50; %Frecuencia de muestreo
N = 1000; %Tamaño del vector
y = zeros(N, 1);
t = linspace(0, (N-1)/Fs, N); %Crea el vector tiempo
l1 = line(nan, nan, 'Color', 'r', 'LineWidth', 2);% Genera una línea a partir de los datos leidos
ylim = ([-0.1 5.1]); %Límites del eje Y
xlim = ([0 (N-1)/Fs]); %Límites del eje X
grid %Abre la grilla
%Crear un botón de parada para la toma de datos
stop = 1;
%Diseño del botón
uicontrol('Style', 'Pushbutton', 'String', 'Parar', 'Callback', 'stop=0;');
tic %Inicio del compas
while stop
if toc > 1/Fs
tic
y(1:end-1) = y(2:end); %Mueve el vector
y(end) = an.analogRead(0)*5/1023;%Lee los datos a través de arduino
set(l1, 'XData', t, 'YData', y);%Pone los datos para graficar
drawnow %Grafica
end
end
Montaje
Control Digital
Lab. No.3 – Discretización y adquisición de datos 8
Fundamentación
Los sistemas de control se refieren al uso de herramientas que permitan controlar de forma autónoma plantas
industriales, se basan en la construcción de lazos cerrados para comparar un set point con la medida directa
de la variable controlada, para que, dependiendo del error, el sistema responda en una u otra forma con una
señal de mando m(t).
Es necesario saber que los sistemas de control manejan variables análogas continuas en el tiempo y que el
controlador moderno (control digital) las manipula en forma digital, esto conlleva a tener que convertir las
entradas de análogo a digital y las salidas de digital a análogo. Para ello se utilizan los sistemas de
conversión ADC y DAC. Matlab es un potente programa que permite, a través de sus toolbox para control
system, realizar todo tipo de análisis y manipulación de los sistemas de control, para ello se deben conocer
las funciones de transferencia de la planta y de su sistema de medida. Existen en Matlab toolboxes para la
identificación paramétrica y no paramétrica de dichas plantas así como los tipos de conversión de análogo a
digital (Continuos to Digital) c2d y (Digital to Continuos) d2c.
A partir de esta función de transferencia se procederá a la conversión al dominio (z), o sea sistema de control
digital.
Donde el tiempo de muestreo Ts será igual al inverso de Fs, la cual en el ejemplo anterior se había definido
como 50, de esta manera la nueva función de transferencia quedará así:
La transformada inversa (z) dará la ecuación en diferencias del sistema, esta será entonces:
Esta será la función de transferencia objeto de estudio en esta parte de la práctica. La respuesta al escalón de
esta nueva función, debe guardar relación con la respuesta al sistema continuo, entonces:
Control Digital
Lab. No.3 – Discretización y adquisición de datos 9
Esta respuesta es muy similar a la obtenida
para el sistema continuo, aquí se logran ver
los pequeños escalones de la conversión.
clc
close all
clear all
delete(instrfind({'Port'},{'COM1'}));%En mi caso el Puerto es el COM1
an = arduino('COM1'); %Puerto donde está conectado el arduino
Fs = 50; %Frecuencia de muestreo
N = 1000; %Tamaño del vector
u = zeros(N,1); %Vector de entradas u
y = zeros(N,1); %Vector de salidas y
t = linspace(0, (N-1)/Fs, N); %Crea el vector tiempo
Control Digital
Lab. No.3 – Discretización y adquisición de datos 10
tic
u(1:end-1) = u(2:end);%Mueve el vector u
y(1:end-1) = y(2:end);%Mueve el vector y
u(end) = an.analogRead(0)*5/1023;%Lee los datos a través de arduino
%Ecuación en diferencias
y(end) = -a1*y(end-1)-a2*y(end-2)+b1*u(end-1)+b2*u(end-2);
Control Digital