MATLAB 是多功能軟件,可用于各種應用。在MATLAB之前的教程中,我們已經解釋了如何使用MATLAB來控制直流電機,伺服電機和家用電器。在本教程中,我們將學習如何使用 MATLAB 進行串行通信。對于串行通信的接收端,我們在這里使用Arduino。
有兩種方法可以在MATLAB和Arduino之間設置串行通信,一種是使用命令窗口,另一種是使用MATLAB GUI。兩種方法的Arduino代碼將保持不變。
所需組件
MATLAB 安裝筆記本電腦(偏好:R2016a 或更高版本)
Arduino UNO
指示燈(任何顏色)
電阻器(330歐姆)
電路圖
?
對于在MATLAB和Arduino之間建立串行通信的兩種方法,上面的電路圖將保持不變。
使用 MATLAB 命令窗口進行串行通信
這是在Arduino和MATLAB之間設置串行通信的簡單方法。在這里,我們將簡單地使用命令窗口將數據從 MATLAB 串行發送到 Arduino,然后 Arduino 讀取傳入的串行數據。然后,這種串行傳輸的數據可用于控制連接到Arduino的任何內容。在這里,我們將LED連接到Arduino,它將根據Arduino串行接收的數據打開和關閉。
首先,在Arduino UNO中上傳給定的Arduino代碼,然后在MATLAB編輯器窗口中開始編碼。要打開新的編輯器腳本,請單擊“新腳本”,如下圖所示:
然后,將以下完整的 MATLAB 代碼復制并粘貼到編輯器窗口中,以便在 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的代碼中應設置相同的波特率。
x=serial('COM18','BAUD', 9600);
要打開串行端口,請使用以下命令,
fopen(x);
以下命令用于將數據從 MATLAB 串行發送到 Arduino,其中 x 用于調用串行,a 是用戶輸入的值。
fprintf(x,a); ?
我們使用while函數來創建無限循環,每當用戶輸入數字“2”時,循環就會中斷。
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”消息,如下圖所示。
現在,您將看到用于發送用戶輸入的命令窗口,我們已經設置了默認消息,
'Press 1 to turn ON LED & 0 to turn OFF:'
發送“1”打開 LED,發送“0”關閉 LED,發送“2”中斷操作。您可以為任何任務設置任何數字,您所要做的就是相應地更改Arduino代碼。最后給出了完整的Arduino代碼。
使用 MATLAB GUI 的串行通信
為了演示使用 MATLAB GUI 的串行通信,我們將使用 MATLAB 創建兩個圖形按鈕來打開和關閉連接到 Arduino 的 LED。數據將從 MATLAB 串行發送到 Arduino,單擊這些按鈕以打開和關閉 LED。Arduino將包含從MATLAB接收串行數據并根據接收到的串行數據控制LED的代碼。Arduino 代碼將與前一個代碼保持相同,唯一的區別是,以前我們通過 MATLAB 的命令窗口發送串行數據“1”和“0”,現在將在兩個圖形按鈕上點擊發送相同的數據。
要啟動 GUI,請在命令窗口中鍵入以下命令
guide
將打開一個彈出窗口,然后選擇新的空白GUI,如下圖所示,
現在選擇兩個按鈕來打開和關閉 LED,如下所示,
要調整按鈕的大小或更改按鈕的形狀,只需單擊它,您就可以拖動按鈕的角。通過雙擊按鈕,您可以更改該特定按鈕的顏色,字符串和標簽。我們自定義了兩個按鈕,如下圖所示。
?
您可以根據自己的選擇自定義按鈕。現在,當您保存此代碼時,將在 MATLAB 的編輯器窗口中生成一個代碼。根據您希望使用 MATLAB GUI 由 Arduino 執行的任務編輯此代碼。
將以下代碼復制并粘貼到第 74 行以設置串行端口和波特率。
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 中的兩個按鈕創建了兩個函數。現在,根據要在單擊時執行的任務在兩個函數中編寫代碼。
在LED-ON按鈕的功能中,在功能結束之前復制并粘貼以下代碼以打開 LED。正如你在下面的代碼中看到的,fprintf(x,1) 用于將串行數據從 MATLAB 發送到 Arduino 串行。在這里,我們將“1”發送到Arduino串行,如果您檢查Arduino代碼,您會發現Arduino將通過使其13千引腳為高電平,當它的串行端口上收到“1”時。
global x;
fprintf(x,1);
在LED-OFF按鈕的功能中,在功能結束之前復制并粘貼以下代碼以關閉 LED。正如你在下面的代碼中看到的,fprintf(x,0) 用于將串行數據從 MATLAB 發送到 Arduino 串行。在這一部分中,我們將“0”發送到Arduino串行,如果您檢查Arduino代碼,您會發現Arduino將通過使其13千引腳低電平,當它的串行端口上收到“0”時。
global x;
fprintf(x,0);
完成 MATLAB GUI 編碼并根據電路圖設置硬件后,只需單擊運行按鈕即可在 .m 文件中運行編輯后的代碼。
MATLAB 可能需要幾秒鐘才能響應,在 MATLAB 顯示 BUSY 指示之前不要單擊任何 GUI 按鈕,您可以在屏幕的左下角看到,如下所示,
一切準備就緒后,單擊 LED 打開和 LED 關閉按鈕以打開和關閉 LED。當您按下 LED 亮起按鈕時,13千Arduino 的引腳變為高電平,連接到此引腳的 LED 開始發光,當您按下 LED 關閉按鈕時,13千Arduino的引腳變為低電平,使LED關閉。
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);
?
評論
查看更多