12曲も収められたメロディオルゴールIC「UM3482」が手に入りましたので、早速簡単なメロディボックスを製作してみました。
単純に演奏させるだけなら、UM3482に少しの部品(抵抗、コンデンサ、スピーカなど)を付ければ済みます。
しかし、それだけでは面白くありませんので、PICとCDS(Cadmium Sulfide)を使って、周りの明るさの変化によって曲を鳴らせてみました。
<仕様>
<明るさの電圧変換>
<明るさの判断>
<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); } } } //**********************************************************************