« 拡張PIC16実験 和文モールス受信練習機へ(7) | メイン | モールス受信練習機でタイマとメトロノームを作ってみる(3/3) »

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


 ラーメン・タイマの次にはメトロノームとキッチン・タイマにチャレンジしてみます。ラーメン・タイマでは3分間の時間が固定でしたが、メトロノームとキッチン・タイマではテンポや時間を調整できるようにしましょう。今回はメトロノームに挑戦です。

■メトロノームの基本
 メトロノームの基本は一定の時間ごとに音を出すことです。1分間に120回というテンポなら、120/60=2回/秒音を鳴らします。音と音の間隔は1/2=0.5秒となります。たとえば、
beep(1200, 100);
delay100ms(400);
beep(880, 100);
delay100ms(400);
をずっと繰り返すことで、高い音を0.1秒、無音0.4秒、低い音を0.1秒、無音0.4秒となり、1秒間に2回音を出すことができます。ずっと繰り返すためにはforループを使って、
for(;;) {
    beep(1200, 100);
    delay100ms(400);
    beep(880, 100);
    delay100ms(400);
}
とすればいいでしょう。

■A-D変換と角度の関係を知る
 テンポをボリューム(半固定抵抗)の角度に合わせて変えるにはどうしたらいいでしょうか。まずボリュームを回すと何が起きるのか考えてみます。ボリュームの両端の端子が電源とグラウンドにつながっていて、中央の端子がPICマイコンの5ピンにつながっています。ボリュームを回すと中央の端子の電圧が0から3V(電源の電圧)に変化します。ボリュームの角度と電圧は比例しています。つまり
(PICマイコンの5ピンの電圧)=(電源電圧)×(ボリュームの角度(0から100%))
で求められます。

 初期化の時にA-Dコンバータに5ピンの電圧を入力するように設定しているので、
GO_nDONE = 1;
delay(10);
GO_nDONE = 0;
とすると、ADRESH変数に、0から255の値が入ります。この値は、
ADRESH=(PICマイコンの5ピンの電圧)÷(電源の電圧)×256
となります(ただし計算結果が256となるときに実際には255になります)。上の式を代入すると、
ADRESH=(ボリュームの角度(0から100%))×256
となることがわかります。つまり、ボリュームの角度に比例してADRESHの値が0から255まで変化します。

■テンポを変える方法は?
 ボリュームの角度と ADRESH が比例しているなら、ADRESHを使ってテンポを変えることができそうです。さきほどの
for(;;) {
    beep(1200, 100);
    delay100ms(400);
    beep(880, 100);
    delay100ms(400);
}
について、どこを変えたらテンポが変わるでしょうか? メトロノームのピッ音の長さは変える必要がなさそうです。そうです。400のところを変えればよさそうです。じゃあ、400の代わりにADRESHを入れると、どうなるか考えてみます。
 待ち時間が0秒から25.5秒まで変化することになりそうです。ということは、音+無音の1組で0.1秒から25.6秒の待ち時間です。ということは、毎分600回(0.1秒)から毎分2.3回(25.6秒)というメトロノームになります。変化の範囲は広いのですが、あまり使わなさそうな範囲が多く含まれていそうです。

■よく使うテンポの範囲を考えて待ち時間を計算しよう
 だいたい使いそうなテンポの範囲の下限を1分間に30回としてみます。速いほうは1分間に300回ぐらいあればよさそうです。であれば、ADRESHはボリュームの角度に応じて0から255に変化するので、ADRES+30をテンポの範囲を表すようにすると30から285になって、よさそうです。

 次はテンポからピッとピッの間隔を求める方法を考えてみます。
(テンポ)=(1分間あたりの回数)
ですから、
(ピッとピッの間隔)[秒]=60[秒]÷(1分間あたりの回数)=60[秒]÷(テンポ)
で求められます。つまり、
(ピッとピッの間隔)[秒]=60/(ADRESH+30)
で計算できます。/は割り算の記号です。delay100msには0.1秒単位の数値が必要なので10倍して、
delay100ms(600/(ADRESH+30));
とすることで適当な待ち時間を作れます。ビープ音ならしている0.1秒が追加されるので、実際のテンポは、60÷(0.1秒+60÷30秒)の毎分28.6回から、60÷(0.1秒+60÷285秒)の毎分193回になります。

■メトロノームのmain関数
 完成したメトロノームのmain関数は次のようになりました。このプログラムでは高い音と低い音が交互に出るので2拍子ですが、3拍子、4拍子に聞こえるように音を変えたり、テンポの範囲を変えてみてください。次回はキッチン・タイマを作ってみます。

void
main(void)
{
    init();                 // 初期化

    for (;;) {
        GO_nDONE = 1;   // GO_nDONEを1にすると A-D 変換開始
        delay(10);      // 一定時間待つ
        GO_nDONE = 0;   // GO_nDONE を0にする

        beep(1200, 100);
        delay100ms(600/(ADRESH+30));
        beep(880, 100);
        delay100ms(600/(ADRESH+30));
    }
}
(光永 法明)

カテゴリ:

トラックバック

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





カテゴリ

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

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

Powered by
Movable Type 4.1
/*yahoo remove*/