PIC16F84A ブザー音 ドレミ


20150501_pic_buzzer

PIC16F84A のデジタル出力に 圧電ブザー をつけて、ブザー音を鳴らすことができます。
さらに、ブザー音の周波数を変えることで、疑似的な音楽を鳴らすことができます。
例えば、A(ラ)の音は 440Hz なので、1秒間に440回オンオフを繰り返すことで、Aの音になります。
正確に 440回を刻むために、タイマー割り込みを使用します。

割り込み周期は下記の 計算式 で求められます。
(Fosc / 4) * プレスケーラー分周 * タイマー分周

なお、440回オンオフを繰り返すには、倍の 880Hz の割り込み周期が必要となります。
880Hz にするには、Fosc が 16MHZ のときは、プレスケーラー分周 が 1/32 で、タイマー分周 が 1/142 となります。
同じように、他の音も周波数から分周比も計算して、ドレミの音階を作ります。
周波数は ドレミの音階(平均律)に対応した周波数の表 を参照しました。

音階 周波数 分周比 タイマー値
262 Hz 1/239 17
293 1/213 43
330 1/189 67
ファ 349 1/179 77
392 1/159 97
440 1/142 114
494 1/127 129
高いド 523 1/120 136

プログラムの例

#define DO4 17
#define RE 43
#define MI 67
#define FA 77
#define SO 97
#define RA 114
#define SI 129
#define DO5 136
void tone( int tmr, int t1, int t2 ) {
    tmr0_value = tmr;
    TMR0 = tmr0_value;
    is_tone_enable = true;
    for( ; t1>0; t1-- ) {
        __delay_ms(10);
    }
    noTone( t2 );
}
void noTone( int t ) {
    is_tone_enable = false;
    for( ; t>0; t-- ) {
        __delay_ms(10);
    }
}

プログラムを Github に公開しました。

補足
タイマー割り込みでブザー音を鳴らす方法は、Arudino でも採用されています。
Arudino では、tone関数に周波数を指定すると、関数の中で計算してプリスケーラーとタイマーの値を決めています。
今回のPICでは、予め計算しておいたプリスケーラーとタイマーの値を設定します。

参考
ドレミの音階(平均律)に対応した周波数の表


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です