ソフト

ESP32のWi-Fiと省電力設計、DeepSleepとLight SleepのAPIと消費電流の違い

ESP32のWi-Fiと省電力設計、DeepSleepとLight SleepのAPIと消費電流の違い

ESP32のWi-Fiと省電力設計、DeepSleepとLight SleepのAPIと消費電流の違い

IoTデバイスを開発する際、ESP32のような高性能なWi-Fiモジュールを搭載したマイコンは非常に便利です。しかし、バッテリー駆動で長期間動かしたい場合、Wi-Fiの電力消費は大きな課題となります。試作段階では電源につないで動作確認できても、いざ製品化してバッテリーで動かそうとすると、あっという間に電池切れになってしまうという状況は少なくありません。

ESP32には複数の省電力モードが用意されていますが、それぞれの特徴と消費電流の違いを理解し、適切に使い分けることがバッテリー駆動デバイスの実現には不可欠です。

ESP32の3つの省電力モードと消費電流の目安

ESP32の省電力モードは、Wi-Fiモジュールの状態とCPUの動作レベルによって大きく3種類に分けられます。モードによって消費電流が大きく変わり、実現できる機能やウェイクアップにかかる時間も異なります。

Modem Sleep(モデムスリープ)

Modem Sleepは、Wi-Fi接続を維持したまま、無線通信モデムの一部機能を一時的に停止させるモードです。Wi-Fiモジュールを完全にオフにするわけではないため、ネットワークへの再接続にかかる時間が短く、頻繁に通信を行うが、その間に短いアイドル時間があるような場合に適しています。CPUは動作を続けます。

消費電流の目安:数十mA程度(Wi-Fi接続状態による)

Light Sleep(ライトスリープ)

Light Sleepは、CPUの動作を停止させ、周辺回路やRAMは電源を維持するモードです。RAMの内容は保持されるため、スリープ前の状態から素早く復帰できます。ウェイクアップトリガとしては、RTC(リアルタイムクロック)タイマーやGPIO、UARTなどが利用可能です。一定時間ごとにデータを取得して送信するといった、間欠的な動作をするデバイスに向いています。

消費電流の目安:数百μA〜数mA程度

Deep Sleep(ディープスリープ)

Deep Sleepは、CPUだけでなくRAMへの電源供給も停止させ、RTC(リアルタイムクロック)と一部のGPIOのみを動作させる、最も消費電力が低いモードです。RAMの内容は失われるため、ウェイクアップ時にはプログラムの最初から実行されます。そのため、重要なデータはRTCのメモリ領域や外部の不揮発性メモリに保存しておく必要があります。ウェイクアップトリガはRTCタイマーやGPIOが主です。数分、数時間、あるいは数日に一度だけ通信を行うような、長期間バッテリーで動作させたいデバイスに最適です。

消費電流の目安:数μA〜数十μA程度

各省電力モードの活用とAPI

ESP32の省電力機能を活用するには、それぞれのモードに合わせたAPIを適切に使う必要があります。

Modem Sleepの活用

Modem Sleepは、Wi-Fi接続がアクティブなときに自動的に適用されることもありますが、明示的に制御することも可能です。Wi-Fi接続を維持しつつ、通信がない間に電力消費を抑えたい場合に有効です。

Light Sleepの活用

Light Sleepに入るには、`esp_light_sleep_start()` 関数を呼び出します。ウェイクアップトリガの設定は、スリープに入る前に行います。例えば、RTCタイマーで一定時間後にウェイクアップする場合は、`esp_sleep_enable_timer_wakeup()` を使います。GPIOからの入力でウェイクアップする場合は、`esp_sleep_enable_ext0_wakeup()` や `esp_sleep_enable_ext1_wakeup()` を使います。

例:5秒後にRTCタイマーでLight Sleepからウェイクアップ

  • `esp_sleep_enable_timer_wakeup(5 * 1000 * 1000);`
  • `esp_light_sleep_start();`

Deep Sleepの活用

