====== 簡易砂時計 ====== ===== 概要 ===== 圧電スピーカは、電極に信号電圧を加えることにより圧電体(圧電素子)が歪み、その振動を音(空気の振動)と して聞くものです。逆に、圧電体に加えられた力(音圧など)を電圧に変換することも出来ます。 そこでこの特性を利用して、“**開始スイッチ**"や“**停止スイッチ**"を使用しない簡易な砂時計を製作しました。 {{:imgpaste:202004:htmikan-20200429-110816.png}}{{:imgpaste:202004:htmikan-20200429-110819.png}} <仕様> * 時計の“**開始**"は、圧電スピーカを、“**指で軽く叩く**"だけとする。 * 時計のカウント値は、1分~8分までの8種類とする。(1分間隔) * 時計のカウント中の“**停止**"は、再度、圧電スピーカを、“**指で軽く叩く**"だけとする。 * 時計のカウント中は、1秒毎に“ピッ"という音(約3kHz)を発生させる。 * 時計がタイムアウトすると、ピンポンパンポ~ン、ピンポンパンポーンと音を発生させる。 ===== 動作原理 ===== <時計の開始の判断> 圧電スピーカからの信号をA/D変換で取り込み、ある値(V1)以上の電圧が得られると開始する。 電源電圧(3V時)→V1=300mV 電源電圧(5V時)→V1=490mV <時計のカウント> - PICのCCPモジュールをキャプチャモードで使用し、0.1秒の周期割り込みを発生させる。 - 1秒毎に“ピッ"という音(約3kHz)を約50msec間発生させ、LEDを点滅させる。 - 圧電スピーカからの信号をA/D変換で取り込み、ある値(V1)以上の電圧が得られると停止する。\\ ※これは、カウントを途中で停止させるための処理です。 - カウント時間が、ディップスイッチ(SW1、SW2、SW3)で指定された時間(1分~8分)経過するとタイムアウトする。 <時計のタイムアウト> 時計がタイムアウトすると、ピンポンパンポ~ン、ピンポンパンポーンと音を発生させる。 * ピン=“ド"(523Hz/250msec) * ポン=“ミ"(659Hz/250msec) * パン=“ソ"(784Hz/250msec) * ポ~ン=“ド"(1047Hz/500msec) 休止符(500msec) * ピン=“ド"(1047Hz/250msec) * ポン=“ソ"(784Hz/250msec) * パン=“ミ"(659Hz/250msec) * ポーン=“ド"(523Hz/500msec) <時計の停止中> LEDを1秒間隔で点滅させる。 ===== 回路図 ===== {{:imgpaste:202004:htmikan-20200429-111113.png?500}} ===== ソースコード ===== //******************************************************************************** /* <簡易砂時計(スイッチ不要)> */ //******************************************************************************** #define SW1 GPIO.F0 #define SW2 GPIO.F1 #define SW3 GPIO.F2 #define SP TRISIO.F4 #define LED GPIO.F5 #define INPUT_MODE 1 #define OUTPUT_MODE 0 #define ON 0 #define OFF -1 //******************************************************************************** static int clock, blink; void interrupt(){ if (PIR1.CCP1IF == 1) { PIR1.CCP1IF = 0; // if (blink != OFF) { blink++; if (blink == 5) { LED = ~LED; blink = ON; } } // clock++; } } //******************************************************************************** short Delay_sec(unsigned int sec) { clock = 0; blink = OFF; sec *= 10; while (clock < sec) { if ((clock % 10) == 0) { LED = 1; Sound_Play(3000, 50); //3kHz×50msec LED = 0; } // SP = INPUT_MODE; if (Adc_Read(3) > 100) { SP = OUTPUT_MODE; blink = ON; return (-1); } SP = OUTPUT_MODE; } blink = ON; // return (0); } //******************************************************************************** void main() { // OSCCON = 0b01010000; //クロックを2Mhzに設定 CMCON0 = 0b00000111; //コンパレータは使用しない。 ANSEL = 0b00001000; //A/D変換はAN3を使用する。 TRISIO = 0b00001111; //入出力ポートを設定する。 // CCPの設定 PIE1.CCP1IE = 1; PIR1.CCP1IF = 0; CCP1CON = 0b00001011; CCPR1L = 0x6A; // 0.1sec...10hz...クロックが2Mhzの時 CCPR1H = 0x18; // 0.1sec...(1÷8000000)*4*8*6250 // TIMER1の設定 PIE1.TMR1IE = 0; PIR1.TMR1IF = 0; TMR1L = 0; TMR1H = 0; T1CON.T1CKPS0 = 1; T1CON.T1CKPS1 = 1; T1CON.TMR1ON = 1; // Sound_Init(&GPIO, 4); // clock = 0; blink = ON; // 割り込みの設定 INTCON.PEIE = 1; INTCON.GIE = 1; while (1) { SP = INPUT_MODE; while (Adc_Read(3) < 100) ; SP = OUTPUT_MODE; // if (Delay_sec(60 + (60 * (GPIO & 0x07))) == 0) { LED = 1; Sound_Play(523, 250); //ド(ピン) LED = 0; Sound_Play(659, 250); //ミ(ポン) LED = 1; Sound_Play(784, 250); //ソ(パン) LED = 0; Sound_Play(1047, 500); //ド(ポーン) LED = 1; Delay_ms(500); LED = 0; Sound_Play(1047, 250); //ド(ピン) LED = 1; Sound_Play(784, 250); //ソ(ポン) LED = 0; Sound_Play(659, 250); //ミ(パン) LED = 1; Sound_Play(523, 500); //ド(ポーン) LED = 0; } // Delay_ms(500); } } //******************************************************************************** ===== 動作確認 ===== {{:imgpaste:202004:htmikan-20200429-111222.png?500}} 如何ですか? 圧電スピーカを指で軽く叩くだけで開始するので、台所等で使用する場合にはとても重宝します。“**操作性抜群**" 基本的な考え方は、“**一つの素子を入力用と出力用**"に使い分けるということです。 発想の転換ですね^_^ 実は、同じような考え方をしたものが、受光&発光(1個のLED)です。 このページは稲崎様の閉鎖した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]]