エフェクトーンモドキの
スリープ中に電気喰ってる問題を解決します。
大きな変更点は、リードスイッチを一般的な
磁石が近づくとショートするノーマリーオープンから
磁石が離れるとショートするノーマリークローズドのものに変更しました。
メロディが鳴る
→スリープする
→磁石が離れる(ドアが開く)→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版 [ マッシモ・バンジ ]
|
コメントを残す