[筆記] 藍牙模組 設定 iBeacon 功能

從網路上採買了含有 TI CC2541 晶片的藍牙模組 (HM-10),它整合了 iBeacon 的功能 (是不是只要 Bluetooth Low Energy 的藍牙晶片,就一定會提供有 iBeacon 的功能,差別只在於模組是否有提供設定指令)

這塊簡便的藍牙模組打算拿來實作防丟器,Ex: 放在鑰匙圈上、放在小孩身上、放在車子上 (對停車場陌生,忘了停在哪裡?)

需要準備的工具:

  1. 藍牙模組 (我用的是 HM-10,還可以選用 HM-11 體積更小)
  2. Arduino UNO Rev.3 (或是 USB to TTL)
  3. 杜邦線
  4. 焊接工具

首先把接腳 (傳送、接收、電源、接地等四個接腳)都焊上杜邦線。IMG_20160407_153711

這個過程真的很折磨人,焊接點間距非常的小,又很怕被燙到,手就一直抖。焊完之後覺得,如果真的有常常要動手做的話,倒是可以考慮買個焊接平台。

[簡中版] Bluetooth 4.0 規格及指令說明 V540 (797 downloads) [英文版] Bluetooth 4.0 規格及指令說明 V540 (229 downloads)

焊接完成後就直接再接上 Ardunio (分別是 Pin 10 – 接收, Pin 9 – 傳送, 3.3V 電源供應, GND 地線)

IMG_20160407_153431

利用 Arduino IDE 來做參數設定 (如果有 USB to TTL 的話,也可以直接使用,但因為手邊沒有 USB to TTL,只有 Arduino 所以就直接利用它來設定參數)。

要利用 Software Series Monitor 的功能來進行設定,所以得要讓 Arduino 具有轉收、轉發的功能。程式碼很簡短:

啟用 Arduino 提供的 Software Series Monitor。先設定要監控的 COM Port (如果沒有出現相對應的 COM Port,就需要安裝驅動程式;在 Arduino 的安裝目錄下,可以找到驅動程式)

HM_10_beacon_setting_Arduino_01

開啟「序列埠監控視窗」

HM_10_beacon_setting_Arduino_02

開啟後就會看到 BT is Ready 的訊息 (這個是程式裡面的設定 Serial.print(“BT is Ready”);)

直接在最上面輸入 AT (然後按下 Enter 或是 「傳送」) 指令就會送到模牙模組上;接線沒有任何錯誤的狀況下,應該會收到 OK 的回應訊息。

順便看一下這個模組的版本

AT+VERR?

回應是 HMSoft V540,表示我的韌體版本是 540;是目前最新的。

HM_10_beacon_setting_Arduino_03

開始設定 iBeacon 功能

相關的設定可以參考這篇文章

Using HM-10 BLE Modules as Low-Cost iBeacons (1058 downloads)

(一) 設回原廠初始值

如果都沒有使用過,這行可以忽略

AT+RENEW

(二) 重開藍牙模組

重開後,才會將最新的設定結果啟用

AT+RESET

(三) 啟用 iBeacon 功能

AT+IBEA1

(四) 設定 UUID

HM-10 預設的 UUID 是 74278BDAB64445208F0C720EAF059935,設定的指令分成 4 個部份 (UUID 則是可以讓使用者自行定義):

AT+IBE074278BDA

AT+IBE1B6444520

AT+IBE28F0C720E

AT+IBE3AF059935

(五) 設定 Major

AT+MARJ0x4134

(六) 設定 Minor

AT+MINO0x4134

(七) 設定 iBeacon 廣播訊息的間隔時間

間隔時間是固定的,廠商依照 Apple 制定的規格,再加上一些額外可以挑選的規格。我們就依照需求設定間隔時間。

0 – 100ms,       1 – 152.5 ms,   2 – 211.25 ms, 3 – 318.75 ms
4 – 417.5 ms,   5 – 546.25 ms, 6 – 760 ms , 7 – 852.5 ms
8 – 1022.5 ms,  9 – 1285 ms,   A – 2000ms , B – 3000ms
C – 4000ms,     D – 5000ms,    E – 6000ms , F – 7000ms

AT+ADVI0

間隔時間越短,也越耗費電力;但訊號會接收的比較即時。我在猜想許多網路上使用防丟器產品沒有覺得很棒,可能跟間隔時間有些關係。但要取得平衡真的不太容易。

(八) 設定它的名稱

AT+NAMEhomekeys

(九) 部署模式

設定成 broadcast-only 可以節省電力

AT+DELO2

(十) 設定廣播模式

設定成 Advertising-Only 可以節省電力

AT+ADTY3

(十一) 設定自動睡眠