Deep Sleepに入るには、`esp_deep_sleep_start()` 関数を呼び出します。Light Sleepと同様に、ウェイクアップトリガの設定はスリープに入る前に行います。Deep SleepではRAMの内容が失われるため、ウェイクアップ後の処理を考慮し、必要な初期化を再度行うようにプログラムを設計します。

例:10秒後にRTCタイマーでDeep Sleepからウェイクアップ

  • `esp_sleep_enable_timer_wakeup(10 * 1000 * 1000);`
  • `esp_deep_sleep_start();`

ウェイクアップトリガの設定と注意点

スリープモードからマイコンを復帰させるためのトリガは、デバイスの用途に合わせて慎重に選びます。

  • タイマーウェイクアップ: 一定間隔で処理を実行する場合に最も一般的です。`esp_sleep_enable_timer_wakeup(uint64_t time_in_us)` を使って、マイクロ秒単位で時間を指定します。
  • GPIOウェイクアップ: 外部ボタンの押下やセンサーの割り込みなど、特定のイベントでウェイクアップさせたい場合に有効です。`esp_sleep_enable_ext0_wakeup(gpio_num_t gpio_num, int level)` や `esp_sleep_enable_ext1_wakeup(uint64_t mask, esp_sleep_ext1_wakeup_mode_t mode)` を使用します。Ext0は単一のGPIO、Ext1は複数のGPIOのいずれかの変化でウェイクアップできます。
  • UARTウェイクアップ: UARTからのデータ受信でウェイクアップする場合に使います。

ウェイクアップにかかる時間はモードによって大きく異なります。Deep Sleepからの復帰はCPUの再起動を伴うため、Light SleepやModem Sleepよりも長い時間がかかります。この復帰時間を考慮した上で、デバイスの応答性やバッテリー寿命のバランスを取ることが重要です。

Wi-Fi接続時間の最適化

ESP32の電力消費の大部分はWi-Fiモジュールによるものです。バッテリー駆動のデバイスでは、Wi-Fi接続時間を最小限に抑えることが省電力化の鍵となります。

  • 必要な時だけWi-Fiをオンにする: データを送信する直前にWi-Fiを接続し、送信が完了したらすぐに切断するというサイクルを徹底します。Wi-Fi接続には数秒かかることがあるため、このオーバーヘッドも考慮に入れます。
  • データ送信頻度の調整: リアルタイム性が求められないデータであれば、まとめて送信したり、送信間隔を長くしたりすることで、Wi-Fiの利用頻度を減らせます。
  • 軽量な通信プロトコルの選択: MQTTのような軽量なプロトコルは、HTTPなどと比較してデータ量が少なく、接続時間を短縮できます。

これらの工夫により、Wi-Fiがアクティブな時間を短縮し、デバイス全体のバッテリー寿命を大幅に延ばすことが可能です。

製品化を視野に入れた省電力設計

試作段階で動作確認ができたとしても、製品として安定稼働させるためには、さらに踏み込んだ省電力設計が必要です。特に、消費電流の正確な測定は欠かせません。開発の初期段階から、各動作モードでの電流値を実測し、目標とするバッテリー寿命と照らし合わせながら、ハードウェアとソフトウェアの両面から最適化を進めます。

バッテリーの選定、充電回路の設計、そしてシステム全体の電力マネジメントは、組み込みソフトだけでなく、電子回路や機構設計の知識も必要とします。一つの技術領域だけでなく、全体を見通した設計が製品化には不可欠です。

サイコス・ジャパン株式会社では、機構設計、電子回路、基板設計、組み込みソフト、クラウド、そして量産まで、製品開発の全工程を一社でまとめています。各工程の担当者が同じ拠点にいるため、省電力設計のようなハードウェアとソフトウェアにまたがる課題に対しても、連携を取りながら最適な解決策を提案できます。小ロット(数百個〜)からの量産にも対応しており、試作はできたが製品化で困っている、というご相談もよく受けます。

試作品をお持ちの方は、写真と経緯のメモだけでも構いませんので、まずご相談ください。

← 技術コラム一覧に戻る
無料相談する