藍(lán)牙是嵌入式系統(tǒng)中用于短距離無線通信的最簡單和最流行的協(xié)議。藍(lán)牙不僅用于將數(shù)據(jù)從一臺(tái)設(shè)備傳輸?shù)搅硪慌_(tái)設(shè)備,還用于無線控制設(shè)備。現(xiàn)在幾乎每個(gè)電子產(chǎn)品都支持藍(lán)牙,因此在嵌入式應(yīng)用程序中使用藍(lán)牙控制選項(xiàng)是明智的選擇。
在本教程中,我們將學(xué)習(xí)如何在 MATLAB 中使用藍(lán)牙進(jìn)行無線通信。我們將使用計(jì)算機(jī)的內(nèi)置藍(lán)牙,一側(cè)帶有 MATLAB,另一側(cè)帶有 Arduino 的 HC-05。通過藍(lán)牙在 MATLAB 和 Arduino 之間建立通信有兩種方法,一種是使用命令窗口,另一種是使用 MATLAB GUI。這兩種方法的 Arduino 代碼將保持不變。
所需組件
MATLAB 安裝筆記本電腦(首選:R2016a 或以上版本)
Arduino UNO
藍(lán)牙模塊 (HC-05)
LED(任何顏色)
電阻器(330 歐姆)
跳線
電路原理圖
MATLAB 和 Arduino 之間的藍(lán)牙通信 原理圖 如下:
使用 MATLAB 命令行窗口進(jìn)行藍(lán)牙通信
這是在 Arduino 和 MATLAB 之間設(shè)置藍(lán)牙通信的簡單方法。在這里,MATLAB 使用筆記本電腦的藍(lán)牙連接 HC-05 與 Arduino 連接。首先,我們必須對 Arduino 進(jìn)行編碼以讀取來自 MATLAB 的串行傳入數(shù)據(jù)(使用筆記本電腦的藍(lán)牙)。
然后這個(gè)來自 MATLAB 的藍(lán)牙傳輸數(shù)據(jù)可用于控制連接到 Arduino 的任何東西。在這里,我們將一個(gè) LED 連接到 Arduino,可以使用 MATLAB 從筆記本電腦進(jìn)行控制。
首先,在 Arduino UNO 中上傳給定的 Arduino 代碼,然后在 MATLAB 命令行窗口中開始編碼。
#include
int TxD;
詮釋 RxD;
整數(shù)數(shù)據(jù);
軟件串行藍(lán)牙(TxD,RxD);
無效設(shè)置(){
序列.開始(9600);
藍(lán)牙.開始(9600);
}
無效循環(huán)()
{
如果(藍(lán)牙.available()> 0)
{
數(shù)據(jù)=藍(lán)牙.read();
串行打印(數(shù)據(jù));
序列號(hào).print("\n");
if(data == '1')
{
digitalWrite(11, HIGH);
}
否則 if(data == '0')
{
digitalWrite(11, LOW);
}
}
}
然后,將下面的 MATLAB 代碼復(fù)制并粘貼到命令窗口中,以便在 MATLAB 和 Arduino 之間進(jìn)行藍(lán)牙通信。
instrhwinfo('藍(lán)牙','HC-05');
bt = 藍(lán)牙('HC-05', 1);
fopen(BT);
在下面的代碼中,命令fprintf(bt,‘0’)用于通過向 Arduino 發(fā)送“0”來關(guān)閉 LED。現(xiàn)在,如果您想打開 LED,只需使用以下命令發(fā)送“1”而不是“0”。
fprintf (bt,‘1’);
instrhwinfo (‘類型’,‘設(shè)備名稱’);
要打開藍(lán)牙端口,請使用以下命令
fopen (BT);
查看下面的視頻,了解 使用藍(lán)牙將數(shù)據(jù)從 MATLAB 發(fā)送到 Arduino的完整過程。
使用 MATLAB GUI 進(jìn)行藍(lán)牙通信
為了使用 MATLAB GUI 演示藍(lán)牙通信,我們將在 MATLAB 中創(chuàng)建三個(gè)圖形按鈕來打開、關(guān)閉和閃爍連接到 Arduino 的 LED。單擊這些圖形按鈕后,數(shù)據(jù)將通過藍(lán)牙從 MATLAB 發(fā)送到 HC-05。Arduino 包含從 MATLAB 向 HC-05 接收藍(lán)牙傳輸數(shù)據(jù)并根據(jù)接收到的數(shù)據(jù)控制 LED 的代碼。Arduino 代碼將與之前的代碼保持一致,唯一不同的是,之前我們通過 MATLAB 的命令窗口發(fā)送數(shù)據(jù)“1”和“0”,現(xiàn)在單擊三個(gè)圖形按鈕將發(fā)送相同的數(shù)據(jù)。
要啟動(dòng) GUI,請?jiān)诿畲翱谥墟I入以下命令
指導(dǎo)
將打開一個(gè)彈出窗口,然后選擇新的空白 GUI,如下圖所示,
現(xiàn)在選擇三個(gè)按鈕來打開、關(guān)閉和閃爍 LED,如下圖所示,
要調(diào)整按鈕的大小或更改按鈕的形狀,只需單擊它,您就可以拖動(dòng)按鈕的角。通過雙擊按鈕,您可以更改該特定按鈕的顏色、字符串和標(biāo)簽。我們定制了三個(gè)按鈕,如下圖所示。
您可以根據(jù)自己的選擇自定義按鈕。現(xiàn)在,當(dāng)您保存它時(shí),將在MATLAB的編輯器窗口中生成一個(gè)代碼。根據(jù)您希望 Arduino 在使用 MATLAB GUI 接收藍(lán)牙數(shù)據(jù)時(shí)執(zhí)行的任務(wù)編輯此代碼。所以下面我們編輯了 MATLAB 代碼。您可以在MATLAB 入門教程中了解有關(guān)命令窗口、編輯器窗口等的更多信息。
本項(xiàng)目末尾給出了完整的 MATLAB 代碼,用于通過藍(lán)牙從 MATLAB 控制 LED。此外,我們在此處包含 GUI 文件 (.fig) 和代碼文件 (.m) 以供下載,您可以使用它們根據(jù)需要自定義按鈕。下面是我們?yōu)榭刂婆c Arduino 連接的 LED 所做的一些調(diào)整。
將以下代碼復(fù)制并粘貼到第 1 行。74 設(shè)置或?qū)?MATLAB 連接到筆記本電腦的藍(lán)牙。
全部清除;
全球BT;
instrhwinfo(‘藍(lán)牙’,‘HC-05’);
bt = 藍(lán)牙(‘HC-05’, 1);
fopen(BT);
其中,fopen(bt)用于打開藍(lán)牙端口以傳輸數(shù)據(jù)。
現(xiàn)在,當(dāng)您向下滾動(dòng)時(shí),您將看到在 GUI 中為三個(gè)按鈕創(chuàng)建了三個(gè)函數(shù)。現(xiàn)在根據(jù)您要在單擊時(shí)執(zhí)行的任務(wù)在函數(shù)中編寫代碼。
在LED ON按鈕的功能中,在功能結(jié)束前復(fù)制并粘貼以下代碼以打開 LED。在下面的代碼中,fprintf(bt,‘1’)用于使用筆記本電腦的藍(lán)牙將 ‘1’ 從 MATLAB 發(fā)送到 HC-05。Arduino 將通過 HC-05 接收此數(shù)據(jù)“1”并通過將其第 11個(gè)引腳設(shè)為高電平來點(diǎn)亮 LED。
全球BT;
fprintf (bt,‘1’);
在LED OFF按鈕的功能中,在功能結(jié)束前復(fù)制并粘貼以下代碼以關(guān)閉 LED。在下面的代碼中,fprintf(bt,‘0’)用于使用筆記本電腦的藍(lán)牙將 ‘0’ 從 MATLAB 發(fā)送到 HC-05。Arduino 將通過 HC-05 接收“0”并通過將其第 11個(gè)引腳設(shè)為低電平來關(guān)閉 LED 。
全球BT;
fprintf (bt,‘0’);
在BLINK按鈕的功能中,使用以下代碼使 LED 閃爍。一個(gè)for循環(huán)用于使 LED 閃爍 10 次。
全球BT;
對于 i = 1:10
fprintf(bt,‘1’);
暫停(0.5);
fprintf(bt,‘0’);
暫停(0.5);
結(jié)尾
完成 MATLAB GUI 編碼并根據(jù)電路圖設(shè)置硬件后,只需單擊運(yùn)行按鈕即可運(yùn)行 .m 文件中編輯的代碼。
MATLAB 可能需要幾秒鐘的時(shí)間來響應(yīng),不要點(diǎn)擊任何 GUI 按鈕,直到 MATLAB 顯示 BUSY 指示,您可以在屏幕的左下角看到如下所示,
一切準(zhǔn)備就緒后,單擊 LED-ON、LED OFF 和 BLINK 按鈕分別打開、關(guān)閉和閃爍 LED。
Arduino代碼:
#include
詮釋TXD;
詮釋 RxD;
整數(shù)數(shù)據(jù);
軟件串行藍(lán)牙(TxD,RxD);
無效設(shè)置(){
序列號(hào).開始(9600);
藍(lán)牙.開始(9600);
}
無效循環(huán)()
{
如果(藍(lán)牙.available()> 0)
{
數(shù)據(jù)=藍(lán)牙.read();
如果(數(shù)據(jù) == '1')
數(shù)字寫入(11,高);
否則如果(數(shù)據(jù) == '0')
數(shù)字寫入(11,低);
}
}
使用 MATLAB 命令行窗口進(jìn)行藍(lán)牙通信的代碼
instrhwinfo('藍(lán)牙','HC-05');
bt = 藍(lán)牙('HC-05', 1);
fopen(BT);
fprintf(bt,'1');
fprintf(bt,'0');
使用 MATLAB GUI 進(jìn)行藍(lán)牙通信的代碼
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @bluetooth_with_MATLAB_OpeningFcn, ...
'gui_OutputFcn', @bluetooth_with_MATLAB_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
結(jié)尾
如果說
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
別的
gui_mainfcn(gui_State, varargin{:});
結(jié)尾
函數(shù) bluetooth_with_MATLAB_OpeningFcn(hObject, eventdata, 句柄, varargin)
函數(shù) varargout = bluetooth_with_MATLAB_OutputFcn(hObject, eventdata, 句柄)
可變參數(shù){1} = 句柄.輸出;
全部清除;
全球BT;
instrhwinfo('藍(lán)牙','HC-05');
bt = 藍(lán)牙('HC-05', 1);
fopen(BT);
函數(shù) led_on_Callback(hObject, eventdata, 句柄)
全球BT;
fprintf(bt,'1');
函數(shù) led_off_Callback(hObject, eventdata, 句柄)
全球BT;
fprintf(bt,'0');
函數(shù)blink_Callback(hObject,事件數(shù)據(jù),句柄)
全球BT;
對于 i = 1:10
fprintf(bt,'1');
暫停(0.5);
fprintf(bt,'0');
暫停(0.5);
結(jié)尾
?
評(píng)論