2015年2月16日 星期一

Arduino用藍牙模組進行遠端遙控

遠端遙控Arduino有幾個選擇:藍牙(Bluetooth)、XBee、無線網路(Wi-Fi)、無線電(Radio)、紅外線等。要連線都需要發射端與接收端兩個設備,其中除紅外線之外可以做雙向傳輸資訊(無線電要看是什麼模組),一般說來無線電適合長距離,Wi-Fi適合上網路與Server連接,其他的幾種傳輸距離都不長。以價錢來說,紅外線最便宜,再來可能就是藍牙(2.1)或無線電模組,Xbee與Wi-Fi模組的價格都較貴,而藍牙跟Android手機連線蠻容易的,所以很多人做遠端遙控的project都會先從藍牙開始嘗試。

市面上比較常見的藍牙模組,目前應以HC-06(僅從機功能)及HC-05(主從機功能)為大宗,很多人買HC-06作為從機連接Arduino,與Android App連線(Android手機做主機),透過藍牙來遙控Arduino。Google許多文章,多半是講如何以Arduino Uno來代替USB to TTL連接線連接HC-06,透過AT指令來設定設備名稱、連線密碼跟Baudrate(HC-06也只能設定這三樣參數)。關於如何判斷是HC-05還是HC-06,這篇寫的很清楚。總之每個人買到的藍牙模組可能會不太一樣,像我的HC-05是焊上6隻pin腳,晶片上有打個金色勾勾,上片還有個像reset的按鈕;而HC-06則只有焊4隻pin腳。如下圖:

從左至右:HC-05、HC-06、USB to TTL

反面:針腳從左至右是EN、VCC、GND、TXD、RXD、STATE

接法很簡單(兩片一樣),左至右
RXD接TX、TXD接RX、VCC接5V、GND接GND

在Arduino IDE上選擇USB to TTL的序列埠,新增一個視窗並打開Serial Console,並將換行指令改為「Both NL & CR」;HC-06可直接開始打入AT指令按Enter,例如打入AT,HC-06會回應OK。但HC-05需要在「通電後」按一下右下的按鈕,方可進入AT模式,如果已在連線狀態,則需要「長按住」按鈕以輸入AT指令,意思是說如果沒按按鈕,輸入AT指令則不會有回應。至於詳細的AT指令,每片模組多少有些不同,所以請跟你購買的商家索取手冊參考。


設定小提醒:
  1. 藍牙模組有好多種,每個人買到的不一定一樣(就算都叫HC-05)
  2. 記得索取手冊,才能確定AT指令跟預設的設定值
  3. 用USB to TTL連線來設定藍牙模組會比較簡單(不用輸入程式)
  4.  HC-06可更改設備名稱,配對密碼(在Mac上用0000會比較簡單),連線率9600可先不更改
  5. HC-05在從機模式時要「通完電」按一下按鈕,才能進AT模式輸入指令
  6. HC-05在連線中(或主機模式AT+ROLE=1時),需要按著按鈕才能輸入AT指令

重點來了,很少文章在講如何將一個從機HC-06連上主機HC-05(大部分人都沒買兩片來試),一般我們都在電腦或手機上設定藍牙連線跟配對,那HC-05沒有螢幕,要怎樣搜尋藍牙設備以及輸入配對密碼呢?答案就是「透過AT指令」。


連線步驟:
  1. 先將HC-06設定好,確定與電腦連線正常,可先從電腦上抄下他的Address備用
  2. 將HC-05的配對密碼以及Baudrate設成跟HC-06的一樣,比如說0000以及9600
  3. 參考HC-05手冊,將角色設為Master(AT+ROLE=1)
  4. 設定連接模式為指定藍牙連接地址(AT+CMODE=0)
  5. 初始化SPP profilelib(AT+INIT)
  6. 查詢藍牙設備(AT+INQ)
我的HC-05到第6步驟做完之後,閃燈就變成每隔一陣閃兩下的狀態,這時再打入AT指令就沒反應了,斷電再試也一樣,這時已經進入連線模式了。需要確定的話,可「按住」按鈕輸入AT+STATE?,這時會回應Connecting,要確認是否是跟HC-06連線,可以先看HC-06的指示燈是否是長亮狀態(長亮表示連線中),或者鍵入AT+MRAD? 看最近連線過的藍牙設備位址是否是之前抄下來的HC-06的Address。

如果沒有自動連上,再嘗試指定藍牙位址配對(AT+PAIR=1234,56,abcdef, 20)試試看。總之一旦連線成功之後,無論主從機哪邊斷電,只要兩邊都開機時就會自動連接上,這樣你的HC-06與HC-05就連線成功啦。

另外我發現有一點往往讓剛試藍牙的人搞不太清楚,就是到底藍牙模組跟Arduino是要怎麼連接,答案很簡單,就RXD連上pin1(TX),TXD連上pin0(RX)再加上5V/GND這樣即可,無需匯入程式庫,此時Arduino的Serial Console就連在藍牙上,傳送字元給藍牙,就如同在Serial Console上鍵入該字元按Enter一樣,在程式裡使用 Serial.read() 就可以接收字元。

還有就是pin0/1原本就是Arduino的序列埠,所以上傳程式前要記得把藍牙接線暫時拔開,否則它占住Serial Port就無法上傳程式了。Mega有三個硬體Serial Port還可以錯開,UNO的話,可以用SoftwareSerial程式庫(比如說SoftwareSerial BT(10, 11);  // RX, TX)在「特定」幾個腳位模擬序列埠,這樣上傳程式時就不用一直去拔藍牙連接線了。或者直接使用藍牙序列埠上傳程式。

至於兩個藍牙設備連線後可以做出什麼東西,就靠大家的想像力跟創意啦!


P.S. 關於SoftwareSerial,在有些Bard rate下工作錯誤率好像還蠻高的,至少在我的Nano板子上57600與38400都無法正常工作,但9600就OK。所以要求正確率的話,還是接Hardware Serial Port吧(也就是pin 0與1)。

沒有留言:

張貼留言