Sunteți pe pagina 1din 12

UNIVERSIDAD PRIVADA DEL NORTE

J.CARLOS GONZALES 1

UNIVERSIDAD PRIVADA DEL NORTE
Laureate Internacional Universities
FACULTAD DE INGENIERA
ESCUELA DE INGENIERA MECATRNICA





Curso:
INGENIERA DE CONTROL
DOCENTE:
ING. CARLOS SANCHEZ
PARTICIPANTE:
GONZALES AROSTE JUAN CARLOS
CRUZ CCOLLCCA ALFONSO
SANCHEZ LORENZO JOS
CUMBA DANNY
UNIVERSIDAD PRIVADA DEL NORTE
J.CARLOS GONZALES 2


Lima Per


A la hora de empezar con cualquier proyecto de aplicacin prctica, una de las
cuestiones principales suele ser enlazar la parte terica (hbilmente trabajosamente
programada en nuestro entorno informtico preferido) como algoritmos 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
adquirir un sistema comercial de adquisicin de datos (DAQ) como los de National
Instruments; afortunadamente hoy en da hay alternativas uno o dos rdenes de
magnitud ms asequibles: una de ellas es el popular microcontrolador Arduino.
Uno de los ejemplos ms bsicos consiste en leer datos de un sensor conectado al
Arduino y transmitirlos al PC mediante comunicacin serie; sin embargo, este ejemplo
tiene dos limitaciones: se limita a un nico sensor y los datos se leen numricamente
en pantalla, pero no es posible adquirirlos ni trabajar con ellos.
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 analgicas A0 y A1 del Arduino, de esta manera:

Por supuesto, cualquier otro sensor analgico sirve exactamente igual para este
ejemplo. A continuacin, hemos de programar el Arduino, para que recoja la
informacin de A0 y A1 y la enve va serie; el formato del envo consiste en: valor de
UNIVERSIDAD PRIVADA DEL NORTE
J.CARLOS GONZALES 3

A0, coma, valor de A1 y retorno de carro + lnea nueva (debido a que se usa la funcin
Serial.println() al final).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// definir variables
int out1 = 0;
int out2 = 0;

void setup() {
// inicializar puerto serie
Serial.begin(9600);
}

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

Configuracin de Matlab
Una vez configurado el Arduino, los datos se enviarn por la propia conexin 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
3
4
5
6
7
%borrar previos
delete(instrfind({'Port'},{'COM4'}));
%crear objeto serie
s = serial('COM4','BaudRate',9600,'Terminator','CR/LF');
warning('off','MATLAB:serial:fscanf:unsuccessfulRead');
%abrir puerto
fopen(s);

El siguiente paso es preparar la medida, ajustando dos parmetros: el tiempo total de
medida, y la velocidad de capturas por segundo. ste ltimo parmetro hay que
estimarlo, pero haremos que que el programa nos devuelva el valor real, con lo que si
ste se aleja de lo estimado ser inmediato corregirlo.
1
2
% parmetros de medidas
tmax = 10; % tiempo de captura en s
UNIVERSIDAD PRIVADA DEL NORTE
J.CARLOS GONZALES 4

3 rate = 33; % resultado experimental (comprobar)
A continuacin preparamos la figura en la que leeremos la seal de ambos
potencimetros. Abrimos una nueva ventana y unos nuevos ejes, y creamos dos
objetos grficos de tipo lnea, que iremos actualizando a medida que tengamos los
datos. De esta manera Matlab no se saturar, que es lo que pasara si intentsemos
utilizar la funcin plot() dentro del bucle.
1
2
3
4
5
6
7
8
9
10
11
% preparar la figura
f = 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 on
hold on
El ncleo 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 ejecucin
y actualizando los dos objetos lnea creados anteriormente: los datos Y sern los
voltajes medidos hasta el momento y los datos X el tiempo de ejecucin. Al salir del
bucle, imprimiremos el dato de capturas por segundo que hemos estimado arriba.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
% inicializar
v1 = zeros(1,tmax*rate);
v2 = zeros(1,tmax*rate);
i = 1;
t = 0;

% ejecutar bucle cronometrado
tic
while t<tmax
t = toc;
% leer del puerto serie
a = fscanf(s,'%d,%d')';
v1(i)=a(1)*5/1024;
v2(i)=a(2)*5/1024;
% dibujar en la figura
x = linspace(0,i/rate,i);
set(l1,'YData',v1(1:i),'XData',x);
set(l2,'YData',v2(1:i),'XData',x);
drawnow
% seguir
i = i+1;
UNIVERSIDAD PRIVADA DEL NORTE
J.CARLOS GONZALES 5

