「FAL.CO」のソーラーモバイルバッテリー「SoNAe」でIoTデバイスを動かす

先日、「FAL.CO」というブランドが販売しているソーラーモバイルバッテリー「SoNAe」の「AUTO POWER OFF」機能について調査しました(記事は こちら)。

ソーラーパネルがついている「SoNAe」から電源供給することで、ESP32などをつかったIoTデバイスをソーラー発電で常時稼働できないか?と考えたのが調査の目的です。

「SoNAe」についているふたつのUSB Type-A端子について調査した結果、

  • 両方の端子とも「AUTO POWER OFF」機能はついており、電流消費の小さい期間が45秒ほどつづくと「SoNAe」が停止してしまう。
  • 右側の端子は「AUTO POWER OFF」するための消費電流しきい値が比較的大きく(100〜150mA程度)、IoTデバイスが稼働している状態でも停止してしまう。
  • 左側の端子は「AUTO POWER OFF」するための消費電流しきい値が比較的小さく(数十mA程度)、IoTデバイスが稼働していれば停止しない。

ということが分かりました。
左側のUSB端子を使い、IoTデバイス用のプログラムを工夫すれば、「SoNAe」でIoTデバイスを常時稼働できる可能性があるということになります。

この結果を踏まえて、実際に「SoNAe」にIoTデバイスをつないで、長期間稼働させることができるか確認してみたいと思います。

IoTデバイスの仕様は以下のとおりとします。

  • IoTデバイスに光センサ(Cdsセル)をつなぎ、一定時間毎に明るさ情報を取得してWebサーバに送信する。
  • IoTデバイスには、ディープスリープ中の消費電流が小さい「M5Stamp Pico」をつかう。
  • ディープスリープを活用することで、IoTデバイスの平均消費電流値を極力小さくする。



ハードウェアの組み立て

Cdsセルと10kΩの抵抗をつないだ光センサを「M5Stamp Pico」につなぎます。
光センサの出力は、「M5Stamp Pico」の「36」ピンにつなぎます。また、光センサへの電源は「M5Stamp Pico」の「26」ピンより供給することで、ディープスリープ中は光センサも電流消費しないようにします。

「M5Stamp Pico」にはUSB端子がないので、「M5Stamp Pico」の「5V」「GND」ピンにUSBコネクタをつなぎ、「SoNAe」からUSB経由で電源供給できるようにしておきます。

実験1

「M5Stamp Pico」に以下のスケッチを書き込みます。

#include <WiFi.h>

#define VOUT_PIN 26
#define ANA_PIN 36

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

void setup() {
  Serial.begin(115200);
  pinMode(VOUT_PIN, OUTPUT);
  digitalWrite(VOUT_PIN, HIGH);

  Serial.printf("Connecting to %s\n", ssid);
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.printf("\nWiFi connected\n");

  pinMode(ANA_PIN, INPUT);
  uint16_t val = analogRead(ANA_PIN);
  Serial.println(val);
  sendRequest(val);

  WiFi.disconnect(true);
  Serial.printf("WiFi disconnected\n");

  esp_sleep_enable_timer_wakeup(interval*1000*1000);
  esp_deep_sleep_start();
}

void loop() {
}

boolean sendRequest(float val) {
  // 省略
}

起動したら「26」ピンをHighにすることで、「M5Stamp Pico」が起動している間だけ、光センサに電源供給します。
Wi-Fi接続した後、「36」ピンのアナログ値を取得し、Webサーバに送信します。
一連の処理が終了したら、Wi-Fiを切断し、ディープスリープに移行します。
電流消費の小さい期間が45秒つづくと「SoNAe」が停止してしまうため、ディープスリープ期間は30秒とします。

「M5Stamp Pico」と「SoNAe」をつないだところ、「SoNAe」は停止せず、数十分にわたり「M5Stamp Pico」を稼働させつづけることができました。

実験2

スケッチを以下のように変更しました。

#include <WiFi.h>

#define VOUT_PIN 26
#define ANA_PIN 36

unsigned long interval       = 30;
unsigned long count          = 2;
const char*   ssid           = "XXXXXXXX";
const char*   password       = "XXXXXXXX";

RTC_DATA_ATTR unsigned long exec_num;

