2012年7月1日 星期日

Config bluetooth baud rate w/ Arduino

image_thumb3 image_thumb6
▲ HC-0x 藍芽模組 (圖左:正面圖,圖右:背面圖)

HC-0x 藍芽模組的 baud rate 預設是 9600 bps,有些時候你可能會需要改它的 baud rate,要改 baud rate,用 USB to TTL 是最簡單的,這部份可以參考這篇,不過如果手邊沒有 USB to TTL,用 Arduino 也是可以的,底下教你怎麼做。

首先,你得知道怎麼把 Arduino 跟藍芽模組連接起來,參考下圖:

image

連接的時候有兩點要注意:第一是電源千萬不可接錯,不然可能會燒錄藍芽模組,第二是 Arduino 的 RXD 要接藍芽模組的 TXD,而 Arduino 的 TXD 要接藍芽模組的 RXD。可參考下表:

Arduino 藍芽模組 備註
5V VCC 注意電源不可接錯
GND GND 注意電源不可接錯
RXD (pin 0) TXD  
TXD (pin 1) RXD  

通電之後,藍芽模組上的 LED 會一直閃爍:

image_thumb[13]

改 Baud rate 的步驟

底下示範如何把藍芽模組 baud rate 改成 57600 bps:

1) 把底下的 sketch 上傳到 Arduino 板子上(注意!在上傳程式的時候,切記不要插著藍芽模組):

2) 打開 Serial Monitor,過 6 秒鐘之後,你應該會看到 AT+BAUD7 的訊息:

 2012-05-06 18h44_12

3) 關閉 Serial Monitor

4) 拔掉 Arduino 的電源

5) 插上藍芽模組

6) 給 Arduino 上電,請在上電後 6 秒鐘之內打開 Serial Monitor,過 6 秒後應該就會看到 AT+BAUD7OK57600 的訊息,代表你已經正確把藍芽模組 baud rate 修改成 57600 bps 了,如下圖所示:

image  

由於藍芽模組 baud rate 已經改成 57600 bps,如果想改回 9600 bps,可以照底下的步驟做。

如何把 baud rate 改回 9600?

1) 把 Sketch 的 setup() 改成如下:

void setup()
{
   Serial.begin(57600);         // Baud rate of HC-0x bluetooth module
   delay(6000);
   Serial.write("AT+BAUD4");   // Set baud rate as 9600
}

2) 把 Sketch 上傳到 Arduino 板子上(注意!在上傳程式的時候,切記不要插著藍芽模組):

3) 打開 Serial Monitor,將下方的 baud rate 設定改成 57600 bps:

image

接著等 6 秒後,應該會看到 AT+BAUD4 的訊息:

2012-05-06 18h57_41

4) 關閉 Serial Monitor

5) 拔掉 Arduino 的電源

6) 插上藍芽模組

7) 給 Arduino 上電,請在上電後 6 秒鐘之內打開 Serial Monitor,過 6 秒後應該就會看到 AT+BAUD4OK9600 的訊息,代表已經正確把藍芽模組 baud rate 改回預設值 9600 bps 了,如下圖所示:

2012-05-06 19h00_02

以上的方法,希望對你有幫助。

參考資料

13 意見:

Ancle 提到...

您好:
看了一下說明,如果忘了參數相關設定,應該是以下處理是嗎?(HC-06 就是26 脚置高电平,或底板KEY 与电源短路一会)

Cooper Maa 提到...

Hi, Reset Pin 是 Pin 11,低電平有效

Pin 26 好像是跟 paring 有關的,用來清除 paring 記憶

OCK 提到...

大大你好...
在拜讀了你的這篇文章後...
跟著試了一下...
可是發現小弟我的LEONARDO的Serial.write不支援" <-雙引號的符號...
可是改成'<-單引號的符號好像又只會取最後一個字母
試了用Serial.print是可以送一整個字串了...
可是serialMonitor在上了BT後也不會回傳正確的回傳值...
只回傳了AT+BAUD7...而不是應有的OK57600

BT燈號正常...也有用Loop back test試過接收發送正常...
不知大大這有沒有其它的方式可以解答...

OCK 提到...

大大你好...
在拜讀了你的這篇文章後...
跟著試了一下...
可是發現小弟我的LEONARDO的Serial.write不支援" <-雙引號的符號...
可是改成'<-單引號的符號好像又只會取最後一個字母
試了用Serial.print是可以送一整個字串了...
可是serialMonitor在上了BT後也不會回傳正確的回傳值...
只回傳了AT+BAUD7...而不是應有的OK57600

BT燈號正常...也有用Loop back test試過接收發送正常...
不知大大這有沒有其它的方式可以解答...

Cooper Maa 提到...

