目次>5章 第2ステップ(色々な実験)>(10)スピーカを使って音を出す

スピーカを使って音を出す

更新日2006.1.29

PICにスピーカをつなげて音を出します。
人間の耳に聞こえる音の周波数は、20Hz〜20,000Hzと言われています。
ここでは、50Hzから10,000Hzまで、徐々に周波数を変えてスピーカを鳴らしてみます。

実験回路

今回作成する回路図です。
RA0にスピーカを接続しています。
RA2のLEDはパイロットランプとして使用します。(0.5秒間隔で点滅させます)
レゾネータ(セラロック)は、20MHzのものを使用します。

ブレッドボードに組み込んだ状態です。
スピーカは、手元にあった8Ω,0.2Wタイプのものを使用しましたが、新たに購入するのであれば0.5Wタイプにして下さい。 (後で追加実験を行いますが、その時には最大0.3W程度の出力になりますので。)

プログラムの作成
スピーカを鳴らすには

以下のような信号(正弦波)をスピーカに入力すれば音を出すことができます。

しかし、PICから直接正弦波を出力すことはできませんので、以下のようにパルス(ここでは矩形波)を出力することにします。
プログラムの作りとしては、RA0の出力を一定間隔でON/OFFさせることでパルスが出力できます。

1/2サイクルはRA0をONにし、次の1/2サイクルはOFFにします。

まず、1サイクルの時間を考えてみます。
50Hzの場合1秒/50Hz=20mS(ミリ秒)
10,000Hzの場合1秒/10,000Hz=0.1mS(ミリ秒)

1/2サイクルの時間は上記の半分ですので以下の通りです。
50Hzの場合20mS/2=10mS(ミリ秒)
10,000Hzの場合0.1mS/2=0.05mS(ミリ秒)

従って、10mS毎にRA0をON/OFFさせれば、50Hzの低い音が出ます。
また、0.05mS毎にRA0をON/OFFさせると、10,000Hzの高い音が出ます。

1/2サイクルの時間用タイマ

1/2サイクルの時間を判断するためにタイマが必要ですが、ここではTMR0割り込みを使用します。
最も短い時間は、10,000Hzの場合で0.05mSです。
このため、TMR0の設定は以下のようにしました。
プリスケーラ使用しない
TMR0フリーラン (初期処理で0を設定し、後は変更しない)

クロックが20MHzですので、TMR0割り込みの時間は以下のようになります。
PICの1命令実行時間
(1秒/20MHz)×4=0.2uS(マイクロ秒)
TMR0割り込み時間
PICの1命令実行時間×プリスケーラ倍率×TMR0オーバフローカウント
=0.2uS×1×256
=0.0512mS

TMR0割り込み1回毎にRA0をON/OFFさせれば、約10,000Hz(計算上は9,765Hz)の出力となります。
また、TMR0割り込み195回毎にRA0をON/OFFさせれば、約50Hzとなります。

プログラムの概要(パルスを発生させる)

プログラムでは、以下のようにパルスを発生させます。

まず、1/2サイクルをカウントするカウンタを用意します。
このカウンタには、次の値をセットします。
 (1/2サイクルの時間)/(TMR0割り込み時間)

そして、TMR0割り込み毎にカウンタから1づつ減算し、0になったらRA0の出力を反転させます。同時にカウンタには初期値をセットします。

この例では、カウンタの初期値を4にしています。

従って、1サイクルの時間は
 0.0512mS×4×2=0.4096mS
となります。

周波数は、
 1秒/0.4096m秒=2,441Hz
になります。

プログラムの概要(音の高さを変化させる)

上で説明したカウンタの初期値を、195から1まで100mS毎に−1することで、周波数を50Hzから9,765Hzまで序所に変化させます。
スピーカからは、「ブー」という低い音から、「ピー」という甲高い音まで20秒間かけて序所に変化します。

この様子を表したものが下のグラフです。
カウンタの値を−1減算するにつれ、周波数が高くなりますが、後半で急激に周波数が高くなります。
スピーカの音としては、最初は「ブー」という低い音が少しずつ高くなって行き、後半の2秒〜3秒位で一気に高音に変化します。

プログラムの概要(タイマ)

このプログラムでは、以下のタイマを使用します。
TMR0割込みを基準にしています。

タイマ値算出方法用途
0.0512mS1回のTMR0割り込み時間1/2サイクルをカウントする
10mSTMR0割り込み195回100mS,500mS算出用
100mS10mS×101/2サイクルのカウンタの初期値を減算する間隔
500mS10mS×50RA2のLEDを点滅させる間隔

プログラムの概要(処理フロー)

以下はメインルーチンのフローです。


以下は、割込み処理のフローです。

プログラム全体
上記の処理を組み込んだプログラムはこちらです。
メモ帳などのテキストエディタに取り込んで、SPEAKER0.ASMという名で保存し、MPLABでアセンブル&PICライタでPICに書き込んで動かしてみて下さい。