#topicpath ** もりみんアドバンスト [#lfc33146] -- 概要:~ 明るさの変化でドレミを奏でます。音量は変わりません。とっても明るいと音は鳴りませんので、あまりやかましくありません。~ 2010年度に児童向けの電気工作のために作成しました。[[Arduino と CdS と圧電スピーカを使ったテルミンもどき楽器>../MoriminAdvanced]]と同様のものです。~ CdSではなく、環境負荷の少ないフォトトランジスタを使っています。~ ~ ~ -- ポイント~ --- 明るさを学習して、音階を決める値を自律的に変更します。~ --- 簡単(例によって。)~ --- 安い(例によって。)~ | 部品 | 値段(円) | まとめ買い個数|購入 |h | マイコンATmega168P | 210 | 14個以上 |秋月電子 http://akizukidenshi.com/catalog/g/gI-03033/ | | マイコンATmega168P | 200 | 14個以上 |秋月電子 http://akizukidenshi.com/catalog/g/gI-03033/ | | フォトトランジスタ | 50 | 2個入り| 秋月電子http://akizukidenshi.com/catalog/g/gI-02325/ | | 圧電スピーカ| 40 | 40 個入り| 秋月電子 http://akizukidenshi.com/catalog/g/gP-01709/| | コンデンサ 0.1μF | 4.75 | 500 個入り|秋月電子 http://akizukidenshi.com/catalog/g/gP-02182/ | | 抵抗 100kΩ 1/4 W| 1 | 100本入り | 秋月電子 http://akizukidenshi.com/catalog/g/gR-25104/ | | 電池ボックス | 50 | 10個以上 |秋月電子 http://akizukidenshi.com/catalog/g/gP-00327/| | 単三乾電池2本 | 25 | 8本 | ダイソー | |スチレンボード | 6.56| 16枚分 | ダイソー | |ホチキスの針 | ほとんど0 | | | | | | | | |合計 | 約390 | | | |合計 | 約380 | | | ~ -- マイコン~ --- ハードウエアはArduino 互換[[ミニマルタイプ>../../Arduino の自作/MINIMAL]]をもとに作成しました。 --- ブートローダは、ハードウエアに対応して[[ミニマル>../../Arduino の自作/MINIMAL]]用にATmegaBOOT_168_pro_8MHz.hex を導入してあります。 --- スケッチ~ 次のようなスケッチを導入してあります。~ 光センサーの近くに物体がある時には明るさの変化が激しいので、仕切りの間隔は均等でないようにしています。~ ここでは、CdS セルではなく、光センサ(フォトトランジスタ)を利用しているために、[[Arduino と CdS と圧電スピーカを使ったテルミンもどき楽器>../MoriminAdvanced]]とはプログラムを少し変え、抵抗値も100kΩに変えています。 #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}; int sdelay=50; // sound length int idelay=250; // interval length 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++ ){ //original: thre[i] = maxv - (int)((maxv-minv)*pow(((1.0*i+0.3)/7.5),0.1)); //linear: thre[i] = maxv - (int)( (maxv-minv)*((1.0*i+0.3)/7.5) ); thre[i] = maxv - (int)((maxv-minv)*pow(((1.0*i+0.1)/7.3),0.555)); } // lesser : brighter if ( val > thre[0] ){ notePlayer.play(note[0],sdelay); }else if ( val > thre[1] ){ notePlayer.play(note[1],sdelay); }else if ( val > thre[2] ){ notePlayer.play(note[2],sdelay); }else if ( val > thre[3] ){ notePlayer.play(note[3],sdelay); }else if ( val > thre[4] ){ notePlayer.play(note[4],sdelay); }else if ( val > thre[5] ){ notePlayer.play(note[5],sdelay); }else if ( val > thre[6] ){ notePlayer.play(note[6],sdelay); }else if ( val > thre[7] ){ notePlayer.play(note[7],sdelay); } delay(idelay); } -- 配線 --- Arduino 互換[[ミニマルタイプ>../../Arduino の自作/MINIMAL]]のハードウェア部分も含めて、配線は次のようにすればよいです。~ スピーカ、抵抗、光センサを外せば、Arduino として動作します。~ &ref(MoriminAd_Circuit.png,,359x340);~ ※ 意外にもホチキスの針はコーティングしてあって通電しないことが多いです。~ 通電しないときは紙やすりで被覆をとって下さい。 -- 配布資料~ --- &ref(もりみんアドバンストWeb用.pdf); -- 履歴 --- 2010-08-08 ウェッブページ作成 --- 2010-07-31, 08-01 夏休みこども理科・エネルギー教室 // // --- スピーカ :黒-グラウンド、赤-デジタル13番(マイコンの19番ピン) // --- 抵抗10kΩ:アナログ0番(マイコンの23番ピン)と電源 // --- CdSセル :アナログ0番ピン(マイコンの23番ピン)とグラウンド~ // &ref(sany0126.jpg,,320x240);~ // ※ スケッチを流し込んでしまった後は、ツェナーダイオードや、68Ωの抵抗は要りません。外しましょう。~ // ~ // -- ユニバーサル基板で作る~ // Arduino の Duemilanove などは、なぜフラットパッケージ~ // (QFP,4方に細かい足が出ているタイプ)を使わないのだろうか、~ // と思っていた。DIP(太い足が2列に並んでブレッドボードや~ // ユニバーサル基板に使いやすいタイプ)よりも、面積が小さいし、~ // 基板設計も楽だろうし、足の数も多くなるし、安いし、QFP~ // (4方に細かい足が出ているタイプ)の方がより良いように思っていた。~ // ~ // ところが、今回の試作で、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)~ // ~ // *** 記録 [#h2dd6f8b] // -- 参考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 音が出る。配線もプログラムも、こんなに簡単。 // // --- スピーカ :黒-グラウンド、赤-デジタル13番(マイコンの19番ピン) // --- 抵抗10kΩ:アナログ0番(マイコンの23番ピン)と電源 // --- CdSセル :アナログ0番ピン(マイコンの23番ピン)とグラウンド~ // &ref(sany0126.jpg,,320x240);~ // ※ スケッチを流し込んでしまった後は、ツェナーダイオードや、68Ωの抵抗は要りません。外しましょう。~ // ~ // -- ユニバーサル基板で作る~ // Arduino の Duemilanove などは、なぜフラットパッケージ~ // (QFP,4方に細かい足が出ているタイプ)を使わないのだろうか、~ // と思っていた。DIP(太い足が2列に並んでブレッドボードや~ // ユニバーサル基板に使いやすいタイプ)よりも、面積が小さいし、~ // 基板設計も楽だろうし、足の数も多くなるし、安いし、QFP~ // (4方に細かい足が出ているタイプ)の方がより良いように思っていた。~ // ~ // ところが、今回の試作で、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)~ // ~ // *** 記録 [#h2dd6f8b] // -- 参考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 音が出る。配線もプログラムも、こんなに簡単。