google-site-verification: google3bd66dd162ef54c7.html

小さな太陽電池でArduinoを連続動作させる実験

 このあいだ秋月に行った時に、電気二重層キャパシタと小さな太陽電池を衝動買いしてしまいました。これを使ってArduinoを連続動作させることが出来るか確認してみたかったからです。

 こういうケースでは回路をいかにして省エネで動かすかがポイントになります。以前の記事のArduinoで豪華にLチカをコイン電池で動かすである程度のレベルの省エネは出来ていたのでその応用で何とかならないかと考えた次第です。

 なお、この記事ではArduinoと呼んでいますが、実際に動かすのはArduinoのIDEで書き込みを行ったCPUのATmega328Pです。

▼電気二重層コンデンサー
電気二重層キャパシタ 5.5V/1F
 NECトーキン製で、容量は1F、耐圧5.5Vです。秋月の通販コードはP-07345 この記事の執筆時点で単価は150円で、これを2個購入。電気二重層コンデンサは耐圧が低いので使い難いと思っていたのですが、最近は5Vを越す物があるんですね。

▼太陽電池 (この写真は取説で、現物ではありません)
300mW太陽電池
 大きな容量の太陽電池を使えばArduinoの連続動作は簡単に出来るでしょう。でもパネルが大きいと使い難い物になってしまいます。これくらいのサイズ (67.5 X 41.0mm) の太陽電池で24時間連続動作が出来れば、いろいろな使い方が生まれるはずです。

 このパネルの最大出力は4.5V/65mA(300mW)となっています。無負荷の開放電圧は5.7Vなので逆流防止ダイオードをかませれば5Vの負荷にちょうど良さそうな気がします。

▼回路図 (クリックで別窓に拡大)
太陽電池と電気二重層キャパシタでArduinoを動かす
 いろいろな方式が考えられますが、DC-DCコンバーターで5Vに昇圧することにしました。使ったDC-DCコンバーターは秋月の通販コードM-03451の物です。これ、無負荷だと15μAくらいしか電流を消費しないので気に入ってます。(秋月には他にM-08619がありますが、たぶんこれでもOKと思います)

▼ブレッドボードで動作確認中
実験中

◆プログラム
 ArduinoのCPU(ATmega328P)をそのまま動かすと10mA以上の電流を消費するので、容量2Fのコンデンサに貯まったエネルギーはあっという間に無くなってしまいます。そこで出来るだけCPUをスリープモードに入れて無駄な電力を消費しないようにプログラムしています。ちなみにスリープモードに入るとCPUは28μAくらいしか電流を消費しません。なおDC-DCコンバータの入力電流は、変換電圧の倍率に効率を加味した分が消費されます。なお、CPUが目覚めた時は大きな電流を消費しますが、ごく短時間なのでエネルギー量としてはあまり大きくはならないです。

 ということでスリープをうまく使うことは重要です。でもスリープばかりさせていては面白くないので、以下の二つの機能を仕込んでみました。

1) 4秒毎にスリープから抜け出して電圧を測定。暗かったら(太陽電池電圧が1.5V以下)ならLEDをフラッシュ。但しキャパシタ電圧2V以下なら節電のためフラッシュしない。なお、4秒はウォッチドッグタイマーのCRオシレーターを使っているので精度は悪いです。

2) キャパシタ電圧を10分毎にEEPROMに記録。1データーは2バイトなので256回分(42時間)のデーターを記録。EEPROMのデーターは電源ON時直後に全てCSV形式でシリアルに流す(これをPCのターミナルソフトなどで読み取る)。 記録開始はスイッチ操作により行い、その時古いデータは全てクリアする。

/* 小さな太陽電池と電気二重層キャパシタでArduinoを動かす実験
* delayWDT関数を使って消費電流できるだけ削減
* 電池電圧を10分ごとに測定してEEPROMに記録
* 2015/12/2 ラジオペンチ http://radiopench.blog96.fc2.com/
*/

#include <avr/sleep.h> // スリープモードを使用
#include <avr/wdt.h> // ウォッチドッグタイマーを使用
#include <EEPROM.h> // EEPROMを使用

