※このサイト内の情報は一切保証されません。参考にする際はすべて自己責任となります。
2023/07/02 Misskeyリンクの追加(内容に変更ありません)
2023/02/11 アクセスカウンタ・アクセス解析タグ入れ替え(内容に変更ありません)
2020/09/13 HTMLタグ修正(内容に変更ありません)
2016/03/16 回路変更
2016/02/21 制御ソフトウェア公開ページへのリンク追加

目次

1. 概要
2. パーツ
3. 回路
4. 製作
5. 実験
6. あとがき
7. 参考にさせていただいたサイト・情報

1. 概要

PC/AT互換機にはタイマとして、Intel 8254(オリジナルのIBM PCでは8253)が搭載(あるいは互換機能がマザーボードに搭載)されています。これは3つの16bitカウンタを持つタイマで、そのうち1つがBeep音のために使用されています。
キーボードを押しすぎた時などの「ピッ」という音はこの8254によって発せられています。
過去のDOSのゲームなどでは、サウンドカード(FM音源、PCM、MIDI等)が一切搭載されていなくても、この8254のタイマのカウント数を変えることで任意の周波数の音を出し、音楽を演奏するなどしていました。

しかしながら、長らくBeep音として採用されてきた8254のBeepは、64bit版のWindows、そして、32bit版ではWindows7から対応が終了しました。
32bit版のWindows7では、system32\drivers内のbeep.sysをWindowsXPのbeep.sysと置き換えることでbeep音を鳴らすことが可能ですが、64bit版OSではどうにもなりません。
そこで、PC上の8254を使うことを諦め、8254を外部に接続することにしました。
そして、せっかくなので3つのタイマをすべてBeep音に使用しました。

2. パーツ

ピンヘッダ・抵抗・電解コンデンサ・74HCU04はスピーカーアンプ用ですので、その部分が必要ないという場合は省略可能です。
3.571545MHzの水晶発振子を使っていますが、この整数倍の水晶発振子・水晶発振器を用いて適切に分周することでもちろん代用可能です。
また、水晶発振器の装着に14pinの平バネICソケットを使っていますが、丸ピンを使うべきです。
USBでの通信には安価なFT245Rを使用しています。モジュール化されたものを使用しましたが、直接使用してもよいかもしれません。

3. 回路

回路はPC/XTに倣い、次のようになりました。


PC/XTでは、NTSCカラーバースト(3.579545MHz)の4倍の水晶を、Intel 8284で3分周→2分周(PCLK端子出力)し、さらに8253の前で2分周、計12分周して8253に入れています。
これは3.579545MHzを3分周していることに等しいので、3.579545MHzの水晶発振器の出力を74HC4017で3分周します。
FTDIのFT245RLは非同期Bit Bangモードで使用すると、8bit分の端子しか使えないため(パラレルポートのようにたくさんの制御ピンがない)、シフトレジスタに1bitずつ書き込んで、8bit毎に8254へ書き込んでいます。
Beep音を鳴らすだけなので、8254から何かを読みだす必要はありません。したがって、~RDはHにしています。
8254はモード3(SQUARE WAVE MODE)で使用しています。PC/XTでは音を切るときは専用の制御ポートを使用していましたが、その部分は再現していません。
モード3では書き込んだ16bit値で入力周波数(今回は1.193182MHz)を分周した矩形波を出力します。
アナログ部はデタラメです。某社の74HCU04アンプキットの回路図(公開されています)を基に、手持ちの抵抗とコンデンサで作っています。
3つのタイマの出力のミキシングも抵抗を入れただけです。
音割れしまくりです(^^;;;;;
(2016/03/16追記)
アナログ部を改良して音割れ・音質を改善しました。
抵抗を33kΩ(回路図では33kとなっていましたが、実装では20k)から200kΩへ、出力コンデンサを10μFから100μFに換装しました。
入力を抑えて音割れを防ぎ、コンデンサ容量を増やし出力波形をなだらかにすることで音質が改善されました。(特に和音発音時)
また、音量がやや落ちたため、出力段の74HCU04インバータ素子を1つ増やしています。

4. 製作

製作には72x95mmのユニバーサル基板を用いました。
次に部品のマウント・はんだ付けをしていきます。ICを直付けして壊さない自信がなかったためICソケットを使用しました。

配線は0.6mm径のスズメッキ線、0.26mm径のUEWとETFE線を用いました。ETFE線もはんだごてを当てると被覆が簡単に溶けますが、はんだ付けはどちらかというとUEWの方がしやすいです。
これまでの製作ではスズメッキ線を持っていなかったのでディスクリート部品の足で配線していましたが、さすがに汚くなるので1本買いました。
8254のOUT0-2はピンヘッダを使って外に出しています。こことGNDの間にスピーカーを挟むことによってBeep音を鳴らすことができます。
すべての配線が終わったら、テスターで導通・絶縁をチェックしてICをソケットにはめ込みます。
最終的に次のようになりました。



(左:表面 右:裏面)
配線自体は、FT245Rモジュールから6本、シフトレジスタから8本、発振器から1本、8254から3本と、非常に簡潔です。ぐちゃぐちゃの素麺配線はギリギリ回避(^^;
むしろ、アナログ部の定数変更(ブレッドボード上でテストしたにもかかわらず、基板に実装するとうまくいかない・・・)でランドを剥がしてしまうなど(_ _;)

5. 実験

USB経由の制御であるため、実験にはプログラムが必要になります。
FTDIからFT245R用のドライバ・ライブラリが提供されているのでそれを使用してVisual Studio 2010 ExpressのC++で制御プログラムを作りました。「USB-8254ボード用制御プログラム」に公開しています。
制御のプロトコルとしては、1bitずつデータを送信し、8bit送信後に8254のA0とA1に対象のアドレスを出力し、~WRをLにしています。
Beep音をただ鳴らすだけではつまらないので、3chのうち1chを高速に切り替えて音楽を演奏してみました。

過去に、32bit Windowsのマシンで演奏した動画も比較用に掲載しておきます。

6. あとがき

今回は、マイクロコントローラは(USBインタフェースを除いて)基板上に乗せていません。
USBインタフェース部分はそっくりそのままレガシーなパラレルポート(IEEE 1284)に置き換えられます。
これは、PC/XTのBeep音発音回路をなるべく再現するという目的のためです。
8253と8254は8254の方が読み出し機能が一つ増えている以外は同じチップなので、今回は8254を使用しました。
マイクロコントローラの類を使用すればICは一つで済んで簡単にできるのでしょうが、そのような製作例(マイコンによる電子オルゴール)はたくさんありますし、そもそもPC/XTのBeep音発音を再現する目的から逸脱するため、マイクロコントローラは使用しませんでした。
「Beep音のような矩形波で音楽を演奏する」という目的であれば、この回路は非常に冗長・ムダの多いものです(^^;;;;
アナログ回路についてはデジタル回路以上(以下?)に素人なので、デタラメに組んで、結局音割れしまくってます。
音割れなく0V-5Vの矩形波をミキシング・増幅する方法が知りたい・・・(_ _;)
(2016/03/16追記 適切な抵抗値・コンデンサ容量をよく考えるべきでした。)
74HCU04はしばらくするとほんのり暖かくなってきます。電流が結構流れているのでしょう。(測定してない^^;)

7. 参考にさせていただいたサイト・情報


上へ
戻る