ANT+找樂子(2),解析心跳感應器和封包
整活啦
ANT+ Device Profile,Heart Rate Monitor規格,心跳傳輸的速度約4Hz。上一篇範例程式速度怎麼搞都很慢,問Grok AI,或是Chatgpt答案都很怪,這種冷門知識還是得靠自己。這篇要講心跳表的定義,以及怎麼用openant讀出數值
心跳表的規格
- RF頻率 = 2457Mhz(下表的57代表2400Mhz + 57Mhz)
- 心跳表用哪個頻率是規定好的
- 訊息發送間隔是32768/8070=4.06Hz,大多ANT+感應器操作在4Hz附近
- Device Type是0x78,Transmission Type=1
為什麼Message Period不設定成8192(4Hz)
為了避免無線電波碰撞。ANT+讓每個裝置頻率略有不同,就算發生碰撞也是短時間,稍後還是會錯開。這個是很有智慧的設計!
直接操作Channel
不囉唆,直接上code
- node = Node(), set network key
ANT+的公開鑰匙,幾乎99%的ANT+裝置都用這把鑰匙
ANTPLUS_NETWORK_KEY = [0xB9, 0xA5, 0x21, 0xFB, 0xBD, 0x72, 0xC3, 0x45] - new_channel,開啟host(電腦)和裝置的通道,這個通道是雙向的
幾乎所有範例都是雙向,直接抄 - set_period(8070)
根據上表,心跳表的週期是8070照著設定 - ch.set_id(54345, 120, 241) # GARMIN WATCH
ch.set_id(49528, 120, 1) # Magene
上述的code,連接Garmin Watch或是Magene心跳帶都可以 - ch.open()
node.start()
開始和ANT+裝置溝通 - finally:
node.stop()
如果按CTRL+C,有機會能正確結束程式。不然在MAC經常要插拔Dongle才能恢復
解析ANT+封包
來自規格書的照片先來一張,中文資料
- byte0[bit7]叫Toggle bit,ANT+經常會重送資料以免接收端漏收,招數很土,但是有用
因為會重送,所以當封包內容改變,toggle-bit會變化;這樣接收端就能判斷是資料有變 - byte0[bit6:0]叫page,這裡是一個編號,代表後面byte1~7怎麼解析。解讀方法看規格書。以心跳帶來說,page0是最重要的讀數
- byte1~3未使用,設定成0xFF
- byte4~5,這次心跳的絕對時間,單位是1/1024s。拿鄰近兩個封包比對,就能知道兩次心跳時間差。假如心跳每分鐘200下,相當於每秒3.33次,時間間隔約300ms,對上1/1024s的單位是非常細緻的
- byte6,心跳的編號,每次心跳都會讓內部計數器(counter)累加。可以用來偵測是否有封包漏掉
- byte7,計算過的每分鐘心跳,可以直接拿來顯示;也可以拿上述byte4/5/6,搭配前後筆資料計算
留言