int solarV; // 太陽電池電圧(単位=1mV)
int cellV; // 電池電圧(単位=1mV)
int recInterval = 0;
int nn = 0;
int x;

void setup() {
Serial.begin(9600);
pinMode(8, INPUT_PULLUP); // 動作モードスイッチ
pinMode(10, INPUT); // 表示用LED (プルアップ抵抗でLED点灯)

for (int i=0; i <= 510; i=i+2) { // EEPROMの内容をダンプ
x = (EEPROM.read(i) << 8) | (EEPROM.read(i + 1));
Serial.print(i / 2); // アドレス
Serial.print(", ");
Serial.println(x); // データ
}

while (digitalRead(8) == HIGH) { // Pin8がLOWになるまで待つ
delayWDT(0); // 電池の消耗を防ぐために16msスリープ
}
delay(30);
while (digitalRead(8) == LOW) { // Pin8がLOWの期間は
digitalWrite(10, HIGH); // 確認のためにLEDを点灯
}
digitalWrite(10, LOW); // Pin8がHIGHになったのでLEDを消灯

for (int i = 0; i <= 511; i++) { // EEPROMをクリア
EEPROM.write(i, 0);
}
for ( int i = 0; i < 5; i++) { // メインループに入る合図にLEDを点滅
digitalWrite(10, HIGH);
delay(10);
digitalWrite(10, LOW);
delay(200);
}
}

void loop() { // メインループ
sensVoltage(); // 電圧読取り
if (solarV < 1500) { // 太陽電池が1.5V以下で、
if ( cellV > 2000) { // バッテリー電圧が2V以上あるなら
digitalWrite(10, HIGH); // LEDを点灯
delayWDT(0); // 16ms
digitalWrite(10, LOW); // LED消灯
}
}
if (nn <= 510) { // EEPROMのアドレス範囲内なら
recInterval++; //
if (recInterval == 150) { // 4秒*150回 = 10分間隔で
EEPROM.write(nn, cellV >> 8); // キャパシタ電圧を記録
EEPROM.write(nn+1, cellV & 0x00FF);
nn = nn + 2;
recInterval = 0;
}
}
delayWDT(8); // 4秒間隔で繰り返す
}

void sensVoltage() { // 太陽電池と電気二重層キャパシタの電圧を読み取る
solarV = analogRead(0); // プリチャージのためのダミー読み出し
solarV = analogRead(0); // 太陽電池電圧を読取る
solarV = 4.883 * solarV; // 1mV単位にスケーリング 5000mV/1024=4.883

cellV = analogRead(1);
cellV = analogRead(1); // キャパシタ電圧の読取り
cellV = 4.883 * cellV;
}

// 以下はdelayWDT関数
void delayWDT(unsigned long t) { // パワーダウンモードでdelayを実行
delayWDT_setup(t); // ウォッチドッグタイマー割り込み条件設定
ADCSRA &= ~(1 << ADEN); // ADENビットをクリアしてADCを停止(120μA節約)
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // パワーダウンモード
sleep_enable();
sleep_mode(); // ここでスリープに入る
sleep_disable(); // WDTがタイムアップでここから動作再開
ADCSRA |= (1 << ADEN); // ADCの電源をON (|=が!=になっていたバグを修正2014/11/17)
}

void delayWDT_setup(unsigned int ii) { // ウォッチドッグタイマーをセット。
// 引数はWDTCSRにセットするWDP0-WDP3の値。設定値と動作時間は概略下記
// 0=16ms, 1=32ms, 2=64ms, 3=128ms, 4=250ms, 5=500ms
// 6=1sec, 7=2sec, 8=4sec, 9=8sec
byte bb;
if (ii > 9 ) { // 変な値を排除
ii = 9;
}
bb = ii & 7; // 下位3ビットをbbに
if (ii > 7) { // 7以上(7.8,9)なら
bb |= (1 << 5); // bbの5ビット目(WDP3)を1にする
}
bb |= ( 1 << WDCE );

MCUSR &= ~(1 << WDRF); // MCU Status Reg. Watchdog Reset Flag ->0
// start timed sequence
WDTCSR |= (1 << WDCE) | (1 << WDE); // ウォッチドッグ変更許可(WDCEは4サイクルで自動リセット)
// set new watchdog timeout value
WDTCSR = bb; // 制御レジスタを設定
WDTCSR |= _BV(WDIE);
}

