« 拡張PIC16実験 内蔵温度センサを試す(1/2) | メイン | PIC16F1827時計の製作(4) »

いろいろな音をモールス受信練習機で作ってみよう


 マイコンを使うといろいろな音を作ることができます。今回はエレキジャックNo.20のモールス受信練習機で救急車、カッコウ、時報の音と、雨だれ音(電子安眠器)を作ってみます。

■準備しよう
 モールス受信練習機を完成させ、MPLAB IDE と PICkit3を準備します。EJ-sound.zipをダウンロードして適当なフォルダ(c:\など、日本語がパスに入らないところがよい)に展開します。モールス受信練習機をつないだPICkit3をパソコンにつないでおきます。EJSound.mcpをダブルクリックすると、MPLAB IDEが起動します。メニューのProjectにあるBuildをクリックしてコンパイルします。コンパイルできたら、Programアイコンをクリックするか、ProgrammerメニューからProgramをクリックしてPICマイコンにプログラムを書き込みます。エラーがなければOKです。救急車の音が鳴ります。

■書き込んだプログラムの内容(救急車の音)

 ソースファイルmain.cを見てみましょう。main関数を探すと、

void
main(void)
{
    init();

    for (;;) {
        beep(960, 500);
        beep(770, 500);
    }
}
と書いてあります(//以降はコメントで動作に関係ないので上記では省略しています)。for(;;)は続く{と}の間のプログラムをずっと繰り返します。beep関数は、一つ目の引数で指定された高さの音を、二つ目の引数で渡された時間だけ出します。単位は[Hz]と[ms](1/1000秒)です。ここでは960Hzの音を0.5秒、770Hzの音を0.5秒交互に出しています。これで救急車のピーポー音(高い音と低い音の繰り返し)を作っています。

■カッコーの鳴き声
 カッコーの鳴き声は高くて短い音と、少し低くて長い音の繰り返しです。短い音と長い音の間には少し間(音のない時間、休符のような時間)があります。delayms関数とdelay100ms関数を使うとPICマイコンは指定した時間何もしないので音が出ません。単位は[ms]と[×100ms]です。そこで main 関数を、
void
main(void)
{
    init();

    for (;;) {
        beep(1220, 200);
        delayms(200);
        beep(980, 600);
        delay100ms(5);
    }
}
と書き換えてみます。コンパイルして、プログラムを書き込むと音が変わりますね。

■NHKの時報の音を作る
 NHKの時報の音は、ぽっぽっぽっぴーという音がします。ぽっの音の高さは440Hz、長さは0.1秒(100ms)で、ぴーのところは880[Hz]で約2秒(最後はだんだん小さくなる)です。それでは、
void
main(void)
{
    init();

    beep(440, 100);
    delay100ms(9);
    beep(440, 100);
    delay100ms(9);
    beep(440, 100);
    delay100ms(9);
    beep(880, 1500);

    for (;;)
    {
    }
}
としてみましょう。時報になりました。delay100msの引数が9なのは、0.1秒鳴る音と音の間を1秒にするには、無音の時間を0.9秒にする必要があるからです。ぴーの音は2秒だと長く感じたので1.5秒(1500ms)にしています。

 上のプログラムでは電源を入れてから1回だけ時報が鳴ります。ボタンを押すたびになるようにするには、
void
main(void)
{
    init();

    for (;;)
    {
        while (BIT_SW != 0) // タクト・スイッチ SW1 が押されるまで待つ
        {
        }
            beep(440, 100);
            delay100ms(9);
            beep(440, 100);
            delay100ms(9);
            beep(440, 100);
            delay100ms(9);
            beep(880, 1500);
    }
}
とすれば、できあがりです。

■雨だれ音(電子安眠器)をつくる
 雨の、ぽつっ、ぽつっという音をじっと聞いていると眠くなりませんか。そんな音を電子回路で作るのが電子安眠器です。ぽつっ音の間隔をだんだん長くしていきます。
void
main(void)
{
    int i;

    init();

    for (i=0; i<100; i++)
    {
        beep(400, 10);
        delay100ms(40);
        delay100ms(i/2);
    }
    SLEEP();
}

としてみました。最初はぽつっ音(400Hz, 10ms)の間隔は4秒(40×100ms = 4000ms)です。forループで音を繰り返して出していますから、1回ごとにiの数が増えていきます。iの値の半分×100msずつ間隔を広げるように二つ目のdelay100ms関数を使っています。最後のSLEEP関数はPICマイコンの動作を(ほぼ)止める関数です。これによって音が100回鳴った後(約11分後)に眠ってしまって電源を切り忘れても(安眠器ですから眠ってしまうのがいいのですhi)電池の消耗を最小限にします。

 ほかにもいろいろな音が作れると思います。挑戦してみてください。
(光永 法明)

カテゴリ:

トラックバック

このエントリーのトラックバックURL:
http://www.eleki-jack.com/mt/mt-tb.cgi/6317





カテゴリ

会社案内
情報セキュリティおよび個人情報の取り扱いについて

コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。
コメントはそれぞれ投稿した人のものです。

Powered by
Movable Type 4.1
/*yahoo remove*/