Wi-Fi・BLEハイブリッドリモコンへのスリープモード導入
まずはお詫びから。一昨日の記事の電流測定時に校正方法を間違えており、電流値が約10%大きくなっていました。記事は修正済みです。
さて、
Wi-Fiを切っても(WiFi.disconnect(true);しても)消費電流が44mA39mAも残ってしまうことからスリープを入れることを検討する方が良さそうだと書いていました。今回使っているESP32にはスリープモードがライトとディープの2つあり、再起動のトリガーも複数用意されていて細かく設定できます。私の大雑把な理解では、ディープスリープからの再起動は電源投入に相当し(Arduinoでいうとグローバルパラメータを読み込んでsetup()からスタートする)、ライトスリープからの再起動はメモリ内容などを保持したままスリープに入った位置から動き出します。
今回の場合、スリープから再起動する時にジョイスティックの校正などを飛ばして素早く動かしたいので、ライトスリープを使ってみました。
ユースケースを考えると、スリープに落ちるときはリモコンを置きっぱなしにしているはずです。また、スリープに落ちているかどうかを意識して、特定のスイッチを押して再起動するのは煩わしい。そこで、ESP32に備わっているタッチセンサー機能を使ってみました。
ブレッドボードでタッチセンサー対応ポートにリード線を繋ぎ、プラ板に貼った銅箔テープと接合して銅箔の裏側からタッチして値を読んでみると、触らない時の値は大体40台後半で、触ると値が3〜8ぐらい小さくなることが分かりました。また、この値が銅箔テープの長さなどによって変わることも分かりました。この感じだと、あらかじめ閾値を決め打ちしない方が良さそうだと思い、スリープに入る前に10回測定して平均値を求め、それよりも2だけ小さい値を閾値にすれば安定して動作しそうだと見当を付けました。 次の写真が、ケース内壁の手前側(ジョイスティックのある側)へ銅箔テープを貼っているところです:

銅箔テープの端の方、あとでESP32のタッチセンサー対応ポート(今回はT2 = GPIO2)に接続しやすいところへリード線をはんだ付けしています。リード線の反対側にはピンヘッダーを付けるので、先にピンの絶縁用に熱収縮チューブを通してあります。
銅箔が剥き出しのままだとショートの危険があるので、上から絶縁用の紙シールを貼りました:

そしてケースに基板を収めて、あらかじめタッチセンサー対応ポートに取り付けたソケットと、リード線に付けたピンヘッダーを嵌合します:

これでハード面の改造は終了です。ソフトの方は、Wi-FiとBLEそれぞれにタイマーを設けてタイムアウトしたら切断するようにしていた(BLEは切断ができないので再起動をかけていた)ところをまとめて、ひとつのタイムアウトでスリープするようにしました。具体的には、Wi-Fiのタイムアウトを1分、BLEのタイムアウトを2分にしていたところ、2分でスリープするように設定しました。 あと、使い勝手を良くするためにFirefoxの再読み込み(F5)を、空いていたOption+Pauseに仕込みました。これらを行ったあとの回路図がこちらです:

…我ながら、ほとんど間違い探しですね。IO2にTOUCHが付いているところと、Option+PauseがF5になったことが差分です。修正したコードはGitHubに置いておきました。 今回の改造前後の電流値比較がこちらです:

前はBLEのタイムアウト後に再起動がかかって定常的なアイドリング電流が39mAあったところ、ライトスリープ導入によって4.3mAになっていて、電池の負荷は格段に少なくなりました。肝心のスリープからの再起動はとても安定しています。また、スリープから起きると直ちにBLEが繋がっているのが便利です。 今後も使い勝手が良くなるように修正していくかも知れませんが、これで開発は一通り完了です。
以上、何かの参考になれば幸いです。 パドラッパ from MacBook Air (M2)
Wi-Fiを切っても(WiFi.disconnect(true);しても)消費電流が
今回の場合、スリープから再起動する時にジョイスティックの校正などを飛ばして素早く動かしたいので、ライトスリープを使ってみました。
ユースケースを考えると、スリープに落ちるときはリモコンを置きっぱなしにしているはずです。また、スリープに落ちているかどうかを意識して、特定のスイッチを押して再起動するのは煩わしい。そこで、ESP32に備わっているタッチセンサー機能を使ってみました。
ブレッドボードでタッチセンサー対応ポートにリード線を繋ぎ、プラ板に貼った銅箔テープと接合して銅箔の裏側からタッチして値を読んでみると、触らない時の値は大体40台後半で、触ると値が3〜8ぐらい小さくなることが分かりました。また、この値が銅箔テープの長さなどによって変わることも分かりました。この感じだと、あらかじめ閾値を決め打ちしない方が良さそうだと思い、スリープに入る前に10回測定して平均値を求め、それよりも2だけ小さい値を閾値にすれば安定して動作しそうだと見当を付けました。 次の写真が、ケース内壁の手前側(ジョイスティックのある側)へ銅箔テープを貼っているところです:

銅箔テープの端の方、あとでESP32のタッチセンサー対応ポート(今回はT2 = GPIO2)に接続しやすいところへリード線をはんだ付けしています。リード線の反対側にはピンヘッダーを付けるので、先にピンの絶縁用に熱収縮チューブを通してあります。
銅箔が剥き出しのままだとショートの危険があるので、上から絶縁用の紙シールを貼りました:

そしてケースに基板を収めて、あらかじめタッチセンサー対応ポートに取り付けたソケットと、リード線に付けたピンヘッダーを嵌合します:

これでハード面の改造は終了です。ソフトの方は、Wi-FiとBLEそれぞれにタイマーを設けてタイムアウトしたら切断するようにしていた(BLEは切断ができないので再起動をかけていた)ところをまとめて、ひとつのタイムアウトでスリープするようにしました。具体的には、Wi-Fiのタイムアウトを1分、BLEのタイムアウトを2分にしていたところ、2分でスリープするように設定しました。 あと、使い勝手を良くするためにFirefoxの再読み込み(F5)を、空いていたOption+Pauseに仕込みました。これらを行ったあとの回路図がこちらです:

…我ながら、ほとんど間違い探しですね。IO2にTOUCHが付いているところと、Option+PauseがF5になったことが差分です。修正したコードはGitHubに置いておきました。 今回の改造前後の電流値比較がこちらです:

前はBLEのタイムアウト後に再起動がかかって定常的なアイドリング電流が39mAあったところ、ライトスリープ導入によって4.3mAになっていて、電池の負荷は格段に少なくなりました。肝心のスリープからの再起動はとても安定しています。また、スリープから起きると直ちにBLEが繋がっているのが便利です。 今後も使い勝手が良くなるように修正していくかも知れませんが、これで開発は一通り完了です。
以上、何かの参考になれば幸いです。 パドラッパ from MacBook Air (M2)
最近のコメント