ISR(WDT_vect) { // WDTがタイムアップした時に実行される処理
// wdt_cycle++; // 必要ならコメントアウトを外す
}

▼EEPROMに記録されたデータの例
電気二重層キャパシタの電圧変化
 回路を置いた場所は、室内の南向きの窓に面した机の上です。

 フル充電すれば18時間く以上動き続けていることが判ります。二日目の9時くらいで電圧が少し上がっているのは明るくなったため、あるいはキャパシタ電圧が2V以下になったのでLEDのフラッシュを停止したためだと思います。この後で測定中断していますが、曇りで電圧がほとんど上がらなかったので実験を中止したためです。

 直射日光が当たれば30分以内で満充電になります。逆に言うと、それ以降発生した太陽電池のエネルギーは利用できていないことになります。

 ということでデーターが取れ始めたので少しずつ様子が見えてきました。このまましばらくデーターを取って今後どうすれば良いか考えたいと思います。今見えている改善点は、蓄電量をもっと増やすことですが、さてどうするか。
関連記事

コメントの投稿

管理者にだけ表示を許可する

車上荒らし対策用フラッシャーに?

いつも興味深い実験例とデータ公開をありがとうございます。

「LEDを点滅させる」という実験例を見て「夜間の車上荒らし対策用フラッシャー」に使えそうだと感じました。
日中の太陽電池から電圧が出ている間は休止、暗くなって発電が減ってきたなら赤LED数個点滅開始、人が近づいて来たなら点滅速度を速くする。

最近は「人感センサー」も省電力対応品が出ているようです。
秋月で販売している「焦電型赤外線(人感)センサーモジュール SB412A」の説明には「待機電流:12μA」とありました。

re:車上荒らし対策用フラッシャーに?

mytoshiさん、おはようございます。

LEDの点滅が出来ればマイコンで他のことも出来るようになりますよね。そのために、まずは自立して安定に動くものを作ろうと思います。

ちょっと気になったのですが、焦電センサはガラス越しには使えないと思います。なので車内設置にして車外監視は難しい気がします。

ガラス越し不可、了解です

> 焦電センサはガラス越しには使えないと思います。

私はセンサの特性を理解していませんでした。ガラス越しでは「使えない」です。
調査せずに思い付きだけでは駄目だということを理解できました。ご指摘をありがとうございます。

以下引用
[Panaの焦電型モーションセンサ[NaPiOn]のリファレンスガイドに
記載のQ/A

本センサが検出できる波長は約5μm以上の長い波長です。
 しかし、一般のガラスなどは2μmまでの波長の遠赤外線しか通すことができず、ガラスの向こう側で人が動いても検出しません。]
引用終わり

re:ガラス越し不可、了解です

mytoshiさん、了解です。

ちなみに焦電型センサーの窓材やレンズには、ガラス以外の材質が使われているのは同じ理由です。

降圧の場合

ラジオペンチ様、あちこちからすいません。
昇圧のおすすめ2種類はこのページで読ませて頂きました。降圧で5vまたは3.3vにしたい場合のおすすめ
DCDCモジュールがあれば教えてください。
もちろん、高効率で無負荷時でも超底消費電流が希望
です。私はあちこち検索はしてみたものの対して良い
ものは見つからずCMOSタイプの三端子レギュレータを
使用してます.もっと良いものがあれば助かります.
よろしくお願い致します.

re:降圧の場合

try2breakさん、こんにちは。

降圧のDDコンで消費電流の少ないものは使ったことがありません。定番のNJM2360は無負荷でも数mA食いますよね。

検索してみると、秋月なら
http://akizukidenshi.com/catalog/g/gI-08177/
SMDなので、場合によっては変換基板使うとか、

ストリナならこのへんとか
https://strawberry-linux.com/catalog/items?code=13245
https://strawberry-linux.com/catalog/items?code=12015

どれも私は使ったことが無いので、仕様をよく調べてみてください。

No title

