組み込み用デバイス(Nordic)(★★★)

Bluetooth Low Energyの実際のデバイスについて説明します。
弊社ではさまざまな半導体ベンダーのハードウェア、ソフトウェアを開発していますが、その中でも最も情報があり、安価で、品質が良いベンダーとしてNordicをお勧めしています(それでもバグがかなり多いですが、、、)。
また、ソフトウェアに関しては、Nordicで開発していれば、他のベンダーも基本的には構造が同じなので、移植も簡単です。


ハードウェア

半導体として、nRF51822という第一世代のデバイスと、nRF52832という第二世代のデバイスがあります。どちらともシングルチップで、RF、ベースバンド、プロトコル処理用のMCUが入っています。コスト的にはほぼ同じになっていますので、以下では、性能が良いnRF52832を対象に記載していきます。

Nordicのハードウェアの特徴は、下記になります。

  • ARM Cortex-M4の64MHz、 512kB Flash ROM内蔵、64kB RAM内蔵です。ROM/RAMが多いため、通常の利用であれば、外付けメモリは必要ありません。ARMのCPUはユーザーに解放されているため、自由にユーザーのプログラムを書き込めます。
  • さまざまなペリフェラル機能(SPI, I2C, UART, ADC, GPIO, NFCなど)を備えています。そのため、外部のセンサー等と簡単に接続ができます。
  • 外付け部品がコンデンサと32MHzクリスタルとアンテナのみ(アンテナマッチング用の回路は必要)と少ないです。そのため、全体の部品コストを低く抑えられます。通常は、電波法の認可費用も抑えるため、認可済みの無線モジュールを利用するので、さらに外付け部品は少なくなります。
  • スリープ用の32kHzオシレータをデバイス内に持っています。Bluetoothや他の処理をしてないときは、CPUの64MHzのクロックを停止させ、この32kHzのタイマだけを動かし、低消費電力にできます。さらに超低消費電力にしたい場合は外付けの32kHzのクリスタルも付けられます。
  • 待機時の電流は、約1.5uAと低いです。なお、通信時の電流は、約30mAです。
  • SPI, I2C, UART等の外部インタフェイス用ペリフェラル機能に対して、外部ピンを自由に割り当てられます。そのため、配線の制限が多い二層基板なども使え、プリント基板のコストを下げられます。

ソフトウェア

Nordicのソフトウェアは、下記のように、基本的には初期設定と、イベントハンドラの登録をして、イベントを待つという形になります。

  1. Bluetoothプロトコルスタックの初期設定(ex.softdevice_enable())
  2. Bluetoothのイベントハンドラの登録(ex.softdevice_ble_evt_handler_set())
  3. while()ループでスリープしつつ待機。Bluetoothイベント(接続、切断、読み書き)が発生したら、イベント種別に応じて処理。

全体のソフトウェアの構造

ソフトウェアの構造は下記のようになっています。一般的なARM Cortex-M系のソフトウェアになっています。リアルタイムOSは利用していませんので、割り込みベースのプログラムを書いていくことになります。状態変数などを使って制御したい場合は、共有変数などでMainコンテキストに通知して、そこで処理をするようにします。

コンテキスト 説明
Main RESETベクタから動作しているmain()関数のコンテキスト。プロトコルスタックの設定をした後、while()ループでスリープしつつ待機する。
プロトコルスタック プロトコルスタックが動作するSVC割り込みコンテキスト。ユーザーには公開していないので、中身は不明。
各種ペリフェラル割り込み SPI, I2C, UART等のペリフェラルの割り込みコンテキスト。

なお、Mainのコンテキストと、プロトコルスタックのコンテキストは、スタックポインタを別に用意していますので、お互いに影響が出ることはありません。

Bluetoothのシーケンス

下図は、Bluetoothの無線区間のパケットと、プロトコルスタックのAPIをシーケンス図にしたものです。
基本的に、無線区間でのパケットと1対1に対応していますので、直感的にわかりやすいと思います。
他社のプロトコルスタックもほとんどNordicと同様のAPIとなっています。

ソフトウェアの開発プラットフォーム

弊社では、gccとNordicのSDKを利用したC言語による開発をお勧めしてます。ArduinoやMBEDなど簡単にソフトウェアを作れるプラットフォームもありますが、現時点では、そこで使われているソフトウェアの品質が非常に悪いため、あまりお勧めしません。それらのプラットフォームは、ハードウェアを意識しないでプログラミングできることが利点でありますが、ハードウェアの細かい設定を行いたい場合にはそれがデメリットになります。特に、クロックを止めたり、割り込みを制御したりするような、低消費電力の製品に対しては、そのようなプラットフォームを使うことはデメリットしかありません。さらに、デバッガでスタックポインタやリンクレジスタなどを見なければならない不具合に遭遇した時に、対処できないことになります。