ESP32 の無線 LAN 通信の消費電力を削減する Tips を紹介します.
背景
ESP32 を乾電池で駆動することを考えた場合,まず必要なのは Deep Sleep の活用ですが,次に気になるのは CPU を動作させているときの消費電力です.CPU でほとんど処理を行わない場合,これは無線 LAN 通信にかかる時間とほぼイコールとなります.
このような状況では,無線 LAN 通信時間を削減することが,消費電力削減に直結します.
例えば,5分間に1回無線 LAN 通信を行う場合において,1回の通信あたり3秒かかる場合,平均消費電力は 150 * 3 / (60 * 5) = 1.5mA となります.(無線 LAN 通信時の消費電力を 150mA と仮置き.通信時以外は Deep Sleep に入っているとすると消費電力は数 uA のため,ほぼ無視できます)
一方,通信時間を 3秒 → 2秒に削減できた場合,平均消費電力は 150 * 2 / (60 * 5) = 1mA となります.2/3 に減っています.
すなわち,平均消費電力は無線 LAN 通信時間に比例します.
そこで,設定をいろいろ変えながら通信時間を計測した結果,時間の削減には次の 4 点が有効そうなことが見えてきました.
- CPU 周波数
- コンパイラオプション
- 切断処理
- IP アドレスチェック
それぞれの詳細を順に紹介します.
CPU 周波数
時間あたりの消費電力を押さえるには CPU の周波数を低くする方が良いですが,処理時間を考えるとこれが逆効果となります.これを確認するために,CPU 周波数を変えながら処理時間をプロットしたのが下のグラフです.
処理内容としては,無線LANアクセスポイントに接続し,数百Byte程度のデータを Web サーバに接続して Deep Sleep に入るというものです.
大半の時間が無線 LAN 接続に費やされており,しかも CPU 周波数に大きく依存しています.深くは追っていませんが,無線 LAN の認証方法で処理時間に大きな変化が見られたので,認証処理の処理負荷が大きいのが要因のようです.
一方,周波数を落としても,処理時間の伸びをカバーするほど時間あたりの消費電力は落ちません.
この結果を踏まえると,基本的には CPU を最も高速な 240MHz にしておくとトータルでの消費電力を低く抑えられると言えそうです.
切断処理
多くの ESP32 のサンプルでは無線 LAN 接続後の切断処理がありませんが,Deep Sleep を挟んで繰り返し接続する場合,切断処理を行うことで消費電力を抑えられます.
この様子を ESP32 の WiFi ログを使って説明します.まず,接続処理を行わない場合は下記のようになります.
注目したいのは,「wifi: state: auth -> init (2)
」の部分です.状態が一度 init から auth になった後,1秒後に再度 init に戻っています.すなわち,ここで1秒時間をロスしています.
1 2 3 4 5 6 7 8 9 10 |
I (537) wifi: n:6 0, o:1 0, ap:255 255, sta:6 0, prof:1 I (2207) wifi: state: init -> auth (b0) I (2217) wifi: state: auth -> auth (8a0) I (3207) wifi: state: auth -> init (2) I (3207) wifi: n:6 0, o:6 0, ap:255 255, sta:6 0, prof:1 I (3337) wifi: n:6 0, o:6 0, ap:255 255, sta:6 0, prof:1 I (3337) wifi: state: init -> auth (b0) I (3337) wifi: state: auth -> assoc (0) I (3347) wifi: state: assoc -> run (10) I (3377) wifi: connected with XXXX, channel 6 |
一方,接続後に「ESP_ERROR_CHECK(esp_wifi_disconnect());
」によって切断処理を行っている場合,次のようになります.無駄な状態遷移が無くなり,接続にかかる時間も 1秒短縮できていることがわかります.
1 2 3 4 5 |
I (557) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1 I (2237) wifi: state: init -> auth (b0) I (2237) wifi: state: auth -> assoc (0) I (2237) wifi: state: assoc -> run (10) I (2277) wifi: connected with XXXX, channel 1 |
このあたりの挙動は,接続間隔やアクセスポイント側の挙動にも依存すると思いますが,Deep Sleep で間欠動作させる場合にはこの1秒の差はとても大きいので,常に切断処理を入れておくのがオススメです.
IP アドレスチェック
ESP32 はデフォルトでは,DHCP で割り当てられた IP アドレスがすでに使われていないかチェックを行います.このチェックが完了するまで,SYSTEM_EVENT_STA_GOT_IP
イベントが発生しません.
通信処理は SYSTEM_EVENT_STA_GOT_IP イベントの発生後に行うので,前述の挙動により通信処理の開始タイミングが遅れてしまいます.
一方,DHCP サーバが適切に機能していれば,このようなチェックを省いても普通は問題は起こりません.
チェックを省くには,make menuconfig
の「Component config > LWIP > DHCP: Perform ARP check on any offered address」のチェックを外します.
環境にもよりますが,これによって通信開始までの時間が 約0.5 秒程度短縮されます.
コンパイラオプション
ESP32 はデフォルトでは,コンパイラにデバッグオプションを指定しています.これをリリースオプションに変更することで,接続までの時間を 80ms 程度短縮できます.
コンパイラのオプションを変更するには,make menuconfig
の「Compiler options > LOptimization Level」を Release に変更します.
まとめ
以上に記載した変更を織り込むことで,無線 LAN 通信にかかる時間を約2.5秒削減することができました.
コメント
[…] 点は以下のとおりです.最初の 4 つは,『ESP32 の無線 LAN 通信の電力削減』で紹介した内容になります. […]