SSブログ

新・踏切カンカン 省エネ? ATtiny13A版 [Arduino]

ATtiny13AでPWMを使った踏切カンカンです。

fk_tn13_pwm_sleep.png
接続は、8-PDIP/SOIC では、
 2 (PB3), 3 (PB4) をLEDに、
 4 (GND) を乾電池のマイナス極に、
 5 (PB0, OC0A) をスピーカーに、
 6 (PB1, INT0) をタクトスイッチで、ボタンを押すとGNDに落ちるように
 8 (VCC) を乾電池のプラス極に
つなぎます。

// 踏切音くん (ATtiny13, 9.2MHz), Sleep mode 付き
#include <avr/sleep.h>

byte swFlg  = 0;                                   // スイッチの状態

void setup() {
  DDRB   = B11001;                                 // PB0(OC0A)をサウンド出力, PB3,PB4をLED ,
  PORTB  = B10010;                                 // PB1(INT0)をスイッチ入力 (内部PullUp有効) とする
  TCCR0A = _BV(COM0A1) | _BV(WGM01) | _BV(WGM00);  // 8bit高速PWM
  TCCR0B = _BV(CS00);                              // 分周なし
  TIMSK0 = 0;                                      // Arduino の割り込みを潰す
}

void wakeUpNow() {       // here the interrupt is handled after wakeup
 }

void sleepNow() {        // here we put the arduino to sleep
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);           // sleep mode is set here
    sleep_enable();                                // enables the sleep bit in the mcucr register
    attachInterrupt(0, wakeUpNow, LOW);            // use interrupt 0 (pin 1) 
    sleep_mode();                                  // here the device is actually put to sleep!!
    sleep_disable();                               // first thing after waking from sleep:
    detachInterrupt(0);                            // disables interrupt 0 on pin 1
}
  
void loop() {
  unsigned int pwmVal, t;  
  if( !swFlg ) {                                   // スイッチが押されていなければスリープモードに入る
    OCR0B = 0;                                     // 消音
    PORTB &= ~B11000;                              // LEDを消灯
    sleepNow();                                    // sleep function called here
    PORTB |=  B10000;                              // LED点灯開始
  }
  swFlg = 0;                                       // スイッチの確認フラグを降ろしておく
  PORTB ^= B11000;                                 // LEDを交互に光らせる
  for( t = 0; t < 15000; t++ ) {                   // 音発生用のループ
    pwmVal = (t & B111111)  * (255 - (t>>6)) >> 6; // 計算式で音の波形をつくる
    while( !(TIFR0 & _BV(TOV0)) ) {                // タイマーがオーバーフローするのを待つ
      if( !(PINB & B00010) ) swFlg = 1;            // スイッチが押されていたら(LOWなら)フラグをたてる 
    }
    TIFR0 |= _BV(TOV0);                            // Timer/Counter0 Overflow Flag をクリア
    OCR0A = pwmVal;                                // PWMの値を指定
  }
}

電流計で電流を測ろうとしましたが、電池との間に挟むとなぜかうまく動かず測定できず、、。
あまりの省電力から通常電流への変化に電流計が対応できず電流計で電流が流れなかったという事だったらいいなぁと思っています。

nice!(0)  コメント(1)  トラックバック(0) 

nice! 0

コメント 1

panda43

while( !(TIFR0 & _BV(TOV0)) ) {
if( !(PINB & 0B00010) ) swFlg = 1;
}

if (LedCnt++ > 16000)
{
PORTB ^= 0B11000;
LedCnt = 0;
}
LEDの点滅をここに入れると、音とLEDのタイミングをずらすことができます

by panda43 (2013-03-06 10:28) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。