google-site-verification: google3bd66dd162ef54c7.html

小さな太陽電池でArduinoを連続運転する実験 その2

 以前やった実験の続報です。その後の経過をざっとおさらいすると、
電池を100均のソーラーアクセントライトのニッケル水素電池3個に変更
ソーラーアクセントライトの太陽電池4個に変更

ということになっていて、この試みを行うきっかけとなった秋月の小型太陽電池と電気二重層コンデンサは使わなくなっています。

 今回の記事はその続報で、しばらく連続運転した結果です。

▼回路図
回路図
 左側の電池まわりが以前の回路図と少し変わっています。なお、電池の充放電状態をモニタするために1Ωのシャントを入れたのを書き忘れました。ニッケル水素電池と並列に電気二重層キャパシタが入っているのは、電池がすっからかんの場合にCPUの起動に失敗することがあったためです。(起動時にEEPROMの全データーのダンプと初期化を行うので5秒くらいフルパワーが必要)

▼ブレッドボード
ブレッドボード
 緑色の部品が80mAhのニッケル水素電池です。

▼太陽電池の設置状態
窓ガラスに太陽電池を貼った
 設置というか、単に窓ガラスにテープで留めただけです。

▼電池電圧の変化
電池電圧推移
 ArduinoのEEPROMに記録した12日分の電池電圧の変化で、横軸は月/日で、縦軸のスケールはmVです。

 記録は20分間隔で行っており、記録単位は25mVステップにして1データを1バイトで表現。それでもEEPROMは512バイトしかないので1週間くらいしか連続記録出来ません。そこで途中でデーターを取り出してPCで合成しています。

 途中で天気の悪い日もありましたが、明け方でも3.7V以上は維持できています。電池の定格電圧の3.6V (3 x1.2V) を下回っていないので、たぶんこのまま動き続けることが出来そうです。

▼スケッチ
 もっとサブルーチン化した方が読みやすいのですが、とりあえず今動いているものをそのまま掲載します。

 動作としては、リセット後にEEPROMの全データーをシリアルにダンプするので、必要に応じターミナルソフトなどでデーターを記録。プッシュスイッチ (CPUの14ピン) を押して離すと、EEPROMの全領域をクリアして運転を開始。loop()を開始。
 運転中は4秒毎に太陽電池電圧とバッテリー電圧を測定。バッテリー電圧が2V以上で太陽電池電圧が1.5V以下なら、LEDをフラッシュ。20分毎にバッテリー電圧をEEPROMに記録。太陽電池の端子をショートさせる(0Vにする)と4秒周期でLEDがフラッシするので、プログラムが正しく動いていることが確認出来ます。
