M5Stamp Picoでできること 〜ディープサイクルバッテリーの電圧を測定する

スポンサーリンク
M5Stamp Pico

近くの里山地域に畑を借り、そこで野菜を育てながら、屋外でのIoT実証実験を行っています。

畑にはコンセントがないため、いくつかのソーラーパネルやディープサイクルバッテリーを設置し、それらを主な電源として使っています。

これらの装置のいくつかは、設置してから何年も経っており、バッテリーの性能もかなり落ちてきているはずです。
これらを電源として使用しているデバイスの調子が悪くなったり、停止してしまったりすることも頻繁にあったのですが、デバイス自身の問題か、電源の問題なのかの切り分けも難しく、原因がわからないまま別のバッテリーに交換して対処したりしていました。
そんな訳で一度、古くなったバッテリーの状態をきちんと調べてみることにしました。

バッテリーはチャージコントローラを介して、ソーラーパネルと負荷(IoTデバイス)につながっています。
ソーラーパネルの発電電力が負荷の消費電力よりも十分大きければ基本的には問題ないはずですが、夜間や悪天候時など、ソーラーパネルが発電できないときのために一時的に電気を貯めておくのがバッテリーの役目です。そのため、バッテリーは夜間などでもある程度の電圧を維持している必要があります。しかし、経年劣化によりバッテリーの性能が落ちてくると、十分に電気を貯めることができなくなり電圧も低下します。
今回は、新たにIoTデバイスを準備し、ディープサイクルバッテリーの電圧を一定時間間隔で測定することにしました。

今回調査するディープサイクルバッテリーは以下です。

(1) カウスメディア 20Ahディープサイクルバッテリー

2020年9月に設置し、50WソーラーパネルにつないでモバイルWi-FiルータとIoTデバイスに電源供給してきました。
性能が落ちてきたため2023年3月に撤去(稼働期間は2年6ヶ月)し、その後は4ヶ月にわたりカウスメディアの「クリスタルパルサー」というバッテリー延命装置に取り付けて復活を試みました。
2023年7月に10Wソーラーパネルに再接続し、その後も時々はIoTデバイスを取り付けたりしていますが、基本的には無負荷(負荷はチャージコントローラのみ)で放置しています(無負荷での稼働期間は1年11ヶ月)。


(2) LONG 20Ahディープサイクルバッテリー(WP20-12IE)

秋月電子で購入したものです。
2023年3月に(1)の代替として設置し、50WソーラーパネルにつないでモバイルWi-FiルータとIoTデバイスに電源供給してきました。
2024年2月(設置の11ヶ月後)に劣化を少しでも遅らせるべく「クリスタルパルサー」を取り付け、その後も運用を継続しました。
2025年4月にモバイルWi-Fiルータが停止してしまったため、ルータは取り外して別のバッテリーで動かすことにしました(稼働期間は2年1ヶ月)。以降は消費電力の小さいIoTデバイス(平均消費電力=0.3W程度)のみが接続されている状態で運用を継続しています(低負荷での稼働期間は2ヶ月)。

(3) LONG 7.2Ahディープサイクルバッテリー(WP7.2-12)

こちらも秋月電子で購入したものです。
2021年8月に設置し、10WのソーラーパネルにつないでモバイルWi-Fiルータや「ESP32 Wi-Fi中継機」など、さまざまなデバイスに電源供給してきました。
2023年7月にデバイスが停止(稼働期間は1年11ヶ月)し、以降は接続や負荷を変更しながら細々と利用を続けてきましたが、2024年1月に完全に利用を停止しました(稼働期間は2年5ヶ月)。
その後は基本的に無負荷(負荷はチャージコントローラのみ)で放置しています(無負荷での稼働期間は1年5ヶ月)。

バッテリー電圧を測定するためのIoTデバイスとして「M5Stamp Pico」を使います。



ディープサイクルバッテリーの電圧は12V程度ですので、これを抵抗分圧で3V以下になるようにし、その電圧値をM5Stamp Picoのアナログ入力端子で測定することにします。
接続を簡単にするために、M5Stamp PicoのGROVE端子を活用します。また、測定は長くても数週間で済ませる予定のため、M5Stamp Pico自体は単三型のNi-MH電池4本で動かすことにします。

具体的な接続は以下のようになります。

