MATLAB 是多功能軟件,可用于各種應(yīng)用。在MATLAB之前的教程中,我們已經(jīng)解釋了如何使用MATLAB來(lái)控制直流電機(jī),伺服電機(jī)和家用電器。在本教程中,我們將學(xué)習(xí)如何使用 MATLAB 進(jìn)行串行通信。對(duì)于串行通信的接收端,我們?cè)谶@里使用Arduino。
有兩種方法可以在MATLAB和Arduino之間設(shè)置串行通信,一種是使用命令窗口,另一種是使用MATLAB GUI。兩種方法的Arduino代碼將保持不變。
所需組件
MATLAB 安裝筆記本電腦(偏好:R2016a 或更高版本)
Arduino UNO
指示燈(任何顏色)
電阻器(330歐姆)
電路圖
?
對(duì)于在MATLAB和Arduino之間建立串行通信的兩種方法,上面的電路圖將保持不變。
使用 MATLAB 命令窗口進(jìn)行串行通信
這是在Arduino和MATLAB之間設(shè)置串行通信的簡(jiǎn)單方法。在這里,我們將簡(jiǎn)單地使用命令窗口將數(shù)據(jù)從 MATLAB 串行發(fā)送到 Arduino,然后 Arduino 讀取傳入的串行數(shù)據(jù)。然后,這種串行傳輸?shù)臄?shù)據(jù)可用于控制連接到Arduino的任何內(nèi)容。在這里,我們將LED連接到Arduino,它將根據(jù)Arduino串行接收的數(shù)據(jù)打開和關(guān)閉。
首先,在Arduino UNO中上傳給定的Arduino代碼,然后在MATLAB編輯器窗口中開始編碼。要打開新的編輯器腳本,請(qǐng)單擊“新腳本”,如下圖所示:
然后,將以下完整的 MATLAB 代碼復(fù)制并粘貼到編輯器窗口中,以便在 MATLAB 和 Arduino 之間進(jìn)行串行通信。
%MATLAB Code for Serial Communication between Arduino and MATLAB
x=serial('COM18','BAUD', 9600);
fopen(x);
go = true;
while go
?
a= input('Press 1 to turn ON LED & 0 to turn OFF:');
fprintf(x,a); ?
if (a == 2)
go=false;
end
end
在給定的代碼中,以下命令用于定義 MATLAB 中的串行通信。確保com端口號(hào)是Arduino連接的端口號(hào),并且在Arduino和MATLAB的代碼中應(yīng)設(shè)置相同的波特率。
x=serial('COM18','BAUD', 9600);
要打開串行端口,請(qǐng)使用以下命令,
fopen(x);
以下命令用于將數(shù)據(jù)從 MATLAB 串行發(fā)送到 Arduino,其中 x 用于調(diào)用串行,a 是用戶輸入的值。
fprintf(x,a); ?
我們使用while函數(shù)來(lái)創(chuàng)建無(wú)限循環(huán),每當(dāng)用戶輸入數(shù)字“2”時(shí),循環(huán)就會(huì)中斷。
while go ? ? ? ? ? ? ??
a= input('Press 1 to turn ON LED & 0 to turn OFF:');
fprintf(x,a); ?
if (a == 2)
go=false;
end
end
完成 MATLAB 編輯器腳本編碼后,單擊“RUN”以運(yùn)行您的程序,如下圖所示,
MATLAB 需要幾秒鐘來(lái)處理代碼并開始串行通信,等到 MATLAB 在軟件屏幕的左下角顯示“BUSY”消息,如下圖所示。
現(xiàn)在,您將看到用于發(fā)送用戶輸入的命令窗口,我們已經(jīng)設(shè)置了默認(rèn)消息,
'Press 1 to turn ON LED & 0 to turn OFF:'
發(fā)送“1”打開 LED,發(fā)送“0”關(guān)閉 LED,發(fā)送“2”中斷操作。您可以為任何任務(wù)設(shè)置任何數(shù)字,您所要做的就是相應(yīng)地更改Arduino代碼。最后給出了完整的Arduino代碼。
使用 MATLAB GUI 的串行通信
為了演示使用 MATLAB GUI 的串行通信,我們將使用 MATLAB 創(chuàng)建兩個(gè)圖形按鈕來(lái)打開和關(guān)閉連接到 Arduino 的 LED。數(shù)據(jù)將從 MATLAB 串行發(fā)送到 Arduino,單擊這些按鈕以打開和關(guān)閉 LED。Arduino將包含從MATLAB接收串行數(shù)據(jù)并根據(jù)接收到的串行數(shù)據(jù)控制LED的代碼。Arduino 代碼將與前一個(gè)代碼保持相同,唯一的區(qū)別是,以前我們通過(guò) MATLAB 的命令窗口發(fā)送串行數(shù)據(jù)“1”和“0”,現(xiàn)在將在兩個(gè)圖形按鈕上點(diǎn)擊發(fā)送相同的數(shù)據(jù)。
要啟動(dòng) GUI,請(qǐng)?jiān)诿畲翱谥墟I入以下命令
guide
將打開一個(gè)彈出窗口,然后選擇新的空白GUI,如下圖所示,
現(xiàn)在選擇兩個(gè)按鈕來(lái)打開和關(guān)閉 LED,如下所示,
要調(diào)整按鈕的大小或更改按鈕的形狀,只需單擊它,您就可以拖動(dòng)按鈕的角。通過(guò)雙擊按鈕,您可以更改該特定按鈕的顏色,字符串和標(biāo)簽。我們自定義了兩個(gè)按鈕,如下圖所示。
?
您可以根據(jù)自己的選擇自定義按鈕?,F(xiàn)在,當(dāng)您保存此代碼時(shí),將在 MATLAB 的編輯器窗口中生成一個(gè)代碼。根據(jù)您希望使用 MATLAB GUI 由 Arduino 執(zhí)行的任務(wù)編輯此代碼。
將以下代碼復(fù)制并粘貼到第 74 行以設(shè)置串行端口和波特率。
clear all;
global x;
x=serial('COM18','BAUD', 9600); % Make sure the baud rate and COM port is
% same as in Arduino IDE
fopen(x);
其中,fopen(x) 用于打開串行端口進(jìn)行串行通信。
向下滾動(dòng)時(shí),您將看到為 GUI 中的兩個(gè)按鈕創(chuàng)建了兩個(gè)函數(shù)?,F(xiàn)在,根據(jù)要在單擊時(shí)執(zhí)行的任務(wù)在兩個(gè)函數(shù)中編寫代碼。
在LED-ON按鈕的功能中,在功能結(jié)束之前復(fù)制并粘貼以下代碼以打開 LED。正如你在下面的代碼中看到的,fprintf(x,1) 用于將串行數(shù)據(jù)從 MATLAB 發(fā)送到 Arduino 串行。在這里,我們將“1”發(fā)送到Arduino串行,如果您檢查Arduino代碼,您會(huì)發(fā)現(xiàn)Arduino將通過(guò)使其13千引腳為高電平,當(dāng)它的串行端口上收到“1”時(shí)。
global x;
fprintf(x,1);
在LED-OFF按鈕的功能中,在功能結(jié)束之前復(fù)制并粘貼以下代碼以關(guān)閉 LED。正如你在下面的代碼中看到的,fprintf(x,0) 用于將串行數(shù)據(jù)從 MATLAB 發(fā)送到 Arduino 串行。在這一部分中,我們將“0”發(fā)送到Arduino串行,如果您檢查Arduino代碼,您會(huì)發(fā)現(xiàn)Arduino將通過(guò)使其13千引腳低電平,當(dāng)它的串行端口上收到“0”時(shí)。
global x;
fprintf(x,0);
完成 MATLAB GUI 編碼并根據(jù)電路圖設(shè)置硬件后,只需單擊運(yùn)行按鈕即可在 .m 文件中運(yùn)行編輯后的代碼。
MATLAB 可能需要幾秒鐘才能響應(yīng),在 MATLAB 顯示 BUSY 指示之前不要單擊任何 GUI 按鈕,您可以在屏幕的左下角看到,如下所示,
一切準(zhǔn)備就緒后,單擊 LED 打開和 LED 關(guān)閉按鈕以打開和關(guān)閉 LED。當(dāng)您按下 LED 亮起按鈕時(shí),13千Arduino 的引腳變?yōu)楦唠娖?,連接到此引腳的 LED 開始發(fā)光,當(dāng)您按下 LED 關(guān)閉按鈕時(shí),13千Arduino的引腳變?yōu)榈碗娖剑筁ED關(guān)閉。
Arduino Code for Serial Communication between MATLAB and Arduino
int value;
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop()
{
if(Serial.available()>0)
{
value=Serial.read();
if (value == 1)?
{?
digitalWrite(13, HIGH);
}
if(value == 0)?
{?
digitalWrite(13, LOW);
}
}
}
MATLAB Code for Serial Communication using MATLAB GUI
function varargout = final(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @final_OpeningFcn, ...
'gui_OutputFcn', @final_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
handles.output = hObject;
guidata(hObject, handles);
function varargout = final_OutputFcn(hObject, eventdata, handles)?
varargout{1} = handles.output;
clear all;
global x;
x=serial('COM18','BAUD', 9600); % Make sure the baud rate and COM port is?
% same as in Arduino IDE
fopen(x);
function turnonled_Callback(hObject, eventdata, handles)
global x;
fprintf(x,1);
function turnoffled_Callback(hObject, eventdata, handles)
global x;
fprintf(x,0);
?
評(píng)論
查看更多