新・踏切カンカン 省エネ? [Arduino]
「踏切カンカン」を押しボタンスイッチで制御し、鳴らさない時はスリープモードに入るようにしてみました。
5Vのソケットに乾電池のプラス極、GNDに乾電池のマイナス極をつなぎ電力供給します。
(5Vのソケットは出力用なのかもしれませんが、ここから電力を供給することもできるみたい。単3乾電池2本で電圧は3Vしかありませんが、16MHzで動きました。)
スピーカーをデジタル3番ピンとGNDにつなぎます。
そして、デジタル2番ピン(INT0)は内部プルアップしておき、スイッチでGNDに落とすと、スリープから目覚めるようにしました。
LEDはつながず、スピーカーのみの場合の電流を確認してみます。
電池との間に、電流計をはさんで確認すると、、
ちなみにスピーカーも外してみると、20mA強でした。
Uno(Rev.1) 上の、ATMEGA8U2 にも電流が摂られてしまっているのでしょうか?
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はつながず、スピーカーのみの場合の電流を確認してみます。
電池との間に、電流計をはさんで確認すると、、
ちなみにスピーカーも外してみると、20mA強でした。
Uno(Rev.1) 上の、ATMEGA8U2 にも電流が摂られてしまっているのでしょうか?