(2001.09.16加筆) | |
(2001.09.25加筆) | |
(2001.09.02加筆) | |
(2001.06.28更新) | |
(2001.07.24加筆) | |
(2001.10.01加筆) |
そうなると電子工作野郎としては USB 経由で何かを動かしたくなります。外部の自作ボードを制御するために、よく PC のパラレルポートを使ったりしますが、電源を別に用意しないといけないのが面倒なんですよね。PC まわりはコンセントがふさがりやすいですし、PS/2 ポートからというのも、ナニですからねえ。
そういった欲求にピッタリなのがモルフィー企画の汎用 USB-IO でしょう。これを使えば非常に簡単に USB で I/O をコントロールできます。チップが DIP タイプなので、自作回路に組み込みやすいのもイイですねえ。私の想像以上に多くの方が購入されたようです。
汎用 USB-IO では Cypress の CY7C63001A という USB コントローラ内蔵マイコンが使われています。このファームウェアを書き換えれば、入出力信号をもっと自由にイジレルのですが、こいつはワンタイム PROM なので、一度ファームウェアを焼いたら書き換えることはできません。オンボードで書き込み可能な Development Kit も販売されていますし、モルフィー企画にお願いして自作ファームウェアを焼いてもらうという方法もありますが、AVR や PIC のようにお手軽に書換えるという訳にはいきません。
そこで登場するのが現 Cypress の EZ-USB です。CQ 出版のインタフェース誌 2001年 1月号で詳しく紹介されていますが、USB を介して PC から内蔵 RAM にファームウェアを転送し、RESET をかけてファームウェアを実行できます。専用ライタもダウンロードケーブルも無しで、自作ファームウェアの転送、実行を何度でも行うことができるのです。PCとつなげずに単体で動かすときには外付けEEPROMが必要ですが、開発時にはPCと繋げるのが常、何の問題もありませんねえ。
Cypress からは EZ-USB の Development Kit が用意されています。インタフェース誌の記事では CQ 出版から販売されている FLEX10KE 評価キットのボード上に載っている EZ-USB チップを使っています。が、両方とも5万円程度、気軽に買える値段ではありません。それにアマチュアとしては、評価ボードでデバッグしたら、あとは基板を起こして....というわけにはいかないので、もっとシンプル、安価なプラットフォームで実験、開発をしてみたいものです。
そんな時に見つけたのがチンゲン菜さんのこのページです。I-O DATA の USB-RS232C 変換アダプタ USB-RSA が EZ-USB シリーズの AN2131QC を使っていて、ハードの改造無しにファームウェアの転送、実行ができるというのです。これは素晴らしい!EZ-USB チップは秋葉原のパーツショップでは売ってないし、DIP ではなくフラットパッケージなので、自作には不向きかなあと思っていました。しかし USB-RSA を使えばハンダ付けをすることもなく、すぐに USB で遊んでみることができるのです。たまたま USB-RSA を段ボール箱の中で眠らせていたので、引っ張り出して追試をしてみました。チンゲン菜さんは AN2131QC でSONY の HGR1,3 エミュレータを作られています。チンゲン菜さん程の情報量は無いですが、私も自分の行なった環境構築についてまとめてみます。
まずは開発環境の入手からです。Cypress の Development Kit AN2131-DK001 のページからソフト一式をダウンロードします。22MByte 近いサイズなので気をつけてください。ダウンロードが終わって実行すると、WinZip により2つのディレクトリが展開されます。それぞれのディレクトリの下の setup.exe を実行することで、開発ツール等がインストールされます。インストールされるのは EZ-USB Control Panel、ドライバ、アセンブラ、C コンパイラ、ドキュメント等です。PATH を keil\C51\BIN に設定しておくと、コマンドラインでのコンパイル、アセンブルが楽になります。
次はドライバのインストールです。ファームウェアをダウンロードできるようにするには、USB-RSA のドライバではなく、開発環境と一緒にインストールされた EZ-USB 用ドライバが必要です。USB-RSA を挿した時にこの EZ-USB ドライバが読み込まれるように inf ファイルを作り、これを使ってドライバのインストールや更新を行います。DDK の usbview.exe によると USB-RSA のベンダ ID は 0x04BB、プロダクト ID は 0x0A01 なので、Drivers ディレクトリの下の ezusbw2k.inf ファイルに下記の記述を追加しました。
* [Cypress]に追加 * ; I/O DATA USB-RSA %USB\VID_04BB&PID_0A01.DeviceDesc%=EZUSB.Dev, USB\VID_04BB&PID_0A01 * [Strings]に追加 * USB\VID_04BB&PID_0A01.DeviceDesc="I/O DATA USB-RSA (AN2131QC)" |
EZ-USB ドライバが読み込まれたら、スタートメニューに登録されている EZ-USB Control Panel を動かします。ドライバがインストールされていない状態では No Anchor USB Device detected. と表示されて、先に進めません。まずは Examples の下にあるファームウェアをダウンロードしてみましょう。DOWNLOAD と書かれたボタンを押し、Examples\EzUsb\bulktest\target の下の bulktest.hex を選択して OK ボタンを押すと、ファームウェアがダウンロードされ、RESET がかかり、実行されます。Examples\buktest\host\Release の下の bulktest.exe を動かし Start ボタンを押すと、バルク転送が行われます。
(2001.9.16 加筆) 上記説明は間違いで、インストールされた状態のままでは bulktest.hex をダウンロードしても EZ-USB 上では正常動作しません。以下の記述を参考にして自分の環境に合わせて再ビルドしてください。もちろん bulktest.exe の方はそのままで動作します。
これでファームウェアを書換えれば、煮るなり焼くなりです。基板上には JP1 とシルクで書かれたジャンパピン用と思われる未使用スルーホールもあるので、これを使えばお手軽に信号線をとり出すことが出来そうです。
そんな折り、I-O DATA の USB-H64 で AN2131SC が使われているという情報を知りました(実際には AN2136SC が使われているようです。チンゲン菜さんのページの写真を参照)。これならヨドバシカメラでも売ってるぜ、ということで町田店に行き、6,600円で販売されているのを確認しました。しかし他のデバイスでも EZ-USB が使われているんじゃないかと思い、商品棚を見ること数分、目に入ったのが同じく I-O DATA の USB-PDC でした。やっていることは PHS 用と変わらないはずだと考えて勝負に出て購入。ヨドバシカメラで 3,900円という値段も勝負に踏みきった一因でした。
家に帰ってまず分解。中のチップには Cypress AN2131SC と書かれていました。勝利。次にドライバをインストールしてみます。USB-PDC のプロダクト ID は 0x0902 だったので、下記のような記述を inf ファイルに追加して EZ-USB 用ドライバを読み込ませました。
* [Cypress]に追加 * ; I/O DATA USB-PDC %USB\VID_04BB&PID_0902.DeviceDesc%=EZUSB.Dev, USB\VID_04BB&PID_0902 * [Strings]に追加 * USB\VID_04BB&PID_0902.DeviceDesc="I/O DATA USB-PDC (AN2131SC)" |
結局 USB-RSA と同じように Examples のファームウェアも動きました。基板も小さいし値段も安いしどこでも売っているし、当面はこれで遊んでみることにします。
(2001.9.25 加筆) 最近店頭で見かける USB-PDC2 では EZ-USB を使っておらず、USB-Serial 変換 LSI を使っているようです。ご注意下さい。
(2001.9.2 加筆) AN2131SC では Port A の bit4 と bit5 も使用可能です。したがって自由に使える信号は 18bit となります。なかよしさん、ご指摘ありがとうございました。
Port C の bit6/7 のプルアップ用 10K チップ抵抗(AN2131SC の1番ピンの対角位置にある2つのチップ抵抗)を外すと、Port C は完全に自由になりました。秋月の 20P コネクタをポリウレタン線(UEW)で AN2131 の Port C につないでみました。あと GND と 3.3V をコネクタに出せば、とりあえず 8bit の I/O として使えます。コネクタは瞬間接着剤でケースの片側に接着しました。
(2001.8.29 加筆) なかよしさんからの情報で、以下のように Port 同士が結線されている事がわかりました。何だか Port の調子がおかしいと思われていた方、どうも済みませんでした。なかよしさん、素晴らしい情報をありがとうございました。
PIN17 PC3--PIN30 PB6
PIN28 PB5--PIN29 PB4
動作テストを兼ねて、7セグメント LED を光らせてみました。開発環境のサンプルプログラム EzIso_asm のソースに手を加えて Port C を出力に設定します。設定は PORTCCFG レジスタへ 0x00 を、OEC レジスタに 0xFF を書き込めば OK です。あとは OUTC レジスタに値を書けば出力されます。これで PC から各種デバイスへのアクセスが非常に簡単になりますねぇ。細かいタイミング制御が必要な場合は AN2131SC 側でローカルに処理できますし、大量のデータのやり取りも USB 経由なので安心です。
調子に乗って Control Panel を使って USB-PDC 上の EEPROM にプログラムを書き込んでしまいました。先頭アドレスに 0xB2 を書き込み、スタンドアローンで動作するようにしたのですが、ホスト PC からの応答部分が全然無いプログラムを書き込んだためか、デバイスが正しく認識されなくなってしまいました。これでは再び Control Panel で EEPROM への書き込みが行なえません。結局断腸の思いで EEPROM の 5pin を浮かせ、再び EZ-USB として認識されるようにしてみました。安易な書き込みは死を招くという教訓を得ることが出来て非常によかったです。(^^;
最初は Cypress が提供する C 言語によるフレームワークをベースにしようとしたのですが、現在のところうまく動作せず、結局 8051 アセンブラによる Keyboard Emulator のソースをベースにして動作させました。ezint.a51 というファイルの EP0Out_ISR: 以降の部分で PC から送られるデータを一度 ReplyBuffer というシンボルの RAM 上に書き込んでいます。この値を見て I/O の操作を行なうコードを追加すれば、USB-IO と同じような動作が期待できます。Cypress の Development Kit 用開発環境添付の Keil 統合環境のプロジェクトファイルを含んでおりますので、hex ファイルの再構築も容易です。
RC サーボ制御 USB-IO 用に作った VB アプリを実行すると 8byte のデータが送受信されるのが確認できました。現在はアセンブラで書かれていますが、ユーザ追加部分を C 言語で書けるように、フレームワークを使わない方式でソースを変更していこうと画策しています。
残念ながらこのキットは買っただけでは動かず、ファームウェアを作る必要があります。前回公開した USB-IO 互換ファームウェアをそのままダウンロードして動かすことも出来ますが、全てアセンブラのソースとなっているので、どこをどう変えればよいのか、すぐには分からないという問題がありました。
そこで、基本的な部分はそのままで、PC から送られたデータを処理する部分などユーザが手を加えたい部分をC言語で記述できるようなフレームワークを作成してみました。これを使えば、PC から送られたデータに応じて Port 出力を変えたり、定周期処理ルーチンを組み込んだりすることが簡単に出来るようになります。
Cypress の Web ページから無料でダウンロードできる Development Kit ソフト同梱の Keil 製Cコンパイラ統合環境評価版に対応しています。統合環境がインストールされていれば、プロジェクトファイル ezusb_io.uv2 をダブルクリックするだけで、開発環境が立ち上がります。あとは自分の開発環境がインストールされているディレクトリに合わせて Project->Setup File Extensions, ... から開発環境のあるディレクトリを設定すれば OK です。
user.c がユーザプログラムを記述するソースになります。ここで使われている関数について説明してみます。
PC とのデータのやり取りが USB-IO 互換程度でよければ、非常に簡単に処理を記述することが出来ます。汎用 USB-IO では難しかったファームウェアの変更も簡単です。テストの終わったファームは EEPROM に書き込むことで、単体で起動することも可能になります。今までパラレルポートで制御していた外部ハードウェアを、レガシー I/F を持たない Note PC から制御したい...といった用途には最適なのではないでしょうか?
通常自作 USB デバイスと Bulk 転送するなら uusbd.sys を使うのが一番楽かもしれませんが、今から新規にドライバを入れるのは面倒です。汎用 USB-IO の場合は PC に挿して使うだけなので Win に標準添付の HID 互換ドライバを使うのが一番楽でしょう。しかし EZ-USB で開発している人の場合は、まず最初に Cypress のドライバがインストールされた状態になります。という訳で、この Cypress ドライバ経由で EZ-USB と Bulk 転送するのが一番楽だろうという結論に至りました。
Cypress の開発環境をインストールすると Examples ディレクトリの下にサンプルソースが置かれます。この中の bulktest が、Bulk 転送を実現する EZ-USB 側のファームと C 言語による PC 側ホストアプリとなっています。但し target ディレクトリの下に置かれている bulktest.hex は ROM 空間に配置されていて、そのままでは EZ-USB に転送しても動きません。これは自分の環境に合わせて以下のように再ビルドする必要があります。
問題はホスト側です。host ディレクトリの下の main.c を参考にして、例によって安直に VisualBasic から Cypress ドライバにアクセスするアプリケーションを作成してみました。アクセスに必要な定義は ezusb.bas という標準モジュールに分けているので、これを自分のアプリケーションに取り込めばよいでしょう。
(2001.10.1 加筆) 五味さんからの情報で、ezusb.bas の CreateFile の引数宣言に不具合があるとのことです。ByRef lpSecurityAttributes を ByVal に修正すると良いようです。ちなみに上記サンプルアプリではこの引数を使用していなかったため、問題が発生するのが分かりませんでした。五味さん、情報をありがとうございました。
基本的には CreateFile でドライバを Open し、DeviceIoControl で Bulk 転送 Read / Write を、そして最後に CloseHandle でドライバを Close するという流れになります。上記サンプルでは ezusb-0 という固定名で Open しているのですが、この 0 を変えることで複数の EZ-USB とやり取りが可能になります。
動きとしては以下のような感じになります。
こんな感じなので、それぞれサンプルを拡張していけば、手軽に大量のデータをやり取りすることが可能になると思います。