文書の過去の版を表示しています。


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の動作モード

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
  • elechobby/picdic/pic12f683/32.1588321521.txt.gz
  • 最終更新: 2025/10/17 14:27
  • (外部編集)