先日、「Timer Camera」の低電力化(外部給電時)を行いました(記事は こちら)。
Timer Cameraは、内蔵バッテリー使用時は非常に低電力ですが、外部から電源供給する場合は、ディープスリープ中の消費電流値が大変大きくなってしまいます(約40mA)。
Timer Cameraに搭載されているイメージセンサ(OV3660)が、ディープスリープ中も電流消費しているのが原因です。
「OV3660」には、動作停止させるための「PWDN」ピンがあるのですが、Timer CameraではこのピンがLOW固定されているため、ハードウェア的に動作停止させることはできません。
しかし、「SCCBインタフェース」というものを使って、ソフト的にスタンバイモードに移行させることができます。
この機能を使って、ディープスリープ中の電流消費を約40mA→約17mAに低減できました。
この値は、これまで使用してきた「M5Camera」のディープスリープ中の消費電流値と同等であり、これによりTimer Cameraが非常に扱いやすくなりました。
さて、一方の「M5Camera」については、これまでなんの不満もなく使ってきたのですが、実はM5Cameraに搭載されているイメージセンサ(OV2640)にも、「SCCBインタフェース」を使ってスタンバイモードに移行させる機能があります。
せっかくなので、「M5Camera」についても「Timer Camera」と同じことを実施して、ディープスリープ中の消費電流を低減させてみたいと思います。
もしも更に低電力化できるのであれば、屋外使用時の電源供給の仕組みを、今よりも更に簡単にできるかもしれません。
まずは、従来のスケッチをつかった場合の、消費電流の推移を再確認しました。
消費電流値測定には、ストロベリー・リナックスの「INA226PRC」というモジュールとM5Stackを使います(測定方法についての記事は こちら)。
結果はこちらです。
動作中は概ね、100mA〜200mA程度で推移、ディープスリープ中は24mA程度となっています。
これに対し、「SCCBインタフェース」によるスタンバイモードへの移行処理を追加してみました。
Timer Cameraの時と同じく、ほとんど理解できないままに無理やりプログラムをつくっているので、プログラム本体は開示できませんが、処理内容としては、SCCBインターフェースを使って、アドレス「0xFF」の値を「0x01」にした上で、アドレス「0x09」の値を「0x02」から「0x12」に書き換えています。
実は、M5Cameraに対してこの処理を実施するとエラーが発生します。
情報がほとんどないので詳細は不明ですが、SCCBインターフェースを使って「OV2640」をスタンバイモードに移行させると、SCCBインターフェース自体が停止してしまい、その後の操作を受け付けなくなるというもののようです(参考にした記事は こちら)。
「Arduino core for the ESP32」のバージョン「1.0.6」「2.0.2」のいずれでも、同じ症状になりました。
いずれにしろ、スタンバイモードそのものには移行できているようであり、また一旦ディープスリープから復帰すると、元の正常な状態に戻ります。
今回のスケッチでは、「OV2640」をスタンバイモードに移行させると、その後は「OV2640」に対しては何も処理を行わずにディープスリープに移行するため、エラーが発生する状態のままでも差し支えないと判断し、そのまま使っています。
結果はこちらです。
写真撮影直後に「OV2640」をスタンバイモードに移行し、その後にWi-Fi接続を行う(「OV2640」とWi-Fiを同時に使わない)ことにより、動作中の消費電流値も低減させています。
これにより、動作中は概ね100mA〜150mA程度で推移、ディープスリープ中は13mA程度となりました。
従来に比べて消費電力を半減できており、簡易的な電源を使った場合でも、より安定して稼働できそうです。
こちら の記事では、「M5Camera」を小型ソーラーパネル2枚で常時稼働させていますが、このパネルを1枚に削減できたらいいなぁと目論んでいます。
なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。