FrontPage

2011/09/02からのアクセス回数 4736

javaのアプリケーションからUSBのHIDデバイスを使う

2011年9月9日のトラ技オフ会にそなえて、これまで調べた

をまとめて見ることにしました。

USBデバイスの問題点

電子工作でUSBデバイスを作る場合に問題となるのは、

OS依存
雑誌で紹介されるものが、特定のOSに依存するため、記事の内容をそのまま使うことができない。 特にVBを使った例が多く、他の言語ではUSBデバイスを制御する時に参考にならない。
デバイスメーカーの提供するドライバー依存
デバイスメーカーがドライバーを提供していないと、そのUSBデバイスを使うことができない。

等がありました。

これに対する解が、 インターネット・ガジェット設計 で紹介されている、

  • libusbを使った制御
  • ソフトウェア・プロトコルスタックを使ったデバイスの実装

でした。これを試してみたのが、

でした。

ARMマイコンパーフェクト学習基板では、usb_control_msgの方法が使えない

しかしながら、ARMマイコンパーフェクト学習基板でUSBのデバイスを作成しようとすると、 USB-ROMのドライバーを使用するため、avr/USB接続で行ったusb_control_msg関数 で情報を受け渡しする方法が使えません。

そこで、libhidを使ってARMマイコンパーフェクト学習基板を制御することにしました。 ( arm/libhidでARMマイコンパーフェクト学習基板にアクセス参照)

OSに依存しないアプリケーション

つぎに、OSに依存しないアプリケーションを作成するために、libhidを参考にjavaで ARMマイコンパーフェクト学習基板にアクセスしてみました。 (arm/JavaからARMマイコンパーフェクト学習基板にアクセス参照)

発表に備えて

今回の発表に備えて、javaで作ったGUIを持つHIDクライアントソフトから、

screen.png

ARMマイコンパーフェクト学習基板に接続したブレッドボードのLEDとスイッチ を制御してみることにしました。

board.png

開発環境もOSに依存しない

ここまで、OSやドライバーに依存しない環境を求めてきたので、 開発環境もOSに依存しないものにしました。

CodeBase

arm/CodeBaseを使ったARMマイコンパーフェクト学習基板の使い方で紹介しましたCodeBaseは、 GCCベースのコンパイラーを使ったLPC1343用のライブラリーです。

元々は、 LPC1343 Reference Design に開発されたみたいですが、今はBSD licenseで公開されているます。

BRD-000002_300w.jpg

CodeBaseを使ってHIDデバイスを作る場合の注意点

CodeBaseでは、projectconfig.hでデバイスの配置を定義しています。 HIDデバイスを作成する場合には、

  • CFG_USBHID
  • CFG_PRINTF_UART

をセットする必要があります。

/* USB Configuration */
#define CFG_USBHID
// #define CFG_USBCDC                                // Defaults to 115200 8N1

/* Printf Redirection */
// #define CFG_PRINTF_NONE                        // Ignore all printf output
#define CFG_PRINTF_UART                        // Use UART for printf output
// #define CFG_PRINTF_USBCDC                         // Use USB CDC for printf output

また、USB-Romから呼び出されるHID要求関数(core/usbhid-rom/usbhid.c)

  • usbHIDGetInReport
  • usbHIDSetOutReport

を以下のように修正しました。

void usbHIDGetInReport (uint8_t src[], uint32_t length)
{
  extern void targetUsbHIDGetInReport (uint8_t src[], uint32_t length);
  targetUsbHIDGetInReport(src, length);
}

void usbHIDSetOutReport (uint8_t dst[], uint32_t length)
{
  extern void targetUsbHIDSetOutReport (uint8_t dst[], uint32_t length);
  targetUsbHIDSetOutReport(dst, length);
}

ここでは、main.cにあるtargetUsbHIDxxxxReport関数に処理を委譲するだけです。 実際の、処理はinput関数を使ってボードのスイッチの4bitを読み込む処理とoutput関数を使ってLEDを 点灯させる処理をします。

void targetUsbHIDGetInReport (uint8_t src[], uint32_t length)
{
  src[0] = input();
}

void targetUsbHIDSetOutReport (uint8_t dst[], uint32_t length)
{
  output(dst[0]);
}

こんなに簡単な処理で、オリジナルのUSB HIDデバイスを作成することができます。以下にmain.cをアップします。

GUIも簡単

javaでのGUIはEclipseのプラグインVisualEditorを使って簡単に作成できます。 ほとんどお絵かき状態!

visualEditor.png

Generic1ByteHIDの使用例

arm/JavaからARMマイコンパーフェクト学習基板にアクセスで作成したGeneric1ByteHIDの使い方は、 ともて簡単です。

mainメソッドでFrameのhidにGeneric1ByteHIDをセットし、その後のwhile文で定期的にPollingするだけです。

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		final MainFrame thisClass = new MainFrame();
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
				try {
					thisClass.hid = new Generic1ByteHID(vendorId, productId);
					thisClass.hid.putByte((byte)0);
				}
				catch (Exception e){
					e.printStackTrace();
				}
			}
		});
		while(true) {
			try {
				thisClass.doHidPolling();
				Thread.sleep(10);
			}
			catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

USB HID Clientソース一式

USB HID Clientのソース一式を以下にアップします。

QuickStart Boardもお薦め

ブレッドボードでの実験には、 QuickStart Board

QuickStart_Board.png

がお薦めです。*1

コメント

選択肢 投票
おもしろかった 3  
そうでもない 0  
わかりずらい 0  

皆様のご意見、ご希望をお待ちしております。


(Input image string)


*1 DigiKeyから購入しました

添付ファイル: fileQuickStart_Board.png 457件 [詳細] fileHIDソース.zip 581件 [詳細] fileトラ技オフ会発表用資料.ppt 582件 [詳細] fileUSBHidClient.zip 377件 [詳細] filevisualEditor.png 474件 [詳細] filemain.c 480件 [詳細] fileBRD-000002_300w.jpg 528件 [詳細] filescreen.png 469件 [詳細] fileboard.png 494件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-02-06 (水) 15:46:02 (1509d)
SmartDoc