USB機器を作るぞ!プロジェクト

トップページへ

2010/7追記:
このページの情報はずいぶん古くなってしまいました。新しいページ(2010年〜版)を書きかけです。

パソコン周辺機器を自作する際のインターフェースとして、一昔前はRS-232Cやプリンタポートなどを使用することが多かったのですが、最近ではUSBに置き換えられることが多くなりました(特にノートパソコン)。これは、自作愛好者にとって危機といえるでしょう。
ということで一念発起してUSB機器を作ってみました。やっと動作するものができてきましたので紹介します。
動作確認環境はWindows98 Second Editionです。
基本的には個人で入手可能な部品を使っているつもりです。
主要部品は以下の通りです。
・マイコン:Atmel AT90S8515(4414でもOK)
・USBチップ:National Semicondunctor USBN9602
製作に関するもうちょっと詳しい内容についてはこちらをご覧ください。

テストボード(キーボード)


USBポートとデバッグ情報表示用のLCD,タクトスイッチのみのシンプルなテストボードです。タクトスイッチを押すとスペースが入力されるものです。LCDは文字数が限られているため、一見意味不明な文字の羅列が表示されます。
これが動作すれば、キーボードだけでなく、マウス、ジョイスティックなどに適用するのは簡単です。
デバイスドライバは必要ありません。Windowsが自動的に認識します。
回路図・ファームウェアのダウンロード

USBキーボード


本USBキーボードの製作は高村氏と共同で行いました。氏はホームページで高岳製作所のXMiNTキーボードを改造してPS/2化されています。これをUSB化しました。
ハードウェア的には、高村氏のPS/2キーボードにUSBチップを付け加えた形になっています(USBチップとの通信にSPIを使用するため、一部キーマトリックス用のピンを変更しています)。USBの信号線は一旦PS/2の余りピン(本来は予約)に出しておいて、変換コネクタでUSBのシリーズBプラグに変換しています。そのためハード的にはPS/2にもUSBにも対応できます。まだ完成していませんが、最終目標はPS/2とUSBの両方に対応(自動切り替え)することです。
USBとは別にもう1本出ている線はAVRマイコンのISP用です。
ファームウェアは、テストボードのプログラムにちょっと変更を加えるだけです。変更点はキーマトリックスを読みとって対応するキーコードをFIFOにセットするところです。
このソースをアセンブルするにはToms氏のAVRアセンブラ
を使って下さい。Atmelのものとマクロや定数の仕様が若干違います。
回路図・ファームウェアのダウンロード

テストボード(バルク転送)

テストボードハードウェアは上のと同じです

作成したWindowsアプリケーション

周辺機器とアプリケーションの間で本格的にデータをやりとりする場合にはバルク転送モードを使用するのが良いと思います。デバイスドライバが必要になります。
テストボードのファームウェアはEndPoint2で受信したデータをそのままEndPoint1に送信するものです。バッファは128バイトで、リングバッファになっています。128バイト以上受信した場合は捨てられます。
まず、Windows98DDKのサンプルアプリ(rwbulk.exe)を動作させました。その時の画面はこれ
それから、それをWindowsアプリに移植しました(上のウィンドウの絵がそれです)。
時間を測定してみると、10バイト程度でも送信・受信にそれぞれ3msecくらいかかっているようです(時々10数msecになることもありました)。最大転送速度はまだ測定していません。USB仕様書によると、仕様上は12Mbpsまでいきそうですが。
回路図・ファームウェア・ドライバ・アプリのダウンロード

まとめ

やっとバルク転送ができるところまでこぎつけました。何かおもしろいアプリケーションを探して応用したいものです。
Bulk, Isochronous, Interruptの各モード混在をどうすればよいかとか、まだまだ課題は多いです。柏野氏やもろぼし☆らむ氏など、デバイスドライバに詳しい方がおられますので、それを参考にするのが早道だと思います。
製作に関するもうちょっと詳しい内容についてはこちらをご覧ください。

注意

ここに書いてある通り、ベンダIDを正規に取得していません。本プログラムをこのまま使用する場合は個人的な使用にとどめてください。
お約束:本ページに掲載されている回路図・ソフトウェア等を使用した結果については一切責任を負いません。商用利用は一応禁止としておきます。

Last update: 2000/6 TTRMKR