2014年3月16日 星期日

Arduino : HC-05 藍芽模組的設定

去年玩過用筆電上的 Scratch 控制 Raspberry Pi GPIO + L293D + LEGO 小車子,前幾天為了玩 S4A + Arduino 無線遙控的方案,買了一片 CZ-HC-05 的藍芽模組,它和電腦或是 Android 的藍芽配對連線以後,電腦或是裝置上就會多一個 serial port 可以通訊,Scratch 或是 Android Apps 就可以透過這個無線的通道和 Arduino 傳送資料。

不過,要開始玩 S4A 之前,因為這個改過的 Scratch 內定是用 38400 的 baud rate 來和 serial port 連線,而 HC-05 預設的 baud rate 卻是 9600,因此,新買的 HC-05 藍芽模組,第一關是要能進入 AT command mode 去修改它的設定值。

如果有 USB to TTL ,可以利用它直接和 HC-05 連接,除了 Vcc , GND, Key(接5V), 兩個裝置的 RXD → TXD, TXD→RXD。

下面介紹第二種方法,以 Arduino 的第 9, 10, 11 pins 和 5V, GND 五個腳位來達到相同的目的。



硬體的部份

HC-05 和 Arduino 接線的腳位對應如下:
HC-05 VCC → Arduino 5V
HC-05 GND → Arduino GND
HC-05 TXD → Arduino pin 10
HC-05 RXD → Arduino pin 11
HC-05 KEY → Arduino pin 9

靭體的部份

Arduino 靭體的部份主要是先讓 Arduino 的 pin 9 設定為高電位,這樣 HC-05 就會進入「AT mode」,可以輸入 AT 指令來查詢或是設定 HC-05;而接收我們輸入指令及顯示 HC-05 回應訊息的工作則是交由 Arduino USB to serial 的 port 處理,它可以接收我們輸入的內容,並將它透過 pin 11 寫入 HC-05,如果由 pin 10 收到 HC-05 的回應.則輸出訊息給我們看。

以下的靭體程式是 TechBitar 網站中這篇文章中的:


/*
AUTHOR: Hazim Bitar (techbitar)
DATE: Aug 29, 2013
LICENSE: Public domain (use at your own risk)
CONTACT: techbitar at gmail dot com (techbitar.com)
*/
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(10, 11); // RX | TX
void setup()
{
  pinMode(9, OUTPUT);  // this pin will pull the HC-05 pin 34 (key pin) HIGH to switch module to AT mode
  digitalWrite(9, HIGH);
  Serial.begin(9600);
  Serial.println("Enter AT commands:");
  BTSerial.begin(38400);  // HC-05 default speed in AT command more
}
void loop()
{
  // Keep reading from HC-05 and send to Arduino Serial Monitor
  if (BTSerial.available())
    Serial.write(BTSerial.read());
  // Keep reading from Arduino Serial Monitor and send to HC-05
  if (Serial.available())
    BTSerial.write(Serial.read());
}

我們先將 Arduino 以 USB 接上電腦,打開靭體程式編寫工具,將上面的程式碼貼上、儲存後,上載到 Arduino 中。


讓 HC-05 進入 AT command mode

如果 HC-05 和 Arduino 已按照前述的腳位接好線,並且將前述的靭體上載到 Arduino 中了。就可以依照下面的程序連線並讓 HC-05 進入 AT command mode:

  • 先拔掉 Arduino 的 USB 線,也拔掉 HC-05 VCC 和 Arduino 5V 相連的這條線。
  • 將 Arduino 的 USB 線插入電腦。
  • 開啟終端機軟體(例如 Windows 的超級終端機或是 Putty ......),以

    每秒傳輸位元: 9600
    資料位元:8
    同位檢查:無
    停止位元:1

    的設定來和 Arduino 的 serial port 連線,成功的話,應該可以在終端機軟體的畫面中看到「Enter AT commands:」的訊息。
  • 將 HC-05 VCC 和 Arduino 5V 的線重新接上。
  • 供電後的 HC-05 應該是以慢速(約兩秒一次)閃爍 LED,這表示它已進入 AT command mode,等候我們輸入 AT 指令。
