CHƯƠNG III: Thiết kế mạch mô phỏng điều khiển và GUI
2. Thiết kế mô phỏng điều khiển và GUI với version Second
2.3. Lập trình giao diện GUI trong matlab
2.3.2. Lập trình GUI trong file (.m)
Sau khi ta thiết kế xong nhấn Run và lưu file (.gui) vào thư mục Robot khi đó ta sẽ có thêm một file .m để lập trình và thêm Code để có thể điều khiển được robot
- Thêm code vào btnTangkhau1
function btnTangkhau1_Callback(hObject, eventdata, handles)
% hObject handle to btnTangkhau1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles = guidata(hObject);
ModelName = 'Robot3Dof';
handles.Goc1 = handles.Goc1 + 10; %Moi lan tang 10 deg va gan bang bien handles.Goc1
set(handles.edit1,'string',num2str(handles.Goc1));
handles.Goc2 = handles.Goc2; %gan bang bien handles.Goc2=0 deg
set(handles.edit2,'string',num2str(handles.Goc2));
handles.Goc3 = handles.Goc3; %gan bang bien handles.Goc3=0 deg
set(handles.edit3,'string',num2str(handles.Goc3));
set_param([ModelName
'/Actuator1'],'after',num2str(handles.Goc1));
set_param([ModelName
'/Actuator2'],'after',num2str(handles.Goc2));
set_param([ModelName
'/Actuator3'],'after',num2str(handles.Goc3));
b1=[cosd(handles.Goc1) 0 sind(handles.Goc1) 0
;sind(handles.Goc1) 0 -cosd(handles.Goc1) 0 ;0 1 0 900;0 0 0 1];%ma tran DH khâu 1
b2=[cosd(handles.Goc2) -sind(handles.Goc2) 0 650*cosd(handles.Goc2) ;sind(handles.Goc2)
cosd(handles.Goc2) 0 650*sind(handles.Goc2) ;0 0 1 0 ;0 0 0 1];%ma tran DH khâu 2
b3=[cosd(handles.Goc3) -sind(handles.Goc3) 0 400*cosd(handles.Goc3);sind(handles.Goc3)
cosd(handles.Goc3) 0 400*sind(handles.Goc3); 0 0 1 0 ; 0 0 0 1];%ma tran DH khâu 3
c=b1*b2*b3;%phuong trinh dongng hoc xac dinh khâu thao tác px=c(1,4);%lay gia tri hang 1, cot 4 tu ma tran c
py=c(2,4);%lay gia tri hang 2, cot 4 tu ma tran c pz=c(3,4);%lay gia tri hang 3, cot 4 tu ma tran c
set(handles.edit4,'string',num2str(px));%chuyen chuoi gia tri px thanh dang ki tu va dat vao thanh edti4
set(handles.edit5,'string',num2str(py));%chuyen chuoi gia tri px thanh dang ki tu va dat vao thanh edti5
set(handles.edit6,'string',num2str(pz));%chuyen chuoi gia tri px thanh dang ki tu va dat vao thanh edti6
guidata(hObject,handles);
- btnTangkhau2, btnTangkhau3 chỉ khác với btnTangkhau1 ở chỗ:
✓ btnTangkhau2
handles.Goc1 = handles.Goc1;
set(handles.edit1,'string',num2str(handles.Goc1));
handles.Goc2 = handles.Goc2 + 10; %Moi lan tang 10 deg, va gan bang bien handles.Goc2
set(handles.edit2,'string',num2str(handles.Goc2));
handles.Goc3 = handles.Goc3;
set(handles.edit3,'string',num2str(handles.Goc3));
✓ btnTangkhau3 handles.Goc1 = handles.Goc1;
set(handles.edit1,'string',num2str(handles.Goc1));
handles.Goc2 = handles.Goc2;
set(handles.edit2,'string',num2str(handles.Goc2));
handles.Goc3 = handles.Goc3 + 10; %Moi lan tang 10 deg va gan bang bien handles.Goc3
set(handles.edit3,'string',num2str(handles.Goc3));
- Thêm code vào btnGiamkhau1 (tương tự với btnGiamkhau2, btnGiamkhau3):
giống btnTangkhau1, btnTangkhau2, btnTangkhau3 chỉ khác ở chỗ thay dấu ‘+’
bằng dấu ‘-’, thay vì tăng 10deg bằng giảm 10deg - btnStart: thêm code
function btnStart_Callback(hObject, eventdata, handles) handles = guidata(hObject);
global Tenrobot
Tenrobot='Robot3Dof';
handles.modelname=Tenrobot; % Bien ten model can dieu khien
handles.Goc1 = 0; %Bien goc khau 1
handles.Fbgoc1 = 0; %Feedback goc khau 1 handles.Goc2 = 0; %Bien goc khau 2
handles.Fbgoc2 = 0; %Feedback goc khau 2 handles.Goc3 = 0; %Bien goc khau 3
handles.Fbgoc3 = 0; %Feedback goc khau 3
% Kiem tra load simulink model
if ~modelIsLoaded(handles.modelname) load_system(handles.modelname);
end
set_param(handles.modelname,'BlockReduction','off');
set_param(handles.modelname,'StopTime','inf');
set_param(handles.modelname,'SimulationMode','normal');
% khi model start thi call funtion: localAddEventListener set_param(handles.modelname,'StartFcn','localAddEventListe ner');
% cho run simulink
set_param(handles.modelname,'SimulationCommand','start');
% an nut start
set(hObject,'Enable','off');
% hien nut stop
set(handles.btnStop,'Enable','on');
% save su thay doi bien toi GUI
guidata(hObject,handles);
- btnStop: thêm Code
function btnStop_Callback(hObject, eventdata, handles) set_param(handles.modelname,'SimulationCommand','stop');
set_param(handles.modelname,'StopTime','10');
set_param(handles.modelname,'StartFcn','');
set(hObject,'Enable','off');
set(handles.btnStart,'Enable','on');
set_param([handles.modelname '/Actuator1'],'after','0');
set_param([handles.modelname '/Actuator2'],'after','0');
set_param([handles.modelname '/Actuator3'],'after','0');
guidata(hObject,handles);
try
catch ME
if exist('hf','var')&&~isempty(hf)&&~ishandle(hf) delete(hf)
end
bdclose(all) end
- Thêm các hàm sau:
function modelLoaded=modelIsLoaded(modelName) try
modelLoaded=~isempty(find_system('Type','block_diagram','N ame',modelName));
catch ME
modelLoaded=False;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%
function eventhandle=localAddEventListener
eventhandle=add_exec_event_listener('Robot3Dof/sensor','Po stOutputs',@localEventListener);
% Ham load su kien moi khi co bien thay doi function localEventListener(block, eventdata) simData=block.OutputPort(1).Data;
%lay bien dung tengui.fig de khong bi loi handles=guidata(BangDieuKhien);
handles.fbGoc1=int16(simData(1));
handles.fbGoc2=int16(simData(2));
handles.fbGoc3=int16(simData(3));
set(handles.edit1,'String',num2str(handles.fbGoc1));
set(handles.edit2,'String',num2str(handles.fbGoc2));
set(handles.edit3,'String',num2str(handles.fbGoc3));
drawnow;
- btnBTN: giải bài toán ngược
ModelName = 'Robot3Dof';
global var; %khai bao bien
px=get(handles.slider1,'value');%lay gia tri tu thanh slider4 gan vào bien px
set(handles.edit4,'string',num2str(px));%chuyen chuoi giá tri px thành ki tu va dat no vao thanh edit4
py=get(handles.slider2,'value');
set(handles.edit5,'string',num2str(py));
pz=get(handles.slider3,'value');
set(handles.edit6,'string',num2str(pz));
%%%%%%%tim cac goc theta d1=900; a2=650; a3=400;
theta1=atan2d(py,px);
m=cosd(theta1)*px+sind(theta1)*py;
n=pz-d1;
theta3=acosd((m^2+n^2-a3^2-a2^2)/(2*a2*a3));
theta2=atan2d(((cosd(theta3)*a3+a2)*n-
m*sind(theta3)*a3),(cosd(theta3)*a3+a2)*m+n*sind(theta3)*a 3);
guidata(hObject,handles);%luu su thay doi
set(handles.edit1,'string',num2str(theta1));%voi giá tri theta1 tim duoc chuyen thanh dang ki tu và dat gia tri do vao thanh edit1
set_param([ModelName
'/Actuator1'],'after',num2str(theta1))%dat gia tri theta1 vào khoi silder gain trong mach dk
set(handles.edit2,'string',num2str(theta2));
set_param([ModelName
'/Actuator2'],'after',num2str(theta2))
set(handles.edit3,'string',num2str(theta3));
set_param([ModelName
'/Actuator3'],'after',num2str(theta3)) - slider1: thêm code
px=get(handles.slider1,'value');%lay gia tri tu thanh slider4 gan vao bien px
set(handles.edit4,'string',num2str(px));%dat px vao thanh edit4
- slide2, slider3 tương tự slider1
❖ Kết quả thu được sau khi điều khiển robot bằng giao diện điều khiển:
- Bài toán thuận
- Bài toán nghịch: