Rabbit Note

技術的な事柄をメモしていきます.

乾電池駆動に適した ESP32 の WiFi 接続サンプル

乾電池駆動に適した ESP32 の WiFi 接続サンプルを紹介します.

はじめに

ESP32 で WiFi 接続するサンプルはすでにいろいろありますが,ESP32 の特長の 1 つである,低消費電力に着目した実用的なサンプルはまだ無いようです.そこで,消費電力の小ささを活かせるコードを紹介します.

無線 LAN に定期的に接続する使用形態の場合,消費電力≒無線LAN通信時間,となりますので接続時間の最小化を行っています.

ポイント

接続時間を短くするために工夫した点は以下のとおりです.最初の 4 つは,『ESP32 の無線 LAN 通信の電力削減』で紹介した内容になります.

CPU 周波数
CPU 周波数をデフォルトの 160Mhz から 240MHz に変更.sdkconfig にて設定.
切断処理
通信が終わったら WiFi を切断し,次回接続時にスムーズにつながるようにします. wifi_stop() 関数にて処理.
IP アドレスチェック
DHCP から通知された IP アドレスがすでに使われていないかチェックする処理を省略.sdkconfig にて設定.
コンパイラオプション
リリースオプションでコンパイルするようにします.sdkconfig にて設定.
ビジーループ削除
WiFi の接続待ちをビジーループではなくセマフォで行います. wifi_connect() 関数にて処理.

また,実用性をあげるために下記の工夫も行いました.

エラー時のリセット防止
独自のエラーチェックマクロ ERROR_RETURNを定義することで,エラーチェックを行いつつもリセットしないようにします.

コード

コード全体は github に上げてあります.

プログラム本体のコードを以下に転載します.なお,コンパイルするには,無線 LAN アクセスポイントの情報を記載した wifi_config.h を作成していただく必要があります.ソースのコメントを参照願います.

実行例

プログラムを実行すると,wifi_config.h に定義したアクセスポイントに 60 秒毎に接続を行います.

実行したときの通信の様子を以下に紹介します.接続開始(Probe Request)から IP アドレスの取得完了(DHCP ACK)まで 740ms しかかかっていません.

接続時間を気にしていないコードに比べると半分以下になっているはずです.

おまけ

上に掲載したパケットキャプチャの方法を紹介します.まず,Monitor Mode に対応した無線LANアダプタが必要になります.今だと RT5370 を使った下記のものがお値打ちでオススメです.

キャプチャは Linux の tshark で行います.Windows でも Network Monitor とか Npcap + Wireshark でやれないことは事は無いと思うのですが,パケットの欠損があって無線 LAN の decrypt がなかなか正常にできなかったので,途中であきらめました.

Ubuntu の場合,下記のようにすることで,60秒間キャプチャできます.生成された wifi.cap を Windows の Wireshark で開いてフィルタをかけてやれば上に掲載したような画面が表示されます.

wlxc83a35dc7e96 は OS が名付けたデバイス名なので環境によっては適宜変更が必要かもしれません.
無線 LAN アダプタを差してから dmesg を実行すると下記のような出力があるはずなので,ここから取得します.(最終行に着目)

また,WPA2-PSKで暗号化されたパケットを復号する際に入力する Key は,Wireshark のこのページで生成できます.(処理は Javascript で記述されているので,キーが漏れる心配は無いです)

LINEで送る
Pocket

, ,

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です