/* 小さな太陽電池とニッケル水素電池でArduinoを動かす実験
* delayWDT関数を使って消費電流できるだけ削減
* 電池電圧を20分ごとに測定してEEPROMに記録 (7日分記録)
* 記録の単位は25mV (5V なら 200)
* 2015/12/13 ラジオペンチ 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点灯)

eepDump();

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 <= 511) { // EEPROMのアドレス範囲内なら
recInterval++; //
if (recInterval == 300) { // 4秒*300回 = 20分間隔で
EEPROM.write(nn, cellV / 25); // キャパシタ電圧を記録 unit=25mV
nn++;
recInterval = 0;
}
}
delayWDT(8); // 4秒間隔で繰り返す
}

void eepDump() {
digitalWrite(10, HIGH);
for (int i = 0; i <= 511; i++) { // EEPROMの内容をダンプ
x = EEPROM.read(i);
Serial.print(i); // アドレス
Serial.print(", ");
Serial.println(x); // データ
}
delay(100); // データー送信完了まで待つ
digitalWrite(10, LOW);
}

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++; // 必要ならコメントアウトを外す
}

 プログラムでやっていることはほとんど無いに等しい状態ですが、まずは太陽電池だけで動き続けることが出来るマイコンを手に入れることが目標です。
 そういうマイコンがあれば、もっと複雑な機能を組み込む。あるいは電池やAC電源で動く機器の電源管理などが可能になるはずです。
関連記事

コメントの投稿

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

No title

処理内容にもよりますが、こちらでは、Mega88Vを1MHzで動作させて
1分ごとにSLEEPから起動して、気温、湿度、気圧のデータ収集を
行なって、別マイコンに、赤外線で送信する、ということを、
行なっていまして、一日晴れれば、3-4日程度は動作しています
(Arduinoの動作速度を動的変更・・・と言うページを参考にしています)

パンダ43さん、おはようございます

情報ありがとうございます。

なんでも作っちゃう、かも。さんが解説されている prescalerライブラリのことでしょうか。確かにその手はありますね。

ただちょっとひっかかっているのは、

クロック下げると実行速度も下がるので、同じコードを食わせると消費電力は同じ。もちろん電源電圧下げれば消費電力は下がりますが、

クロック下げるとI2CやSPIがうまく動かなくなる気がして、

ということなんですが、そうか、赤外線使う手がありますね。参考になります、ありがとうございます。

あけましたおめでとうございます

パンダ43です、今年もよろしくお願いいたします。
電源関係ですけど、電池は単4のニッケル水素(100均)に
変更して電圧は3.3vに昇圧して使用しています。
電池の電圧を測定して1.1vで停止し、1.45v以上では
SLEEPしないで待機し、過充電を防止いています。
今後は、電圧によって測定間隔を広げて、停止してしまう
空白の時間を少なくする工夫をしようと思っています。
(1.2vになったら間隔を長くするなど)
それと、Tiny13Aを内蔵して、車のセキュリティーライトもどき
なども作っていますがこちらはフル充電では一週間ほどホタル
のように光っています。

re:あけましたおめでとうございます

パンダ43さん、今年もよろしくお願いいたします。

そうですね、電池は単4のニッ水あたりが容量的に余裕があっていいですよね。

CPUを動かして過充電対策にする手は考えたことありますが、CPUがバグなどで暴走した時に過充電防止が出来ないのが心配なので、今のところやってません。
かと言って、充電電圧を低めの設計にすると、満充電に出来ない恐れがあるので難しいところですね。

No title

パンダ43です。
車のセキュリティーライトはもう3年目に入りますが、週一で
電圧の点検をする程度で、いまだに、電池がへたることもなく
順調に点灯しています。
ただ、北海道の冬は、フロントガラスに雪が積もって充電量が
少なくなるので、どこまで点灯し続けるか試練の年になりそうです。
ソーラーガーデンライトは、もう、30本以上のバリエーションを
テストしていますが、故障の原因は、電池の接点不良がほとんどで
二番目が、ソーラーパネルに水が入って腐食し発電しなくなる
でした、マイコンの不良は発生していません。
(ちなみに、使用しているのはPIC10F200か222、Tiny13Aです)

パンダ43さん、おはようございます

PICにAtinyですか、私 Arduino UNOしか使ったこと無いのでうらやましいです。

それと、ソーラーパネルの腐食はやはり発生しますか。見た目でも太陽電池の防水は頼りない感じがしてました。

ソーラーパネル

Panda43です。
ソーラーパネルは、ゼリータイプの瞬間接着剤で周りを埋めて
使用していますが、どうしても、完全に防水は出来ないようです。
アモルファスタイプの裸のパネルは湿度が高くなると腐食する
ようです。
でも、中国から3.0mmx3.6mmのソーラーパネルを購入して
交換して使用しているものは全然問題ありません。
(一枚50円程度で購入できるので40枚ほど購入しました)
今年は50円の多結晶シリコンモジュールで色々作ってみたいと
思っています。
(Aruduinoで作れるのなら、PICもAtinyでも大丈夫だと思いますよ
 初期設定だけはちょっと面倒ですが・・・・
 一度作ってしまえばコピペでOKです)

re:ソーラーパネル

Panda43さん、もろもろ了解です。

この記事で取り上げている100円ショップのソーラーアクセントライトの太陽電池は、水が溜まってしまいそうな構造なので、屋外で長期間動かすのは難しそうです。
カレンダー
05 | 2017/06 | 07
- - - - 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 -
プロフィール

ラジオペンチ

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

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