100kΩと22kΩの抵抗を使って分圧することにします。
バッテリー電圧が12Vのとき、M5Stamp Picoに入力されるアナログ電圧は「12V * 22kΩ / 122kΩ = 2.16V」、バッテリー電圧が14Vのときでも「14V * 22kΩ / 122kΩ = 2.52V」となり、M5Stamp Picoで測定できる電圧範囲に収まります。

工作したものはこのような感じです。

3台つくりました。作業を簡単に済ませるためにブレッドボードを使って接続し、コードなどが簡単に抜けないようマスキングテープで固定しています。ディープサイクルバッテリーに取り付けるための端子にはワニ口クリップを使っています。

M5Stamp Pico用スケッチは以下のとおりです。

#include <WiFi.h>
WiFiClient client;

#define LED_PIN   27 // 内蔵LEDのピン
#define Ext_PIN_2 33 // GROVEポート-4番目のピン

const char* ssid     = "XXXXXXXX";
const char* password = "XXXXXXXX";
unsigned long interval = 600;

void sleepStamp() {
  Serial.println("### DEEP SLEEP START");
  WiFi.disconnect(true);
  neopixelWrite(LED_PIN, 0, 0, 0);
  esp_sleep_enable_timer_wakeup(interval*1000*1000);
  esp_deep_sleep_start();
}

boolean connect_wifi() {
  Serial.println("### CONNECTING TO WIFI");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.print("### WIFI CONNECTED TO ");
  Serial.println(WiFi.SSID());
  return true;
}

void disconnect_wifi() {
  WiFi.disconnect(true);
  Serial.println("### WIFI DISCONNECTED");
}

void setup() {
  // 初期設定
  Serial.begin(115200);
  neopixelWrite(LED_PIN, 0, 255, 0);

  // データ取得
  pinMode(Ext_PIN_2, INPUT);
  float val0 = (float)analogReadMilliVolts(Ext_PIN_2)*0.00555; // 電圧を取得(デバイスでは上100kΩ, 下22kΩのRで分圧しているので補正する)
  Serial.printf("Voltage: %.2f\n", val0);

  // Wi-Fi接続、データ送信、Wi-Fi切断
  if(!connect_wifi()) sleepStamp();
  if(!sendRequest(val0, 0.0, 0.0)) sleepStamp();
  disconnect_wifi();

  // スリープ移行
  sleepStamp();
}

void loop() {
  sleepStamp();
  delay(1000);
}

boolean sendRequest(float val0, float val1, float val2) {
  (省略)
}

機能はごく簡単なもので、起動したらLEDを点灯し、GPIO端子「Ext_PIN_2(33番ピン)」のアナログ電圧値を測定して「122 / 22 * 0.001」倍に補正、その後はWi-Fi接続、データ送信、Wi-Fi切断を行い、LEDを消灯して10分間のディープスリープに移行するというものです。
なお、データ送信の部分(sendRequest関数)は、受信側によって内容が変わってくるので省略しています。

このスケッチをM5Stamp Picoに書き込み完成です。

できあがったIoTデバイスを畑に持っていき、ディープサイクルバッテリーに取り付けました。以下の写真は、上から順に(1)、(2)、(3)のバッテリーに取り付けたときのものです。

1週間にわたりデータを測定しました。
各バッテリーの電圧測定結果は以下のとおりです。

いずれのバッテリーについても、朝6時頃からソーラーパネルによる充電が始まり、昼頃には満充電になっています。それ以降はフロート充電で一定の電圧値を維持しています。
18時頃になるとソーラーパネルからの充電ができなくなり、一気に電圧が低下します。この時の電圧は、バッテリーが劣化しているほど低くなっており、(3)のバッテリーでは13V以下になってしまっています。

また、(1)、(3)のバッテリーはほぼ無負荷(負荷はチャージコントローラの0.1W程度のみ)、(2)のバッテリーも低消費電力のIoTデバイスを駆動しているだけ(負荷はIoTデバイスの0.3W程度+チャージコントローラの0.1W程度)にも関わらず、いずれのバッテリーについても夜間は電圧が少しずつ低下しています。
もしもこれらのバッテリーで比較的消費電力の大きい負荷を駆動させると、この電圧低下が急激になり、電圧がチャージコントローラの遮断電圧以下になると、負荷への電源供給が停止されてしまう(つまり負荷のIoTデバイスが停止する)と想定されます。

ChatGPTによると、ディープサイクルバッテリーが劣化すると「充電直後の電圧は正常でも、すぐに低下する」「大電流を流すと、急激に電圧が低下する」というような症状が現れるとのことですが、実際に測定した結果からも、そのような状況が確認できました。

 

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


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