USB HID Device (PC側)

(2015.6.15 作成)

(2015.10.10 修正)

 USB HIDデバイスを使用するためのホスト側(PC側)について紹介したいと思います。といってもホスト = PC = Windows という環境での説明です。実際はAndroidやMacでも使えるとは思うのですが、単に管理人がWindows以外あまり触ったことがないというだけですのでそこはご容赦を。

 まずHIDデバイスですが、基本的には名前(Human Interface Device)が表すようにキーボードやマウス用のプロトコルです。このプロトコルを利用して任意のデータを送受信できるようにします。

 WindowsでHIDデバイスを使用する例は検索すればいくつか出てくるのですが、ここではこのライブラリを使用する方法を紹介します。使用する言語はC#です。

プロジェクト作成

  1. UsbHid.zipをダウンロードして適当なフォルダーに展開してください。この際始めての場合はユーザー登録が必要になると思います。
  2. Visual Studioを起動して適当にC#プロジェクトを作成します。
  3. Visual Studioのソリューションエクスプローラからソリューションを右クリックし追加→既存のプロジェクトとしてUsbHidを追加します。
  4. 再びソリューションエクスプローラから先ほど作成したプロジェクトを右クリックし参照→ソリューション→UsbHidを追加します。

 最後にデザイナで右図のようにコンポーネントを配置してコーディングの準備完了です。

サンプルコード

 少し長いですが、サンプルコードを以下に載せます。

UsbHid.UsbHidDevice Device;
const int VID = 0x0483;
const int PID = 0x5750;

private void Form1_Load(object sender, EventArgs e)
{
        TryDeviceConnect();
}

#region Connect/ Disconeect
private void buttonConnect_Click(object sender, EventArgs e)
{
        TryDeviceConnect();
}

void TryDeviceConnect()
{
        Device = new UsbHid.UsbHidDevice(VID, PID);
        Device.OnConnected += DeviceOnConnected;
        Device.OnDisConnected += DeviceOnDisConnected;
        Device.DataReceived += DeviceDataReceived;
        Device.Connect();
        if (!Device.IsDeviceConnected)
        {
                Device.Dispose();
                Device = null;
        }
        else
        {
                groupBox1.Enabled = true;
                buttonConnect.Enabled = false;
        }
}

private void DeviceOnDisConnected()
{
        ThreadSafe(() => groupBox1.Enabled = false);


private void DeviceOnConnected()
{
        ThreadSafe(() => groupBox1.Enabled = true);
}

#endregion

private void ThreadSafe(MethodInvoker method)
{
        if (InvokeRequired)
                Invoke(method);
        else
                method();
}

private void DeviceDataReceived(byte[] data)
{
        ThreadSafe(() => textBoxReceiveText.Text = BitConverter.ToString(data));
}

private void checkBoxLED_CheckedChanged(object sender, EventArgs e)
{
        if (!Device.IsDeviceConnected) return;
        byte[] data = new byte[2];
        data[0] = 0;
        if (checkBoxLED.Checked) data[1] = 1;
        else data[1] = 0;
        UsbHid.USB.Classes.Messaging.CommandMessage command = new UsbHid.USB.Classes.Messaging.CommandMessage(0xaa,data);
        Device.SendMessage(command);
}

 制御先を指定するVID,PIDはここで紹介しているデバイス用です。別のデバイスを使用する場合は必要に応じてIDは修正してください。

 簡単に動作を説明すると

  • Form作成時にデバイスが接続されていればコネクションを確立。接続されていなければボタンを押して接続に挑戦する。
  • 接続が成立していれば接続や送受信のイベントハンドラをUsbHidに登録。
  • 受信時やデバイスが外されたときはイベントが発生する。
  • イベントによりコントロールを操作する際は、別プロセスからのイベントなのでInvokeしてコントロールを制御する
  • チェックボックスのOn/OffイベントでPCからデバイスへデータ送信する。その際CommandMessageクラスのインスタンスcommandを作成してこれを送る。

です。

 このプログラムとデバイス側のプログラムを合わせて使用することでPCとデバイスかでデータ送受信が出来ることが確認できると思います。