このQ&Aは役に立ちましたか?
ATTiny13Aが省電力化できない
2023/09/07 04:24
- ATTiny13Aでフォトカプラを一定時間ONにする回路を作成しましたが、省電力にできません。
- 仕様としては10分、30分、60分をジャンパー等で選択し、ボタンを押したら一定時間の間、フォトカプラをONにします。
- LR44電池2個で1年以上、動けばと思っています。
ATTiny13Aが省電力化できない
2022/03/26 22:25
ATTiny13Aでフォトカプラを一定時間ONにする回路を作成しましたが、省電力にできません。
仕様としては10分、30分、60分をジャンパー等で選択し、ボタンを押したら一定時間の間、フォトカプラをONにします。
また、途中で再度、割り込みがあっても時間の延長はしません。
LR44電池2個で1年以上、動けばと思っています。
コードも拙い上、回路図もまともに書けない初心者ですが、よろしくお願いいたします。
#include <avr/wdt.h>
#include <avr/sleep.h>
//LED_PIN
#define LED_PIN (5)
//interrupt pin
#define ACC_IN (2)
//Time_select
#define TIME_PIN1 (0)
#define TIME_PIN2 (4)
#define TIME_PIN3 (1)
volatile int sleep_flg=0;
volatile int counter;
int count_max=15;//4second * 15 = 60 second
int wait_minutes=1;//wait_time (minutes)
//arduino wakeup interrupt
void wakeUp()
{
//wdt_reset();
//sleep end
sleep_flg = 0;
//counter reset
counter = 0;
}
//watch dog timer setup
void wdt_set()
{
wdt_reset();
cli();
MCUSR = 0;
WDTCR |= 0b00011000; //WDCE WDE set
WDTCR = 0b01000000 | 0b100000;//WDIE set |WDIF set scale 4 seconds
sei();
}
//watch dog timer unset
void wdt_unset()
{
wdt_reset();
cli();
MCUSR = 0;
WDTCR |= 0b00011000; //WDCE WDE set
WDTCR = 0b00000000; //status clear
sei();
}
//watch dog timer call
ISR(WDT_vect)
{
//wdt_reset();
if(sleep_flg == 1)
{
counter++;
if( counter >= (count_max * wait_minutes))
{
//sleep end
sleep_flg = 0;
//counter reset
counter = 0;
}
}
else
{
}
}
//status reset
void init_status()
{
counter=0;
}
//sleep arduino
void sleep()
{
wdt_set(); //watch dog timer set
sleep_flg=1; //enable on sleep flag
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //set sleep mode
attachInterrupt(0,wakeUp, RISING); //set level interrupt
while(sleep_flg){
noInterrupts(); //cli();
sleep_enable();
interrupts(); //seii();
sleep_cpu(); //cpu sleep
sleep_disable();
byte adcsra_old = ADCSRA; //NEW
ADCSRA = 0; //NEW
ADCSRA = adcsra_old; //NEW
}
wdt_unset(); //watch dog timer unset
detachInterrupt(0); //unset level interrupt
}
//set up
void setup()
{
init_status();
pinMode(LED_PIN,OUTPUT);
pinMode(ACC_IN, INPUT);
pinMode(TIME_PIN1, INPUT);
pinMode(TIME_PIN2, INPUT);
pinMode(TIME_PIN3, INPUT);
}
//main loop
void loop()
{
if(!digitalRead(ACC_IN))
{
sleep(); //sleep
if (digitalRead(0) == HIGH) {
digitalWrite(5, HIGH);
//delay(1800000); // Wait for 1800 second(s)
uint16_t i;
for (i = 0; i < 10*60; i++) { _delay_ms(1000); }
digitalWrite(5, LOW);
delay(1000); // Wait for 1 second(s)
} else {
if (digitalRead(4) < HIGH) {
digitalWrite(5, HIGH);
//delay(600000); // Wait for 600 second(s)
uint16_t i;
for (i = 0; i < 30*60; i++) { _delay_ms(1000); }
digitalWrite(5, LOW);
delay(1000); // Wait for 1 second(s)
} else {
if (digitalRead(1) < HIGH) {
digitalWrite(5, HIGH);
//delay(36000000000); // Wait for 3600 second(s)
uint16_t i;
for (i = 0; i < 60*60; i++) { _delay_ms(1000); }
digitalWrite(5, LOW);
delay(1000); // Wait for 1 second(s)
} else {
delay(1000); // Wait for 1 second(s)
}
}
}
sleep(); //sleep
}
}
質問者が選んだベストアンサー
とりあえずご希望の用途であれば
①タイマ開始のトリガにはAVRマイコンの機能である5番ピンのLowレベル割り込み(INT0)を使って割り込み駆動にするべき
②リセット後は128kHzクロックに切り替え割り込みが来ないときにはパワーダウンモードに入りクロックを止めて割り込み待ち
③10分、30分、60分のタイマー動作はウォッチドッグタイマー最大で8秒ごとに割り込みかかるので毎回CPUをパワーダウンしながら75,225,450をカウントしてタイマー動作させる。
でも120mAhのLR44電池2個直列でフォトカプラを駆動するとなると
5mA動作でも24時間分しか無いですよ。60分タイマーなら24回使ったら電池無くなりますよ。
このQ&Aは役に立ちましたか?
この質問は投稿から一年以上経過しています。
解決しない場合、新しい質問の投稿をおすすめします。
その他の回答 (4件中 1~4件目)
>LEDはフォトカプラの動作確認です。実際はスイッチのON-OFFをフォトカプラでしたいだけです。
いやいや・・・・フォトカプラの中のLEDを言ったんですけどね。
フォトカプラの中身ってどうなるか知らないんですか?
ジャンパーの電力削減なら。IOピンが一つ余ってるんだからマイナスコモンをそのピンにあてて、待機中はHighにしとけばいいんです。
必要な時だけLowにしてジャンパーの状態を読めばいい。
フォトカプラじゃON時電流がでかいので、許されるならFETを使えばいい。電圧制御素子なので駆動電流を限りなくゼロに出来ます。
補足
2022/03/28 08:48
お世話になっております。
ご回答、ありがとうございます。
LEDを外にも使用していましたので、フォトカプラの中のLEDとは気づきませんでした。
すみませんでした。
フォトカプラの中身は理解しています。
>ジャンパーの電力削減なら。IOピンが一つ余ってるんだからマイナスコモンをそのピンにあてて、待機中はHighにしとけばいいんです。
必要な時だけLowにしてジャンパーの状態を読めばいい。
なるほど、やってみます。
>フォトカプラじゃON時電流がでかいので、許されるならFETを使えばいい。電圧制御素子なので駆動電流を限りなくゼロに出来ます。
接続する機器の関係で、フォトカプラかリレーで行う必要がありましたので、FETは使えません。
ATTiny13Aが動いてるから
https://higeborin.blog.fc2.com/blog-entry-22.html
補足
2022/03/27 21:58
ご教授いただきましたサイトも参考にさせていただきましたが、ジャンパーピンの選択とボタンONでスリープから抜ける方法が分からず、別なサイトの情報からコード書きました。
ご教授いただきましたサイトも参考に勉強してみます。
ありがとうございました。
かなり道のりは遠いですね。
Arduino言語で書かれているので若干なにがなんだかですが・・・・
ウォッチドッグをタイマー代わりに使っているのに、なぜdelayを使うのか?
LED点灯中はずっと電力を使っちゃうのですか?
まあ、フォトカプラのLEDほど消費しないのでどうでもいいですが。
タクトスイッチが押されたらスリープから復帰しようとしています?
無理ですよ、そのピンはパワーダウン中は機能しません。
ジャンパーによってはプルダウン抵抗で常に電力消費しますね。
1年なんて夢のまた夢かな。
補足
2022/03/27 21:50
説明が不足しており、申し訳ありません。
>ウォッチドッグをタイマー代わりに使っているのに、なぜdelayを使うのか?
参考にしたサイトで、ウォッチドッグでスリープして消費電力を抑え、スイッチONでリレー等をONにしていましたので、それを参考にしました。
LEDはフォトカプラの動作確認です。実際はスイッチのON-OFFをフォトカプラでしたいだけです。
(すみません、どこのサイトか忘れました。)
>タクトスイッチが押されたらスリープから復帰しようとしています?
無理ですよ、そのピンはパワーダウン中は機能しません。
ジャンパーによってはプルダウン抵抗で常に電力消費しますね。
ご指摘の通り、プルダウン抵抗で常に電力消費してしまうので、こちらで質問させていただきました。
ありがとうございました。
補足
2022/03/27 22:15
ご教授、ありがとうございます。
やはり、5番ピンのLowレベル割り込み(INT0)を使って割り込み駆動が良いのですね。
②、③は自分の理解度では難しいかもしれませんが、頑張ってやってみたいと思います。
ちなみのLEDは動作確認のためで、実際は通信機のスイッチをONにしたいと思っていますので、スリープで駆動できる時間は1年程度、フォトカプラをONにする時間は400時間程度あればと考えています。
通信機の送信スイッチの電気的特性
接点入力条件
Open:端子間抵抗1MΩ以上、Close:端子間抵抗200Ω以下
信号検知
Open→Closeの片エッジ
極性
無し