===== 簡易メロディボックス(明るさ検知) ===== 12曲も収められたメロディオルゴールIC「UM3482」が手に入りましたので、早速簡単なメロディボックスを製作してみました。 単純に演奏させるだけなら、UM3482に少しの部品(抵抗、コンデンサ、スピーカなど)を付ければ済みます。 しかし、それだけでは面白くありませんので、PICとCDS(Cadmium Sulfide)を使って、周りの明るさの変化によって曲を鳴らせてみました。 <仕様> * 起動直後の周りの明るさを閾値とします。 * 閾値より明るくなるか暗くなるかによってメロディを1曲鳴らせます。 * メロディ(曲)は、12種類を順次切り替えていきます。 * 乾電池2本で動作可能とします。 {{:imgpaste:202004:htmikan-20200429-121649.png?200}} {{:imgpaste:202004:htmikan-20200429-121656.png}} ===== 動作原理 ===== <明るさの電圧変換> * CDSの抵抗値は、暗いと高くなり、明るいと低くなります。 * この特性を利用して、明るさ(照度)を電圧に変換します。 * 回路図のようにCDSと抵抗を接続すると、出力電圧は“明るいと高く"なり、“暗いと低く"なります。 <明るさの判断> * 起動直後の明るさを測定し、閾値(V2)とします。 * 閾値(V2)にはヒステリシス(hysteresis)特性を持たせます。 * 上限閾値(V3)以上になると“明るい"と判断します。 * 一旦“明るい"と判断したら、下限閾値(V1)以上であれば“明るい"と判断します。 * 下限閾値(V1)以下になると“暗い"と判断します。 * 一旦“暗い"と判断したら、上限閾値(V3)以下であれば“暗い"と判断します。 {{:imgpaste:202004:htmikan-20200429-121810.png}} * 動作モード(7)を使用します。 * SL信号を、“↑"(lowからhigh)にすると、次の曲が1度だけ演奏され停止します。 * 明るさが、変化(“明るい→暗い"、“暗い→明るい")した時のみ、SL信号を、“↑"にします。 UM3482の動作モード {{:imgpaste:202004:htmikan-20200429-122302.png}} ===== 回路図 ===== {{:imgpaste:202004:htmikan-20200429-122446.png}} ===== ソースコード ===== //********************************************************************** /*   <簡易メロディボックス(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); } } } //********************************************************************** ===== 動作確認 ===== {{:imgpaste:202004:htmikan-20200429-122555.png?500}} 左側:CDS部分です。 右側:起動直後は、明るさは閾値内なので、LED1とLED2は点滅します。 {{:imgpaste:202004:htmikan-20200429-122628.png}}{{:imgpaste:202004:htmikan-20200429-122631.png}} 左側:明るくなるとLED1が点滅します。 右側:暗くなるとLED2が点滅します。 {{:imgpaste:202004:htmikan-20200429-122636.png}}{{:imgpaste:202004:htmikan-20200429-122639.png}} 如何ですか? 用途としては、部屋の照度が明るくなり過ぎたり、暗くなり過ぎた時に、オルゴールがなるので、次のような効果が期待できます。 * 明るくなり過ぎが分かるので、電気代を節約することが出来ます。 * 暗くなり過ぎが分かるので、視力低下を防ぐことが出来ます。 このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]] This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]]