先日、「M5Stamp Pico」をディープスリープさせずに低電力で動かす方法について調査しました(記事は こちら)。
「M5Stamp Pico」の動作周波数を10MHzに落とすことで、単四型Ni-MH電池4本で動かしたときの消費電流値を7.0〜9.6mAに低減させることができました。
また、机上計算によると、こちらの0.5Wソーラーパネルで、平均消費電流値が11mA@5VのIoTデバイスをギリギリ常時稼働できそうな見込みです。
つまり、「M5Stamp Pico」「0.5Wソーラーパネル」「単四型Ni-MH電池4本」を以下のようにつなぎ、「M5Stamp Pico」の動作周波数を10MHzに落とすことで、「M5Stamp Pico」をディープスリープさせることなく、小型ソーラーパネルで発電した電力で常時稼働させることができる可能性があります。
例えば「獣害柵の振動を観測し、動物が侵入したときに通知する」ようなシステムでは、柵の振動を常時観測しておかなければならないので、デバイスをディープスリープさせることができないのですが、このようなシステムでも、小型ソーラーパネルで発電した電力で常時稼働させることができるかもしれません。
そんな訳で、実際に試してみたいと思います。
実験なので観測するデータは何でもいいのですが、今回は、ソーラーパネルで発電した電流値・電圧値を測定してみようと思います。
測定したデータを使って、机上検討によるソーラーパネルの発電量の見積もりが妥当であるかどうかを確認することにします。
以下のように電流計と電圧計を入れて測定します。
「INA226PRC」という電流・電圧計モジュールをつかいます。
具体的な接続は以下のようになります。
以下のような処理を行います。
- 30秒毎に電流値、電圧値を測定する(動作周波数は10MHz)。
- 4回分のデータをまとめてAmbientに送信する(この時のみ動作周波数を240MHzにする)。
- ディープスリープはさせない。
30秒毎のデータ測定なので、本来なら途中でディープスリープさせても良い用途ですが、今回は常に動かしておくことが目的の実験なので、ディープスリープはさせず、動作周波数10MHzで動作させます。
Ambientにはデータの一括送信機能があるので、2分毎に4回分のデータをまとめて送信します。この時だけ動作周波数を240MHzに上げ、送信完了したら10MHzに戻します。これにより、2分間のうち数秒だけ消費電流値が大きく(80mA程度)なり、その他の大部分の時間は10mA程度に収まるはずです。
スケッチは以下のとおりです(INA226PRCのライブラリは こちら を使用させていただきました)。
#include <Wire.h>
#include "INA226PRC.h"
#include <WiFi.h>
#include "Ambient.h"
#include "time.h"
INA226PRC ina226prc;
WiFiClient client;
Ambient ambient;
unsigned int channelId = XXXXX;
const char* writeKey = "XXXXXXXX";
const char* ssid = "XXXXXXXX";
const char* password = "XXXXXXXX";
unsigned int interval = 30; // データ測定間隔
unsigned int sampleNum = 4; // 1度に送信するデータ数
char dataset[70];
char buffer[7000];
void setup() {
Serial.begin(115200);
Wire.begin(21, 22);
ina226prc.begin();
setCpuFrequencyMhz(240); // Wi-Fi接続前に動作周波数を240MHzにする
if(!connect_wifi()) ESP.restart();
configTime(9 * 3600, 0, "ntp.nict.jp");
struct tm timeInfo;
getLocalTime(&timeInfo);
disconnect_wifi();
setCpuFrequencyMhz(10); // Wi-Fi通信後に動作周波数を10MHzにする
}
void loop() {
sprintf(buffer, "{\"writeKey\":\"%s\",\"data\":[", writeKey);
for(int i=0; i<sampleNum; i++) {
struct tm timeInfo;
getLocalTime(&timeInfo);
char now[24];
sprintf(now, "%04d-%02d-%02d %02d:%02d:%02d.000",
timeInfo.tm_year + 1900,
timeInfo.tm_mon + 1,
timeInfo.tm_mday,
timeInfo.tm_hour,
timeInfo.tm_min,
timeInfo.tm_sec
);
float current = ina226prc.readCurrent();
float voltage = ina226prc.readVoltage();
sprintf(dataset, "{\"created\":\"%s\",\"d1\":%.2f,\"d2\":%.2f}", now, current, voltage);
Serial.println(dataset);
sprintf(buffer, "%s%s,", buffer, dataset);
delay(interval*1000);
}
buffer[strlen(buffer)-1] = '\0';
sprintf(buffer, "%s]}", buffer);
Serial.println("Send data to Ambient");
setCpuFrequencyMhz(240); // Wi-Fi接続前に動作周波数を240MHzにする
if(!connect_wifi()) ESP.restart();
ambient.begin(channelId, writeKey, &client);
Serial.println(buffer);
ambient.bulk_send(buffer);
disconnect_wifi();
setCpuFrequencyMhz(10); // Wi-Fi通信後に動作周波数を10MHzにする
}
boolean connect_wifi() {
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");
return true;
}
void disconnect_wifi() {
WiFi.disconnect(true);
Serial.printf("WiFi disconnected\n");
}
Ni-MH電池とM5Stamp Picoの間にテスターを入れて測ったところ、消費電流値は10.7mAでした。
同じデバイスで何も処理をしなかったときの消費電流値が9.6mAでしたので、電流・電圧計モジュールをつないだり処理内容を追加したことによる消費電流値の増加は1mA程度ということになります。
また、2分毎にAmbientにデータ送信する際の消費電流値は82mA程度、データ送信にかかる時間は3〜4秒でした。
よって、稼働中の消費電流値を平均すると「(10.7mA×116s + 82mA×4s) / 120s = 13.1mA」となります。
ソーラーパネルで発電できるのは「11mA」の見込みですので、ややオーバーしていますが、今回はきびしめのこの条件で調査を行うことにします。
ちなみに、Ambientに送信する間隔を10分毎(20回分のデータをまとめて送信)にすれば、「(10.7mA×596s + 82mA×4s) / 600s = 11.2mA」となり、ソーラーパネルの発電能力とほぼ同じ電流消費になる計算です。
実験するのにあたっては、「単四型Ni-MH電池4本」を「単三型Ni-MH電池4本」に変更しました。
ソーラーパネルの発電量が足りなくても、それなりに長い期間にわたりデータ採取したいためです。
もしもソーラーパネルで全く発電できなかったとすると、「単四型Ni-MH電池4本(800mAh)」では「800mAh / 13.1mA = 61.1h = 2.54日」と、3日足らずで停止してしまうのに対し、「単三型Ni-MH電池4本」であれば「2000mAh / 13.1mA = 152.7h = 6.36日」と、1週間近くのデータを採取することができます。
デバイスを畑に持っていき、ソーラーパネルをこのように設置しました。おおよそ真南向き、角度30度ぐらいで設置しています。
ソーラーパネル以外のデバイスは、足元のコンテナボックスに収納しています。
実験したのは、10月9日〜23日の15日間です。
この期間の天気は、「晴れ」が7日、「雨」が3日、その他の日は「曇り」や「曇りときどき晴れ」など、中途半端な天候でした。
概ね普段どおりの平均的な天候です。
なお、実験している畑には西側に山があり、この時期だと午後2時半以降は完全に影になってしまいます。
日の出ている時間(午前7時〜午後5時の10時間)のうち1/4は、全く発電できないことになります。
ソーラーパネルで発電した発電電流値をグラフ表示してみました。
気象庁のホームページに記載されている、近隣地域における日毎の日照時間も記載しています。
晴れている日の正午頃には、発電電流値は70〜80mA程度になっています。
一方、曇りや雨などで陽が差していない日の発電電流値は、正午頃でもせいぜい10〜20mA程度に留まっています。
15日分の発電電流波形を、日毎に重ね合わせてみました。
発電しているのは、午前7時頃から午後2時半頃にかけてです。先ほども書いたように、実験している場所では午後2時半以降は完全に影になるので、晴れている日でもほとんど発電できなくなっています。
測定した電流値・電圧値より、日毎の発電電力量を計算してみました。
平均すると、1日あたり 1226.8mWh を発電できていました。
「1226.8mWh / 24h / 5V = 10.2mA」となり、机上検討によるソーラーパネルの発電量(平均11mA)が概ね妥当であることを確認できました。
1日のはじめ(午前0時)からおわり(午後23時59分)にかけてのNi-MH電池の電圧変化と、その1日におけるソーラーパネルでの発電電力量の相関をグラフにしてみました。
電圧変化がプラスであれば、その1日のソーラーパネルでの発電電力量が、その1日にデバイスが消費した電力よりも大きかったことになります。
逆に、電圧変化がマイナスであれば、その1日の発電電力量が、デバイスの消費分よりも小さかったことになります。
発電電力量が 1400mWh 以上であれば、デバイスの消費分を賄えているようです。
15日のうち9日は、デバイスの消費以上に発電できていました。
これより、今回の構成では、発電電力と消費電力はほぼトントンで、現状の構成でも常時稼働できる可能性はあるが、全く余裕はないということがわかりました。
最後に、1日あたりの日照時間と1日あたりの発電電力量をグラフにしてみました。
これより、1日の日照時間が5時間以上あれば、このデバイスを稼働させるための電力(1400mWh)を賄えることがわかります。
まとめると、以下のようになります。
「M5Stamp Pico」を動作周波数10MHzで動かすことにより、ディープスリープさせなくても、出力0.5Wのソーラーパネルで、15日間にわたり問題なく連続稼働させることができました。
ディープスリープなしのIoTデバイスを、小型のソーラーパネルで発電した電力で常時稼働させることも、不可能ではなさそうです。
ただし、発電能力には余裕は全くありません。天気が悪い日が何日か続けば、停止してしまう可能性もあります。
このソーラーパネルを2枚並列にしたり、もう少し高出力のソーラーパネルを使えば、より安定して稼働させることができそうです。
また、これまでソーラーパネルの発電電力量の見積もりに使ってきた式が、概ね妥当であることが確認できました。
「式1」は「1年の発電電力量=ソーラーパネルの出力×1000」というもので、今回のパネルでは「0.5W * 1000 = 500Wh」となります。
実験で得られた結果は、1日あたり 1226.8mWh なので、1年では「1226.8mWh * 365日 = 447.8Wh」です。
「式2」は「快晴の1日の発電電力量=ソーラーパネルの出力×3.5時間」というもので、今回のパネルでは「0.5W * 3.5h = 1.75Wh」となります。
実験で得られた結果は、曇りや雨の日も含めた平均で、1日あたり「1226.8mWh = 1.23Wh」です。
先ほども書いたように、今回の実験場所では、本来の日射時間の 1/4 は発電できていないので、それを踏まえると、上記のふたつの見積もり式は概ね妥当と思います。