信大ロボ研のブログ

信州大学ロボット研究会のブログです。

梵天丸アセンブラ制御研究報告6回目

こんにちは、2年のたぬです。
メカトロで遊ぶ会が開発した『PIC16F84Aを使用している入門者向け自律走行ロボットキット』である梵天丸を、アセンブラ言語によって制御する研究の中間報告6回目みたいです。
毎日更新しているのは、言わずもがな忙しくないからです。

本日の成果は以下の通りです。
梵天丸にカエルの歌を歌わせることに成功
梵天丸に残酷な天使のテーゼの始まりの部分を歌わせることに成功
正確には、「曲を流させた」です。
モーターをスピーカーとして利用することで、音声出力装置の無い梵天丸からも音を出すことができます。

PIC16F84Aには、PWM出力端子がありません。
ゆえに、ソフトウェアによってPWMもどきのことをする必要があります。
そのために、プログラミング上の制約として
○音を出している最中は時間を計るプログラムを使えない
○時間を計るプログラムの使用中は音を出せない
○時間を計っているときは他の処理が一切できない
この制約は、プログラミングをするうえで非常に重大な、大きな壁です。
私のプログラムの場合、音波1パルスを発生する関数を何度も呼び出すことによって音波を生成してます。
ゆえに、「音符1つに必要なパルス関数の繰り返し数がそれぞれの音によって全て違う」という全然うれしくない特典がついてます。
それでも、それぞれの音に対して四分音符や八分音符のパルス発生回数を調べれば、時間を計ることなく曲を流せます。
しかし、それの欠点として
○個人趣味範囲での研究ではやりきれないほどのデータが必要になる
○曲が複雑になるほど、プログラムが必要以上に長くなる
○テンポアップ、テンポダウンができない
とくに3番目の欠点については致命的です。テンポ変化ができないということは、「1曲につき1まとまりのデータが必要」ということです。つまり、調べたデータの使い回しができないということです。

私はこれらの欠点を克服するために、PIC16F84Aにある「ある機能」を使用することにしました。
そう、「タイマー0」です。
PIC16F84Aには、内臓のタイマーが存在します。正確には「実行サイクル数を数えるカウンター」が存在します。
このカウンターを用いることで、音波を発生させる処理中でも時間を計ることができるようになりました。
さらに、このタイマー0を用いると、いろいろとうれしい特典が付いてきます。
○テンポが自由に選択できる
○プログラムを超えてサブルーチンの使い回しができる
○必要なデータが少なくなる
これは、曲を流すアルゴリズムの影響も受けます。
私のアルゴリズムは、ソースなしでは説明しにくいので触れません。ただし、上記3つの特典は確実に得ています。
だからこそ、1日のうちに「カエルの歌」と「残酷な天使のテーゼ」の2つの曲を作ることができたのです。
テンポは、タイマー0のカウント数を調整することで早くしたり遅くしたりできます。
サブルーチンは「モーターを回すためのルーチン」「音波を発生させるためのモーター振動間隔をディレイで実行するルーチン」「音波1パルスを発生させるルーチン」「パルスを発生させ続けるルーチン」の4つで構成されています。音の波を発生させるだけなので、音を流し続ける時間に関するルーチンは存在しません。流す時間は全て、タイマー0の初期設定だけで変えられます。
また、タイマー0の使い方にも一工夫を加えました。64分音符をタイマーのカウント数としてプログラミングすることで、64分音符〜全ての音符を、ひとつの変数で変えられるようにしました。早い話が、64分音符タイマーを何回繰り返すかによって、音符の制御ができるということです。

まあ、欠点といえば「1音符につき最低でも処理が3つ必要になる」ということです。
早い話、長い曲を演奏させられないということです。