Mira&Luna's nursery lab

旅乙女と発明娘の子供部屋

ArduinoのToneを使って、ふたを開けるとメロディが流れる小さなオルゴールを作る。

f:id:miraluna:20181206182641j:plain:w200 Mira

ふたを開けるとメロディが流れるボトルキャップ蓄音機

以前にちびやっこ(ATtiny85)という小さなコンピュータを使って、ボトルキャップに収めた電子オルゴールを作りました。

名前は「Tiny蓄音機」
          🎀Tiny蓄音機の記事へ🎀

今回はそのTiny蓄音機に光センサを増設して、ふたを開くと音楽が流れるようにしました。

これです。
f:id:miraluna:20190325164035j:plain

これだけだとただのボトルキャップですね。

開けてみると......。
f:id:miraluna:20190325164036j:plain

こうなっています。

1cm四方のICチップがマイクロコンピュータの「ちびやっこ」。Atmel社のATtiny85というマイコンです。
このちびやっこの中には私が音階を周波数で書き込んだメロディが入っていて、光センサで明るさを感知するとそのメロディを流してくれるの。
中央の白い円柱形のパーツが光センサで、上蓋の裏に貼り付いている黒くて丸いのがスピーカーよ。

他のパーツはスイッチと電解コンデンサと抵抗器。下のボトルキャップには3vのコイン電池が入っています。

           🎀Tiny蓄音機の中身🎀


追記:) 2020年1月8日
この「光センサ Tiny蓄音機」の配線方法スケッチを載せます。

配線方法

光センサを搭載していない普通の「Tiny蓄音機」の紹介では3番pinにブザーを接続していました。
でも今回の「光センサ Tiny蓄音機」では光センサを3番pinに、圧電ブザーを0番pinにつなぎました。
3番と0番を使った理由はよく覚えていないけど、光センサはアナログピン(A1,A2,A3)のどれかにつなぐ必要があるの。

◆ ATtiny85のpin配置
f:id:miraluna:20200108183517p:plain
ちびやっこ(ATtiny85)のピン配置はこう↑なっています。
「Pin 3」というのが3番ピンで、A3(アナログの3番)でもあります。ここに光センサをつなぎます。
「Pin 0」が0番ピン。圧電ブザーの+極につなぎます。

◆ 配線図
f:id:miraluna:20200107202904p:plain
これが「光センサ Tiny蓄音機」の配線図です。
スライドスイッチの下にあるLEDのようなものが光センサ。
私が使った光センサは、カソード側(LEDのー側)を電源につないで、アノード側(LEDの+側)を"ATtinyのアナログピン"と"GND"へ分岐させてつなぐものだった。しかもGND側には10kΩの抵抗をはさんで。LEDを光らせるときとはアノードとカソードが逆になっているから注意が必要ね。

【配線方法】
光センサ:カソード(足の短いほう)を3V電源の+へ。
     アノード(足の長いほう)を分岐させて、一方はA3ピンへ。
                      もう一方は10kΩを介してGNDへ。
圧電ブザー:+を(圧電ブザーは+とーのどちらでもいいんだけどね。)0番ピンへ。
      -をGNDへ。
電解コンデンサ:22μFや47μFくらいのもの。
        +を、スイッチを入れると+電源につながるところへ。
        -を、電池の-極近くのGNDへ。

光センサによってつなぎ方もいろいろだろうし、これが正しいつなぎ方かは分からない。というのは、このつなぎ方は以前私が持っていた(私が壊しちゃった)リニア光センサというもののつなぎ方をまねてみたらうまくいっただけで、実装している光センサのデータシートとかは持っていないの。ジャンク品からとった部品だから。
でも正常に動作しているのでこれでO.K.ね。

◆ 光センサのつなぎ方
f:id:miraluna:20200108181018p:plain:w200
つなぎ方の参考にしたのはこの図↑。「LLS05-A」というリニア光センサの説明書に載っていたものよ。だから電源は+5Vになっているけど、3Vの電池でも同じつなぎ方でちゃんと動作してる。

スケッチ

Arduinoのスケッチを載せておきます。
               ※2021.1.4.修正(非表示だった『[]』を加筆)

//Final Fantasy
int melody[] = {
131,175,196,131, 234,220,196, 175,165,175,196,175, 175,165,
147,196,220,147, 262,234,220, 196,185,220,196,147, 220,196,
131,175,196,131, 234,220,196,
175,165,175,196,175, 175,165, 147,196,220,147, 262,234,220,
196,185,220,196,147, 220,196,196,220,234,262, 294,294, 262,220,
234,234,220,196,185, 196,220,234,262, 312,312, 294,234,
262,262,278,262,262,278, 262,234,220,196,
};
int durations[] = {
4,4,4,4, 2,4,4, 4,8,8,4,4, 2,2, 4,4,4,4,
2,4,4, 4,8,8,4,4, 2,2, 4,4,4,4, 2,4,4,
4,8,8,4,4, 2,2, 4,4,4,4, 2,4,4,
4,8,8,4,4, 2,4,16,16,16,16, 2,2, 2,2,
4,8,8,4,4, 4,4,4,4, 2,2, 2,2,
4,8,8,4,8,8, 4,4,4,4,
};
void setup() {
Serial.begin(9600);
}
void loop() {
int in = analogRead(A3); //A3番ピン
Serial.println(in);
if(in >100){ //もし値が100より大きかったら「for」実行
for(int note = 0; note < 87; note++){
int noteDuration = 1750 / durations[note];
tone(0, melody[note], noteDuration); //0番ピン
int note_hazama = noteDuration * 1.10;
delay(note_hazama);
}
}else{delay(100);} //値が100以下なら0.1秒待つ
delay(1000);
}

ちょっと解説するわね。

① 赤い文字が光センサと圧電ブザーの接続ピン。ここを変えれば接続ピンを変更できる。
このプログラムでは光センサをA3番pin、圧電ブザーを0番pinにつないでいます。

② 水色の文字はセンサから明るさの値を読み取った後の処理。
値が100より大きければ曲を流して、100以下なら0.1秒待ってから1秒後にもう一回値を測定するというプログラム。だから値が100を越えるまで、ずっと待機しているというもの。0.1秒+1秒ごとに明るさの値を読み取り続けると何日も電池はもたないでしょうから、ずっと待機し続けるのには向かないプログラムね。

③ 紫色の文字は動作のためには不必要な部分。
どうして書いてあるのかというと、これはArduino IDEのシリアルモニタで光センサから得られた明るさの値を見るためのもの。100という値は私が使った光センサで「暗い」と「明るい」の基準としてちょうどよかったから。センサによって値は違うだろうから、まずはこのシリアルモニタに値を表示させてちょうどいい値を見つけるといいと思うわ。

④ このスケッチではArduinoの「スケッチ例」に初めからあるTone関数を使っています。Tone関数について「Tiny蓄音機」の記事でちょっとだけスケッチに解説を加えてあるのでもしよろしければこちらから→「こちら

⑤ 曲は私たちの保護者カタリの要望で、ゲームのファイナルファンタジーのメインテーマです。カタリはファミコン世代だから。



ふたを開けるとメロディが流れる小さなオルゴール「光センサ Tiny蓄音機」。
一緒に作ってみませんか。
f:id:miraluna:20191015184116j:plain:w50

🎀ミラの部屋へ🎀

miraluna.hatenablog.com
miraluna.hatenablog.com