Giới thiệu
Ờ phần trước: Hướng dẫn mô phỏng robot 2 bậc tự do bằng Matlab Simulink mình đã giới thiệu cách chuyển mô hình từ Solidworks sang Matlab Simulink bằng công cụ Simmechanics.
Tiếp theo hôm nay là phần 2 của bài hướng dẫn: Điều khiển mô hình Simulink bằng Matlab GUI. Từ mô hình đã có của robot 2 bậc tự do, chúng ta sẽ thiết kế giao diện, điều khiển actuator của từng khâu, đồng thời sẽ đọc cảm biến để hiển thị vị trí của từng khớp lên giao diện chương trình. Trong khi khớp chuyển động thì giá trị hiển thị cũng thay đổi tương ứng.

Điều khiển mô hình Simulink
Chỉnh sửa mô hình Simulink

So với mô hình ban đầu, chúng ta cần phải thêm một số khối để phục vụ cho việc kết nối với GUI và xử lý sự kiện.
Thiết kế giao diện

Giao diện điều khiển gồm các nút ấn điều khiển vị trí từng khâu và phẩn hiển thị vị trí hiện tại của khâu đó.
Chương trình xử lý sự kiện
localAddEventListener
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Callback Function for adding an event listener to the gain block %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function eventhandle = localAddEventListener eventhandle = add_exec_event_listener('Scara2dof/Sensor', ... 'PostOutputs', @localEventListener);
localEventListener
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Callback Function for executing the event listener on the gain block %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function localEventListener(block, eventdata) %#ok simData = block.OutputPort(1).Data; apphandles = guidata(Panel) ; apphandles.fbGoc1 = int16(simData(2)); apphandles.fbGoc2 = int16(simData(1)); set(apphandles.txtGoc1, 'String',num2str(apphandles.fbGoc1)); set(apphandles.txtGoc2, 'String',num2str(apphandles.fbGoc2)); drawnow;
btnTangkhau1_Callback
% --- Executes on button press in 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); handles.Goc1 = handles.Goc1 + 10; % Moi lan tang 10 deg set_param('Scara2dof/Actuator1','after', ... num2str(handles.Goc1)); guidata(hObject,handles);
btnTangkhau2_Callback
function btnTangkhau2_Callback(hObject, eventdata, handles) % hObject handle to btnTangkhau2 (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); handles.Goc2 = handles.Goc2 + 10; % Moi lan tang 10 deg set_param('Scara2dof/Actuator2','after', ... num2str(handles.Goc2)); guidata(hObject,handles);
btnGiamkhau1_Callback
function btnGiamkhau1_Callback(hObject, eventdata, handles) % hObject handle to btnGiamkhau1 (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); handles.Goc1 = handles.Goc1 - 10; % Moi lan giam 10 deg set_param('Scara2dof/Actuator1','after', ... num2str(handles.Goc1)); guidata(hObject,handles);
btnGiamkhau2_Callback
function btnGiamkhau2_Callback(hObject, eventdata, handles) % hObject handle to btnGiamkhau2 (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); handles.Goc2 = handles.Goc2 - 10; % Moi lan giam 10 deg set_param('Scara2dof/Actuator2','after', ... num2str(handles.Goc2)); guidata(hObject,handles);
btnStart_Callback
function btnStart_Callback(hObject, eventdata, handles) % hObject handle to btnStart (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 = 'Scara2dof'; handles.modelname = modelName; 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 % Load the simulink model if ~modelIsLoaded(modelName) load_system(modelName); end % Simulink may optimise your model by integrating all your blocks. To % prevent this, you need to disable the Block Reduction in the Optimisation % settings. set_param(handles.modelname,'BlockReduction','off'); % set the stop time to inf set_param(handles.modelname,'StopTime','inf'); % set the simulation mode to normal set_param(handles.modelname,'SimulationMode','normal'); % When the model starts, call the localAddEventListener function set_param(handles.modelname,'StartFcn','localAddEventListener'); % Start the model set_param(handles.modelname, 'SimulationCommand', 'start'); set(hObject,'Enable','off'); set(handles.btnStop, 'Enable','on'); set(handles.txtStatus, 'String','START COMPLETE!'); guidata(hObject,handles);
btnStop_Callback
function btnStop_Callback(hObject, eventdata, handles) % hObject handle to btnStop (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) 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('Scara2dof/Actuator1','after','0'); set_param('Scara2dof/Actuator2','after','0'); guidata(hObject,handles); try catch ME % Get rid of the figure if it was created if exist('hf','var') && ~isempty(hf) && ishandle(hf) delete(hf); end % Get rid of the model if it was loaded bdclose(all); end