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