void setup() {
  Serial.begin(115200);
  pinMode(VOUT_PIN, OUTPUT);
  digitalWrite(VOUT_PIN, HIGH);

  if(exec_num % count == 0) {
    Serial.printf("Connecting to %s\n", ssid);
    WiFi.begin(ssid, password);
    while(WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.printf("\nWiFi connected\n");

    pinMode(ANA_PIN, INPUT);
    uint16_t val = analogRead(ANA_PIN);
    Serial.println(val);
    sendRequest(val);

    WiFi.disconnect(true);
    Serial.printf("WiFi disconnected\n");
  }
  exec_num++;

  esp_sleep_enable_timer_wakeup(interval*1000*1000);
  esp_deep_sleep_start();
}

void loop() {
}

boolean sendRequest(float val) {
  // 省略
}

30秒毎にデータをWebサーバに送信するのでは、データ送信が頻繁すぎるため、送信間隔を粗くしています。

「exec_num」という変数を定義し、「M5Stamp Pico」を起動するたびにカウントアップします。
ディープスリープ中も「exec_num」変数の値を保持するために「RTC_DATA_ATTR」を使います。

「exec_num」変数の値を確認し、1回おきにデータをWebサーバに送信します。
データを送信しない時には速やかにディープスリープに移行します。

このスケッチで動作確認したところ、データは1回しか送信できずに「SoNAe」は停止してしまいました。
ディープスリープに移行する前にディレイを1秒挿入しても、状況は変わりません。
「M5Stamp Pico」を起動しただけ程度の電流消費では、「AUTO POWER OFF」の消費電流しきい値に届かないようです。

また、電流消費の大きいWi-Fi接続処理を一瞬(0.1秒)だけ実行し、すぐに中断してディープスリープに移行するようにスケッチを変更してもダメでした。
電流消費の大きい期間をそれなりに長くしないと、「AUTO POWER OFF」を解除することはできないようです。

実験3

前述の実験より、結局「30秒おきに電流消費の大きい期間がそれなりに長く続かなければならない」という結果になりましたので、スケッチを以下のように変更しました。

#include <WiFi.h>

#define VOUT_PIN 26
#define ANA_PIN 36

unsigned long interval       = 30;
unsigned long count          = 2;
const char*   ssid           = "XXXXXXXX";
const char*   password       = "XXXXXXXX";

RTC_DATA_ATTR unsigned long exec_num;

void setup() {
  Serial.begin(115200);
  pinMode(VOUT_PIN, OUTPUT);
  digitalWrite(VOUT_PIN, HIGH);

  Serial.printf("Connecting to %s\n", ssid);
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.printf("\nWiFi connected\n");

  if(exec_num % count == 0) {
    pinMode(ANA_PIN, INPUT);
    uint16_t val = analogRead(ANA_PIN);
    Serial.println(val);
    sendRequest(val);
  }
  exec_num++;

  WiFi.disconnect(true);
  Serial.printf("WiFi disconnected\n");

  esp_sleep_enable_timer_wakeup(interval*1000*1000);
  esp_deep_sleep_start();
}

void loop() {
}

boolean sendRequest(float val) {
  // 省略
}

「M5Stamp Pico」は30秒おきに起動し、毎回Wi-Fi接続までは実施します。
ただし、データ送信だけは1回おきに実施します。

このスケッチで動作確認したところ、「SoNAe」は停止せず、数十分にわたり「M5Stamp Pico」を稼働させつづけることができました。

IoTデバイスの消費電流値調査

「SoNAe」からの電力供給で「M5Stamp Pico」を長期稼働し、所望の時間間隔でデータ送信できるようにはなりましたが、30秒おきに「M5Stamp Pico」で無駄に電流消費していることになります。
そのため、このスケッチでの「M5Stamp Pico」の消費電流値を調査してみました。

調査には こちら の方法を使いました。

結果は以下のとおりです。

データ送信する場合、しない場合それぞれについて、起動からディープスリープに移行するまでの一連の処理における消費電流波形をそれぞれ数回測定しています。
データ送信する場合、処理時間は4秒程度、その間の平均消費電流値は77.6mA、また、データ送信しない場合、処理時間は3秒程度、その間の平均消費電流値は85.0mAとなりました。
データ送信してもしなくても、電流消費は大きく変わりません。エネルギーの使い方としては、かなり勿体ない使い方になります。

ちなみに、ディープスリープ中の電流消費は0.4mA程度でした。
30秒のうち4秒間は消費電流値が77.6mA、残り26秒間は0.4mAとすると、このデバイスの平均消費電流値は 10.7mA となります。

先日の記事でも書いたように、IoTデバイスの平均消費電流値が 58mA 以下であれば、ソーラーパネルで発電する電力で常時稼働できる計算になりますので、勿体ない使い方ではありますが、この構成で長期稼働させることはできそうです。

追記

丸1日以上にわたり、連続稼働させてみました。
特に問題なく、データ採取できています。

この構成の場合、何かのはずみで電源供給がストップしてしまうと、自動では二度と復帰しませんので、決しておすすめの方法ではありませんが、一応「SoNAe」からの電源供給で、IoTデバイスを長期稼働させることはできそうです。


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


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


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

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