學習目標 : 認識faya藍芽模組的功能及使用方式
學習時間 : 60min
示範模組 : (1) faya brickNano
(2) faya藍芽模組
(3) faya直流馬達模組
工具 : (1) 樂高底板(相容)
(2) 具藍芽功能的筆電或電腦
(3) Andriod 手機 (選擇性)
====================功能介紹====================
藍芽為現今最常見的無線通訊設備,假如你手邊有行動裝置如:智慧型手機、平板電腦,絕大部分都有內建藍芽。藍芽模組的傳輸方式非常簡單,使用UART資料傳輸,只需將模組上的TxD(資料傳送)、RxD(資料接收)連接到Arduino板,並將通訊速度(鮑率:baud rate)設定完成後,就可以傳送資料。
faya藍芽模組採用市面上最常用的藍芽模組HC-05,並將常用的3個控制埠TxD,RxD,KEY至於模組的左方,和Arduino的串列埠相連接。

Arduino板的UART: TxD(1)、RxD(0)腳是用來燒錄程式用的,如果用來連接藍芽模組,會無法燒錄程式,所以這裡先介紹使用程式指令模擬其他的UART腳位。
- #include<SoftwareSerial.h>;
- SoftwareSerial 物件名稱(RxDPin, TxDPin);
物件名稱 : 可自行命名
RxDPin : 連接到Arduino模擬的RxD腳位,對於藍芽模組而言是TxD
TXDPin : 連接到Arduino模擬的TxD腳位,對於藍芽模組而言是RxD
備注 - 用程式模擬出來的RxD腳位是有限制的,只能連到具有中斷的腳位UNO
和 NANO 為D10、D11、D12、D13腳
(例) 當建構物件名稱為"fayaBluetooth",RxD設到第10腳,TxD設到第11腳時,需宣告:
SoftwareSerial fayaBluetooth(10,11);
- 物件名稱. begin(BTspeed);
物件名稱 : 可自行命名
BTspeed : 設定以下常用的鮑率:2400、4800、9600、19200、38400、115200,大部
分的藍芽裝置都預設鮑率:9600。
(例) 當我們建構一物件名稱為"fayaBluetooth",鮑率為9600bps時,程式中需宣告
fayaBluetooth.begin(9600);
以上舉了幾個模擬的串列連接埠使用範例,基本上用法和一般的串列連接埠使用方式相同,有興趣的人可以參考官方網站 。
====================原理知識====================
藍芽的傳輸原理很複雜,基本上是運作在2.45GHz的頻帶,可傳輸資料與聲音,傳輸距離最遠可達10公尺。運作原理主要是用跳頻展頻技術(Frequency Hopping Spread Spectrum — FHSS),就像是特定頻率的無線電,使藍芽兩端可以用特定的窄頻窄波同步在2.4MHz的頻帶上傳送訊號。
以上複雜的傳輸都已交給硬體晶片來完成,使藍芽模組的人其實不需要了解當中原理。只要了解如何資料正確地透過藍芽傳送和接收即可。faya藍芽模組的介面簡化到用兩隻腳(TxD, RxD)就能傳送資料,另一隻KEY腳用來設定藍芽的工作狀態,我們未來有範例需要使用此腳位時再介紹。模組電路圖如下:

