Bluetoothモジュールはスリープ時には数µAを消費し、送信時には数十mAを消費します。この二つの数値の差こそが電池寿命を決定します。多くのチームは無線をチューニングして電力状態マシンを忘れますが、実は月単位の稼働時間は状態マシンで稼ぐか失うかです。本記事では実践的な低消費電力スケジューリングモデルを解説します。どの状態が存在し、何が復帰させ、設計が実際に消費する平均電流をどう計算するかです。

電力状態マシン

Bluetoothモジュールは2状態ではなく4状態を移動すると考えます。

状態 代表的な電流 動作しているもの
アクティブ/TX-RX 5-20 mA 無線、CPU、フラッシュ
スリープ(CPU idle) 1-3 mA CPUクロック停止、RAM保持
ディープスリープ 10-200 µA RTC、保持RAMのみ
ハイバネート 1-5 µA GPIO復帰、RTCのみ

肝は、アプリケーションが必要とする遅延を満たしつつ、できるだけ長くディープスリープやハイバネートに留まることです。1日1回報告するドアセンサーはハイバネートでよく、心拍をストリームするウェアラブルはスリープに留まる必要があります。

ウェイクソース

Bluetoothモジュールは自ら目覚めません。何かがスリープから引き出す必要があります。

  • GPIO割り込み: ボタン、PIR、リードスイッチのエッジ。最速(µs)で最安。
  • RTC/タイマー: 定期ビーコンやポーリング用。予測可能だがデューティ比が固定。
  • UART RX: ホストのバイト到着で立下りエッジが復帰。RXピンをバイアス保持必要。
  • BLEイベント: スタックがスケジュールした接続イベントや広告ウィンドウ。
  • 無線内ウェイクタイマー: リンク層が次の接続間隔で自己復帰。

電池センサーではGPIO+RTCの組み合わせが、99%の時間をスリープさせます。

デューティ比の数学

平均電流は各状態の時間重み付き和です。

I_avg = I_active * (t_active / T) + I_sleep * (1 – t_active / T)

Bluetoothモジュールが1秒ごとに5ms送信(15mA)し、残りを50µAでスリープする場合:

I_avg = 0.015 * 0.005 + 0.00005 * 0.995 ≈ 0.000125 A = 125 µA

CR2032(220mAh)なら約220/0.125≈1760時間、約73日。間隔を10秒にすると2年以上に伸びます。決定要素は無線電力ではなく間隔です。

PMICとレギュレータ選択

Bluetoothモジュールに給電するレギュレータはモジュール自身と同じくらい重要です。リニアLDOは単純で静かですが、電池から1.8Vへの降下を熱として無駄にします。バック(スイッチング)は85-95%効率で、3.6V Liセルで稼働時間を倍にできます。目安:200mV以上の降下で数mA以上ならバックを使います。

またPMIC自体の静止電流にも注意。スリープで25µAを消費するバックは、ハイバネートで5µAのBluetoothモジュールを圧倒できます。目標スリープ電流より十分低いIqのPMICを選びます。

スリープ移行のハンドシェイク

Bluetoothモジュールの電源をフラッシュ中に抜かないでください。明示的なハンドシェイクを使います。

1. ホストがスリープコマンド(例 AT+SLEEP)を送りOKを待つ。

2. モジュールは現在の処理を終えUARTをフラッシュし、「眠った」ことを示すHOST_WAKE/CTS線をアサート。

3. ホストは無線電源を切るかPMICにアイドルさせる。

復帰時、ホストは線をデアサート。モジュールは数十msでスタックを起動し、準備完了を示すHOST_WAKEを再びハイにします。

ウェイク遅延のトレードオフ

高速復帰は電力を消費します。低周波発振器を動かし続けるモジュールは2msで復帰しますがスリープ電力は高く、すべてをゲートするものは20-50msとフル再初期化を要します。キーボードは10ms未満、温度ビーコンは数秒許容。

実測する

モデルは数値の質だけのものです。DC電力解析器(マルチメータではなく)で電流トレースを取得し、曲線下面積を積算します。

Charge_per_cycle = ∫ I(t) dt (µA·s)

Average_current = Charge_per_cycle / T

これは簡略式が隠すフラッシュ書込や水晶起動、レギュレータのリングの実コストを捉えます。

設計を練ったBluetoothモジュールは、生涯のほとんどをディープスリープで過ごし、クリーンなソースで目覚め、静止電流がスリープ床の一部であるバックレギュレータを使います。それが数週間の稼働を数年に変える方法です。