« 拡張PIC16実験 和文モールス受信練習機へ(6) | メイン | モールス受信練習機を乱数で遊んでみる(2/2) »

モールス受信練習機でタイマとメトロノームを作ってみる(1/3)


 音を出す方法と時間待ち、繰り返しの方法が分かったらタイマを作るのは簡単です。そこでラーメン・タイマとメトロノームを作ってみます。雛形として使うEJ-sound-timer.zipをダウンロードして準備をしておきます(モールス受信練習機でセンサ・オルゴールを作ろうなどを参考に)。

■プログラムの部品を思いだそう
 雛形の中にはビープ音を出すbeep関数、0.1秒単位でプログラムを中断するdelay100ms関数、メロディを出すplay_melody関数があります。ほかに、無限の繰り返しをforループで作る方法を紹介しました。またforループは次のように書くと繰り返し回数を指定できます。
for (i=0; i<100; i++) {

}
 中括弧{}の中に繰り返すプログラムを書きます。回数はiという変数で数えます。数えるために使う変数のことをカウンタとよびます。C言語では変数を使うときには宣言が必要です。ここで使うカウンタ変数iについては宣言を、
int i;
と書きます。宣言は中括弧{}で囲まれた範囲の先頭にまとめて書きます。intというのは変数の型(型が違うと扱える数の範囲などが変わります)の一つです。

■ラーメン・タイマを設計する
 ラーメン・タイマに欲しい機能を考えてみましょう。当然3分経ったらメロディで教えて欲しいところです。メロディはチャルメラにして、ずっと鳴り続けるようにしたいですね。3分経つまで音が鳴っていないと動作しているかわからないので、1秒に1回音を鳴らしたいところです。

 それではマイコンの動作の順番に並べ直してみましょう。
  1. 初期化
  2. 3分間の間、1秒に1回音を鳴らす
  3. チャルメラを鳴らし続ける
簡単なところから考えてみると初期化は init 関数を呼び出す、
init();
だけでOKでした。チャルメラを鳴らし続けるのは無限ループを使って、
for(;;) {
    play_melody("G2a2b6a2G2 6G2a2b2a2G2a6"); // チャルメラ
}
とすればよさそうです。

■3分間の間、1秒に1回音を鳴らす
 1秒に1回音を鳴らすというのはどういうことでしょうか? 時報を思い出してみましょう。ビープ音を出して待つと「ピッ」という音が出ます。「ピッ」がちょうど1秒になるように、
beep(1500, 100);
delay100ms(9);
を1組にすることを考えます。0.1秒(100ms)の間1500Hzの音を出し、0.9秒(900ms)待つので、ちょうど1秒になります。

 これを3分間の間鳴らし続けるにはどうしたらいいでしょうか? そうです。3分=180秒ですから、180回繰り返せば3分間鳴り続けることになります。forループを使って180回繰り返すには、
for (i=0; i<180; i++) {
    beep(1500, 100);
    delay100ms(9);
}
と書きます。

■ラーメン・タイマのmain関数
 完成したラーメン・タイマのmain関数は次のようになりました。雛形のmain関数を書き換えて動かします。最初にカウンタ変数の宣言をしています。for文に3*60と書いています。掛け算の記号には*を使います。また掛け算の計算をこのようにコンピュータに任せることもできます。それからチャルメラの音を鳴らしたあとに、1秒待つようにしています。

 3分間の間にならす音に凝ったり、チャルメラ以外のメロディをならすなど工夫を凝らしてみてください。次回はメトロノームを作ってみます。
void
main(void)
{
    int i;

    init();                 // 初期化

    for (i=0; i<3*60; i++) {
        beep(1500, 100);
        delay100ms(9);
    }

    for (;;) {
        play_melody("G2a2b6a2G2 6G2a2b2a2G2a6"); // チャルメラ
        delay100ms(10);        // 1秒待ち
    }
}

(光永 法明)

カテゴリ:

トラックバック

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





カテゴリ

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

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

Powered by
Movable Type 4.1
/*yahoo remove*/