SEOクソクラエ、みたいなタイトルですね。
ツイッターで見て「これ欲しい!」と思ったネタ。
ゼルダの伝説のエフェクトーンです。
いいなーと思うが、販売方法がくじ引きなので手を出す気がせず…
ってこれ、自作できるんじゃね?
要はドアの開閉を検知して、音を鳴らせばいいわけだ。
考えてみましょう。
まずセンサーはリードスイッチ1択。
おそらく本物もこれを使っているはず。
磁力によって物理的にスイッチをオンオフするものです。
で、それを検知してメロディをどう鳴らすか。
今回はみんな大好きArduinoを使います。
使いますが、回路を極力シンプルにしたいので、
8ピンDIPのATtiny85、これをArduino化しましょう。
各自「ATtiny85 Arduino」等でググってみてください。
クロックはインターナルの8MHzで。
1MHzでは音がうまくなりません。
薄くしたいので電源はCR2032。
KiCadでサクサクっと書いた回路図がコチラ。
シンプル。
パスコンすらついていない大変男らしい回路ですが、
こんなのでもArduinoとして動作したので、
問題が出たらその時に対処しましょう。
音声(波形)データを鳴らすのはちと大変そうなので、
TONEで鳴らしちゃいましょう。
音の減衰ができませんが、不思議発見のテーマ(違う)
は単音なので多分それっぽくなるでしょう。
宝箱を開ける音は今のところあきらめましょう。
大体構想がかたまったら
とりあえずスイッチをタクトスイッチで代用してテストしてみましょう。
スイッチを押している
≒マグネットが近づいてリードスイッチがオン
≒ドアが閉まっている
なので、押している間は動作せず、離した瞬間に音がなるのが正しい動作。
で、そのまま動かしっぱなしでは電池がすぐになくなるので、
よくわからないなりに頑張ってスリープを仕込んでみます。
スリープモード搭載出来た。あとリードスイッチにして基板に落とし込めばゼルダドアセンサーが出来る。問題は鳴動後にスイッチが押される(ドアが閉まる)までスリープに入らないこと。 pic.twitter.com/0q1y4SrG0u
— カワヅ(PWM制御) (@necobut) 2017年6月8日
スリープのやり方はこちらを参考にさせて頂きました。
メロディが鳴り終わってリードスイッチがオンになった
(ドアが閉まった)らスリープに入って待機します。
本当はメロディ鳴り終わりと同時にスリープに入れて
待機にしたかったのですが、
それをするとその後うんともすんとも反応しなくなったので妥協しました。
そのため冷蔵庫とかじゃなくて部屋のドアとかで
開けっ放しにすると延々電池を消耗します。
誰か対処法教えて下さい。
というか今一オクターブ低い事に気がつきました。
危ない危ない。
んで、現在の最新スケッチがコチラ
スリープ動作に問題がある(あまり省電力にならない)
ので現在スケッチ改良作業中です。ご了承ください。
#include "pitches.h" #include <avr/sleep.h> #define BODS 7 #define BODSE 2 int melody[] = { NOTE_FS6, NOTE_F6, NOTE_D6, NOTE_GS5, NOTE_G5, NOTE_DS6, NOTE_G6, NOTE_A6 //A6→B6 }; int noteDurations[] = { 8, 8, 8, 8, 8, 8, 8, 4 }; void setup() { pinMode(1, OUTPUT); pinMode(2, INPUT); } void loop() { while (digitalRead(2) == LOW) { delay(100); } goToSleep(); 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); } } void goToSleep(void) { byte mcucr1, mcucr2; set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); MCUCR &= ~(_BV(ISC01) | _BV(ISC00)); GIMSK |= _BV(INT0); ADCSRA &= ~_BV(ADEN); cli(); mcucr1 = MCUCR | _BV(BODS) | _BV(BODSE); mcucr2 = mcucr1 & ~_BV(BODSE); MCUCR = mcucr1; MCUCR = mcucr2; sei(); sleep_cpu(); sleep_disable(); } ISR(INT0_vect) { GIMSK = 0; }
スケッチの例にあるtoneMelodyに含まれるpitches.hを利用しているので、
toneMelodyを読み込んでpitches.hのタブが横にある状態でやると
良いと思います。
ところでこの音は任天堂の著作物なので、
ソースコードとはいえそのままの音が鳴るのはよくないだろうと思って
音程をわざと一つだけ変えてあります。
同じものを作りたい場合はソースコードをよく読んで
修正して使ってください。
折角なので、KiCadで基板書いてPCBサービスに頼んでみます。
seeed studioのFUSION PCBがレビュー書いたら
クーポンを下さるそうなのでお願いしてみた。
KiCadのデータも公開するつもりですが、
一応基板組み立てて動作確認してからということで。
次回、組み立てて使ってみるよ。
→続・ゼルダのアレを真似したい
エフェクトーンがらみの何か商品でも紹介しようかと思ったら
そのものがプレミア価格で売られていたのでそれは貼らないよ!
コメントを残す