Escolar Documentos
Profissional Documentos
Cultura Documentos
ESCUELA PROFECIONAL:
INGENIERÍA ELECTRÓNICA
ASIGNATURA: LABORATORIO DE
CONTROL
<math>A_1=Rotx(q_1)Trasy(l_1)</math>
<math>A_1=Rotx(q_1)Trasy(l_1)</math>
<math>A_2=Rotx(q_2)Trasy(l_2)</math>
donde: Rotx y Trasy son las mismas matrices del ejemplo anterior
<math>A_3=Rotx(q_3)</math>
<math>A_0=Rotz(g_0)</math>
<math>A_1=Rotx(q_1)Trasy(l_1)</math>
<math>A_2=Rotx(q_2)Trasy(l_2)</math>
robótica.
pines analógicos.
Esquema y conexiones
Alimentaremos el módulo desde el pin de 3.3v del Arduino y conectaremos el
pin GND del sensor a cualquier pin GND del Arduino. Los pines X, Y y Z del
dispositivo que se alimenta a 3.3 V, por lo que hay que tener cuidado al
dañaríamos el sensor.
Que es un giroscopio
los polos magnéticos. Este sistema completo seria un IMU de 9 ejes. Y de ahí
digitales.
analógicas, 2 como puerto UART, 2 más para el puerto I2C, y 3 para el puerto
Un detalle que cuenta con tres leds: Encendido, RX y TX. No cuenta con un led
especifico para el pin 13 como tienen todos los Arduinos, pero ojo, que eso
no quiere decir que no podamos hacer un ¡Hola mundo!, todo lo contrario, con
este Arduino podemos usar el pin RX y TX como leds programables, ambos
//©2011 bildr
//Released under the MIT License - Please reuse change and share
//Simple code for the ADXL335, prints calculated orientation via serial
//////////////////////////////////////////////////////////////////
double x;
double y;
double z;
void setup(){
Serial.begin(9600);
void loop(){
//Serial.print("x: ");
Serial.print(0);
Serial.print(",");
Serial.println(yAng);
//Serial.print(",");
//Serial.println(z);
delete(instrfind({'port'},{'COM7'}));
global puerto;
puerto = serial('COM7');
puerto.BaudRate=9600;
fopen(puerto);%abre el puerto a utilizar
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @Control_brazo_robotico_OpeningFcn,
...
'gui_OutputFcn', @Control_brazo_robotico_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 Control_brazo_robotico is made visible.
function Control_brazo_robotico_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 Control_brazo_robotico (see
VARARGIN)
Velocidad=0.01;
set(handles.Edit_GradoA,'String','');
set(handles.Edit_GradoB,'String','');
set(handles.Edit_GradoC,'String','');
set(handles.Edit_Giro_P,'String','');
data1=[];%tabla en cero
set(handles.Tabla,'Data',data1);
%valores obtenidos de los slider
Rango_A=0;
Rango_B=0;
Rango_C=0;
Rango_G_P=0;
%valores obtenidos de Las cajas editables
Edit_GradoA=0;
Edit_GradoB=0;
Edit_GradoC=0;
Edit_Giro_P=0;
%Antigos valores obtenidos de los slider o cajas editables
AntiguoA=0;
AntiguoB=0;
AntiguoC=0;
AntiguoP=0;
Antiguo_Rango_A=100;
Antiguo_Rango_B=100;
Antiguo_Rango_C=100;
Antiguo_Rango_G_P=100;
Antiguo_i=0.19;
n=0;
Stop=0;
% --- Outputs from this function are returned to the command line.
function varargout = Control_brazo_robotico_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)
end
%asegurando retorno A en 0 completo
Grado_A.rotation=[0 1 0 0];
set(handles.GradoA,'Value',0);
set(handles.Grado_A,'String',0);
%asegurando retorno B en 0 completo
Grado_B.rotation=[0 0 1 0];
set(handles.GradoB,'Value',0);
set(handles.Grado_B,'String',0);
%asegurando retorno C en 0 completo
Grado_C.rotation=[0 0 1 0];
set(handles.GradoC,'Value',0);
set(handles.Grado_C,'String',0);
%asegurando retorno Pinza en 0 completo
Grado_P.rotation=[0 1 0 0];
set(handles.GIRO_PINZA,'Value',0);
set(handles.Giro_P,'String',0);
vrdrawnow;
drawnow
%limpiado Variables
set(handles.Edit_GradoA,'String','');
set(handles.Edit_GradoB,'String','');
set(handles.Edit_GradoC,'String','');
set(handles.Edit_Giro_P,'String','');
Rango_A=0;
Rango_B=0;
Rango_C=0;
Rango_G_P=0;
Edit_GradoA=0;
Edit_GradoB=0;
Edit_GradoC=0;
Edit_Giro_P=0;
AntiguoA=0;
AntiguoB=0;
AntiguoC=0;
AntiguoP=0;
%Cierra Pinza
Cierra_Pinza_Callback(hObject, eventdata, handles)
set(handles.Home,'Enable','on');
set(handles.Trial,'Enable','on');
set(handles.Run_Secuencia,'Enable','on');
set(handles.Aabre_pinza,'Enable','on');
set(handles.Cierra_Pinza,'Enable','on');
set(handles.Save_Posicion,'Enable','on');
set(handles.New_Posicion,'Enable','on');
%________________________________________________________________________
__
if(data1(n2,6)==1)
end
set(handles.Home,'Enable','on');
set(handles.Trial,'Enable','on');
set(handles.Run_Secuencia,'Enable','on');
set(handles.Aabre_pinza,'Enable','on');
set(handles.Cierra_Pinza,'Enable','on');
set(handles.Save_Posicion,'Enable','on');
set(handles.New_Posicion,'Enable','on');
%________________________________________________________________________
__
set(handles.Home,'Enable','off');
set(handles.Trial,'Enable','off');
set(handles.Run_Secuencia,'Enable','off');
set(handles.Aabre_pinza,'Enable','off');
set(handles.Cierra_Pinza,'Enable','off');
set(handles.Save_Posicion,'Enable','off');
set(handles.New_Posicion,'Enable','off');
%Secuencia1
Aabre_pinza_Callback(hObject, eventdata, handles)
Edit_GradoA=((180*pi)/180);
Edit_GradoB=((90*pi)/180);
Edit_GradoC=((90*pi)/180);
Edit_Giro_P=((180*pi)/180);
Movimentos_Callback(hObject, eventdata, handles)
%Secuencia2
Cierra_Pinza_Callback(hObject, eventdata, handles)
Edit_GradoA=((-90*pi)/180);
Edit_GradoB=((0*pi)/180);
Edit_GradoC=((0*pi)/180);
Edit_Giro_P=((90*pi)/180);
Movimentos_Callback(hObject, eventdata, handles)
%Secuencia3
Aabre_pinza_Callback(hObject, eventdata, handles)
Edit_GradoA=((-180*pi)/180);
Edit_GradoB=((90*pi)/180);
Edit_GradoC=((90*pi)/180);
Edit_Giro_P=((90*pi)/180);
Movimentos_Callback(hObject, eventdata, handles)
%Secuencia4
Cierra_Pinza_Callback(hObject, eventdata, handles)
Edit_GradoA=((-100*pi)/180);
Edit_GradoB=((90*pi)/180);
Edit_GradoC=((0*pi)/180);
Edit_Giro_P=((0*pi)/180);
Movimentos_Callback(hObject, eventdata, handles)
%Secuencia5
Aabre_pinza_Callback(hObject, eventdata, handles)
Edit_GradoA=((-90*pi)/180);
Edit_GradoB=((0*pi)/180);
Edit_GradoC=((90*pi)/180);
Edit_Giro_P=((180*pi)/180);
Movimentos_Callback(hObject, eventdata, handles)
set(handles.Home,'Enable','on');
set(handles.Trial,'Enable','on');
set(handles.Run_Secuencia,'Enable','on');
set(handles.Aabre_pinza,'Enable','on');
set(handles.Cierra_Pinza,'Enable','on');
set(handles.Save_Posicion,'Enable','on');
set(handles.New_Posicion,'Enable','on');
%________________________________________________________________________
__
%--------------------------Retorno de
GradoB-------------------------------
if(AntiguoB~=Edit_GradoB)
if(AntiguoB>Edit_GradoB)
%decremento de barra
if(a<=AntiguoB && a>=Edit_GradoB)
Rango_B=Edit_GradoB;
Grado_B=vrnode(world,'Grado2');%cargando nodo de VRML
Grado_B.rotation=[0 0 1 b];
set(handles.GradoB,'Value',b);
B=round(b*180/pi);
set(handles.Grado_B,'String',B); %Escribe el valor de
b=b-Velocidad;
vrdrawnow;
drawnow
end
else
%incremento de barra
if(a<=Edit_GradoB && a>=AntiguoB)
Rango_B=Edit_GradoB;
b=a;
Grado_B=vrnode(world,'Grado2');%cargando nodo de VRML
Grado_B.rotation=[0 0 1 b];
set(handles.GradoB,'Value',b);
B=round(b*180/pi);
set(handles.Grado_B,'String',B); %Escribe el valor de
vrdrawnow;
drawnow
end
end
end
%--------------------------Retorno de
GradoC-------------------------------
if(AntiguoC~=Edit_GradoC)
if(AntiguoC>Edit_GradoC)
%decremento de barra
if(a<=AntiguoC && a>=Edit_GradoC)
Rango_C=Edit_GradoC;
Grado_C=vrnode(world,'Grado3');%cargando nodo de VRML
Grado_C.rotation=[0 0 1 c];
set(handles.GradoC,'Value',c);
C=round(c*180/pi);
set(handles.Grado_C,'String',C); %Escribe el valor de
c=c-Velocidad;
vrdrawnow;
drawnow
end
else
%incremento de barra
if(a<=Edit_GradoC && a>=AntiguoC)
Rango_C=Edit_GradoC;
c=a;
Grado_C=vrnode(world,'Grado3');%cargando nodo de VRML
Grado_C.rotation=[0 0 1 c];
set(handles.GradoC,'Value',c);
C=round(c*180/pi);
set(handles.Grado_C,'String',C); %Escribe el valor de
vrdrawnow;
drawnow
end
end
end
%--------------------------Retorno de
Pinza-------------------------------
if(AntiguoP~=Edit_Giro_P)
if(AntiguoP>Edit_Giro_P)
%decremento de barra
if(a<=AntiguoP && a>=Edit_Giro_P)
Rango_G_P=Edit_Giro_P;
Grado_P=vrnode(world,'Pinza');%cargando nodo de VRML
Grado_P.rotation=[0 1 0 p];
set(handles.GIRO_PINZA,'Value',p);
P=round(p*180/pi);
set(handles.Giro_P,'String',P); %Escribe el valor de
p=p-Velocidad;
vrdrawnow;
drawnow
end
else
%incremento de barra
if(a<=Edit_Giro_P && a>=AntiguoP)
Rango_G_P=Edit_Giro_P;
p=a;
Grado_P=vrnode(world,'Pinza');%cargando nodo de VRML
Grado_P.rotation=[0 1 0 p];
set(handles.GIRO_PINZA,'Value',p);
P=round(p*180/pi);
set(handles.Giro_P,'String',P); %Escribe el valor de
vrdrawnow;
drawnow
end
end
end
end
AntiguoA=Edit_GradoA;
AntiguoB=Edit_GradoB;
AntiguoC=Edit_GradoC;
AntiguoP=Edit_Giro_P;
%________________________________________________________________________
__
%________________________CAPTANDO ANGULOS DE
%USIARIO______________________
function Edit_GradoA_Callback(hObject, eventdata, handles)
global Edit_GradoA Edit_GradoB Edit_GradoC Edit_Giro_P AntiguoB AntiguoC
AntiguoP
Edit_GradoA=str2double(get(hObject,'String')); %Almacenar valor ingresado
y Transformar a formato double
%identifica valor no numerico
if isnan(Edit_GradoA)
errordlg('El valor debe ser numérico','ERROR');
set(handles.Edit_GradoA,'String','');
return
end
%identificando rango
if(Edit_GradoA<-180 ||Edit_GradoA>180)
errordlg('El Rango incorrecto (-180,180)','ERROR');
set(handles.Edit_GradoA,'String','');
return
end
Edit_GradoA=((Edit_GradoA*pi)/180);
%ASEGURANDO SOLO EL MOVIMIENTO DE BARAS A
Edit_GradoB=AntiguoB;
Edit_GradoC=AntiguoC;
Edit_Giro_P=AntiguoP;
Movimentos_Callback(hObject, eventdata, handles)
% % function datos=refresco_angulo()
% % global world puerto valorANGULO angulo_b
% % %while 1
% % valorANGULO=fscanf(puerto,'%d,%d'); %Toma el valor recibido por
el puerto y lo guarda en la variable
% % angulo_b=valorANGULO(2)/100;
% % Grado_B=vrnode(world,'Grado2');%cargando nodo de VRML
% % Grado_B.rotation=[0 0 1 angulo_b];
% % %end
% --- Executes on button press in boton_Inicio.
function boton_Inicio_Callback(hObject, eventdata, handles)
% hObject handle to boton_Inicio (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global world puerto valorANGULO angulo_b Velocidad AntiguoB parar
%for i=1:200
parar = 0;
while parar==0
valorANGULO=fscanf(puerto,'%d,%d'); %Toma el valor recibido por el
puerto y lo guarda en la variable
angulo_b=valorANGULO(2)/100;
Grado_B=vrnode(world,'Grado2');%cargando nodo de VRML
Grado_B.rotation=[0 0 1 angulo_b];
AntiguoB=angulo_b;
Rango_B1=(angulo_b*180/pi);%convirtiendo valor a grados
set(handles.GradoB,'SliderStep',[Velocidad 0]);%Velocidad
set(handles.Grado_B,'String',Rango_B1);
vrdrawnow;
end