MATLAB 是多功能軟件,可用于各種應(yīng)用。在MATLAB之前的教程中,我們已經(jīng)解釋了如何使用MATLAB來控制直流電機,伺服電機和家用電器。在本教程中,我們將學(xué)習(xí)如何使用 MATLAB 進行串行通信。對于串行通信的接收端,我們在這里使用Arduino。
有兩種方法可以在MATLAB和Arduino之間設(shè)置串行通信,一種是使用命令窗口,另一種是使用MATLAB GUI。兩種方法的Arduino代碼將保持不變。
所需組件
MATLAB 安裝筆記本電腦(偏好:R2016a 或更高版本)
Arduino UNO
指示燈(任何顏色)
電阻器(330歐姆)
電路圖

?

對于在MATLAB和Arduino之間建立串行通信的兩種方法,上面的電路圖將保持不變。
使用 MATLAB 命令窗口進行串行通信
這是在Arduino和MATLAB之間設(shè)置串行通信的簡單方法。在這里,我們將簡單地使用命令窗口將數(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編輯器窗口中開始編碼。要打開新的編輯器腳本,請單擊“新腳本”,如下圖所示:

然后,將以下完整的 MATLAB 代碼復(fù)制并粘貼到編輯器窗口中,以便在 MATLAB 和 Arduino 之間進行串行通信。
%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端口號是Arduino連接的端口號,并且在Arduino和MATLAB的代碼中應(yīng)設(shè)置相同的波特率。
x=serial('COM18','BAUD', 9600);
要打開串行端口,請使用以下命令,
fopen(x);
以下命令用于將數(shù)據(jù)從 MATLAB 串行發(fā)送到 Arduino,其中 x 用于調(diào)用串行,a 是用戶輸入的值。
fprintf(x,a); ?
我們使用while函數(shù)來創(chuàng)建無限循環(huán),每當用戶輸入數(shù)字“2”時,循環(huán)就會中斷。
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”以運行您的程序,如下圖所示,

MATLAB 需要幾秒鐘來處理代碼并開始串行通信,等到 MATLAB 在軟件屏幕的左下角顯示“BUSY”消息,如下圖所示。

現(xiàn)在,您將看到用于發(fā)送用戶輸入的命令窗口,我們已經(jīng)設(shè)置了默認消息,
'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)建兩個圖形按鈕來打開和關(guān)閉連接到 Arduino 的 LED。數(shù)據(jù)將從 MATLAB 串行發(fā)送到 Arduino,單擊這些按鈕以打開和關(guān)閉 LED。Arduino將包含從MATLAB接收串行數(shù)據(jù)并根據(jù)接收到的串行數(shù)據(jù)控制LED的代碼。Arduino 代碼將與前一個代碼保持相同,唯一的區(qū)別是,以前我們通過 MATLAB 的命令窗口發(fā)送串行數(shù)據(jù)“1”和“0”,現(xiàn)在將在兩個圖形按鈕上點擊發(fā)送相同的數(shù)據(jù)。
要啟動 GUI,請在命令窗口中鍵入以下命令
guide
將打開一個彈出窗口,然后選擇新的空白GUI,如下圖所示,

現(xiàn)在選擇兩個按鈕來打開和關(guān)閉 LED,如下所示,

要調(diào)整按鈕的大小或更改按鈕的形狀,只需單擊它,您就可以拖動按鈕的角。通過雙擊按鈕,您可以更改該特定按鈕的顏色,字符串和標簽。我們自定義了兩個按鈕,如下圖所示。

?

您可以根據(jù)自己的選擇自定義按鈕?,F(xiàn)在,當您保存此代碼時,將在 MATLAB 的編輯器窗口中生成一個代碼。根據(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) 用于打開串行端口進行串行通信。
向下滾動時,您將看到為 GUI 中的兩個按鈕創(chuàng)建了兩個函數(shù)?,F(xiàn)在,根據(jù)要在單擊時執(zhí)行的任務(wù)在兩個函數(shù)中編寫代碼。
在LED-ON按鈕的功能中,在功能結(jié)束之前復(fù)制并粘貼以下代碼以打開 LED。正如你在下面的代碼中看到的,fprintf(x,1) 用于將串行數(shù)據(jù)從 MATLAB 發(fā)送到 Arduino 串行。在這里,我們將“1”發(fā)送到Arduino串行,如果您檢查Arduino代碼,您會發(fā)現(xiàn)Arduino將通過使其13千引腳為高電平,當它的串行端口上收到“1”時。
global x;
fprintf(x,1);

在LED-OFF按鈕的功能中,在功能結(jié)束之前復(fù)制并粘貼以下代碼以關(guān)閉 LED。正如你在下面的代碼中看到的,fprintf(x,0) 用于將串行數(shù)據(jù)從 MATLAB 發(fā)送到 Arduino 串行。在這一部分中,我們將“0”發(fā)送到Arduino串行,如果您檢查Arduino代碼,您會發(fā)現(xiàn)Arduino將通過使其13千引腳低電平,當它的串行端口上收到“0”時。
global x;
fprintf(x,0);

完成 MATLAB GUI 編碼并根據(jù)電路圖設(shè)置硬件后,只需單擊運行按鈕即可在 .m 文件中運行編輯后的代碼。

MATLAB 可能需要幾秒鐘才能響應(yīng),在 MATLAB 顯示 BUSY 指示之前不要單擊任何 GUI 按鈕,您可以在屏幕的左下角看到,如下所示,

一切準備就緒后,單擊 LED 打開和 LED 關(guān)閉按鈕以打開和關(guān)閉 LED。當您按下 LED 亮起按鈕時,13千Arduino 的引腳變?yōu)楦唠娖?,連接到此引腳的 LED 開始發(fā)光,當您按下 LED 關(guān)閉按鈕時,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);
?
電子發(fā)燒友App














評論