22
23
24
25
end
% resultado del cronometro
clc;
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 maravillosa funcin 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
3
4
%% Limpiar la escena del crimen
fclose(s);
delete(s);
clear s;
Resultado y ejemplo de captura
Con el cdigo del ejemplo, obtendramos una figura semejante a esta:

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 anlisis
espectral mediante transformada rpida de Fourier; graficarlos frente a otras variables,
realizar un test de correlacin, salvarlos en formato Excel, etc.



UNIVERSIDAD PRIVADA DEL NORTE
J.CARLOS GONZALES 6





AVANCE DE LA GUIDE PARA CONTROL POR VOZ:

function varargout = ledscomandosvoz(varargin)
% Por: Ronald Pineda / Level 6
% LEDSCOMANDOSVOZ M-file for ledscomandosvoz.fig
% LEDSCOMANDOSVOZ, by itself, creates a new LEDSCOMANDOSVOZ or
raises the existing
% singleton*.
%
% H = LEDSCOMANDOSVOZ returns the handle to a new LEDSCOMANDOSVOZ
or the handle to
% the existing singleton*.
%
% LEDSCOMANDOSVOZ('CALLBACK',hObject,eventData,handles,...) calls
the local
% function named CALLBACK in LEDSCOMANDOSVOZ.M with the given
input arguments.
%
% LEDSCOMANDOSVOZ('Property','Value',...) creates a new
LEDSCOMANDOSVOZ or raises the
% existing singleton*. Starting from the left, property value
pairs are
% applied to the GUI before ledscomandosvoz_OpeningFcn gets
called. An
UNIVERSIDAD PRIVADA DEL NORTE
J.CARLOS GONZALES 7

% unrecognized property name or invalid value makes property
application
% stop. All inputs are passed to ledscomandosvoz_OpeningFcn via
varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows
only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help ledscomandosvoz

