太陽電池による充電でIoT機器を長時間動作させようとする試みに関する備忘録。
Arduino を Sleep/Stand-By 状態にし WDT で起こす
まずは Arduino の消費電力を落とす試み。スリープに avr/sleep.h、ウォッチドックタイマー(WDT)に avr/wdt.h をinclude すると使えるようになる。割り込みルーチン(ISR)を使えば設定した時間寝て、その後起きることが可能だ。
これでうまくいく、、、といいたいところがだが、WDT が最長で 8秒程度しか設定できないので、割り込みハンドラでカウントして適切な回数カウントする必要がある。更に BOD 機能を止めるようにするとさらに消費電力を削ることが出来るらしい。その際はちゃんと消費電力測らないとね(私はまだ測ってません。はい)。
私の適当に動いたソースを張り付けておく。なんとなく動いている気がする。Serial.println("sleep tes loop t");のあとの sleep はいきなり sleep_enable にするとシリアルが化けちゃうから。8秒のに対し 4秒は sleep しすぎだし、シリアル出力必要ないな、、、
#include <avr/sleep.h> #include <avr/power.h> #include <avr/wdt.h> const uint16_t SLEEP_CYCLE = 75; // x 8 sec = 600sec = 10 min to sleep volatile uint16_t counter = SLEEP_CYCLE; void setup() { Serial.begin(9600); while(!Serial); cli(); wdt_reset(); /* clear WatchDog system Reset Flag on MCU Status Register */ MCUSR &= ~(1 << WDRF); /* * set WatchDog Change Enable and WatchDog system reset Enable * on WatchDog Timer Control Register * (setting only WDCE does not seem to work) */ WDTCSR |= 1 << WDCE | 1 << WDE; /* * set WatchDog Interrupt Enable, clear WDE * and set prescaler to 8 sec */ WDTCSR = 1 << WDIE | 0 << WDE | 1 << WDP3 | 0 << WDP2 | 0 << WDP1 | 1 << WDP0; /* enable interruput */ sei(); Serial.println("sleep test"); } void loop() { Serial.println("sleep tes loop t"); delay(4UL * 1000UL); set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sleep_cpu(); Serial.print("wakeup "); Serial.println(counter); if (counter == 0) { sleep_disable(); counter = SLEEP_CYCLE; } //delay(5UL * 1000UL); } ISR(WDT_vect) { --counter; }
とりあえず、ここまで出来たとしましょう。ところが、実際に使ってみるとほとんど電池の寿命を延ばすに至りませんでした。大抵の Arduino 系の実験基板は電源が ON していることがわかるように常時点灯の LED がついているのと、その他の周辺機器もちゃんとSleep や Stand-By 状態にならないと消費電力を削減することは難しいためでしょう。よくよく考えたら、私の場合 USB 給電していたので、無駄に USB Serial のチップ(FTDI など) が電力を消費してくれていました。
根本的に電源供給をカット
外部の RTC をつかって根本的に電源供給をカットしようという製品がある。Wio-Extension-RTCというものだ。PCF8523 を使っている。PCF8523 の消費電力が 150 nA でどうも Stand-By モードみたいなのはなさそう。ボタン電池でも動くらしい。自動的に消費電力を抑える機構があるのでしょう。机上で計算すると電池で 75日はもつ。本当かね。ちゃんとデータシートを後で読むことにしましょう。データシートだけじゃだめなので、おいおいデータも集める。だれか人柱になってくれ。
脱線して RTC を調べる
PCF8523 を含めた RTC をちょっと調べてみる。3.3V だと PCF8523 と DS3231 の基板がスイッチサイエンスで売られている。PCF8523 より DS3231 の方が良さそうなのだが値段が高い。そんな高性能じゃなくてよいから 3.3V のはないのだろうか?MAXIM で探してみる。DS1308 と MAX31342 が見つかる。MAX31342 の方が新しくて、安くて、良さそうなのだがパッケージが WLP/8 と特殊だ。DS1308 も良さそうで消費電力もすくない。
Wio-Extension-RTC はどうやって電力供給をコントロールしている?
github のソースを見るとクロックを停止するようになっている。このクロックは単純に PCF8523 の入力をスルーして出しているだけのようだ。このボードの回路図は見つからなかったが MOSFET でコントロールしているだけのようなので、3.3V でon/offする FET を使えばよさそう。しかし、これなんでクロックの出力を使っているのだろう?割り込みにすればいい気がする。
FET はどうすれば?
仮に RTC をうまく選定できた場合 FET はどうすればいいだろうか?FET は電圧の閾値で制御するので省電圧?の FET を使えばよいようだ。入手性を考えて秋月電子通商で手に入るものを検討した結果2SK4017 がよさそうという結論。
肝心の太陽光発電は?
基本的には逆流防止のダイオードをつければ蓄電池側が消費していなければ充電できるはず。単純なのはダイオード付けるだけ。ただ、これだと満充電になった場合、抑制することが出来ないので過充電という状態になって電池の温度が上がる。LiPo だと火災の危険が高い。あと、雑誌インタフェースに載っていたが、サージ機能とかつけた方がいいみたいだ。
まずは実験して情報を集める必要がある。