文章總列表

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


  1. node = Node(), set network key
    ANT+的公開鑰匙,幾乎99%的ANT+裝置都用這把鑰匙
    ANTPLUS_NETWORK_KEY = [0xB9, 0xA5, 0x21, 0xFB, 0xBD, 0x72, 0xC3, 0x45]

  2. new_channel,開啟host(電腦)和裝置的通道,這個通道是雙向的
    幾乎所有範例都是雙向,直接抄

  3. set_period(8070)
    根據上表,心跳表的週期是8070照著設定

  4. ch.set_id(54345, 120, 241) # GARMIN WATCH
    ch.set_id(49528, 120, 1) # Magene
    上述的code,連接Garmin Watch或是Magene心跳帶都可以

  5. ch.open()
    node.start()
    開始和ANT+裝置溝通

  6. 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,搭配前後筆資料計算


實作

理解封包意義後,寫一小段軟體解讀不是很難。我猜做單車碼表的公司,都會有RD專門搞定各種sensor,順便也得處理傳輸不穩時,怎麼平順的顯示數據


結語

身為通訊工程師,寫寫通訊的軟體也是別有一番滋味


留言

這個網誌中的熱門文章

STM32 UART + DMA,使用HAL實作TX/RX,以及不定長度接收

小米掃地機器人S20+ review

玩CAN bus的傢伙們 (1) CandleLight-based USB-CAN