SSブログ

踏切ガジェット [Arduino]

先日の踏切カンカンスリープモード付きを、電池ボックスケース(単3電池4本用で、2本を電池ボックスとして使用)に収めてみました。
gfk_kansei.jpg

前回のコードはボタンの判定やスリープに無駄があったのでちょっと改善してみました。
// 踏切音くん (ATtiny13, 9.2MHz), Sleep mode 付き
#include <avr/sleep.h>

volatile boolean 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 の割り込みを潰す
  attachInterrupt(0, wakeUpNow, LOW);              // use interrupt 0 (pin 2) 
}

void wakeUpNow() {       // here the interrupt is handled after wakeup
  swFlg = 1;                                       // スイッチが押されていたらフラグをたてる 
  detachInterrupt(0);                              // disables interrupt 0 on pin 2 so the
}

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

基板はこんな感じ
gfk_kairo.png
gfk_kiban.jpg
LEDは交互に光るので電流制限抵抗は1つでOK。ただLEDが明るすぎたので、後でもう少し抵抗値を上げました。

ケースはこんな感じで加工。
gfk_case.jpg

完成したのがコレ。

電車好きの息子のために、手作りクリスマスプレゼント。

Arduinoやブレッドボードでプロトタイピングは簡単にできても、そこから完成品を作るのはやっぱり慎重になります。
ハンダ付けしたら戻すのは一苦労。マイコンもケースに収めるためにはICソケットは使えないし。
でも完成品を作らなくては自己満足で終わってしまう、、。
来年はなるべく完成品ができるようにがんばりたいです。
nice!(0)  コメント(1)  トラックバック(0) 

nice! 0

コメント 1

たに

よくできてますね!
by たに (2016-10-23 15:37) 

コメントを書く

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

トラックバック 0

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