目次

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

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

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

<仕様>

<UM3482の曲目>

<UM3482のピン配置>

動作原理

<明るさの電圧変換>

<明るさの判断>

<UM3482の制御>

UM3482の動作モード

回路図

ソースコード

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);
               	}
        }
}
//**********************************************************************

動作確認

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

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

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

著作権表示 copyright notice

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