電路中,我們將輸入的5V電壓降到3.3V的工作電壓,並把所需的TxD、RxD和KEY腳位拉出來,另外,我們用一顆LED(焊在模組背面)顯示模組的配對/連線狀態 (需先配對成功後才能連線):
- 快速閃爍 (每秒5次) - 模組等待連線配對中
- 每2秒閃爍1次 - 模組配對成功 (藍芽模組會記得曾經配對成功的模組,之後重新開機時就無須再次配對,此時不會再顯示此狀態
- 每2秒閃爍2次 - 藍芽模組以連線
- 範例一 : 讓筆電透過藍芽傳送字元指令控制Arduino的LED燈
- 範例二 : 讓筆電透過藍芽傳送字串指令控制連接Arduino的直流馬達
目標:
(1) Arduino透過藍芽模組送出字串到電腦的終端機介面
(2) 電腦透過藍芽傳送'1'時,Arduino 板子上的LED燈亮起,傳送'0'時,LED熄滅
接線:
(1) 電源線連接
如下圖所示,連接的說明請看這篇文章 或簡易版
Arduino_10 ===> 藍芽模組_TxD
Arduino_11 ===> 藍芽模組_RxD
藍芽配對:
(1) 完成以上的電源和訊號接線後,用USB線將電腦與brickNano連結,此時faya藍芽模組會通電,由於電腦的藍芽和faya藍芽模組還未配對,因此模組下方的LED燈會快速閃爍。

(2) 接著在到 [控制台 > 硬體和音效 > 裝置和印表機] 的畫面,點選 [新增裝置]

(3) 從新增裝置的選單中挑選HC-05 (無此選項時,可以找顯示[不明]的那個試試看)

(4)出現要求輸入裝置密碼的畫面,輸入預設密碼[1234]

(5)接著會跳到正在安裝檔案的頁面,等待自動安裝完成

(6)完成後,模組下方的紅色LED每2秒會閃爍1次 -代表電腦藍芽(主)和模組藍芽(僕)配對成功,電腦的裝置管理員的藍芽也會顯示HC-05裝置。

以上配對程序只需要做一次,電腦會記得此模組已經配對過,未來無須重新配對。
軟體安裝:
我們需要在具有藍芽的電腦(筆電)安裝串列終端介面,這樣才能夠過此介面接收和發送訊號給faya藍芽模組,這邊建議使用的終端機介面為TeraTerm
(1) 到TeraTerm下載網頁下載並安裝軟體,安裝過程中,一直按下一步即可,不須額外加選其他安裝項目。

(2)開啟TeraTerm,在連線選單選擇Serial,找藍芽ComPort按OK進行連線。當看到模組下方的紅色LED燈每兩秒快速閃爍2下時,代表連線成功。(註:筆者的Win10在配對成功後,需要重新開機一次,才能順利連線,如果在這邊連線失敗了,試著重新開機在連連看)

範例程式:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2017/8/28 | |
// Faya-Nugget 範例程式 (Bluetooth_1.ino) | |
// 單元: 模組介紹:faya藍牙模組 | |
// 網址: https://fayalab.blogspot.com/2017/09/BlueTooth.html | |
// 目標: (1) Arduino透過藍芽模組送出字串到電腦的終端機介面 | |
// (2) 電腦透過藍芽傳送'1'時,Arduino 板子上的LED燈亮起,傳送'0'時,LED熄滅 | |
// 接線: Arduino ==> faya模組 | |
// 10 ==> TxD (藍牙模組) | |
// 11 ==> RxD (藍牙模組) | |
#include <SoftwareSerial.h> //使用模擬串列埠函示庫 | |
// 藍牙腳位設定 | |
int RxDPin = 10; // Arduino Rx 連到藍芽模組 Tx | |
int TxDPin = 11; // Arduino Tx 連到藍芽模組 Rx | |
//定義Arduino連接到藍芽模組的串列腳位 | |
SoftwareSerial fayaBluetooth(RxDPin, TxDPin); | |
char CmdData; // 字元指令存放 | |
void setup() | |
{ | |
fayaBluetooth.begin(9600); //藍芽baudRate = 9600 | |
Serial.begin(9600); // Arduino串列埠baurRate = 9600 | |
delay(3000); // 延遲3秒 | |
pinMode(13,OUTPUT); // 設定13腳為輸出腳,控制內建LED | |
fayaBluetooth.println("Please enter '1' or '0' to turn on / off DC Motor"); //開機訊息 | |
} | |
void loop() { | |
if(fayaBluetooth.available()>0){ // 當藍牙接收到資料時 | |
CmdData = fayaBluetooth.read(); // 把字元存到CmdData | |
} | |
if(CmdData == '1') { // 輸入1時點燈 | |
digitalWrite(13, HIGH); | |
} | |
if(CmdData == '0') { // 輸入0時熄燈 | |
digitalWrite(13, LOW); | |
} | |
} |
備註:
- L18: 模擬串列埠fayaBluetooth搭起了和藍芽模組溝通的介面,和TeraTerm終端機介面程式連線後,就可以在此介面接收或發送資料
- L28 : Arduino啟動後,透過藍芽模組對電腦的藍芽發送訊息,電腦會把收到的訊息顯示在TeraTerm終端機畫面。
- L31~L41: 電腦鍵盤輸入1 or 0,並且透過電腦的藍芽發送給faya藍芽模組,faya藍芽接收到字元後,透過串列埠傳給Arduino來控制LED燈
- L31~L41: 電腦鍵盤輸入1 or 0,並且透過電腦的藍芽發送給faya藍芽模組,faya藍芽接收到字元後,透過串列埠傳給Arduino來控制LED燈
討論:
- 連接從TeraTerm送出字元指令前,需開啟選單中[Control / Broadcast Command],接著在視窗中勾選如下所示:

- 這個範例我們透過字元來控制LED,單一字元的控制項目有限,因此控制了LED明亮,下個範例我們透過傳送字串送出控制碼,如此能控制的項目就無限了!
===================範例實作(2)===================
目標:
(1) Arduino透過藍芽模組送出指令簡介到電腦的終端機介面
(2) 電腦的終端機介面送出"120"~"200"之間的字串控制直流馬達旋轉速度
(3) 電腦的終端機介面送出"CW" / "CCW" 字串控制馬達旋轉方向
(4) 電腦的終端機介面送出"OFF" 字串停止運轉
接線:
(1) 電源線連接
如下圖所示,連接的說明請看這篇文章 或簡易版
(2) 訊號線連接
Arduino_10 ===> 藍芽模組_TxD
Arduino_11 ===> 藍芽模組_RxD
Arduino_3 ===> 直流馬達模組_SIG
Arduino_13 ===> 直流馬達模組_DIR
範例程式:
備註:
- L48~L54: 接收字串指令的重要程式技巧,由於(串列.read)的函示一次只能讀一字元,因此當街收到('\n') new line 碼時,才開始判斷組合起來的字串。在TeraTerm裡的Broadcast Command 勾選 [Enter Key]時,等同送出new line碼
-L63 / L69 / L80 : 由於我們在TeraTerm裡的Broadcast Command勾選[EnterKey]後,又多帶了一個[CR] carriage return碼,所以接收時,判斷字串時需要再加上('\r')碼,傳送和接收的字串才會一致。
範例結果:
討論:
目標:
(1) Arduino透過藍芽模組送出指令簡介到電腦的終端機介面
(2) 電腦的終端機介面送出"120"~"200"之間的字串控制直流馬達旋轉速度
(3) 電腦的終端機介面送出"CW" / "CCW" 字串控制馬達旋轉方向
(4) 電腦的終端機介面送出"OFF" 字串停止運轉
接線:
(1) 電源線連接
如下圖所示,連接的說明請看這篇文章 或簡易版
(2) 訊號線連接
Arduino_10 ===> 藍芽模組_TxD
Arduino_11 ===> 藍芽模組_RxD
Arduino_3 ===> 直流馬達模組_SIG
Arduino_13 ===> 直流馬達模組_DIR
範例程式:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2017/8/29 | |
// Faya-Nugget 範例程式 (Bluetooth_2.ino) | |
// 單元: 模組介紹:faya藍牙模組 | |
// 網址: https://fayalab.blogspot.com/2017/09/BlueTooth.html | |
// 目標: (1) Arduino透過藍芽模組送出指令簡介到電腦的終端機介面 | |
// (2) 電腦的終端機介面送出"120"~"200"之間的字串控制直流馬達旋轉速度 | |
// (3) 電腦的終端機介面送出"CW" / "CCW" 字串控制馬達旋轉方向 | |
// (4) 電腦的終端機介面送出"OFF" 字串停止運轉 | |
// 接線: Arduino ==> faya模組 | |
// 10 ==> TxD (藍牙模組) | |
// 11 ==> RxD (藍牙模組) | |
// 3 ==> SIG (直流馬達模組) | |
// 13 ==> DIR (直流馬達模組) | |
#include <SoftwareSerial.h> //使用模擬串列埠函示庫 | |
// 直流馬達腳位設定 | |
int dcMotorSig = 3; // 數位第3腳可當PWM輸出類比電壓訊號 | |
int dcMotorDir = 13; // 數位第13腳控制旋轉方向 | |
int motorSpeed; // 儲存馬達速度變數 | |
int motorDir_flag = 1; // 旋轉方向旗標 : 1 = CW, 0 = CCW | |
// 藍牙腳位設定 | |
int RxDPin = 10; // Arduino Rx 連到藍芽模組 Tx | |
int TxDPin = 11; // Arduino Tx 連到藍芽模組 Rx | |
//定義Arduino連接到藍芽模組的串列腳位 | |
SoftwareSerial fayaBluetooth(RxDPin, TxDPin); | |
String cmdString; // 字串指令存放 | |
void setup() | |
{ | |
fayaBluetooth.begin(9600); //藍芽baudRate = 9600 | |
// Serial.begin(9600); // Arduino串列埠baudRate = 9600 | |
delay(3000); //延遲3秒 | |
pinMode(dcMotorSig,OUTPUT); //輸出腳位控制直流馬達訊號 | |
pinMode(dcMotorDir,OUTPUT); //輸出腳位控制直流馬達旋轉方向 | |
digitalWrite(dcMotorDir, 1); //初始旋轉方向 = CW | |
analogWrite(dcMotorSig, 0); //初始馬達不運轉 | |
fayaBluetooth.println("Please enter [120~200] to control DC Motor speed"); //開機訊息 | |
fayaBluetooth.println("Please enter [OFF] to turn off DC Motor"); | |
fayaBluetooth.println("Please enter [CW] to turn DC Motor Clockwise"); | |
fayaBluetooth.println("Please enter [CCW] to turn DC Motor Counter Clockwise"); | |
} | |
void loop() { | |
cmdString = ""; //重置字串 | |
while(fayaBluetooth.available()) { // 當藍牙接收到資料時 | |
char c = fayaBluetooth.read(); //儲存此字元 | |
if(c != '\n'){ //直到按下Return [CR] | |
cmdString += c; //未按下Return前,將字元累積,組合成字串 | |
} | |
delay(5); // 延遲讓處理器足夠時間反應 | |
} | |
if(cmdString >= "120" & cmdString <= "200") { //字串120~200控制馬達速度 | |
//Serial.println(cmdString); | |
motorSpeed = cmdString.toInt(); //先將字串改成數字 | |
analogWrite(dcMotorSig, motorSpeed); //才能將數字放入analogWrite函示 | |
} | |
if(cmdString == "OFF\r") { //字串OFF停止運轉 | |
//Serial.println(cmdString); | |
motorSpeed = 0; | |
analogWrite(dcMotorSig, motorSpeed); | |
} | |
if(cmdString == "CW\r") { //字串CW馬達正轉 | |
//Serial.println(cmdString); | |
if(motorDir_flag ==0) { // 如果原本是逆轉時 | |
analogWrite(dcMotorSig, 0); // 先停下來 | |
digitalWrite(dcMotorDir, 1); // CCW 改成 CW | |
delay(1500); // 等待1.5秒,保護電路 | |
analogWrite(dcMotorSig, motorSpeed); // 回復運轉 | |
motorDir_flag = 1; | |
} | |
} | |
if(cmdString == "CCW\r") { //字串CCW馬達逆轉 | |
//Serial.println(cmdString); | |
if(motorDir_flag == 1) { // 如果原本是正轉時 | |
analogWrite(dcMotorSig, 0); // 先停下來 | |
digitalWrite(dcMotorDir, 0); // CW 改成 CCW | |
delay(1500); // 等待1.5秒,保護電路 | |
analogWrite(dcMotorSig, motorSpeed); // 回復運轉 | |
motorDir_flag = 0; | |
} | |
} | |
} |
備註:
- L48~L54: 接收字串指令的重要程式技巧,由於(串列.read)的函示一次只能讀一字元,因此當街收到('\n') new line 碼時,才開始判斷組合起來的字串。在TeraTerm裡的Broadcast Command 勾選 [Enter Key]時,等同送出new line碼

-L63 / L69 / L80 : 由於我們在TeraTerm裡的Broadcast Command勾選[EnterKey]後,又多帶了一個[CR] carriage return碼,所以接收時,判斷字串時需要再加上('\r')碼,傳送和接收的字串才會一致。
範例結果:
討論:
- 我們在第二個範例學習到如何透過藍芽傳送和接收字串指令,把這個技巧學起來,對於爾後我們的藍芽無線控制各種標的物時,是非常有用的!
- Windows上還有不同的藍芽終端機軟體,筆者在Win10的市集裡下載了[Bluetooth Serial Terminal] ,畫面簡單了許多,同樣可以控制本篇的範例喔!

- 另外有Android手機的朋友,也可以下載相關藍芽終端機App,例如Bluetooth Terminal,軟體安裝完後的使用方式,也和本篇介紹的相同,只是控制介面由電腦轉到手機上了,大家可以試試看。注意Iphone裡的藍芽終端機軟,基於某些限制,必須連到有認證過的藍芽裝置,可惜不包含HC-05,因此無法用Iphone手機控制本章的範例喔!
也歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================
fayalab 粉絲團
FB本篇留言版
iphone的藍芽弄得出來嗎
回覆刪除Iphone的藍芽要求比較嚴謹,需要有認證的藍芽晶片,類似TI的CC254x系列的,筆者也想找個時間試試看!
刪除