簡易メロディボックス(明るさ検知)

12曲も収められたメロディオルゴールIC「UM3482」が手に入りましたので、早速簡単なメロディボックスを 製作してみました。

単純に演奏させるだけなら、UM3482に少しの部品(抵抗、コンデンサ、スピーカなど)を付ければ済みます。 しかし、それだけでは面白くありませんので、PICとCDS(Cadmium Sulfide)を使って、周りの明るさの変化によ って曲を鳴らせてみました。

<仕様>

起動直後の周りの明るさを閾値とします。

閾値より明るくなるか暗くなるかによってメロディを1曲鳴らせます。

メロディ(曲)は、12種類を順次切り替えていきます。

乾電池2本で動作可能とします。

<UM3482の曲目>

<UM3482のピン配置>

動作原理

<明るさの電圧変換>

CDSの抵抗値は、暗いと高くなり、明るいと低くなります。

この特性を利用して、明るさ(照度)を電圧に変換します。

回路図のようにCDSと抵抗を接続すると、出力電圧は“明るいと高く“なり、“暗いと低く”なります。

<明るさの判断>

起動直後の明るさを測定し、閾値(V2)とします。

閾値(V2)にはヒステリシス(hysteresis)特性を持たせます。

上限閾値(V3)以上になると“明るい“と判断します。

一旦“明るい”と判断したら、下限閾値(V1)以上であれば“明るい“と判断します。

下限閾値(V1)以下になると“暗い”と判断します。

一旦“暗い“と判断したら、上限閾値(V3)以下であれば“暗い”と判断します。

<UM3482の制御>

動作モード(7)を使用します。

SL信号を、“￪“(lowからhigh)にすると、次の曲が1度だけ演奏され停止します。

明るさが、変化(“明るい￫暗い”、“暗い￫明るい“)した時のみ、SL信号を、“￪”にします。

UM3482の動作モード

回路図

ソースコード

//********************************************************************** /* ＜簡易メロディボックス（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); } } } //**********************************************************************

動作確認

左側:CDS部分です。 右側:起動直後は、明るさは閾値内なので、LED1とLED2は点滅します。

左側:明るくなるとLED1が点滅します。 右側:暗くなるとLED2が点滅します。

如何ですか? 用途としては、部屋の照度が明るくなり過ぎたり、暗くなり過ぎた時に、オルゴールがなるので、次のような効果 が期待できます。

明るくなり過ぎが分かるので、電気代を節約することが出来ます。

暗くなり過ぎが分かるので、視力低下を防ぐことが出来ます。

このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。詳細 This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.Details