文書の過去の版を表示しています。
簡易メロディボックス(明るさ検知)
12曲も収められたメロディオルゴールIC「UM3482」が手に入りましたので、早速簡単なメロディボックスを
製作してみました。
単純に演奏させるだけなら、UM3482に少しの部品(抵抗、コンデンサ、スピーカなど)を付ければ済みます。
しかし、それだけでは面白くありませんので、PICとCDS(Cadmium Sulfide)を使って、周りの明るさの変化によ
って曲を鳴らせてみました。
<仕様>
- 起動直後の周りの明るさを閾値とします。
- 閾値より明るくなるか暗くなるかによってメロディを1曲鳴らせます。
- メロディ(曲)は、12種類を順次切り替えていきます。
- 乾電池2本で動作可能とします。
動作原理
<明るさの電圧変換>
- CDSの抵抗値は、暗いと高くなり、明るいと低くなります。
- この特性を利用して、明るさ(照度)を電圧に変換します。
- 回路図のようにCDSと抵抗を接続すると、出力電圧は“明るいと高く“なり、“暗いと低く”なります。
<明るさの判断>
- 起動直後の明るさを測定し、閾値(V2)とします。
- 閾値(V2)にはヒステリシス(hysteresis)特性を持たせます。
- 上限閾値(V3)以上になると“明るい“と判断します。
- 一旦“明るい”と判断したら、下限閾値(V1)以上であれば“明るい“と判断します。
- 下限閾値(V1)以下になると“暗い”と判断します。
- 一旦“暗い“と判断したら、上限閾値(V3)以下であれば“暗い”と判断します。
<UM3482の制御>
- 動作モード(7)を使用します。
- SL信号を、“↑“(lowからhigh)にすると、次の曲が1度だけ演奏され停止します。
- 明るさが、変化(“明るい→暗い”、“暗い→明るい“)した時のみ、SL信号を、“↑”にします。
回路図
ソースコード
- melody_box_v1.c
//********************************************************************** /* <簡易メロディボックス(12曲)> */ //********************************************************************** #define UM3482 GPIO.F1 #define LED1 GPIO.F4 #define LED2 GPIO.F5 #define ON 1 #define OFF 0 //********************************************************************** int measurement() { int ad; short cnt; // ad = OFF; for (cnt = OFF; cnt < 10; cnt++) { ad += Adc_Read(0); } return (ad / 10); } //********************************************************************** void main() { int threshold; short flag, cnt; // OSCCON = 0b00000000; //32kHz CMCON0 = 0b00000111; ANSEL = 0b00000001; TRISIO = 0b00001001; // flag = OFF; UM3482 = OFF; LED1 = OFF; LED2 = OFF; //起動直後の明るさを基準値として取り込む。 Delay_ms(1000); threshold = measurement(); for (cnt = OFF; cnt < 10; cnt++) { LED1 = ON; LED2 = ON; Delay_ms(100); LED1 = OFF; LED2 = OFF; Delay_ms(100); } // while (flag == 0) { //基準値に比べて明るくなったかをチェックする。 if (measurement() > (threshold + 50)) { UM3482 = ON; Delay_ms(100); UM3482 = OFF; flag = 1; } //基準値に比べて暗くなったかをチェックする。 if (measurement() < (threshold - 50)) { UM3482 = ON; Delay_ms(100); UM3482 = OFF; flag = 2; } // LED1 = ON; LED2 = ON; Delay_ms(100); LED1 = OFF; LED2 = OFF; Delay_ms(100); } // while (1) { //基準値に比べて明るくなったかをチェックする。 if ((measurement() > (threshold + 50)) && (flag == 2)) { UM3482 = ON; Delay_ms(100); UM3482 = OFF; flag = 1; } //基準値に比べて暗くなったかをチェックする。 if ((measurement() < (threshold - 50)) && (flag == 1)) { UM3482 = ON; Delay_ms(100); UM3482 = OFF; flag = 2; } // if (flag == 1) { LED1 = ON; Delay_ms(100); LED1 = OFF; Delay_ms(100); } else { LED2 = ON; Delay_ms(100); LED2 = OFF; Delay_ms(100); } } } //**********************************************************************