啟動「超級終端機」新增連線
選取 Arduino 的 serial port
傳輸速率設為 9600
成功和 Arduino 連線

HC-05 進入 AT command mode 以後,我們可以先輸入「AT」,按完 Enter 鍵後,應該可以看到畫面回應了「OK」,如果沒訊息,先檢查一下硬體的部份是否有按腳位接對了,再依前述的程序重新來一次。

如果畫面上的「OK」一直重覆的出現,停不下來(我被它給嚇壞了,以為買到了有問題的東西),只要每次按 Enter 鍵時快速的多按一下(也就是連按兩次 Enter 鍵),或是用鍵盤按「Ctrl  C」,它就不會瘋狂的回應你了。這個問題應該是 HC-05 的 AT 指令最後要送出「\r\n」,而我們按下 Enter 鍵時,終端機的預設值並沒有送出「換行」字元所致。以 Windows 的「超級終端機」來說,我們可以多設定以下的內容來避免前述的情形:


終端機中如果在「ASCII設定」中多點選「行尾傳送換行符號」就可以滿足 HC-05 AT 指令後需要加上「\r\n」的需求了。

如果用的是 Arduino 內建的終端機,就在下方多選個「Both NL & CR」,讓在在每道指令後頭都自動加上「\r\n」。




HC-05 的 AT 指令

除了「AT」這個指令外,接下來,我們先查詢一下 HC-05 目前的連線速率,在終端機中輸入底下的指令並按 Enter 鍵:

AT+UART?

如果都沒更改過,預設值的回應可能是:

+UART:9600,0,0

我們想將速率換成 S4A 的 36800 ,輸入以下的指令,並按 Enter 鍵:

AT+UART:38400,0,0

成功的話,HC-05 應該會回應「OK」。


除此之外,可能還有其它 AT command 可以執行的,基本的格式是:

  • 查詢:以問號 (?) 結尾。
  • 設定:將前述的問號換成冒號 (:) ,其後再接要設定的新內容。


例如:

  • AT+VERSION?
  • AT+NAME?
  • AT+ADDR?
  • AT+PSWD?

上面分別是查詢版本(VERSION)、藍芽裝置名稱(NAME)、藍芽裝置位址(ADDR)、配對時的密碼(PSWD)。

相對應的設定指令變成:

  • AT+NAME:xxxxx
  • AT+PSWD:xxxxx
xxxxx 為想自訂的內容。

還有其它的 AT 指令,有興趣可以找 HC-05 的手冊來研究吧!



參考文章

相關文章



