#topicpath ** Arduino と CdS と圧電スピーカを使ったテルミンもどき楽器 [#z543e351] -- 概要:~ 明るさの変化でドレミを奏でます。音量は変わりません。とっても明るいと音は鳴りませんので、あまりやかましくありません。~ 2010年度オープンキャンパスのために作成しました。~ ~ CdS は廃棄に困ります。(個人的にはずっと持ちつづけるかな、と思っています。)~ CdS の代わりにフォトトランジスタを使う場合は[[Arduino/みんな試作機/MoriminAdvanced2]]を参照してください。 ~ ~ -- ポイント~ --- 明るさを学習(というほど大袈裟ではない)して、音階を決める値を自律的に変更します。~ 電源電圧が変わっても大丈夫なはずです。 --- プログラムがこなれていない。(試作ですから。) --- 簡単(例によって。)~ --- 安い(例によって。)~ ~ -- 配線~ [[USBに直結するタイプ>../../Arduino の自作/USBTYPE]]をもとに作成。~ --- スピーカ :黒-グラウンド、赤-デジタル13番(マイコンの19番ピン) --- 抵抗10kΩ:アナログ0番(マイコンの23番ピン)と電源 --- CdSセル :アナログ0番ピン(マイコンの23番ピン)とグラウンド~ &ref(sany0126.jpg,,320x240);~ ※ スケッチを流し込んでしまった後は、ツェナーダイオードや、68Ωの抵抗は要りません。外しましょう。~ ~ -- ユニバーサル基板で作る~ 自作Arduino互換機から ATmega168P(マイコンチップ)を引き抜き、ユニバーサル基盤に~ 配線が同じになるようにして移植する。 ところで、Arduino の Duemilanove などは、なぜフラットパッケージ(QFP,4方に細かい足が出ているタイプ)を使わないのだろうか。 DIP(太い足が2列に並んでブレッドボードやユニバーサル基板に使いやすいタイプ)よりも、面積が小さいし、 基板設計も楽だろうし、足の数も多くなるし、安い。実際、Japanino などでは、QFPを利用している。 ところが、今回の試作で、DIP であることの重要な理由がわかったように思う。なぜ DIP なのか。 それは、おそらく、ここでやったように、マイコンを抜いて、移植できるからだ。 言葉をかえると、プロトタイプを、よりプロダクトに近いものに移行する際、チップを移植すればいいのである。 &ref(SANY0135.JPG,,320x240);~ ~ -- プログラム~ Arduino 017 で [[Tone>http://code.google.com/p/rogue-code/wiki/ToneLibraryDocumentation]] を使いました。~ Arduino 018 に含まれる Tone はごく一部なので、やはり Tone ライブラリを別途用意して入れる必要があります。~ #include <Tone.h> #include <math.h> Tone notePlayer; int val = 0; int maxv = 0; int minv = 1024; int note[]={ 262, 294, 330, 349, 393, 440, 494, 523}; int thre[]={minv,minv,minv,minv,minv,minv,minv,minv}; void setup(void) { notePlayer.begin(13); } void loop(void) { int i; val = analogRead(0); if ( minv > val ){ minv = val; } if ( maxv < val ){ maxv = val; } for( i = 0; i < 8; i++ ){ thre[i] = maxv - (int)((maxv-minv)*pow(((1.0*i+0.3)/7.5),0.1)); } // lesser : brighter if ( val > thre[0] ){ notePlayer.play(note[0],100); }else if ( val > thre[1] ){ notePlayer.play(note[1],100); }else if ( val > thre[2] ){ notePlayer.play(note[2],100); }else if ( val > thre[3] ){ notePlayer.play(note[3],100); }else if ( val > thre[4] ){ notePlayer.play(note[4],100); }else if ( val > thre[5] ){ notePlayer.play(note[5],100); }else if ( val > thre[6] ){ notePlayer.play(note[6],100); }else if ( val > thre[7] ){ notePlayer.play(note[7],100); } delay(200); } ~ ~ -- 動作の様子([[YouTube>http://www.youtube.com/watch?v=bhNO1FlrfA8]])~ #u2b(id=bhNO1FlrfA8)~ #u2b(id=bhNO1FlrfA8,large,left)~ #clear ~ *** 記録 [#j3120b86] -- 参考URL --- [[Arduino Tone Library>http://code.google.com/p/rogue-code/wiki/ToneLibraryDocumentation]] --- [[Arduinoで遊ぼう - 圧電スピーカでチクタク/なんでもつくっちゃう、かも>http://arms22.blog91.fc2.com/blog-entry-276.html]] --- [[MTM05 Scratch ワークショップ>http://scratch-ja.org/atmtm05/report]] -- 履歴~ --- 2010-06-16 ユニバーサル基板化~ --- 2010-06-14 動画掲載~ --- 2010-06-11 音階を分けるAD変換された値を自動的に決めるように変更~ --- 2010-06-10 音が出る。配線もプログラムも、こんなに簡単。