本文へ移動
サポートシェアリングソリューション
OKWAVE Plus

このQ&Aは役に立ちましたか?

ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ATTiny13Aが省電力化できない)

ATTiny13Aが省電力化できない

2023/09/07 04:24

このQ&Aのポイント
  • 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
}
}

投稿された画像

質問者が選んだベストアンサー

ベストアンサー
2022/03/27 18:03
回答No.3

とりあえずご希望の用途であれば
①タイマ開始のトリガにはAVRマイコンの機能である5番ピンのLowレベル割り込み(INT0)を使って割り込み駆動にするべき
②リセット後は128kHzクロックに切り替え割り込みが来ないときにはパワーダウンモードに入りクロックを止めて割り込み待ち
③10分、30分、60分のタイマー動作はウォッチドッグタイマー最大で8秒ごとに割り込みかかるので毎回CPUをパワーダウンしながら75,225,450をカウントしてタイマー動作させる。

でも120mAhのLR44電池2個直列でフォトカプラを駆動するとなると
5mA動作でも24時間分しか無いですよ。60分タイマーなら24回使ったら電池無くなりますよ。

補足

2022/03/27 22:15

ご教授、ありがとうございます。
やはり、5番ピンのLowレベル割り込み(INT0)を使って割り込み駆動が良いのですね。
②、③は自分の理解度では難しいかもしれませんが、頑張ってやってみたいと思います。

ちなみのLEDは動作確認のためで、実際は通信機のスイッチをONにしたいと思っていますので、スリープで駆動できる時間は1年程度、フォトカプラをONにする時間は400時間程度あればと考えています。

通信機の送信スイッチの電気的特性
接点入力条件
Open:端子間抵抗1MΩ以上、Close:端子間抵抗200Ω以下

信号検知
Open→Closeの片エッジ

極性
無し

質問者

このQ&Aは役に立ちましたか?

この質問は投稿から一年以上経過しています。
解決しない場合、新しい質問の投稿をおすすめします。

質問する

その他の回答 (4件中 1~4件目)

2022/03/27 23:13
回答No.4

>LEDはフォトカプラの動作確認です。実際はスイッチのON-OFFをフォトカプラでしたいだけです。

いやいや・・・・フォトカプラの中のLEDを言ったんですけどね。
フォトカプラの中身ってどうなるか知らないんですか?

ジャンパーの電力削減なら。IOピンが一つ余ってるんだからマイナスコモンをそのピンにあてて、待機中はHighにしとけばいいんです。
必要な時だけLowにしてジャンパーの状態を読めばいい。

フォトカプラじゃON時電流がでかいので、許されるならFETを使えばいい。電圧制御素子なので駆動電流を限りなくゼロに出来ます。

補足

2022/03/28 08:48

お世話になっております。
ご回答、ありがとうございます。

LEDを外にも使用していましたので、フォトカプラの中のLEDとは気づきませんでした。
すみませんでした。
フォトカプラの中身は理解しています。

>ジャンパーの電力削減なら。IOピンが一つ余ってるんだからマイナスコモンをそのピンにあてて、待機中はHighにしとけばいいんです。
必要な時だけLowにしてジャンパーの状態を読めばいい。

なるほど、やってみます。

>フォトカプラじゃON時電流がでかいので、許されるならFETを使えばいい。電圧制御素子なので駆動電流を限りなくゼロに出来ます。

接続する機器の関係で、フォトカプラかリレーで行う必要がありましたので、FETは使えません。

質問者
2022/03/27 10:33
回答No.2

ATTiny13Aが動いてるから
https://higeborin.blog.fc2.com/blog-entry-22.html

補足

2022/03/27 21:58

ご教授いただきましたサイトも参考にさせていただきましたが、ジャンパーピンの選択とボタンONでスリープから抜ける方法が分からず、別なサイトの情報からコード書きました。
ご教授いただきましたサイトも参考に勉強してみます。
ありがとうございました。

質問者
2022/03/26 23:55
回答No.1

かなり道のりは遠いですね。
Arduino言語で書かれているので若干なにがなんだかですが・・・・
ウォッチドッグをタイマー代わりに使っているのに、なぜdelayを使うのか?
LED点灯中はずっと電力を使っちゃうのですか?
まあ、フォトカプラのLEDほど消費しないのでどうでもいいですが。
タクトスイッチが押されたらスリープから復帰しようとしています?
無理ですよ、そのピンはパワーダウン中は機能しません。
ジャンパーによってはプルダウン抵抗で常に電力消費しますね。
1年なんて夢のまた夢かな。

補足

2022/03/27 21:50

説明が不足しており、申し訳ありません。

>ウォッチドッグをタイマー代わりに使っているのに、なぜdelayを使うのか?

 参考にしたサイトで、ウォッチドッグでスリープして消費電力を抑え、スイッチONでリレー等をONにしていましたので、それを参考にしました。
 LEDはフォトカプラの動作確認です。実際はスイッチのON-OFFをフォトカプラでしたいだけです。
 (すみません、どこのサイトか忘れました。)

>タクトスイッチが押されたらスリープから復帰しようとしています?
無理ですよ、そのピンはパワーダウン中は機能しません。
ジャンパーによってはプルダウン抵抗で常に電力消費しますね。

 ご指摘の通り、プルダウン抵抗で常に電力消費してしまうので、こちらで質問させていただきました。

 ありがとうございました。

質問者

お礼をおくりました

さらに、この回答をベストアンサーに選びますか?

ベストアンサーを選ぶと質問が締切られます。
なおベストアンサーを選びなおすことはできません。