在本教程中,我們將向您展示如何使用MATLB 和 Arduino 控制直流電機(jī)。
創(chuàng)建用于控制直流電機(jī)的 MATLAB 圖形用戶界面
完成 Arduino for MATLAB 的設(shè)置后,我們必須構(gòu)建 GUI(圖形用戶界面)來控制直流電機(jī)。要啟動 GUI,請在命令窗口中鍵入以下命令
guide
將打開一個彈出窗口,然后選擇新的空白GUI,如下圖所示,
現(xiàn)在選擇三個按鈕用于順時針旋轉(zhuǎn)、逆時針旋轉(zhuǎn)和停止,如下所示,
要調(diào)整按鈕的大小或更改按鈕的形狀,只需單擊它,您就可以拖動按鈕的角。通過雙擊按鈕,您可以更改該特定按鈕的顏色,字符串和標(biāo)簽。我們自定義了三個按鈕,如下圖所示。
?
您可以根據(jù)自己的選擇自定義按鈕?,F(xiàn)在,當(dāng)您保存此代碼時,將在 MATLAB 的編輯器窗口中生成一個代碼。要編寫Arduino代碼以執(zhí)行與項目相關(guān)的任何任務(wù),您必須始終編輯此生成的代碼。所以下面我們編輯了 MATLAB 代碼。
MATLAB 代碼,用于使用 Arduino 控制直流電機(jī)
完整的 MATLAB 代碼,在針對直流電機(jī)控制進(jìn)行編輯后,在本項目結(jié)束時給出。此外,我們在此處包含GUI文件(.fig)和代碼文件(.m)以供下載,您可以使用它們根據(jù)您的要求自定義按鈕。以下是我們對順時針、逆時針旋轉(zhuǎn)直流電機(jī)并使用三個按鈕停止所做的一些調(diào)整。
將以下代碼復(fù)制并粘貼到第 74 行,以確保每次運(yùn)行 m 文件時 Arduino 都在與 MATLAB 通信。
clear all;
global a;
a = arduino();
向下滾動時,您將看到 GUI 中的每個按鈕都有三個功能?,F(xiàn)在,根據(jù)您要在單擊時執(zhí)行的任務(wù)在每個函數(shù)中編寫代碼。
在順時針按鈕的函數(shù)中,將以下代碼復(fù)制并粘貼到函數(shù)的結(jié)束大括號之前,以順時針方向旋轉(zhuǎn)電機(jī)。在這里,我們在引腳 6 處給出 HIGH 和引腳 5 處的 LOW,以順時針方向旋轉(zhuǎn)電機(jī)。
global a;
writeDigitalPin(a, 'D6', 1);
pause(0.5);
現(xiàn)在,在逆時針按鈕的功能中,將以下代碼粘貼到函數(shù)的末尾以逆時針方向旋轉(zhuǎn)電機(jī)。在這里,我們在引腳 5 處給出高電平,在引腳 6 處給出 LOW,以逆時針方向旋轉(zhuǎn)電機(jī)。
global a;
writeDigitalPin(a, 'D5', 1);
writeDigitalPin(a, 'D6', 0);
pause(0.5);
最后在STOP按鈕的功能中,將以下代碼粘貼到末尾,以停止電機(jī)的旋轉(zhuǎn)。在這里,我們在引腳5和6處給出LOW以停止電機(jī)。
global a;
writeDigitalPin(a, 'D5', 0);
writeDigitalPin(a, 'D6', 0);
pause(0.5);
所需材料
MATLAB 安裝筆記本電腦(偏好:R2016a 或更高版本)
Arduino UNO
直流電動機(jī)
L293D- 電機(jī)驅(qū)動器
電路圖
?
使用 MATLAB 控制直流電機(jī)
根據(jù)電路圖設(shè)置硬件后,只需單擊運(yùn)行按鈕即可在.m文件中運(yùn)行編輯后的代碼
MATLAB 可能需要幾秒鐘才能響應(yīng),在 MATLAB 顯示 BUSY 指示之前不要單擊任何 GUI 按鈕,您可以在屏幕的左下角看到,如下所示,
一切準(zhǔn)備就緒后,單擊順時針或逆時針按鈕以旋轉(zhuǎn)電機(jī)。當(dāng)您按下順時針按鈕時,電流流經(jīng)引腳 6 到引腳 5,電機(jī)將順時針旋轉(zhuǎn),而逆時針方向電流流過引腳 5 到引腳 6,電機(jī)將順時針方向旋轉(zhuǎn)將順時針方向旋轉(zhuǎn)。要停止直流電機(jī)的旋轉(zhuǎn),請按停止按鈕。同樣的方法可以用來控制使用MATLAB的伺服電機(jī),我們只需要相應(yīng)地編輯代碼。
function varargout = DCmotor(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @DCmotor_OpeningFcn, ...
'gui_OutputFcn', @DCmotor_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
function DCmotor_OpeningFcn(hObject, eventdata, handles, varargin)
guidata(hObject, handles);
function varargout = DCmotor_OutputFcn(hObject, eventdata, handles)?
varargout{1} = handles.output;
clear all;
global a;
a = arduino();
function clockwise_Callback(hObject, eventdata, handles)
global a;
writeDigitalPin(a, 'D5', 0);
writeDigitalPin(a, 'D6', 1);
pause(0.5);
function anticlockwise_Callback(hObject, eventdata, handles)
global a;
writeDigitalPin(a, 'D5', 1);
writeDigitalPin(a, 'D6', 0);
pause(0.5);
function stop_Callback(hObject, eventdata, handles)
global a;
writeDigitalPin(a, 'D5', 0);
writeDigitalPin(a, 'D6', 0);
pause(0.5);
評論
查看更多