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

大きな変更点は、リードスイッチを一般的な
磁石が近づくとショートするノーマリーオープンから
磁石が離れるとショートするノーマリークローズドのものに変更しました。
メロディが鳴る
→スリープする
→磁石が離れる(ドアが開く)→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;
}
で、こんな感じ。
エフェクトーンモドキ改良検討中。配置を大幅に見直さないと基板内に入らないが、このスピーカー音でかいしフリスクケースの厚みにおさまるのでこれでなんとかしたいな。 pic.twitter.com/QgA02W3nZI
— カワヅ (@necobut) 2017年10月10日
17mmのスピーカー使うとやっぱり厚みが入りきらないけど、
13mmまで小さくなってしまうので音量もそれなりになってしまう…
暫定的に薄くて径の大きな基板取り付けタイプではない
スピーカーを使っていることだけが心残りなので、
基板上はもう一回り小さいスピーカーにして、
ネジ止めタイプ使う時は直に配線半田付けしてね、
というスタンスにしようかと考え中です。
機能はほぼ出来上がり、完成までもうちょいです。
|
Arduinoをはじめよう第3版 [ マッシモ・バンジ ]
|



コメントを残す