2015年6月5日金曜日

BluetoothSMARTデバイスをmbed で開発する(7)

はじめに

BLEは省電力であることが最大の特徴ではありますが、使い方によっては電池の減りが早かったり
以外なな落とし穴に陥る場合があります。
今回は消費電力を下げるためのアプローチについて掲載いたします。

関連記事
BluetoothSMARTデバイスをmbed で開発する(1)
BluetoothSMARTデバイスをmbed で開発する(2)
BluetoothSMARTデバイスをmbed で開発する(3)
BluetoothSMARTデバイスをmbed で開発する(4)
BluetoothSMARTデバイスをmbed で開発する(5)
BluetoothSMARTデバイスをmbed で開発する(6)

BluetoothSMARTデバイスをmbed で開発する(8)

ARMは、ARM Limited(またはその子会社)のEUまたはその他の国における登録商標です。mbedは、ARM Limited(またはその子会社)のEUまたはその他の国における商標です。All rights reserved.

注意事項 - 本記事に掲載されているソースコードについて

2015年の後半に次世代 mbed である mbed OS がリリースされるというアナウンスが出ています。 mbed OSでは新たに Bluetooth スタックのサポートが追加され API が大幅に変更されることが予測されます。 mbed OS上では本記事の内容が利用できなくなる可能性がありますので予めご了承ください。


mbed BLE & Android プログラミング -- 消費電力の削減


・BLEデバイスの消費電力を測る

消費電力の削減を考える前に、まずはBLEデバイスの消費電力を測れるようにします。 今回は小型安定化電源から10Ωのシャント抵抗を経由してBLEデバイスを接続し電流が測れるようにしました。



今回は次の部品を使用しました。
カーボン抵抗 10Ω5%

安定化電源モジュールはUSBから給電できるものが小型で使い勝手がよいと思います。
また電源電圧の監視のために小型の電圧計も付けています。
この構成では1mAの電流が10mVの電圧として読み取ることができます。
なお測定で扱う電圧が50mVと微弱であるため、オシロスコープは100V電源からのノイズ影響を受けにくいバッテリー動作のポータブルタイプを使うことをお奨めします。


・削減方法その1 - 送信出力を抑える

ワイヤレス機器において送信時の電波出力は消費電力に大きく関わってくるというのが定説です。nRF51822 においてもデバイスの機能として電波出力の設定があり、標準出力+0dBから何段階かのステップで電波の出力を下げることができます。

BLEデバイスが接続待ち(Advertising)を行っているときの電力消費を計測したグラフを示します。
(1目盛 50mV = 5mA)


Advertisingを行っているときは上記のような消費電流の波形が一定間隔で繰り返し出てきています。この部分の動作としては nRF51 Softdevice内部動作であるため推測ではありますが、3回の大きな山があるのは3つのAdvertising周波数スロットに対して、順番にAdvertising パケットを送信しているものと思われます。

ただし電波を高出力で送信するWiFiやWWANに比べて、もともと送信電力の小さいBLEでは送信電力が消費電力に占める割合は小さく、実用的な送信出力の範囲では期待したほどの消費電力の削減が見込めないことが判ります。

なお特殊な応用事例として電波の届く範囲が1~2メートルの局所的な通信でよい場合は、思いきって設定最小値である-40dBを使って消費電力を削減するというのもよいと思われます。

mbedでは送信出力をnRF51822/projectconfig.h で設定するようになっています。
送信出力は +4dBmまで設定可能となっていますが、+4dBmを使用するとmRF51822モジュールの技適の適合範囲を超え法律違反となりますので、この値は電波暗室以外では使用しないようにしてください。

#define CFG_BLE_TX_POWER_LEVEL 0  /**< in dBm (Valid values are -40, -20, -16, -12, -8, -4, 0, 4) */



・削減方法その2 - Advertising Interval を伸ばす

Advertising動作時の消費電力の模式図を以下に示します

前項で記載した電力消費の波形が一定間隔で出ており、黄色で塗られている面積を加算したものが実際のエネルギー消費となります。つまり一定時間内に出るAdvertisingの回数が少なくなれば黄色で塗られている面積が小さくなくなることから消費電力の削減に繋がります。
この波形の周期は Advertising Interval というパラメータで mbedファームウェア側から制御が可能です。

mbedで Advertising Interval 設定を行うコードは次の通りです、この例では1秒(1000ms) 間隔で
Advertisingパケットが送信されるようになります。

ble.init();

...
ble.setAdvertisingInterval(1600); /* 1000ms; in multiples of 0.625ms. */
ble.startAdvertising();

なおAndroidのバージョンによっては Advertising Intervalを伸ばすとGATT接続時の接続時間が延びる事象が見つかっています、省電力を突き詰めてユーザビリティを低下させてしまっては意味がありませんので、実際に使用されるAndroid端末との相性をみてパラメータを決定するようにしましょう。

・削減方法その3 - Connection Interval を伸ばす

BLE接続時の通信には通信タイミングを制御するパケットというものがあり、無通信時においても常にこのパケットの送受信は行われています。Advertisingと同様、このパケットの頻度を落すことにより単位時間ごとの積算電力を抑えることができるため、全体的な消費電力の低下が見込めます。


AndroidではConnection Internalを設定しない状態で40mSから50mS となっていますが、Connection Internalを設定することにより 7.5mSから 4000mSの範囲で変更することができます。このパラメータはAndroid側ではなく mbed側から設定許容範囲を通知することにより行うようになっています。 ※ 最小値は機種に依存します、こちらで検証した機器では8.5mS となっていました

mbedでのConnection Interval設定を行うコードは次の通りです。

static Gap::ConnectionParams_t connectionParams;

void ConnectionCallback(Gap::Handle_t handle, Gap::addr_type_t type, const Gap::address_t addr,
     Gap::addr_type_t addr_type_townAddrType, const Gap::address_t ownAddr, const Gap::ConnectionParams_t *params)
{
  DEBUG("Connected!\n\r");
  ble.getPreferredConnectionParams(&connectionParams);
  connectionParams.minConnectionInterval        = 50; /* 62.5msec */
  connectionParams.maxConnectionInterval        = 100; /* 125msec */
  if (ble.updateConnectionParams(handle, &connectionParams) != BLE_ERROR_NONE) {
    DEBUG("failed to update connection paramter\r\n");
  }
}


設定パラメータはConnection Intervalの最小許容値と最大許容値を1.25msec単位で指定するようになっています。AndroidではBLE部分の初期化時にパラメータ設定を行っても反映されません。そのため BLE接続が確立した時点でパラメータ設定を行う必要があります。

なおBLEではConnection Interval ごとに1パケット(20バイト)の通信が行われるため、このパラメータを大きくしすぎると通信の応答速度や転送パフォーマンスの低下を引き起こします。消費電力と性能の釣り合いを考えてパラメータを決定するようにしてください。

・削減方法その4 - ユーザタスクの処理は簡潔に

nRF51822 のSoftdevice (カーネル部分)は待機時に自動的にSoCクロック停止を用いて電力消費を下げてくれるのですが、ユーザタスクやコールバック関数の実行中は省電力機能が動作しません。コールバック関数を抜けてSoftdeviceに処理が戻れば省電力モードに入りますので、センサー等からの応答を待つ場合や間欠動作を行う場合は割り込みやインターバルタイマーを活用するようにしましょう。

・削減方法その5 - SoC内蔵の周辺機能は極力使わない


nRF51822を用いた mbed では、I2CやUARTなどSoCに内蔵してある周辺機能を有効にしてしまうと、その機能停止させることができず電流が流れたままになるという事象が見つかっています。

SoC内蔵の周辺機能を有効にした時と、有効にしていない時の電流値

I2CもしくはUART有効時 -- 最小電流  >1mA
I2CおよびUART未使用 -- 最小電流 <0.1mA

nRF51822の解説によるとnA単位まで下がると記載されていますが、今回用いた機材では0.1mA以下が測れないことから0.1mAとしています

mbedのBLE-APIにnRF51822の周辺機能を停止するためのAPIが実装されていないというのが問題の根源ではありますが、本ブログの公開時点ではまだ解決する見込みが立っていません。
もしどうしてもSoC内蔵の機能を利用したい場合は mbed を用いず Nordic が出している nRF51822-SDKでの実装をお奨めします。

まとめ

専用の機材が無くても、コツさえ掴めればある程度の省電力化は可能であることがお分かりいただけたかと思います。現在も mbed nRF51822の改良が続いていますので今後より消費電力を下げる方法が出るかもしれません、そのときは逐次ブログのアップデートをしていきたいと思います。

次回は2015年5月以降に追加されたmbedの新しい機能について記載を行う予定です。


140 180 Bluetooth , GAP , GATT , mbed , Nordic , nRF51822 , ツール作成

記載されている会社名、および商品名等は、各社の商標または登録商標です。

0 コメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...