Lập trình GUI trong file (.m)

Một phần của tài liệu Đồ án môn học thiết kế hệ thống cơ điện: Thiết kế và mô phỏng điều khiển robot 3 bậc tự do RRR (Trang 63 - 69)

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:

Một phần của tài liệu Đồ án môn học thiết kế hệ thống cơ điện: Thiết kế và mô phỏng điều khiển robot 3 bậc tự do RRR (Trang 63 - 69)

Tải bản đầy đủ (PDF)

(70 trang)