RCX のファームウェアには WAVE ファイル再生機能は入っていないので、RCX CODE や NQC では実現できない。必然的に legOS を使って実装することになる。早速 legOS と H8 用 GCC をインストールして環境を作った。legOS 環境を構築するには梅さんの Web ページが非常に参考になる。
legOS の機能を調べると、8KHz 1bit の WAVE ファイルを再生する機能がある!なんだ解決したじゃないかと思い、試してみた。しかしドキュメントにも書いてあるとおり、実用にはツライ音質だった。やはりゼロクロス法の 1bit WAVE ファイルでは音質に限界があるようだ。
そこで legOS の WAVE ファイル再生ルーチンに手を入れて、8bit データを再生できるようにした。もちろんデータサイズは8倍になってしまうのだが、多少は聞き取れる程度の音質になった。4bit でもそれなりの音質だったので、さらに改善出来るのかもしれない。
まずは聞き比べてもらいたい。2番に繋げたタッチセンサを押すと、テスト用の WAVE ファイルを再生するプログラムを legOS を使って作ってみた。WAVE ファイルは個人でテストする時には色々使って遊んだのだが、公開することを考えて著作権に問題のない自分の声を録音したものを恥を忍んで作成した。
今回手を加えた legOS で作成したサンプルプログラム(LZH 形式 18KB)
オリジナルの legOS で作成したサンプルプログラム(LZH 形式 12KB)
サンプルプログラムは firmdl.exe yamete8.srec もしくは firmdl.exe yamete1.srec でダウンロード出来る。ダウンロードが終わったら Run ボタンを押し、2番に繋げたタッチセンサが ON の間「やめてよ〜」を繰り返し再生する。プログラム動作中は On-Off ボタンは利かないので、一度 Run ボタンでプログラムを停止させてから On-Off ボタンを押すこと。再びファームウェアをダウンロードするには Prgm ボタンを押しながら On-Off ボタンを押して電源を落とせば OK だ。
ちなみにタッチセンサ OFF の時には A と C のモータが回り、タッチセンサ ON の時にはモータが停止するようにしている。試しに左のようなロボットを作ってみた。このロボットは、通常は徒手空拳を振りまわすなのだが、頭を押さえると動きを停止して「やめてよ〜」と言うネガティブロボット「やめてよ君」だ。
自分で WAVE ファイルを再生したい場合はどうすればいいのか?
手を入れた legOS ソースプログラム等(LZH 形式 4KB)
ちょっと技術的なことにも触れてみよう。RCX の圧電スピーカは H8/3292 の 8bit タイマ ch0 の出力に繋がっている。アナログ出力ではないので、スピーカに対して0を出力するか1を出力するかしかない。このような状態で 8bit のデータを出力するのに PWM を用いる方法がよく使われている。つまり出力する WAVE ファイルの 0〜255 データに合わせて圧電スピーカ ON/OFF の Duty 比を変えてやることで、ON/OFF だけでもそれなりの音を再生できるのである。
日立の内蔵タイマはコンペアマッチレジスタを2つ持っていて PWM が簡単に実現できる。個人的には好きな内蔵タイマだ。タイマに供給するクロックを CPU クロック 16MHz の8分周である 2MHz に設定して 256 カウントさせれば約 8KHz になる。となると WAVE ファイルのデータがそのまま Duty 比に対応するので、値をそのままコンペアマッチレジスタに入れてやれば 8KHz 8bit の再生が出来ることになる。
実際これで再生を行なうと、PWM キャリア周波数である 8KHz の「ぴー」という音が出てしまい、実用にはならない。そこで今回はタイマ自身のカウントを 128 とし、2回に1回コンペアマッチレジスタに WAVE ファイルのデータを書き込むことで、PWM キャリア周波数を 16KHz にしながら、8bit データによるスペクトルの再現を行なえるようにしてみた。まだこれでも音質には不満ありありだが、オリジナルのままよりかは WAVE ファイル再生が使える機能になったと思っている。