看網路上的資料,Leonardo 的 Serial.write() 的行為跟 UNO 不一樣,確實只能送一個字元 (UNO 的 Serial.write() 可以送多個字元)

我這篇是用 UNO 測試的, leonardo 我沒試過
leonardo 的 serial 跟 UNO 是不一樣的,我不確定這篇的方法 leonardo 能不能用

我把程式改了一下,你把它傳到 leonardo 上,試試看能不能用:

// A simple sketch to set baud rate of HC-0x bluetooth module
// If successful configured, a response like "OK75600" will be shown on serial monitor
//
// Command: AT+BAUDx, where x can be:
// 1: 1200, 2:2400, 3:4800, 4:9600, 5:19200,
// 6:38400, 7:57600, 8:115200, 9:230400

void setup()
{
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial1.begin(9600); // Baud rate of HC-0x bluetooth module
delay(6000);
Serial1.write("AT+BAUD7"); // Set baud rate as 57600
}

void loop()
{
if (Serial1.available())
Serial.write(Serial.read());
}

OCK 提到...

感謝coopermaa大哥撥空指導...
新的程式碼在leonardo上是可以run的...只是serialMonitor會回傳亂碼(小寫y上再再加兩個小點)
然後進入無窮迴圈致arduino當機...
但拔電再用amarino抓BT是確定BT的名稱有改了...鮑率也有改了....

再次感謝coopermaa大大...

另想請教...
小弟有試用amarino確定BT連接了...但BT就是無法跟leonardo通信...所以這也是因為serial的關係嗎
(我有上官網看了一下leonardo RX/TX TTL通信用serial1...CDC用serial)
那amarino是走TTL還是USB CDC??又或跟這兩個沒關係??

小弟是新手...英文資料又太難啃...是是大哥可以介紹其他的BT TO 安卓的軟體...

Cooper Maa 提到...

amarino 是走 TTL,因為 bluetooth 是接在 pin 0 和 pin 1 上

leonardo 的 Serial 是 USB CDC, Serial1 是 RX/TX TTL 通信
要在 lenoardo 上跑的話,amarino 得改用 Serial1 才行
所以,你可能要改 MeetAndroid library,把程式裏用到 Serial 的地方全都改成 Serial1,也許還得把 CDC.h 給 include 進來

OCK 提到...

有了...感謝coopermaa大大的指點...
方法如同coopermaa大哥所說的...將MeetAndroid.cpp內所有的serial改成serial1...
另將TEST的sketch裡加入Serial1.begin(XXXX);


我的LED總算會閃了...感動到快哭了...QQ

(另小插曲...本來在改 MeetAndroid library將裡面的檔案先用複製的並貼在同資料夾...結果編譯錯誤...後來將那些帶中文的檔案移到該資料夾外就OK了...)

Cooper Maa 提到...

哇塞!恭禧你啊!
說不定你是全球第一位在 arduino leonardo 上成功執行 Amarino 的人!

OCK 提到...

大大你太誇張了...

應該有很多人可以使用...

只是沒幾個人會想像大大一樣替人解答而已...又或是小弟英文太爛漏看了...畢竟這方便的資訊太少了...

另小弟有在ROBOFUN論壇發了相同的問題...既然現在有解了...所以想在該論壇將解答引用到你這裡...如有不妥再跟小弟說一下...

Cooper Maa 提到...

是真的,不誇張
如果用 "arduino leonardo + amarino" 當關鍵字搜尋,可能現在還找不到資料咧!

BTW, 我在想 MeetAndroid 應該可以寫成兼容 Leonardo,方法是檢查 MCU 晶片有沒有 USB,像 Leonardo 有 USB 介面,就可以利用底下的方法判斷出來:

#if defined(USBCON)
Serial1.print(n); // for Leonardo
#else
Serial.print(n);
#endif

我沒試過,不過估計是辦得到的
如果你試成功,也許可以發個信給 amarino 作者,把 source code 提交上去,haha~~

Unknown 提到...

您好,請問我的藍芽模組是CSR BC-4 照你上面的做法,確認有AT+BAUD7立刻拔掉接上藍芽,在開啟Sseial monitor看,也是顯示AT+BAUD7。請問這個問題是在藍芽模組嗎?

Cooper Maa 提到...

Hi, 我後來發現用底下這個方法最簡單,建議你試試:

Arduino as an USB to TTL adapter


你買的是這個模組嗎?
http://goods.ruten.com.tw/item/show?21209019709583

我沒用過這個模組,不過看拍賣網站的介紹,它好像有附一個設定軟體,也許你可以跟賣家索取設定軟體來用應該會比較容易。

BTW, 這個模組韌體功能看起比較豐富一些