25 則留言:

  1. 之前只有設定過,還不知道有加?查詢方式,謝謝你的分享
    我之前做的時候藍牙模組卡很久 ,有時會遇到問題,有時都要TX RX交換
    才解決。
    之前做的時候,有參考coopermaa大大的文章
    Arduino as an USB to TTL adapter
    http://coopermaa2nd.blogspot.tw/2012/07/arduino-as-usb-to-ttl-adapter.html
    他的方式不用裝韌體就可以用arduino設定藍牙模組,我只用uno 試過
    ,在此也與你分享!

    回覆刪除
    回覆
    1. 文宏老師您好:
      謝謝您的分享。
      利用 Arduino 來設定的方法是用 SoftSerial ,所以需先安裝靭體,而 USB to TTL 的方式則是利用硬體,其實這一篇是給沒有 USB to TTL 的人參考用的,個人是用硬體直接接,這樣較快速,插了就能用。
      TX RX 的問題的確是個關鍵,我被自己買的 USB to TTL 困惑了許久。

      刪除
  2. 請問一下雄老師:
    可不可以請你做個HC05(主)連HC05(從)的範例呢?
    我試了好久連線都不成功
    謝謝!!

    回覆刪除
    回覆
    1. 抱歉!我只有一個 HC-05,要如何做呢?
      其實, 我並不是唸電子的,更不是專家,只是玩一玩而已。倒是給您一個建議,印象中 google 一下應該有您要的答案。

      刪除
    2. 兩個 HC-05 藍牙模組透過SSCOM互連設定 HC-05
      ※ 先下載SSCOM,電腦接上USB to TTL線,如果接不好,查詢命令下不了,就重覆多接接腳幾次,然後記得COM埠要選對,還有SendNew要打勾、BUAD要設定正確。
      (1). 首先,以 AT command mode ,先設定一下兩片 HC-05,主要是讓它們扮演不同的角色:slave 和 master (出廠時,預設是 slave);除此之外, 通訊時,UART 的 baud rate 也要設為一樣。slave 和 master 出廠時,BAUD皆為9600,0,0(最好在當Master的那個Bluetooth板上做個記號,以色搞混了)。
      (2). 按下藍牙模組上的按鍵不放,後送電;此時,藍牙模組上的LED每2秒閃1次,代表進入AT command mode,可設定或查詢藍牙模組的連線參數。
      注意1:此「AT command Mode」 的BAUD為38400,0,0;全部設定完成後,要對傳資料時是「非AT command mode」的狀態,而這時就要把主、從的Default BAUD調為9600,0,0。
      注意2:HC-05 藍牙模組要加上行結尾字元\r\n,即0D、0A;而,HC-06模組的AT指令不需要加上行結尾字元。
      (3). 檢測HC-05 slave 端的連結,用AT command :at+uart? 或設定如下:AT+UART=9600,0,0
      • AT+CMODE=0
      • AT+ROLE=0
      • AT+ADDR?
      如果「AT+ADDR?」回應的內容是:
      +ADDR:14:1:61757
      要記下 +ADDR: 後面的那串數字「14:1:61757」(slave 的 address),在設定 master時會用到。
      (4). 檢測HC-05 master 端的連結,用AT command :at+uart? 或設定如下:AT+UART=9600,0,0
      在當 master 的 HC-05 必須執行的 AT command :at+uart? 或設定如下:
      • AT+UART=960,0,0
      • AT+CMODE=0
      • AT+ROLE=1
      • AT+BIND=14,1,61757
      (注意:14,1,61757 請自行置換成您查到的 slave address)
      特別注意:「AT+ADDR?」查到的 address 中是用冒號「:」當分隔符號,而在 BIND 指令中用的卻是用逗號「,」當分隔符號哦!即,AT+BIND=14,1,61757
      依上面的 AT commands 來看,slave 和 master 不同的地方在後兩道指令:
      • 「AT+ROLE=」用來設定模組的角色是 slave ( 0 ) ,還是 master ( 1 )。
      • 「AT+ADDR?」用來查詢 client 的 address。
      • 「AT+BIND=」用來指定要主動連哪一個 address 的 slave。
      (5). 當設好藍牙模組的連線參數後,設定藍牙模組為非AT command mode;先將藍牙模組斷電後,再上電即可;此時,藍牙模組上的LED每0.5秒閃1次(也就是快閃2下)。
      (6). 接著用SSCOM以9600,0,0連起來即可互傳資料了。

      刪除
  3. 雄老師你好:
    我買的hc05 比較特別 他沒有 KEY 腳位而是 EN 腳位 其他腳接腳都一樣
    我google了一下發現網路上好像都沒有類似的資料
    請問老師知道解決方法嗎?
    HC-05 VCC → Arduino 5V
    HC-05 GND → Arduino GND
    HC-05 TXD → Arduino pin 10
    HC-05 RXD → Arduino pin 11
    HC-05 EN → ?

    回覆刪除
    回覆
    1. Jacky 您好:
      您的問題如果能找到廠商給的 datasheet 才有解。幫您 google 到底下的文:
      http://www.instructables.com/id/AT-command-mode-of-HC-05-Bluetooth-module/step3/If-key-pin-is-not-present-or-not-connected/
      您參考看看。

      刪除
  4. 請問如果改過 但不記得藍芽模組目前的鮑率

    可以去哪看嗎?

    回覆刪除
    回覆
    1. 您好:
      如果您用的是 HC-05 的話,不用擔心這一點,因為進入 AT Mode 後一定是用 9600 和 HC-05 通訊,會被改掉的是藍芽的鮑率,忘了,將它重新設定。但如果是 HC-06 的話,只好一個個 baud rate 去猜囉!

      刪除
  5. 如果要從HC-05傳訊息給另一個HC-05,程式要怎麼打?(RXD:6,TXD:7,EN:9)

    回覆刪除
    回覆
    1. Jimmy 您好:
      很多人在問這個問題, 不過, 抱歉, 我只有一個 HC-05 , 完全沒有試過。

      刪除
  6. 請問超級終端機顯示Enter AT commands:之後
    然後無法在超級終端機介面輸入文字,該怎麼解決?

    回覆刪除
    回覆
    1. 請下載SSCOM,這個比超級終端機好用。

      刪除
  7. 不好意思想請教老師,為何HC-05只能接TX只能接Arduino的pin10而RX只能接Arduino的pin11,有試著把程式SoftwareSerial BTSerial;改為其他腳位,但皆無法有作用

    回覆刪除
    回覆
    1. 您好:
      Arduino SoftwareSerial 其實是有腳位限制的,您可到他們的網站中找到資料。

      刪除
  8. 不好意思我輸入"AT" 顯示出 AT 不是 OK
    不管輸入甚麼 輸出就會顯示輸入的東西
    請問這是什麼問題呢?

    回覆刪除
  9. 請問要怎麼判斷藍芽模組是否燒掉

    回覆刪除
    回覆
    1. 您好:
      我只會用最笨的方法,看 LED 燈是否亮,試試能不能進入 AT mode,看能不能和電腦通訊,看看能不能和其它藍牙裝置連線 XD

      刪除
  10. 我的HC-05可以進入AT mode,但是無法被手機和電腦的藍牙搜尋到,請問這個要怎麼解決?

    回覆刪除
    回覆
    1. 您好:
      建議您先檢查 HC-05 的 role 目前是 master 還是 slave , 如果是設定成 slave 才能被搜尋。不然, 之前同事的 HC-06 發生這種情形時, 是 HC-06 燒壞了。

      刪除
  11. 請問有辦法透過HC_05來連接電腦去跑Arduino的CODE嗎
    (Arduino版接行動電源不接電腦)?

    回覆刪除
    回覆
    1. 您好:
      HC-05 的角色是透過藍牙來接收或傳送資料, 而資料是什麼就看設計者, 您有什麼想法, 去試了便可以知道結果了。
      相關文章中有利用 S4A (電腦端) 和遠端不接電腦的 Arduino 通訊的記錄, 應該類似您提的吧! 網路上有很多別的方式, 您可以找找別人如何應用 HC-05 的實例。

      刪除
  12. 請問一下,
    我使用的是 WIN10,在管理藍芽裝置,已經有看到 HC-05已配對,
    但是 使用 AccessPort137 跟 CoolTermWin 都無法傳送指令給 Arduino
    Arduino 互動設計入門@動手做 14-1 使用軟體序列埠程式連結 Arduino 與藍芽模組
    無法試驗成功
    感恩

    回覆刪除
    回覆
    1. Johnson 您好:
      完成配對, 如果 baud rate 沒設對, 資料無法正確的解碼;建議您先確認是不有在傳資料, 如果有, 但為亂碼, 就有可能是兩邊的 baud rate 不同; 另外 tx / rx 也得確認腳位接對了。
      至於您提到的那本書, 我沒看過, 建議您寫信問作者比較快。

      刪除
  13. 試了好多種方式,終於成功!!感謝大大!!

    回覆刪除

 
© 2009. Design by Pocket