2011/09/02からのアクセス回数 8885 javaのアプリケーションからUSBのHIDデバイスを使う †2011年9月9日のトラ技オフ会にそなえて、これまで調べた
をまとめて見ることにしました。 USBデバイスの問題点 †電子工作でUSBデバイスを作る場合に問題となるのは、
等がありました。 これに対する解が、 インターネット・ガジェット設計 で紹介されている、
でした。これを試してみたのが、 でした。 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クライアントソフトから、 ARMマイコンパーフェクト学習基板に接続したブレッドボードのLEDとスイッチ を制御してみることにしました。 開発環境もOSに依存しない †ここまで、OSやドライバーに依存しない環境を求めてきたので、 開発環境もOSに依存しないものにしました。 CodeBase †arm/CodeBaseを使ったARMマイコンパーフェクト学習基板の使い方で紹介しましたCodeBaseは、 GCCベースのコンパイラーを使ったLPC1343用のライブラリーです。 元々は、 LPC1343 Reference Design に開発されたみたいですが、今はBSD licenseで公開されているます。 CodeBaseを使ってHIDデバイスを作る場合の注意点 †CodeBaseでは、projectconfig.hでデバイスの配置を定義しています。 HIDデバイスを作成する場合には、
をセットする必要があります。 /* 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)
を以下のように修正しました。 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を使って簡単に作成できます。 ほとんどお絵かき状態! 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 がお薦めです。*1 コメント †皆様のご意見、ご希望をお待ちしております。
Tweet |