Timer Cameraで「brownout detector」を無効化する

私は複数台のTimer Cameraを畑に設置し、作物の生育状況を遠隔地から継続的に観測しています。

具体的には、Timer Cameraで以下の繰り返し処理を行っています。

「スタンバイ状態から復帰」→「静止画を撮影」→「モバイルWi-Fiルータに接続」→「Webサーバに画像データを送信」→「10分間のスタンバイ状態に移行」

さて、Timer Cameraで上記の処理を行うと、デバイスによっては動作が不安定なものがあり、途中で画像データを送信できなくなることがあります。
スタンバイ状態から復帰した際に何らかの原因でフリーズしてしまい、そのため次のスタンバイ状態への移行ができず、その結果すぐに電池が空になり停止してしまうという現象のようです。
フリーズする頻度はデバイスによる個体差が大きいため、しばしばフリーズしてしまうデバイスは「動作不安定品」として保管し、安定して動作するデバイスだけを選んで使用しています。

ところで、久しぶりにM5Stack社のホームページでTimer Cameraのドキュメント(こちら)を見ていたところ、以前は記載されていなかった「Brown out protection」という項が追加されていることに気づきました。
電圧が低い時に、Timer Cameraが「Brown out protection」を発動してリセットをかけてしまう可能性があるが、その機能を無効化するよう設定することができるという内容です。
上述のデバイスがフリーズする現象は、この「Brown out protection」が原因なのではないか?という気がしてきました。そうであれば、ここに書かれている方法でこの機能を無効化すれば、より安定して動くはずです。

早速試してみました。
上記の処理を行うスケッチ(スタンバイ時間は10分→1分に変更)に対し、「Brown out protection」機能を無効化するための以下の記述を追加します。

        :
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"
        :
void setup() {
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
        :
}
        :

「動作不安定品」として保管していたデバイス(8台もありました!)を引っ張り出してきて、このスケッチを書き込み、安定して動作するかどうか確認しました。
具体的には、画像データを送信すると同時に「bat_get_voltage()」コマンドでバッテリーの電圧を観測し、画像データを送信できなくなった直前の電圧が十分高ければ「途中でフリーズした」、直前の電圧が3V前半ぐらいまで落ちていれば「最後まで安定稼働した」と判断することにします。

8台のデバイスに対して、それぞれ2回ずつ動作確認を行いました。
その結果、8台のうち5台については、2回とも途中でフリーズしました。一方、残りの3台については、2回とも最後まで安定稼働しました。

実は「動作不安定品」にも、画像データを数枚送信しただけですぐにフリーズしてしまうものから、画像データを何百枚も送信してからフリーズするものまで程度の違いがあります。
今回、途中でフリーズしてしまった5台はいずれも、動作不安定な中でも程度の悪いものでした。それに対して、最後まで安定稼働した3台は、動作不安定な中でもその程度は比較的軽いものでした。

結局、「Brown out protection」機能を無効化しても、これまでの動作不安定な状況が一掃されることはありませんでした。
ただ、確実に一定程度の効果はあり、またこの処理を追加してもデバイスの動作への悪影響などは特にないようなので、今後、Timer Camera用のスケッチには上記の処理を追加することにしようと思います。


なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。


このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。

他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。