続々・ゼルダのエフェクトーンモドキを自作する

LinkedIn にシェア
Delicious にシェア
LINEで送る
email this
Pocket

エフェクトーンモドキの
スリープ中に電気喰ってる問題を解決します。

DFnjF85VoAENB1g

2017-11-05 0.22.28
大きな変更点は、リードスイッチを一般的な
磁石が近づくとショートするノーマリーオープンから
磁石が離れるとショートするノーマリークローズドのものに変更しました。

メロディが鳴る
→スリープする
→磁石が離れる(ドアが開く)→INT0がGNDショート
→LOWレベル割り込みが発生してスリープ解除
→メロディが鳴る
→スリープする(繰り返し)

これならスリープ時の消費電力は限りなく0に近いので
今度こそうまくいく…はず!多分!

ノーマリークローズドのスイッチは国内ではなかなか見つからなかったので
みんな大好きAliexpressで買いました。
Aliexpressリンク

ついでにICSPのピンもつけてIC直挿しでも
書き換えができるようにした。
ソケット使うとフリスクケースにはいらんので。

スケッチも回路変更に合わせて修正。

#include "pitches.h"
#include <avr/sleep.h>
#define BODS 7
#define BODSE 2

int melody[8] = {
  NOTE_FS5, NOTE_F5, NOTE_D5, NOTE_GS4, NOTE_G4, NOTE_DS5, NOTE_G5, NOTE_B5
};

int noteDurations[8] = {
  8, 8, 8, 8, 8, 8, 8, 8
};

void setup() {
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
}

void loop() {

  for (int thisNote = 0; thisNote < 8; thisNote++) {

    int noteDuration = 1000 / noteDurations[thisNote];

    tone(1, melody[thisNote], noteDuration);

    int pauseBetweenNotes = noteDuration * 1.0;
    delay(pauseBetweenNotes);
    noTone(1);
  }
    while (digitalRead(2) == LOW) {
  }

    goToSleep();
}

void goToSleep(void)
{
    byte adcsra, mcucr1, mcucr2;

    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();
    MCUCR &= ~(_BV(ISC01) | _BV(ISC00));
    GIMSK |= _BV(INT0);
    adcsra = ADCSRA;
    ADCSRA &= ~_BV(ADEN);
    cli();
    mcucr1 = MCUCR | _BV(BODS) | _BV(BODSE);
    mcucr2 = mcucr1 & ~_BV(BODSE);
    MCUCR = mcucr1;
    MCUCR = mcucr2;
    sei();
    sleep_cpu();
    sleep_disable();
    ADCSRA = adcsra;
}

ISR(INT0_vect)
{
  GIMSK = 0;
}

で、こんな感じ。

17mmのスピーカー使うとやっぱり厚みが入りきらないけど、
13mmまで小さくなってしまうので音量もそれなりになってしまう…
暫定的に薄くて径の大きな基板取り付けタイプではない
スピーカーを使っていることだけが心残りなので、
基板上はもう一回り小さいスピーカーにして、
ネジ止めタイプ使う時は直に配線半田付けしてね、
というスタンスにしようかと考え中です。

機能はほぼ出来上がり、完成までもうちょいです。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Arduinoをはじめよう第3版 [ マッシモ・バンジ ]
価格:2160円(税込、送料無料) (2017/11/5時点)

“続々・ゼルダのエフェクトーンモドキを自作する” への2件の返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください