以前、検討したソーラー電源システムの試作を行いました。
まだ道半ばですが、一応、目的の動作はしてくれます。
ここ一週間の我が家のベランダでの稼働状況が下図です。
上の方の数字は、その日の日照時間です。
置く場所的に12時~15時しかパネルに直射日光が当たらなくて、その時間のみZeroが稼働してます。十分に晴れな日でも直射日光が当たらないと稼働まで至らないのがちょっと残念なところ。当たり前ですが、雨の日や曇りはダメですね。
ログは取っていませんが、時々眺めている感じでは、Picoは直射日光が当たらない時間でも起動しているので、日中は大体稼働してるんじゃないかと。この時、発電電圧は4~5Vくらいになっているので、もっと効率的に電力を伝えられれば、Zeroも稼働できる、かも?
■ 構成
■ ソーラーパネルとスーパーキャパシタ
コスパのいい2W(6V、0.33A)で600円のソーラーパネルを使用。以前の検討では、定電圧にするためコンバーターの利用を考えていましたが、今回はつけていません。
今回のソーラーパネルの最大出力は6Vで、ダイオードとかMOSFETとかを介す中で降圧されて、結果5Vくらいになるのと、RaspberryPiがある程度電圧が変動しても動いてくれたので。
スーパーキャパシタは容量5F、耐圧5.4Vのを使いました。このキャパシタはソーラーパネルの出力の安定化と、Zeroのシャットダウン時までのバックアップ電源を担っています。
ソーラーパネルへの逆流防止のためのダイオードは、順電圧の小さいショットキーバリアダイオードを使うべきでしたが、間違えて整流用ダイオードを買ってきてしまいましたorz。容量1Aで、順電圧は1.1V。この時点で、最大電圧が6.0-1.1=4.9Vになる計算です。実測すると、直射日光がパネルに当たる時、発電電圧が6.04V、ダイオードを通過してキャパシタにかかるのが5.24V、MOSFETを介してPicoにかかる電圧が5.10Vとなり、しばらく見てましたが、RaspberryPiの電源範囲としても、キャパシタの耐電圧としても大丈夫そうだったので、このまま稼働させました。うーん、結果オーライ?
ただ、Picoが壊れたり、何らかのトラブルで無負荷状態になれば、ソーラーパネルの開放電圧は6.9Vなので、ダイオードで多少下がっても、キャパシタの耐圧5.4Vを上回ってしまいそうです。なんで、定圧化するのが望ましいと思います。ちなみに、キャパシタに高電圧を流した時の壊れ方は、急激に高い電圧をかけると発熱したり最悪爆発したりするそうだけども、基本的に、電解液が気化してガスとして抜けていくので比較的安全なそう(とのことで稼働させてます)。
太陽電池モジュール 2W SY-M2W
https://akizukidenshi.com/catalog/g/gM-08919/
電気二重層コンデンサー5F5.4V
https://akizukidenshi.com/catalog/g/gP-04247/
汎用整流用ダイオード 1000V1A 1N4007-B
https://akizukidenshi.com/catalog/g/gI-08327/
ちなみにメモとして書きますが、通常の電源バックアップ回路としてはこんな感じらしい。
・電源直後の抵抗は、キャパシタ充電時に流れる突入電流防止のための電流制限抵抗で、ワット容量が大きく、負荷の抵抗に比べ、抵抗の小さいものを選ぶ。
・キャパシタに並列につけられている抵抗は、キャパシタを直列にして耐電圧を上げた際に、キャパシタの容量誤差から生じる充電電圧の差をキャンセルし、充電電圧のバランスをとるための抵抗で、抵抗の大きいものを選ぶ。
今回、キャパシタは一つなのでバランス抵抗はいりませんし、ソーラーパネルなら能力以上の電流は流れないだろうので、電流制限抵抗も入れませんでした。
■ 分圧
Picoはアナログ-デジタル変換(ADC)端子がありますが、電圧範囲が0~3.3Vなので、電圧を1/2に分圧してます。
■ スイッチ回路
電圧を監視しているPicoのGPIOで、MOSFETに印加して、Zeroに電源を供給します。
LEDはZero通電時に光ってわかるようにしました。
無駄に汎用的に使えるように、NOT回路で反転されるPIN2と、そのままのPIN1を用意しました。今回はPIN2を使って、PicoのGPIOにつながっています。
PchMOSFETには、MTP4835I3を使いました。DMG3415UというチップMOSFETを前に買って持っていたんですが、小さすぎてはんだ付けが難しく、よく壊してしまうんで、これにしました・・・orz
PchパワーMOSFET 30V40A MTP4835I3
https://akizukidenshi.com/catalog/g/gI-16096/
MOSFET 2N7000
https://akizukidenshi.com/catalog/g/gI-09723/
■ リセット回路
Picoを確実にオンオフするためのリセット回路です。これがないと、一度電圧が下がって、その後上がった際、Picoが動作しないことがたまに起きます。
リセットICには、電圧の閾値が2.63Vで確定しているTCM809Rを使っています。Zeroがギリギリ動作する電圧が2.7Vくらいまでなので、Picoもその範囲で動けばいいと考えると、ちょうどいい範囲です。Picoの電源電圧の下限は1.8Vなので、Pico単体としてはまだ余力があるのですが。
この回路、課題があって、リセット信号のタイムラグなしで出力するので、カットオフした直後、負荷が無くなるのでキャパシタの電圧が回復して通電、Picoが動くと電圧が落ちてまたカットオフと、閾値付近でしばらくチカチカとオンオフを繰り返してしまいます。が、それに気づいたのは、基盤を作った後なので、このまま使ってます。余白一切なしな感じで作ってしまったので、コンデンサの後付け等も叶わず。
大体、はんだ付けへたっぴなのに、これを16ホールのユニバーサル基盤に収めようとしたのが、いけなかった・・・、チップMOSFETのDMG3415Uを3つ壊した末にようやく完成しました。
リセットIC TCM809R
https://akizukidenshi.com/catalog/g/gI-02533/
PchチップMOSFET DMG3415U(20V4A)
https://akizukidenshi.com/catalog/g/gI-03942/
回路は以下を参考にしました。
M51957B を用いた自動回復型なシンプル過放電防止回路
https://wakwak-koba.hatenadiary.jp/entry/20171008/p1
リチウムイオン電池にも使えるハイサイド動作な過放電防止回路
https://wakwak-koba.hatenadiary.jp/entry/20161210/p1
■ Picoのプログラム
Picoは、Zeroのオンオフを操作していますが、以下の動作を繰り返して制御しています。
①電圧が4.5V未満の場合は待機
②電圧4.5以上になったらZeroの通電を開始
③電圧が3.5Vを下回ったら、Zeroにシャットダウン指示
④30秒後にZeroの通電を遮断
(→①に戻る)
電圧上昇を待っている状態、Zeroへ通電している状態、シャットダウン指示をしている状態、それぞれでPico内蔵のLEDの点滅速度を変えることで、今どのモードか見てわかるようにしました。
import machine from machine import UART, Pin, Timer import utime led = Pin(25, Pin.OUT) tim = Timer() def tick(timer): global led led.toggle() tim.init(freq=0.5, mode=Timer.PERIODIC, callback=tick) act = Pin(6, Pin.OUT) relay = Pin(7, Pin.OUT) act.value(0) relay.value(0) input_voltage = machine.ADC(1) conv_factor = 3.3 / (65535) * 2 while True: print('Waiting for the voltage to rise') tim.init(freq=1.0, mode=Timer.PERIODIC, callback=tick) while True: vol = input_voltage.read_u16() * conv_factor print(vol) if vol > 4.5: break utime.sleep(1) print('The voltage went up. Start Zero') tim.init(freq=2.5, mode=Timer.PERIODIC, callback=tick) act.value(1) relay.value(1) while True: vol = input_voltage.read_u16() * conv_factor if vol < 3.5: break utime.sleep(1) print('The voltage has dropped. Shutdown Zero') tim.init(freq=5.0, mode=Timer.PERIODIC, callback=tick) act.value(0) utime.sleep(30) relay.value(0) print('Turn off the power') utime.sleep(5)
ちなみにZeroのシャットダウンを消費電力0.75W、時間10秒、動作下限電圧を2.7Vとし、3.5V時点でシャットダウン開始する場合に、必要なキャパシタ容量を計算すると、およそ3Fになります。
■ Zeroのプログラム
Zero側は、PicoとつながっているGPIOを監視し、その信号がLOWになればシャットダウンするスクリプトを常駐させます。
常駐には、お手軽に/etc/rc.localによる方法にしました。
gpiozeroモジュールを使いました。
#!/usr/bin/python # -*- coding: utf-8 -*- import os,time import gpiozero btn = gpiozero.Button(21) print('waiting shutdown signal') while True: if btn.is_pressed: print('shutdown signal is activate. shutdown now') time.sleep(5) os.system('sudo shutdown -h now') break time.sleep(1)
start.shを作って、
$ nano start.sh
start.sh
python /home/pi/check_shutdown.py &
startup.shを所定のフォルダに移動させて、
$ sudo mv ./startup.sh /usr/local/bin/
/etc/rc.localを編集します。
$ sudo nano /etc/rc.local
exit 0の前に、startup.shを追記
startup.sh exit 0
これでも動くは動きますが、電圧が上がりすぎて壊れないとも限らないので、電圧保護を組み込む改良を試みるつもりです。あとリセット回路もできれば。
具合が良ければ、一つの基盤に集約して、ケースも付けたいと思ってます。
追記:電圧保護回路だけはやりました。