%////////////////////////////////////////////////////////////////////////%
%/// CONEXION USB MATLAB MEDIANTE LA LIBRERIA MPUSBAPI,DLL ///%
%/// SOFTWARE QUE NOS PERMITE RECIBIR DATOS DESDE EL ADC DEL PIC ///%
%/// 18F4550 Y ANALIZAR LA ONDAS FOTOPLETISMOGRAFICAS ///%
%/// CUSCO-PERU-2009 ///%
%////////////////////////////////////////////////////////////////////////%
%NOMBRAMOS A NUESTRO PROYECTO Conex_USB_1
function Conex_USB_1
hAxesRaw = [];
hAxesRojoAC = [];
%DEFINIMOS VARIABLE ADQUISICION_DATO
%Adquisicion_Dato = false;
%hProcesaRojoAC = [];
hRecibeADCRojoAC = [];
Buff_Aux= [1 1 1 ];
%% INCIALIZAMOS Y ESCONDEMOS EL GUI CREADO
f = figure('Visible','off','Position',[310,50,550,485]);%6,'Color',[0 0 0.15]);
%IMPORTAMOS IMAGEN
[x,map]=imread('escudo.jpg','jpg');
%Representamos imagen en figura, con su mapa de colores
image(x),colormap(map),axis off,hold on
%% DEFINIMOS CONTROLES ABRIR-CERRAR PUERTO
%CREAMOS BARRA DE MENUS
mAbrir = uimenu(f,'Label','Conex USB');
Abrir = uimenu(mAbrir,'Label','Abrir',...
'Callback',{@AbrirMenu_Callback});
mAnalizar = uimenu(f,'Label','ANALIZAR');
RojoAC = uimenu(mAnalizar,'Label','ROJO AC',...
'Callback',{@RojoACMenu_Callback});
InfrAC = uimenu(mAnalizar,'Label','INFR AC',...
'Callback',{@InfrACMenu_Callback});
RojoDC = uimenu(mAnalizar,'Label','ROJO DC',...
'Callback',{@RojoDCMenu_Callback});
InfrDC = uimenu(mAnalizar,'Label','INFR DC',...
'Callback',{@InfrDCMenu_Callback});
LuzDC = uimenu(mAnalizar,'Label','LUZ DC',...
'Callback',{@LuzDCMenu_Callback});
mSPO2 = uimenu(f,'Label','SPO2');
SPO2 = uimenu(mSPO2,'Label','Abrir',...
'Callback',{@SPO2Menu_Callback});
%CREAMOS UN PANEL PARA CONEX USB
pConexion = uipanel('BorderType','etchedin',...
'Parent',f,'Title','CONEX USB',...
'Position',[.05 .65 .2 .3]);
pRojoAC = uipanel('BorderType','etchedin',...
'Parent',f,'Title','ROJO AC',...
'Position',[.05 .42 .2 .2]);
pInfrAC = uipanel('BorderType','etchedin',...
'Parent',f,'Title','INFR AC',...
'Position',[.05 .42 .2 .2]);
pRojoDC = uipanel('BorderType','etchedin',...
'Parent',f,'Title','ROJO DC',...
'Position',[.05 .42 .2 .2]);
pInfrDC = uipanel('BorderType','etchedin',...
'Parent',f,'Title','INFR DC',...
'Position',[.05 .42 .2 .2]);
pLuz = uipanel('BorderType','etchedin',...
'Parent',f,'Title','LUZ DC',...
'Position',[.05 .42 .2 .2]);
pSPO2 = uipanel('BorderType','etchedin',...
'Parent',f,'Title','SPO2',...
'Position',[.05 .42 .2 .2]);
%BOTONES : ABRIR CERRAR CONEXION , ENCEDER APAGAR LEDS
hAbrirConex = uicontrol('Parent',pConexion,'Style','pushbutton',...
'String','Abrir','Enable','off','Position',[1,90,70,25],...
'Callback',{@AbrirConexButton_Callback});
hCerrarConex = uicontrol('Parent',pConexion,'Style','pushbutton',...
'String','Cerrar','Enable','off','Position',[15,60,70,25],...
'Callback',{@CerrarConexButton_Callback});
hLEDV = uicontrol('Parent',pConexion,'Style','pushbutton',...
'String','LEDV','Enable','off','Position',[15,35,70,25],...
'Callback',{@LEDVButton_Callback});
hLEDR = uicontrol('Parent',pConexion,'Style','pushbutton',...
'String','LEDR','Enable','off','Position',[15,10,70,25],...
'Callback',{@LEDRButton_Callback});
%CERRAMOS LIBRERIA PARA EVITAR ERRORES
hCerrarLib = uicontrol('Style','pushbutton',...
'String','Cerrar Lib','Enable','on','Position',[315,5,70,55],...
'Callback',{@CerrarLibButton_Callback});
%CREAMOS BOTONES PARA RECIBIR Y PROCESAR DATOS PIC_ADC
hRecibeADCRojoAC = uicontrol('Parent',pRojoAC,'Style','pushbutton',...
'String','ADC ROJO AC','Position',[1,50,100,25],...
'Callback',{@RecibeADCRojoACButton_Callback});
hProcesaRojoAC = uicontrol('Parent',pRojoAC,'Style','pushbutton',...
'String','Procesa Dato','Enable','off','Position',[1,20,100,25],...
'Callback',{@ProcesaRojoACButton_Callback});
%CREAMOS BOTONES INICIO Y PARADA DE GRAFICOS
hIniciaPloter_RojoAC = uicontrol('Style','pushbutton',...
'String','INICIO','ForegroundColor',[0,1,0],...
'Enable','on','FontWeight','bold',...
'Position',[250,380,100,25],...
'Callback',{@IniciaPloter_Callback});
hPausaPloter = uicontrol('Style','pushbutton',...
'String','PAUSA','ForegroundColor',[1,0,0],...
'Enable','on','FontWeight','bold',...
'Position',[250,350,100,25],...
'Callback',{@PausaPloter_Callback});
%CREAMOS EL OBJETO TIMER
timerObj = timer('Period',0.05,'ExecutionMode','fixedSpacing','timerFcn',@DatosUSB);
timer_RojoAC = timer('Period',0.5,'ExecutionMode','fixedSpacing','timerFcn',@Datos_RojoAC);
%ALINEAMOS LOS BOTONES
align([hAbrirConex,hCerrarConex,hLEDR,hLEDV],'Center','None');
%HACEMOS EL GUI VISIBLE
set(f,'Visible','on');
set([hRecibeADCRojoAC,hProcesaRojoAC],'FontWeight','bold');
%CREAMOS EJES DE COORD
hAxesRaw = axes('visible','off','position', [0.13 0.1 0.775 0.31]);
title('PRUEBA');
hAxesRojoAC = axes('visible','off','position', [0.13 0.1 0.775 0.31]);
title('ROJO AC');
%CAMBIAMOS LA NORMALIZACXION DE LOS COMPONENTES
set([f,hAbrirConex,hCerrarConex,hRecibeADCRojoAC,hProcesaRojoAC, hPausaPloter,hIniciaPloter_RojoAC],'Units','normalized');
set(f,'MenuBar','none');
set([pConexion,pRojoAC,pInfrAC,pRojoDC,pInfrDC,pLuz,pSPO2],'visible','off');
set([Abrir,RojoAC,InfrAC,RojoDC,InfrDC,LuzDC,SPO2],'ForegroundColor',[0 0 1] );
%% CARGAMOS LA LIBRERIA MPUSBAPI
%CARGAMOS LA LIBRERIA MPUSBAPI
loadlibrary mpusbapi _mpusbapi.h alias libreria
libisloaded libreria
%DECLARANDO VECTORES DE DATOS
data_in = eye(1,10,'uint8'); % El que se recibe del PIC
data_out = eye(1,3,'uint8'); % El que se envia al PIC
%DECALARANDO VID-PID DEL PIC18F4550
vid_pid_norm = libpointer('int8Ptr',[uint8('vid_04d8&pid_0052') 0]);
out_pipe = libpointer('int8Ptr',[uint8('\MCHP_EP1') 0]);
in_pipe = libpointer('int8Ptr',[uint8('\MCHP_EP1') 0]);
%REALIZAMOS CONTEO DE DISPOSITIVOS
calllib('libreria','MPUSBGetDLLVersion');
[conectado] = calllib('libreria','MPUSBGetDeviceCount',vid_pid_norm);
%PREGUNTAMOS SI LA CONEX SE REALIZO
%SI ES ASI HABILITAMOS EL BOTON ABRIR CONEX
if conectado == 1
set(hAbrirConex,'Enable','on');
end
%% FUNCIONES DE BARRA DE MENU
function AbrirMenu_Callback(source,eventdata)
set([pRojoAC,pInfrAC,pRojoDC,pInfrDC,pLuz,pSPO2],'visible','off')
set(pConexion,'visible','on')
end
function RojoACMenu_Callback(source,eventdata)
set([pRojoAC,pInfrAC,pRojoDC,pInfrDC,pLuz,pSPO2],'visible','off')
set([pRojoAC,pConexion],'visible','on')
end
function InfrACMenu_Callback(source,eventdata)
set([pRojoAC,pInfrAC,pRojoDC,pInfrDC,pLuz,pSPO2],'visible','off')
set([pInfrAC,pConexion],'visible','on')
end
function RojoDCMenu_Callback(source,eventdata)
set([pRojoAC,pInfrAC,pRojoDC,pInfrDC,pLuz,pSPO2],'visible','off')
set([pRojoDC,pConexion],'visible','on')
end
function InfrDCMenu_Callback(source,eventdata)
set([pRojoAC,pInfrAC,pRojoDC,pInfrDC,pLuz,pSPO2],'visible','off')
set([pInfrDC,pConexion],'visible','on')
end
function LuzDCMenu_Callback(source,eventdata)
set([pRojoAC,pInfrAC,pRojoDC,pInfrDC,pLuz,pSPO2],'visible','off')
set([pLuz,pConexion],'visible','on')
end
function SPO2Menu_Callback(source,eventdata)
set([pConexion,pRojoAC,pInfrAC,pRojoDC,pInfrDC,pLuz,pSPO2],'visible','off')
set([pSPO2,pConexion],'visible','on')
end
%% FUNCION ABRIR CONEXION PUERTO USB
function AbrirConexButton_Callback(source,eventdata)
set(hCerrarConex,'Enable','on');
set(hAbrirConex,'Enable','off');
set(hLEDV,'Enable','on');
set(hLEDR,'Enable','on');
set(hRecibeADCRojoAC,'Enable','on');
% ABRIMOS EL PIPE DE CONEXION
[my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, out_pipe, uint8(0), uint8 (0));
% SE ENVIA DATO AL PIC
calllib('libreria', 'MPUSBWrite',my_out_pipe, data_out, uint8(64), uint8(64), uint8(10));
[my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, out_pipe, uint8(0), uint8 (0)); % Se abre el tunel de envio
calllib('libreria', 'MPUSBClose', my_out_pipe); % Se cierra el tunel de envio
end
%% FUNCION ENCIENDE APAGA LEDS
function LEDRButton_Callback(source,eventdata)
set(hAbrirConex,'Enable','off');
set(hRecibeADCRojoAC,'Enable','on');
% ABRIMOS EL PIPE DE CONEXION
[my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, out_pipe, uint8(0), uint8 (0));
data_out(2)=1
% SE ENVIA DATO AL PIC
calllib('libreria', 'MPUSBWrite',my_out_pipe, data_out, uint8(64), uint8(64), uint8(10));
[my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, out_pipe, uint8(0), uint8 (0)); % Se abre el tunel de envio
calllib('libreria', 'MPUSBClose', my_out_pipe); % Se cierra el tunel de envio
end
function LEDVButton_Callback(source,eventdata)
set(hAbrirConex,'Enable','off');
set(hRecibeADCRojoAC,'Enable','on');
% ABRIMOS EL PIPE DE CONEXION
[my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, out_pipe, uint8(0), uint8 (0));
data_out(2)=2;
% SE ENVIA DATO AL PIC
calllib('libreria', 'MPUSBWrite',my_out_pipe, data_out, uint8(64), uint8(64), uint8(10));
end
%% FUNCION CERRAR PIPES DE COMUNICACION
function CerrarConexButton_Callback(source,eventdata)
set(hAbrirConex,'Enable','off');
set(hCerrarConex,'Enable','off');
set(hCerrarLib,'Enable','on');
[my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, out_pipe, uint8(0), uint8 (0)); % Se abre el tunel de envio
calllib('libreria', 'MPUSBClose', my_out_pipe); % Se cierra el tunel de envio
%calllib('libreria', 'MPUSBClose', my_in_pipe); % Se cierra el tunel de envio
libisloaded libreria
end
%% CERRAMOS LIBRERIAS _mpusbapi.h y mpusbapi.dll PARA EVITAR ERRORES
function CerrarLibButton_Callback(source,eventdata)
set(hAbrirConex,'Enable','off');
set(hCerrarConex,'Enable','off');
unloadlibrary libreria
libisloaded libreria
stop(timerObj)
close(f);
end
%% RECIBIMOS DATOS DEL ADC_ROJO
function RecibeADCRojoACButton_Callback(source,eventdata)
% ABRIMOS EL PIPE DE CONEXION
%[my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (1), vid_pid_norm, out_pipe, uint8(0), uint8 (0));
% ENVIAMOS PETICON AL PIC
% calllib('libreria', 'MPUSBWrite',my_out_pipe, data_out, uint8(64), uint8(64), uint8(10));
% for n=0:10
%DAMOS LA ORDEN PARA QUE EL PIC ENVIE DATOS HACIA LA PC
% [my_in_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, in_pipe, uint8 (1), uint8 (0));
%RECIBIMOS DATOS PROVENEINTES DEL PIC
% [aa,bb,data_in,dd] = calllib('libreria', 'MPUSBRead',my_in_pipe, data_in, uint8(11), uint8(11), uint8(0));
% data_in(1)
% data_in(2)
start(timer_RojoAC);
%data_in(2) %data_in(3) %data_in(4)
%data_in(5) %data_in(6) %data_in(7) %data_in(8)
%data_in(9) %data_in(10)
end
%% TIMER EMPIEZA A REALIZAR TAREA ASIGNADA
function DatosUSB(hObject, eventdata)
Xdato = linspace(0,1,256);
Ydato = sin(30*2*pi*Xdato) + randn(size(Xdato))*0.2;
Xunits='Segundos';
Yunits='Voltios';
if ishandle(hAxesRaw)
axes(hAxesRaw);
plot(Xdato,Ydato);
xlabel(Xunits);
ylabel(Yunits);
end
end
%% TIMER ROJOAC
function Datos_RojoAC(source, eventdata)
%ABRIMOS EL PIPE DE CONEXION
[my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (2), vid_pid_norm, out_pipe, uint8(0), uint8 (0));
% ENVIAMOS PETICON AL PIC
calllib('libreria', 'MPUSBWrite',my_out_pipe, data_out, uint8(64), uint8(64), uint8(1));
%DAMOS LA ORDEN PARA QUE EL PIC ENVIE DATOS HACIA LA PC
[my_in_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, in_pipe, uint8 (1), uint8 (0));
%RECIBIMOS DATOS PROVENEINTES DEL PIC
[aa,bb,data_in,dd] = calllib('libreria', 'MPUSBRead',my_in_pipe, data_in, uint8(2), uint8(2), uint8(0))
data_in(1)
data_in(2)
%Buff_Aux(1) = data_in(1) ; %valor asignado a
Xdato = linspace(0,10,1024);
Ydato = data_in(1)/100 + data_in(2)/100
Xunits='Segundos';
Yunits='Voltios';
if ishandle(hAxesRojoAC)
axes(hAxesRojoAC);
plot(Xdato,Ydato);
xlabel(Xunits);
ylabel(Yunits);
end
end
%% PROCESAMOS DATOS DEL ADC ROJO
function IniciaPloter_Callback(source,eventdata)
%Buff_Aux=rand(1,1e5); %creamos un arreglo de 1x1e5 de tamaño
%tic;
% ABRIMOS EL PIPE DE CONEXION
%[my_out_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (3), vid_pid_norm, out_pipe, uint8(0), uint8 (0));
% ENVIAMOS PETICON AL PIC
%calllib('libreria', 'MPUSBWrite',my_out_pipe, data_out, uint8(64), uint8(64), uint8(10));
%DAMOS LA ORDEN PARA QUE EL PIC ENVIE DATOS HACIA LA PC
%[my_in_pipe] = calllib('libreria', 'MPUSBOpen',uint8 (0), vid_pid_norm, in_pipe, uint8 (1), uint8 (0));
%RECIBIMOS DATOS PROVENEINTES DEL PIC
%[aa,bb,data_in,dd] = calllib('libreria', 'MPUSBRead',my_in_pipe, data_in, uint8(11), uint8(11), uint8(0));
%a = data_in(1);
%a = randn(1,1e5);
%Generates a random signal to display
%Buff_Aux(1:1) = data_in(1) + data_in(2); %valor asignado a 1x1 del arreglo
%fs = 200 ; %samplificadorng frequency
%timeBase = 4; %tiempo en sec
%hF = figure; %creamos eje de coord
%hAx = gca; %
%maxA = 40; minA = 0; %definimos maximo y minimo en el eje y
%nSamples = round(fs*timeBase); %asegura que el producto se un entero
%ind = 1; %creamos un index
%hLine = plot(hAx,(1:nSamples)/fs,Buff_Aux(1:1,ind)); %parametros para el eje x
%xlabel('[sec]'); %damos nombre al eje x
%ylim([minA maxA]); %limitamos el eje y
%tic; %empezamos a medir el tiempo
%añadimos "ishandle" para cerrar el ploteador
%while ishandle(hLine)
%set(hLine,'ydata',Buff_Aux(ind,1:1)) %empezamos a graficar
% drawnow %actualizamos el grafico
% t=toc; %terminamos de medir el tiempo
%ind = round(t*fs);
% ind = max(1,1); %nos quedamos en el index 1:1
%end
%------------------------------------------------------------------
% if Adquisicion_Dato
% if strcmp(timerObj.Running,'on')
% stop(timerObj);
% end
%Adquisicion_Dato = false;
% set(hObject,'string','Start Adq');
% end
% Adquisicion_Dato = true;
%set(hObject,'string','Stop Adq');
if strcmp(timerObj.Running, 'off')
start(timerObj);
end
end
%% FUNCION PAUSA
function PausaPloter_Callback(source,eventdata)
stop(timerObj);
stop(timer_RojoAC);
%Adquisicion_Dato = false;
end
end