% Last Modified by GUIDE v2.5 23-Apr-2013 15:28:53

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @ledscomandosvoz_OpeningFcn, ...
'gui_OutputFcn', @ledscomandosvoz_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before ledscomandosvoz is made visible.
function ledscomandosvoz_OpeningFcn(hObject, eventdata, handles,
varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to ledscomandosvoz (see VARARGIN)

% Choose default command line output for ledscomandosvoz
handles.output = hObject;
handles.rgb = [];
handles.noback = [];
guidata(hObject, handles);
% Update handles structure
if strcmp(get(hObject,'Visible'),'off')
try
handles.vidobj = videoinput('winvideo',2);
% Update handles structure
start(handles.vidobj);
guidata(hObject, handles);
vidRes = get(handles.vidobj, 'VideoResolution');
nBands = get(handles.vidobj, 'NumberOfBands');
hImage = image(zeros(vidRes(2), vidRes(1), nBands), 'Parent',...
handles.axes3);
UNIVERSIDAD PRIVADA DEL NORTE
J.CARLOS GONZALES 8

preview(handles.vidobj,hImage);
catch
msgbox('NO HAY CMARA CONECTADA. Cargando Profile.jpg.')
hImage = image(imread('profile.jpg'), 'Parent',handles.axes2);
end
end
% Update handles structure
guidata(hObject, handles);
clear all;
global a; % declaro a como variable global
a = arduino('COM30'); % realizo la comunicacin serial entre el
arduino y matlab
a.pinMode(7,'output'); % declaro el pin 7 como salida
a.pinMode(8,'output'); % declaro el pin 8 como salida



% --- Outputs from this function are returned to the command line.
function varargout = ledscomandosvoz_OutputFcn(hObject, eventdata,
handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in orden.
function orden_Callback(hObject, eventdata, handles)
% Se realiza el proceso para grabar audio en tiempo real
clc %limpia la pantalla
global y fs; %Establecer variables globales
fs=11025; %frecuencia de muestreo
tiempograb=1.5; %Tiempo de grabacion
y=wavrecord(tiempograb*fs,fs,1); %funcin de grabacion
%soundsc(y,fs); %Reproduce grabacin
ts=1/fs;
t=0:ts:tiempograb-ts; % vector de tiempo
b=[1 -0.95];
yf=filter(b,1,y); %Proceso de filtrado
len = length(y); %longitud del vector
avg_e = sum(y.*y)/len; %promedio seal entera
THRES = 0.2;
soundsc(y,fs) %Reproduce seal filtrada
wavwrite(yf,fs,'voz'); %Graba en archivo .wav el audio q pronunciamos
axes(handles.axes2);
plot(t,yf);grid on; % Grafica en los axes

guidata(hObject, handles);

% --- Executes on button press in sal.
function sal_Callback(hObject, eventdata, handles)
% hObject handle to sal (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
ans=questdlg('Desea salir del programa?','SALIR','Si','No','No');
if strcmp(ans,'No')
UNIVERSIDAD PRIVADA DEL NORTE
J.CARLOS GONZALES 9

return;
end
clear,clc,close all

function sonidoN=normalizar(sonido) % funcin para normalizar la seal
maximo=max(abs(sonido)); % saco el valor mximo y absoluto
n=length(sonido); %calcula el tamao del vector
sonidoN=zeros(1,n); % zeros, me devuelve una matriz de ceros
for i=1:1:n
sonidoN(i)=sonido(i)/maximo;
end
% --- Executes on button press in procesa.
function procesa_Callback(hObject, eventdata, handles)
% hObject handle to procesa (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global a y fs; % hago llamado a las variables q se van a usar en
todo el programa

N=length(y); %calcula el tamao del vector
f=(0:N-1)*fs/N;

% Parmetros entrenados para reconocer
v1 = wavread('a'); % leo los archivos .wav q tenemos almacenados
p1 = wavread('b');
c1 = wavread('1');
o1= wavread ('O');


%--- Uso de la Funcin Normalizar
orden1 = normalizar(v1); % normalizo los archivos de audio
orden2 = normalizar(p1);
orden3= normalizar (c1);
orden4= normalizar (o1);
%---- Transformada de las Letras y Nmeros
transorden1 = abs((fft(orden1))); % encuentro la transformada rapida
de fourie y su valor absoluto
transorden2 = abs((fft(orden2)));
transorden3 =abs ((fft(orden3)));
transorden4=abs((fft(orden4)));
%----- Proceso de Reconocimiento
voz_usuario=wavread('voz'); % leo el archivo de audio q grabamos en
tiempo real
usuario=normalizar(voz_usuario); % normalizo el archivo de audio
transusuario=abs((fft(usuario))); % encuentro la transformada rapida
de fourier y su valor absoluto
a1=transorden1-transusuario; % realizo la resta de las seales
procesadas (audio base de datos - audio grabado en tiempo real)
b1=transorden2-transusuario;
c11=transorden3-transusuario;
o11=transorden4-transusuario;
error(1)=mean(abs(a1)); % mean = Devuelve los valores de media de los
elementos
error(2)=mean(abs(b1));
error(3)=mean(abs(c11));
error(4)=mean(abs(o11));

min_error=min(error); %Almacena el menor error
%display(error) %Muestra el vector error
%display(min_error) %Muestra el menor error
UNIVERSIDAD PRIVADA DEL NORTE
J.CARLOS GONZALES
1
0


if(min_error == error(1)) % realizo la comparacin del mnimo error

set (handles.text3, 'String', 'A'); % Muestra la letra comparada

a.digitalWrite(7,1); % escribo el pin 7 en alto
a.digitalWrite(8,0); % escribo el pin 8 en bajo
end

if(min_error == error(2))

set (handles.text3, 'string', 'B');

a.digitalWrite(7,0); % escribo el pin 7 en bajo
a.digitalWrite(8,1); % escribo el pin 8 en alto
end

if(min_error == error(3))

set (handles.text3, 'string', 'UNO');

a.digitalWrite(7,0); % escribo el pin 7 en bajo
a.digitalWrite(8,0); % escribo el pin 8 en bajo
end
if(min_error == error(4))

set (handles.text3, 'string', 'O');

a.digitalWrite(7,1); % escribo el pin 7 en alto
a.digitalWrite(8,1); % escribo el pin 8 alto
end



% --- Executes during object creation, after setting all properties.
function axes1_CreateFcn(hObject, eventdata, handles)
% hObject handle to axes1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns
called
yy=imread('walle.jpg'); % leo un archivo jpg
image(yy); % presento la imagen
axis off

ARCHIVO GRABAR.m
fs=11025; %frecuencia de muestreo
tiempograb=1.5; %Tiempo de grabacion
y=wavrecord(tiempograb*fs,fs,1); %funcin de grabacion
%soundsc(y,fs); %Reproduce grabacin
ts=1/fs;
t=0:ts:tiempograb-ts; % vector de tiempo
b=[1 -0.95];
yf=filter(b,1,y); %Proceso de filtrado
len = length(y); %longitud del vector
avg_e = sum(y.*y)/len; %promedio seal entera
UNIVERSIDAD PRIVADA DEL NORTE
J.CARLOS GONZALES
1
1

THRES = 0.2;
soundsc(y,fs) %Reproduce seal filtrada
wavwrite(yf,fs,'O'); %Graba en archivo





UNIVERSIDAD PRIVADA DEL NORTE
J.CARLOS GONZALES
1
2

S-ar putea să vă placă și