V-USB ホスト側アプリとAVR-HID/IO
(C) Objective Development Software
2012年4月 前回の記事「V-USBを利用してHIDデバイスを作る」はハードウェア編でした。 今回はホスト(PC)側のソフトを紹介します。C#でHIDデバイスを操作するライブラリです。 また、汎用I/OデバイスAVR-HID/IOとそれを操作するアプリを作成したので、ハードともども紹介します。 |
なぜ自作ライブラリなのか | |
PCからUSB/HIDデバイスを操作するにはWindows APIを使います。必要なAPIはhid.dll, setupapi.dll, kernel32.dllに含まれています。これらを使ってイチから自分で組むのも一興ですが、libusbを使う方が簡単です。libusbはUSBデバイス操作の汎用ライブラリで(HIDデバイスに限らない)、libusb0.sys(ドライバ)とlibusb0.dll(ライブラリ)から成っています。
WinUSB APIを使ったドライバ開発の方法もあります。この場合Windowsに含まれるwinusb.sys/winusb.dllを利用するのですが、これらはWindowsXP/SP1以前には含まれていません。MicrosoftUpdateでSP2以上にアップデートしても追加されません。※手元の開発機WindowsXP/SP3(SP1からアップデート)には入っていないので、WinUSBを使った開発の線はここで消える。 libusbを使用したアプリの実行にはlibusb0.dllが必要です。アプリのexeファイルと同梱して配布するか、アプリ利用者に別途用意してもらうことになります。後者の場合、「DLLのバージョンによってアプリの動作が異なることがある」という、よくある心配事が付いてきます。 ここで、本シリーズ記事がHIDデバイスを開発している理由は、「デバイスとアプリを利用するのに、ドライバのインストールが不要だから」です。というわけで、libusbも使わずホスト側アプリを開発しました。 ※C#で開発したい、自分で好きなように作れる、というのも理由。 今回作成したライブラリはUSB汎用ではなく、V-USBを利用したHIDデバイスを操作するためのものです。多様なUSBデバイスを制御するためのものではありません。 C#でソフト開発しない人には、本記事の見所は特にないかもしれません。 C#のプログラミングに興味がある人には、USBやHIDのこととは関係なしに、プログラミング技術の面で参考になることがあるかもしれません。本ライブラリではCで組まれたDLL内のAPIを呼び出しています。マーシャリング、アンマネージ領域のメモリ操作、それを含むスレッド処理などは、マネージコードだけのプログラミングとはちょっと違うコツがあります。ソース内のコメントを参照してください。 |
USB HIDライブラリ | ||||||||||||||||||||||
ソース(UsbHidLib.cs)は次章「AVR-HID/IO」でダウンロードできます。 使用例として、前記事のテストプログラムhiddevc.exeのProgram.csを【ここに示します】。※下図は概略。
プロジェクトの準備 1. プロジェクトに「UsbHidLib.cs」を追加する。 2. ソースに「using UsbHid;」を記述する。 ソース記述の手順 1. HidDeviceMgrオブジェクトを生成する。 2. HidDeviceMgr.GetDeviceList()でデバイス一覧を取得する。 3. HidDeviceMgr.TargetDevice()で目的のデバイスを決定する。HidDeviceオブジェクトが返る。 4. 以降、HidDeviceオブジェクトを通してデバイスを操作する。 同種のデバイスを複数台接続した場合、手順2の一覧に全て含まれます。それぞれのシリアル番号やデバイス名を見て目的のデバイスを選びます。または、それら一つ一つを手順3で決定し(それぞれのHidDeviceオブジェクトを取得し)、個別に操作することもできます。
|
AVR-HID/IO | |||||||||||||||||||||||||||||||||||||||||||||
前回の記事で目標としていた、AVR-CDC/IOと同様のデバイスAVR-HID/IOを作りました。 ATmega48シリーズ版とATtiny2313版があります。 回路はどちらもV-USBの基本回路の通りです。フラッシュ容量の都合によりATtiny2313版は機能を削減しています。 ソフトの組み方・ライブラリの使い方は、上記ZIPに同梱のサンプルプログラムを見てください。※下図は概略。
サポートしている操作
サポートしている操作
|
AVR-HID/IOの応用について |
AVR-CDCシリーズにはAVR-CDC/IOの他、AVR-CDC/232やAVR-CDC/SPIがあります。今回製作したAVR-HID/IOは外から見れば汎用I/Oデバイスですが、内部的にはAVRのレジスタ操作デバイスです。レジスタを適切に設定すれば、AVR-CDC/232やAVR-CDC/SPIと似たような動作をさせることもできます。ですがAVR-HID/IOの原型を維持しようとせず、目的の製作物に合わせて独自に作り替えた方が扱いやすいものになります。 AVR-HID/IOはUSBロー・スピード・デバイスなので仕様上1.5Mbps出せます。ホストとの通信速度で困ることはあまり無いと思います。それよりも、SRAM上に送受信バッファをどれだけ取るか、インタラプト転送(IN)を使うか連続したコントロール転送(IN)で処理するか、それで速さと処理量が見合うのか、細かいレジスタ制御が必要になるのか、といったことが考えどころになるでしょう。 |
◆ ◆ ◆ |
V-USBを利用してHIDデバイスを作り、ホスト側アプリにlibusbを使わず、C#で開発したい。 …という場合に本記事のアプリが参考になれば幸いです。かなり限定された向きの話です。 |
(C) 『昼夜逆転』工作室 | [トップページへ戻る] |