スピーカからの音の出力

スイッチを押すとスピーカから音が出るようにしました。

1.音が出る仕組みは下記のようになります。
*周期の単位は[s]、周波数の単位は[Hz]です。s:second(秒)、Hz:heltz(ヘルツ)
*「0」をLowレベル、「1」をHighレベルとしています。
*波形は正弦波でなく、方形波ですが音は出ます。正弦波のように澄んだ音ではありませんが・・・
*詳しい話は波形の合成のページで!

2.押すスイッチに対応した出力信号が出るようにプログラミングをします。
  下記のようになるようにしました。


  @ スイッチを押したときだけ、スピーカから音が出力。離すと音の出力停止。

  


  A スイッチと出力の関係は下表のようにします。(押した時を「1」、離した時を「0」と記す。)     
番号 スイッチ 出力の状態
SW4 SW3 SW2 SW1 SW0 周期[ms] 周波数[Hz]
無音状態
500
250
166
125
10 100
12 83.3
14 71.4
16 62.5
10 18 55.5
11 20 50.0
12 22 45.5
13 24 41.7
14 26 38.5
15 28 35.7
16 30 33.3
17 32 31.3
18 34 29.4
19 36 27.8
20 38 26.3
21 40 25.0
22 42 23.8
23 44 22.7
24 46 21.7
25 48 20.8
26 50 20.0
27 52 19.2
28 54 18.5
29 56 17.9
30 58 17.2
31 60 16.7
32 62 16.1



3.出力コネクタにスピーカを接続します。

  基板についているLEDとスピーカが負荷になります。
  今回は、プログラムの動作確認のためこの状態で動作させました。
  PICの出力能力と負荷の関係を考えると、LEDの接続を外し、スピーカ駆動回路を設けます。



プログラム(スピーカからの音の出力)
//----------------------------------------------------------------------------
//  【スピーカからの音の出力】 
//----------------------------------------------------------------------------

#include <16f84a.h>                     // 使用デバイスの定義情報インクルード
#fuses HS, NOWDT, NOPROTECT            // コンフィグレーション設定
#use delay (clock=20000000)         // 発振子の周波数20MHz

//----------------------------------------------------------------------------
//  I/Oポートの定義
//----------------------------------------------------------------------------
#byte  RA = 5                       // ポートAのアドレス5番地をRA文字変数
#byte  RB = 6                       // ポートBのアドレス6番地をRB文字変数
//----------------------------------------------------------------------------
//  音発生の関数
//----------------------------------------------------------------------------
music( int cnt)
        {
        byte i;
                for (i=1;i<5;i++)
                        {
                        RB = 0xff;
                        delay_ms(cnt);
                        RB = 0x00;
                        delay_ms(cnt);
                        }
                return;
        }
//----------------------------------------------------------------------------
//  音停止の関数
//----------------------------------------------------------------------------
scine()
        {
                RB = 0x00;
                return;
        }
//----------------------------------------------------------------------------
//  メイン関数
//----------------------------------------------------------------------------
main()  {
        byte  cnt, pushsw;                           

        set_tris_a(0xff);           // ポートAはすべて入力に設定(1:Input)
        set_tris_b(0x00);           // ポートBはすべて出力に設定(0:Output)
        RB = 0x00;                   // 初期状態の点灯

        while(1){                       // 無限ループで繰り返す
                pushsw = (~RA & 0x1f);
                if (pushsw > 0)
                    { 
                        cnt = pushsw;
                        music(cnt);
                        }
                else
                        {
                        scine();
                        }
                }
        }


平成16年12月12日作成

back