新・踏切カンカン 省エネ? ATtiny13A版 [Arduino]
ATtiny13AでPWMを使った踏切カンカンです。
接続は、8-PDIP/SOIC では、
2 (PB3), 3 (PB4) をLEDに、
4 (GND) を乾電池のマイナス極に、
5 (PB0, OC0A) をスピーカーに、
6 (PB1, INT0) をタクトスイッチで、ボタンを押すとGNDに落ちるように
8 (VCC) を乾電池のプラス極に
つなぎます。
電流計で電流を測ろうとしましたが、電池との間に挟むとなぜかうまく動かず測定できず、、。
あまりの省電力から通常電流への変化に電流計が対応できず電流計で電流が流れなかったという事だったらいいなぁと思っています。
接続は、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の値を指定
}
}
電流計で電流を測ろうとしましたが、電池との間に挟むとなぜかうまく動かず測定できず、、。
あまりの省電力から通常電流への変化に電流計が対応できず電流計で電流が流れなかったという事だったらいいなぁと思っています。
2012-11-27 05:04
nice!(0)
コメント(1)
トラックバック(0)
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)