nRF52840による市販ANT+デバイスデータの読み込み

2022/12/23

センサ

2015年に「nRF24AP2による市販ANT+デバイスデータの読み込み」という記事を書きましたが,それから7年経ってキーとなるモジュールのBeatcraft BC-ANT-SERIAL-2が入手できなくなってしまいました.
手元にはいくつかモジュールをストックしているので当面は問題ありませんでしたが,故障したり不足したりしてから対応を考えるのでは遅いので,この機会にANT+モジュールを刷新しました.
 
比較的新しめの無線モジュールでANT+規格での通信が可能なものの中にNordic Semiconductor nRF52840がありますが,相変わらずANT+を使う話はネット上にほとんど情報がないので,nRF52840でANT+通信を行う(=サンプルプロジェクトを動かす)までの手順を簡単にまとめておきたいと思います.

まずは,ハードウエア・ソフトウエアの開発環境を整えます.

ハードウエア

nRF52840を搭載した技適取得済みモジュールを買って基板を起こすか,nRF52840が載った評価ボードを用意します.
今回は,後々基板を起こすことを考えて,小型のnRF52840モジュールRAYTAC-MDBT50Q-1MV2を搭載した評価ボードRAYTAC-MDBT50Q-DBを選定しました.
(より小型なモジュールとして,Insight SiP ISP1807が挙げられますが,検討した当時は半導体不足の煽りを受けてモジュール単体での入手が難しかったので,RAYTACのモジュールを選定したという経緯があります.)
J-Linkを接続したnRF52840開発ボード
テスト用には
  • nRF52840 1個およびANT+規格センサ 1個
または
  • nRF52840 2個
が必要ですが,手元にANT+規格のセンサがあるので,評価ボード1個のみを準備しました.
モジュールの選定にあたっては,モジュールがクロックを内蔵しているか否かを考慮に入れる必要があります.
nRF52840にはMHz帯, kHz帯両方の外部クロックが接続できますが,ANT+のサンプルプロジェクトはデフォルトではkHz帯のクロックも使う設定になっています.
nRF52840モジュールによっては両方の発振器を内蔵しているのでサンプルプロジェクトがそのまま動きますが,RAYTAC-MDBT50Q-1MV2はkHz帯の発振器を内蔵していないので,自前の基板でANT+の機能を使う場合には設定の変更が必要でした.
(sdk_cofig.hのNRF_SDH_CLOCK_LF_SRCを2に変更する)
評価ボードには32.768 kHzの水晶振動子が搭載されていたので,自前の基板を作製後にソフトウエアを移植する際に気付きましたがハードウエアの変更なしでも対応できるようです.

nRF24AP2とは異なり,nRF52840はマイコンなので,開発に当たってはデバッガが必要です.
安価なデバッガとしてSegger J-Link EDUを使いましたが,最近は在庫切れで入手できないようです.
他に安くJ-Linkを利用できるものとしては,たとえばnRF52840 DK等の評価ボードが挙げられます.

ソフトウエア

今回は統合開発環境として,Segger Embedded Studioを用いました.

また,nRF51およびnRF52シリーズ向けのソフトウエア開発環境nRF5 SDKが必要ですので,こちらもダウンロードしておきます.
ANT+のサンプルプロジェクトはこのnRF5 SDKに含まれます.

さらに,ANT+の開発の場合には,ANT+周りの中核となる機能を持つsoftdevice (s212など)をANT+の公式ページからダウンロードする必要があります.
ダウンロードにあたっては会員登録が必要ですが,登録情報のすべての項目を埋めないとsoftdeviceはダウンロードできないらしく,少しハマりました.
ダウンロードしたsoftdeviceは,nRF5 SDKの\components\softdevice\s212ディレクトリ下にヘッダファイルおよびhexファイルをコピーしておきます.

ANT+の公式ページからは,市販のデバイスとの通信で必要になる暗号化キーも入手できます.
暗号化キーはant_key_manager_config.hに定義があるので,必要に応じて書き換えます.

ここまでくればサンプルプロジェクトをビルドするだけなのですが,サンプルプロジェクトはnRF52832向けに作られています.
nRF52840とnRF52832はある程度(?)バイナリ互換があるらしく,設定を変えずともビルド・書き込みを行って正常に動作することが確認できましたが,本来はきちんと設定を変える必要があります.
(このあたりはQiitaの記事nRF52832とnRF52840のプロジェクトファイルの差分等が参考になります.)
ローダの設定
また,サンプルプロジェクトに加えてsoftdeviceを書き込んでおく必要があるので,適当なツールを使って事前に書き込むか,Loaderの設定を変更してサンプルプロジェクトと同時に書き込みます.

nRF5 SDKとSegger Embedded Studioのバージョン間の相性によっては,サンプルプロジェクトのビルドに失敗する場合があるようです.
私が開発の初期に使っていたSegger Embedded Studio 5.70aでは問題ありませんでしたが,6.40aアップデートした際に問題が起こりました.
幸いエラーメッセージで検索するだけで解消法が見つかる程度のエラーだったので,適当にコードを修正して再度ビルドが成功するようになりました.

以上の手順で,ファームウエアが用意できるので,J-Linkで評価ボードに書き込みます.
たとえば,パワーメータから送信されるデータの受信はサンプルプロジェクトant_bpwr_rxで行えます.
対になるサンプルプロジェクトant_bpwr_txはパワーメータを模擬するものなので,手元にANT+対応デバイスがない場合でもnRF52840が2個あればパワーメータとの通信のテストが行えます.
作製したnRF52840-CAN変換基板をロガーにつなぎANT+通信・TWELITEとの通信を行う様子
このテストの結果をもとに,nRF52840で送受信したデータをCANに変換する基板を起こしました.
nRF52840はBLEやIEEE802.15.4規格にも対応しているので,ファームウエアを書き換えることでたとえばAndroid端末との通信や,同じIEEE802.15.4規格を採用しているMonowireless TWELITEとの通信も可能です.

実際に,Team 'F' Nextz Plusでは,この基板を3枚搭載し,TWELITE2台とANT+規格のパワーメータGarmin Vector 3との通信を行っています.
今後はAndroid端末との通信のためにBLEも試してみたいと考えています.