自動睡眠可以節省更多電力,但是如果要持續監控的狀態下就不適用。

0 – 自動睡眠, 1 – 永續開啟

AT+PWRM0

(十二) 重開藍牙模組

重開後,才會將最新的設定結果啟用

AT+RESET

測試 iBeacon 囉 ~

手邊只有 Android 手機,版本是 4.4,到 play 商店裡面找 Locate Beacon 並且安裝。

HM_10_beacon_setting_Android_02

使用前記得先把藍牙功能打開。

HM_10_beacon_setting_Android_01

畫面很簡單,直接下 Locate Beacons

HM_10_beacon_setting_Android_03

App 開始掃描附近的 Beacon

HM_10_beacon_setting_Android_04

抓到了 ~ distance 的地方就是表示預估設備間的距離

HM_10_beacon_setting_Android_05 HM_10_beacon_setting_Android_06 HM_10_beacon_setting_Android_07

接下來還有好多工作需要完成:

  • Android App 開發
  • 電池模組 (3V 鈕扣電池, 電池座)
  • 外殼 (LEGO ?)
  • 參數設定測試
    • TxPower
    • Power Save Setting …

 

20 comments

  • ggwww

    請問有辦法把APP收到的距離傳給ADUINO嗎
    感謝

  • fiveshit

    您好:
    有辦法一個arduino 廣播 多個 arduino 接收嗎?

    • Nick Mason

      你的問題太過簡短,我不太確定你真正的用塗是想要什麼?

      以 Beacon 的模式來說,它就是一種 Broadcast (廣播) 的方式,許多的 Bluetooth 設定說我在這裡,有什麼資訊我送出;有需要資訊的終端設備再自行取用。

      但如果是想要用 Bluetooth 做到 1 控制 N 的方式,而且還是「同時」,在 Arduino 上是無法做到,因為 Arduino 還沒有 Multithreading 的功能。

  • Mark

    請問Arduino+BLE4.0並上傳程式碼後可以看到”BT is Ready”的字樣,但接下來無論下什麼指令(AT or AT+VERR?),監控視窗(沒有行結尾+9600 baud)都無任何回饋的字樣,請問有可能是哪裡出了問題呢?

  • Paul

    我也是沒有反應
    但我把腳位交換一樣沒反應
    無解

    • Nick Mason

      1. 藍芽模組是好的?
      2. 電源 3.3V 的連接是正確的?
      3. Tx, Rx 腳位連接是正確的?

      先檢查看看硬體的部份 ~ ~

  • simon

    想請問一下,有辦法讓hm-10去測試ibeacon是否有遠離偵測範圍,並使用/啟動蜂鳴器發出警示的方法呢?

    • Nick Mason

      這個部份我沒有實作過,不過理論上是可行的。

      可以先參考這篇文章:Understanding ibeacon distancing
      先是利用 RSSI 計算公式算出物體的可能距離,裡面有個很重要的影響因子,就是訊號干擾 (電子產品、牆、柱…) 問題,它會造成距離的誤判。

      你要實作的概念跟防丟失保護器很像,現在坊間已經有很多產品,但實用還是有待考量,並沒有推廣影片中那麼吸引人。

  • josong

    嗯嗯 確實 9 , 10 腳位反了, 換過來 at 通訊ok, 感謝版主 寫這篇文章

  • YC

    您好 請問我有2個BLE模組可以一個廣播,一個接收封包嗎?
    因為很多文章都是用手機接收APP顯示,不知道模組的封包接收如何實作?

  • victor

    不好意思 可以請教一下
    能在不連結的狀態下 讓ARDUNIO+hm10當主端掃描多個IBEACON
    並且顯示RSSI值到 監控視窗

    查詢很多文章 都無法使用ardunio 當主端 監控每個RSSI值
    所有樓層您貼的文章都已詳細閱讀
    還請你不令指教

    • Nick Mason

      不知道你有沒有這樣子測試過 ~

      Server Side:
      Arduino + HM10 將 HM10 以正常的藍芽設備使用,使用它的掃描功能,抓取附近有哪些的藍芽設備。這個方式就跟手機或是其它藍芽設備差不多,連線前會先做掃描。而 Arduino 就必須使用 Array 來記錄掃到的資料。

      iBeacon Side:
      Arduino + HM10 將 HM10 設定為 iBeacon 模式,不停發送資訊。

  • VICTOR

    感謝您的回覆 我在測試看看
    另外我想問

    有辦法可以直接用CODE命令AT指令 並回傳到監控視窗嗎?

    目前看到都是燒錄完 開啟監控視窗 手動輸入AT指令
    而不是在ARDUiNO裡設定

    謝謝

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *