最終更新日: 2013年8月26日

太陽電池充電コントローラー

太陽電池でバッテリーを充電。その目的でなく手段を楽しみ、その結果として、わずかな電力であっても節電につながればそれでいいじゃないか。

太陽電池で鉛蓄電池を充電していましたが、過充電防止のため充電コントローラーを買ってみました。しかしこのコントローラー自体の消費電力が大きい。ということで自作しよう、というのがこのコンセプト。

どういうものか。

まずは仕様。
過充電と過放電を防ぐためのもの。
つまり、太陽電池から充電していてバッテリー電圧がある程度以上になれば太陽電池を切り離し、放電していてバッテリー電圧がある程度以下になれば負荷を切り離す…という動作。

これをArduinoで制御します。

さらにバッテリーは2台接続できるようにしました。2台持っていたという事が大きな理由ですが、1台が満充電になれば2台目を充電し…という動作にすれば太陽電池で発電した電力をより有効活用できます。

そしてもうひとつの仕様が、低消費電力。
もちろん、太陽電池で充電している時は太陽電池で、夜間などで充電していない時はバッテリーからの電力で動作します。その貴重な電力を消費しないためにATMega328のスリープモードを活用し、スリープ時の消費電力目標を60μAとしました。バッテリーの自然放電電流並み、というレベルです。

ハード概要

回路図は以下のとおり。

大まかには、太陽電池からバッテリーへの接続経路、そしてバッテリーから負荷への接続経路にFETによるスイッチをはさみ、そのスイッチをATMega328にてON/OFF制御をします。そのスイッチにはPch MOS FETの2SJ334を使いました。ここには12Vを越える電圧がかかるので、直接制御をせずにNch MOS FETの2N7000を経由して制御しています。それぞれのFETは「秋月で売ってるもの」の中から選びました。

また、太陽電池の電圧、バッテリーの電圧を計り、充電完了・放電完了をチェックします。これは単純にそれぞれの電圧を抵抗で分圧し、ATMega328のA/D入力端子に入れてます。抵抗値は、発生するであろう最大電圧の場合でも分圧の結果として5Vを越えないようにしています。

さらに、太陽電池からバッテリーまでの間に1Ωの抵抗を入れ、その両端の電圧を計測することによって充電電流を計測しています。これはオペアンプNJU7072Dで1Ω抵抗間の電圧を約10倍にし、その電圧をATMega328に入れてます。このオペアンプの電源には太陽電池の出力をそのまま使ってますが、これがある程度低くなるとオペアンプの入力電圧と電源電圧との関係が正常動作をする電圧を外れ、出力電圧が5Vを越えてしまう可能性があるので、定電圧ダイオードを入れてATMega328の入力が5Vを越えないようにしています。
ちなみに当初このオペアンプにはLM358を使ってみたのですが、電源電圧に対して入力電圧の余裕が狭く、余裕のあるオペアンプを探して(かつ、安価なものを探して)NJU7072Dを採用しました。
なお、本来ならばバッテリーへの充電電流を制御すべきですが、使用する太陽電池の発電能力がバッテリーの許容充電電流を下回るため、充電電流の制御は行っていません。もし大容量の太陽電池を使用する場合には電流制限の回路が必用になるでしょう。

ATMega328の電源には3端子レギュレーターを使っていますが、これの電力源は太陽電池、バッテリー2台のいずれかです(ダイオードによるOR)。このレギュレーターとしてSIIのS-812C50AY-B-Gを使いました。出力が75mAと小さいですが、消費電流が1μAと非常に小さいのが大きなメリットです。動作電圧の最大が16Vですが、太陽電池の電圧は17Vくらいになることがあるので、LEDを1個入れて電圧を下げてます。結果としてこのLEDはATMega328が動作している間(スリープモードでない時)に点灯します(厳密にはスリープモード時でもわずかながら点灯していますが)。

充電用、負荷用のスイッチ(FET)が、バッテリー2個に対し計4個ありますが、そのどれがONになっているかがわかるようにLEDを設けています。これももちろん電力を消費するため、LEDは間欠的に点灯するようにしています。その制御のためのFET(2N7000)も設けています。

注:ここで使用しているバッテリーは鉛シールドバッテリーです。他の種類(特にリチウム)の場合はその充電仕様に合わせた回路である必要があります。


ソフトウエア

大きな特徴が、前述のとおり「低消費電力」です。動作時以外はスリープモードに入るようにしました。これによってスリープモード時の消費電力は、目標の60μAには至らなかったものの、70μA以下にすることができました。
このスリープモードからの復帰ですが、消費電力を最小限にした状態で使えるタイマー関連の機能はウォッチドッグタイマーしかなく、これを使うことにしました。基本的には、このウォッチドックタイマーの時間を短時間(32mS)と長時間(1秒または4秒)を交互に切り替え、長時間のスリープからの復帰時に各種処理とLEDのオン、短時間のスリープからの復帰時にLEDのオフを行っています。これによりLED点灯中でも最小限の消費電力で済むようにしました。
長時間スリープの1秒、4秒は、太陽電池から充電されていれば1秒、されていなければ4秒です。

ハードからの情報は、太陽電池の電圧、充電電流、各バッテリーの電圧です。基本的にはバッテリーの電圧をもとに充電・放電の完了をチェックしています。ただし充電時は太陽電池の電圧にも大きく依存するので、ある程度の電圧を越えた場合、一旦太陽電池からの充電を切り離した状態での電圧をチェックしています。
さらに「バッテリーが外されたか」のチェックも行っています。基本的には「バッテリーの電圧が極端に小さい場合」または「充電電流が小さい場合」が、バッテリーが外されている状態とみなします。ただし充電電流が小さい場合は発電量が小さい場合もあるので、この時は一旦充電を切り離した状態での電圧をチェックしています。

ユーザーインターフェースとしてはボタン1個を用意しました。これを押すと割り込みがかかり、スリープから復帰するとともに「設定モード」に移行します。設定モード中ではボタンを押す毎に、充電・放電するバッテリーが順次切り替わります。しばらくボタンを押さずに放置すれば設定モードから抜け、設定されたバッテリーへの充電・放電がされるようになります。

ソフトは、イベント駆動型プログラムのスケルトンから派生して作っています。このため随所に無駄がありますが、Arduinoで大切なのは「手軽に簡単に作れること」なので、ある程度の無駄は無視しています(笑)。

スケッチのダウンロード

使ってみて

なんといっても低消費電力なので、充電されていない夜間でも気にすることなくバッテリーに接続したままにできます。そのまま太陽が昇ってくれれば充電してくれます。いい感じ。

 



home | Elec top

inserted by FC2 system