SSブログ

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

「踏切カンカン」を押しボタンスイッチで制御し、鳴らさない時はスリープモードに入るようにしてみました。

fumikiri_powersave.png
5Vのソケットに乾電池のプラス極、GNDに乾電池のマイナス極をつなぎ電力供給します。
(5Vのソケットは出力用なのかもしれませんが、ここから電力を供給することもできるみたい。単3乾電池2本で電圧は3Vしかありませんが、16MHzで動きました。)
スピーカーをデジタル3番ピンとGNDにつなぎます。
そして、デジタル2番ピン(INT0)は内部プルアップしておき、スイッチでGNDに落とすと、スリープから目覚めるようにしました。

// 踏切音くん (Arduino Uno / Duemilanove系, 16MHz), Sleep mode 付き
#include <avr/sleep.h>

#define PIN_SW    2   // Arduino pin 2 (ATmega328 PD2, INT0)をスイッチ入力 (固定, 変更不可)
#define PIN_SP    3   // Arduino pin 3 (ATmega328 PD3, OC2B)をサウンド出力 (固定, 変更不可)
#define PIN_LED1  12  // 信号のLED (変更可)
#define PIN_LED2  13  // 信号のLED (変更可)

boolean sigLED = 0;   // LEDの状態
boolean swFlg  = 0;   // スイッチの状態

void setup() {
  pinMode( PIN_SW,   INPUT_PULLUP );               // 内部プルアップ有効, LowでスイッチON
  pinMode( PIN_SP,   OUTPUT       );
  pinMode( PIN_LED1, OUTPUT       );
  pinMode( PIN_LED2, OUTPUT       );
  TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);  // 8bit高速PWM
  TCCR2B = _BV(CS20);                              // 分周なし (8分周なら TCCR2B = _BV(CS21);)
}

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 2) 
    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 2 so the
}

void loop() {
  unsigned int pwmVal, t;  
  if( !swFlg ) {                         // スイッチが押されていなければスリープモードに入る
    OCR2B = 0;                                 // 消音
    digitalWrite( PIN_LED1, LOW );             // LEDを消灯
    digitalWrite( PIN_LED2, LOW );
    sleepNow();                                // sleep function called here
  }
  swFlg = 0;                             // スイッチの確認フラグを降ろしておく
  digitalWrite( PIN_LED1, sigLED );      // LEDを交互に光らせる
  digitalWrite( PIN_LED2, sigLED ^= 1 );
  for( t = 0; t < 30000; t++ ) {         // 音発生用のループ
    pwmVal = (t & B1111111)  * (255 - (t>>7)) >> 7; // 計算式で音の波形をつくる
    while( !(TIFR2 & _BV(TOV2)) ) {                 // タイマーがオーバーフローするのを待つ
      if( digitalRead(PIN_SW) == LOW ) swFlg = 1;   // スイッチが押されていたらフラグをたてる 
    }
    TIFR2 |= _BV(TOV2);                  // タイマー/カウンター2 オーバーフロー・フラグ をクリア
    OCR2B = pwmVal;                      // PWMの値を指定
  }
}

LEDはつながず、スピーカーのみの場合の電流を確認してみます。
電池との間に、電流計をはさんで確認すると、、
fumikiri_sleep.jpg
ちなみにスピーカーも外してみると、20mA強でした。

Uno(Rev.1) 上の、ATMEGA8U2 にも電流が摂られてしまっているのでしょうか?



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