ありがとうございます!
ストリナのほうは基盤付きなので高いですねー。
今度秋月の1個400円のほうを実験用でテストしてみます.
ですが、DIP変換基盤を作ってからでないと私の目が
着いていけない。。。

私が今作ろうとしているものは、S8081BというICを
使います.これはディスコンとなっていてプレミアとも
思われるほど高く取引されています。私は少しこの
ICを持っていますがもったいないので出来れば使いたくないのです。秋月のLTC3245EMSEが使えると
すれば間接的に私の構想から8081Bを使わなくても
良い状況になりうれしいのですが、1個400円とも
なるとちょっと難しいものがあります。
ファンクションが全く違うDCDCとタイマをダイレクトに
置き換えるのではなく、間接的に(結果として)置き換え
可能になるという意味です.
(話が少し脱線して、私事になり申し訳ありませんです)

とりあえず、こんど買ってきて実験だけはしておこうと
おもいます。ありがとうございました!!

re:降圧の場合

いろいろ、考えた結果、やはり8081Bはもったいないので
使うのは止めることにしました.それと、値段的なことや
出力電流、使いやすさ等を考えると、やはり今使っている
http://akizukidenshi.com/catalog/g/gI-00671/
http://akizukidenshi.com/catalog/g/gI-00432/
これらを使うことにしました.
で、これを可能にするために、ラジオペンチさんの
delayWDT()を使わせていただきます.
8秒ごとに起き上がって10時間のスリープを作っても
それで良いかなぁと思いはじめてきました。
現状の回路をちょっと修正して作り直して見ます.

何もせずにぼーっと考えていたらこんな時間になってしまいました.
ではでは、おやすみなさい。

re2:降圧の場合

try2breakさん、おはようございます

何をされようとしているのか完全に理解できていないのですが、
CMOSの3端子レギュレーターの無負荷電流はものすごく小さいので、そういう手もありでしょうね。

確かバッテリー電圧の監視をお考えだったと思います。バッテリーの自己放電量に対して、監視系の消費電流が無視出来る程度に抑えることが出来たら、それ以上は頑張っても仕方ない気がしますが、どうなんでしょう。

delayWDT関数の時間精度は悪いのでご注意下さい。8081BもCRオシレーターのようなので、原理的な精度は同等でしょうか。

あと、コメント入れる時にURL欄にそちらのブログのアドレス
http://try2break.blog.fc2.com/
を書いておくと、読者の方に便利です。それに多少の集客効果もあります。

re2:降圧の場合

ラジオペンチ様、ありがとうございます。
私が今やろうとしているのは確かにバッテリー電圧
監視です。単にセンサー値をWifiで飛ばすだけのこと
です.これだけを考えるとラジオペンチ様のおっしゃる
とおりだと思います.

でも、例えば、これをベースに後々電池駆動で植物の
土中湿度を飛ばすものにも使ったりするかも知れ
ません。ですので、今後の利用の可能性も含めて
考えると消費電流を少なくするために頑張りすぎると
いうことはないように思えます.
乾電池が放電するまえに、電池自体が腐って使えなく
なるくらい消費電流を抑えられたらそれはそれで
別の用途で役に立つこともあるとおもいます.
(太陽電池で動かせれば最高ですね.)

ですが、私の知識では到底無理なのかもしれないけど
やれるだけやってみようと思っています.ただし、お金の
かからない方法で。

delayWDT関数の時間精度のこともあちこち読ませて
頂いているので承知の上です.今回の私の用途では
全く問題なく使えると思っています.

ではでは、ありがとうございました!

re3:降圧の場合

try2breakさん今晩は。お話了解です。

マイコンを太陽電池などで動かし続けることが出来ると、いろんな用途がありますよね。

この記事の実験は、現在はソーラーガーデンライトの部品の流用に変わっていて、1週間以上太陽電池だけで動かすことが出来ています。まあ、ほとんど仕事らしい仕事はやらせていないのですが。近日中に記事で紹介できると思います。

あと、Arduinoから使える安いWifiモジュールがあるんですね。機会があったら遊んでみたくなりました。
カレンダー
07 | 2017/08 | 09
- - 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 - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード