100均のソーラーパネルと SPRESENSE でバッテリーレス ロガー製作
前回は100均のソーラーパネルで Raspberry Pi Pico を駆動してみました。
このときSPRESENSE も動かしてみて報告しています。
ここではSPRESENSE でロガーを製作してみましたので報告させていただきます。
目次
前回のおさらい
100円ガーデンライトのソーラーを2個シリーズに接続してSPRESENSE に直結してLチカ動作させてみました。
この投稿をInstagramで見る
SPRESENSE のメインボードの電源入力は
・動作推奨電圧:3.6V~4.4V
・最大絶対定格電圧:7V ・最大絶対定格電圧:5.5V (2022/8/27追記 公式の値が変わっていた。。)
とのことです。
100円ガーデンライトのソーラーを2個シリーズに接続して日光に当てると、無負荷で5Vほど出力しました。
SPRESENSE は4つのLEDを点灯させるサンプルコードを書き込んでおり
3.6V入力で10mAほど 約0.04Wの消費で非常に低消費電力でした。
SPRESENSE が低消費電力設計がなされているため、100円ガーデンライトのソーラー2個でも駆動できたと考えられます。
GPS
SPRESENSEにはGPSが搭載されています。
そこでGPSからの時刻取得を試してみました。
久しぶりにSpresenseでGPSを楽しみました。
宇宙から時刻をいただく。サンキューユニバース pic.twitter.com/oJkvKm9oxn
— HomeMadeGarbage (@H0meMadeGarbage) April 21, 2021
衛星信号を受信して現在時刻の取得を確認できました。
ちなみにこちらの実験はスマホからUSBホストケーブルで給電&シリアルデータ受信してSerial USB Terminalで表示しています。
GPSを動かしてもSPRESENSEは0.05Wほどしか消費しませんでした。
さらにクロックを156MHz から32MHzに下げたところ0.03Wまで低消費電力化できました。
あらためてSPRESENSE凄いです!
参考
ロガー製作
低消費でGPSから時刻が取得できることがわかりましたので、完全バッテリーレスのロガー実現を目指します。
ここでは、ソーラをSPRESENSEに直結してソーラの出力電圧と時刻をSDカードに記録するロガーを作ります。
以前にSDカードスロットを搭載した小型のSPRESENSE拡張ボードを購入しておりましたのでコチラを使用します。
GPSが時刻取得で入力電圧を測ってSD記録し1分スリープする動作にいたしました。
ソーラー電圧監視は以下を参考にLowPower ライブラリを使用しました。
https://qiita.com/baggio/items/456b93bee54111f2fabf
ロガー動作
早速ベランダにロガーを設置してみました。
しかし、データは保存されていませんでした。。。
GPSは動作しているようですがSDカードを起動できてないみたいです。
出力の大きそうな300円ガーデンライトのソーラーに変更してみます。
2個をシリーズに接続しています。
高級なほう
こんな立派なのもあるんだな#ダイソー pic.twitter.com/9jPvtHqiHK— HomeMadeGarbage (@H0meMadeGarbage) April 19, 2021
しかしこれでもSDカード書き込みはできませんでした。。。
SDカード消費電力
SDカード書き込みに時の電力を測ってみました。
通常動作時は電源電圧3.6V印可で10mAを超えることはないのですが、SD書き込み時には16mAを超えていました。瞬間的にはもっと流れていそうです。
そこで、ソーラ出力にコンデンサを挿入いたしました。
日照量にもよるのでしょうが10uFではまだ足りなかったので
景気よく1000uFを挿入しましたところ無事SDカード書き込みが確認できました。
ロガーの最終的な構成
こぼれ話
消費電力を測定する際に間違って過電圧印可してしまいSPRESENSEを壊しました。。。
たった今Spresenseを壊しました。
正確な消費電力をはかるべく安定化電源を接続したところ誤って18V以上印可してしまいました。
ドチクショーーーーーーーーー!!!!!!!!!!!
速攻Spresense購入。。。。
— HomeMadeGarbage (@H0meMadeGarbage) April 22, 2021
しょうがないので購入しました。もともと頂き物ですし。。。
toioもいただけたのでプラスマイナスゼロいやむしろ得したと思うことにします( ;∀;)。
届きました!
子供たちと遊び倒して
アイディアの実現に向けて
学びたい!#toioDo #Doコン pic.twitter.com/njYvOr0b7C— HomeMadeGarbage (@H0meMadeGarbage) April 22, 2021
Arduino コード
GPSで時刻更新後に入力電圧を計測してSDカードに保存して、60秒スリープし起床を繰り返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
#include <Arduino.h> #include <LowPower.h> #include <SDHCI.h> #include <File.h> #include <RTC.h> #include <GNSS.h> SDClass SD; /**< SDClass object */ File myFile; /**< File object */ SpGnss Gnss; #define MY_TIMEZONE_IN_SECONDS (9 * 60 * 60) // JST int state = false; void setup() { LowPower.clockMode(CLOCK_MODE_32MHz); Serial.begin(115200); while (!Serial); RTC.begin(); LowPower.begin(); pinMode(LED0, OUTPUT); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); digitalWrite(LED0, LOW); digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); // Initialize and start GNSS library int ret; ret = Gnss.begin(); assert(ret == 0); ret = Gnss.start(); assert(ret == 0); } void loop() { Serial.print("."); state = !state; digitalWrite(LED2, (state)? HIGH: LOW); // Wait for GNSS data if (Gnss.waitUpdate()) { SpNavData NavData; // Get the UTC time Gnss.getNavData(&NavData); SpGnssTime *time = &NavData.time; // Check if the acquired UTC time is accurate if (time->year >= 2000) { Serial.println("."); Serial.print("start\n"); digitalWrite(LED0, HIGH); char buf[128]; // Convert SpGnssTime to RtcTime RtcTime gps(time->year, time->month, time->day, time->hour, time->minute, time->sec, time->usec * 1000); gps += MY_TIMEZONE_IN_SECONDS; sprintf(buf, "%04d/%02d/%02d %02d:%02d:%02d\t", gps.year(), gps.month(), gps.day(), gps.hour(), gps.minute(), gps.second()); Serial.print(buf); float voltage = LowPower.getVoltage() / 1000.0; Serial.println(voltage); if(SD.begin()){ myFile = SD.open("log.txt", FILE_WRITE); myFile.print(buf); myFile.println(voltage); myFile.close(); Serial.print("SD Write!!\n"); digitalWrite(LED1, HIGH); }else{ Serial.print("No SD!!\n"); } delay(2000); digitalWrite(LED0, LOW); digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); Serial.print("sleep\n"); //updateClock(); LowPower.deepSleep(60); } } } |
参考
結果
SDカードのログ(log.txt)は以下の通りです。
1 2 3 |
2021/04/26 06:11:02 4.59 2021/04/26 06:12:56 4.54 2021/04/26 06:14:03 4.55 |
完全バッテリーレスでロガーができてしまいました!
当然電気代ゼロでしかもソーラーはダイソーで買ったものです!
面白いのでしばらく運用してみようと思います。
1 2 3 4 5 6 7 8 9 |
2021/04/26 09:43:32 4.59 2021/04/26 09:50:56 4.59 2021/04/26 09:52:02 4.59 2021/04/26 09:53:09 4.59 2021/04/26 09:54:16 4.59 2021/04/26 09:55:23 4.56 2021/04/26 09:57:26 4.52 2021/04/26 09:58:33 4.51 2021/04/26 09:59:40 4.41 |
日中ベランダに置いといたのですが東向きで長時間の日照が得られず、
またベランダ柵の陰もかかるなどして10分しかデータとれてませんでした。。。
今回、日照次第でバッテリーレス&電気代ゼロでデータロガーができることがわかりました。
しかし、これまただからなんだ?という話です。
日中のソーラー電圧を測っているだけですし、仮に気温やガーデニング植物の土の湿度など意味ありげな数値を測れたとしてもSDカード回収が必要です。。。
次回やるならバッテリーレスでWiFiでデータ飛ばしたいな