[[FrontPage]] #contents 2011/09/02からのアクセス回数 &counter; ** javaのアプリケーションからUSBのHIDデバイスを使う [#wd222a6d] 2011年9月9日のトラ技オフ会にそなえて、これまで調べた - [[arm/CodeBaseを使ったARMマイコンパーフェクト学習基板の使い方]] - [[arm/libhidでARMマイコンパーフェクト学習基板にアクセス]] - [[arm/JavaからARMマイコンパーフェクト学習基板にアクセス]] をまとめて見ることにしました。 *** USBデバイスの問題点 [#t4cbdb64] 電子工作でUSBデバイスを作る場合に問題となるのは、 : OS依存 | 雑誌で紹介されるものが、特定のOSに依存するため、記事の内容をそのまま使うことができない。 特にVBを使った例が多く、他の言語ではUSBデバイスを制御する時に参考にならない。 : デバイスメーカーの提供するドライバー依存 | デバイスメーカーがドライバーを提供していないと、そのUSBデバイスを使うことができない。 等がありました。 これに対する解が、 [[インターネット・ガジェット設計>http://www.amazon.co.jp/dp/4274501868/]] で紹介されている、 - libusbを使った制御 - ソフトウェア・プロトコルスタックを使ったデバイスの実装 でした。これを試してみたのが、 - [[avr/USB接続]] - [[avr/javaからLibusbを使う]] でした。 *** ARMマイコンパーフェクト学習基板では、usb_control_msgの方法が使えない [#z7d91767] しかしながら、ARMマイコンパーフェクト学習基板でUSBのデバイスを作成しようとすると、 USB-ROMのドライバーを使用するため、[[avr/USB接続]]で行ったusb_control_msg関数 で情報を受け渡しする方法が使えません。 そこで、libhidを使ってARMマイコンパーフェクト学習基板を制御することにしました。 ( [[arm/libhidでARMマイコンパーフェクト学習基板にアクセス]]参照) ** OSに依存しないアプリケーション [#v1eee95c] つぎに、OSに依存しないアプリケーションを作成するために、libhidを参考にjavaで ARMマイコンパーフェクト学習基板にアクセスしてみました。 ([[arm/JavaからARMマイコンパーフェクト学習基板にアクセス]]参照) ** 発表に備えて [#qaaae172] 今回の発表に備えて、javaで作ったGUIを持つHIDクライアントソフトから、 &ref(screen.png); ARMマイコンパーフェクト学習基板に接続したブレッドボードのLEDとスイッチ を制御してみることにしました。 &ref(board.png); ** 開発環境もOSに依存しない [#j09656dd] ここまで、OSやドライバーに依存しない環境を求めてきたので、 開発環境もOSに依存しないものにしました。 *** CodeBase [#pef8ae5b] [[arm/CodeBaseを使ったARMマイコンパーフェクト学習基板の使い方]]で紹介しましたCodeBaseは、 GCCベースのコンパイラーを使ったLPC1343用のライブラリーです。 元々は、 [[LPC1343 Reference Design>http://www.microbuilder.eu/Projects/LPC1343ReferenceDesign.aspx]] に開発されたみたいですが、今はBSD licenseで公開されているます。 &ref(BRD-000002_300w.jpg); *** CodeBaseを使ってHIDデバイスを作る場合の注意点 [#mac4e244] CodeBaseでは、projectconfig.hでデバイスの配置を定義しています。 HIDデバイスを作成する場合には、 - CFG_USBHID - CFG_PRINTF_UART をセットする必要があります。 #pre{{ /* 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 を以下のように修正しました。 #pre{{ 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を 点灯させる処理をします。 #pre{{ 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をアップします。 - &ref(main.c); ** GUIも簡単 [#fef9e82d] javaでのGUIはEclipseのプラグインVisualEditorを使って簡単に作成できます。 ほとんどお絵かき状態! &ref(visualEditor.png); *** Generic1ByteHIDの使用例 [#d1d6da13] [[arm/JavaからARMマイコンパーフェクト学習基板にアクセス]]で作成したGeneric1ByteHIDの使い方は、 ともて簡単です。 mainメソッドでFrameのhidにGeneric1ByteHIDをセットし、その後のwhile文で定期的にPollingするだけです。 #pre{{ 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ソース一式 [#i3476e20] USB HID Clientのソース一式を以下にアップします。 - &ref(HIDソース.zip); - &ref(USBHidClient.zip); ** QuickStart Boardもお薦め [#k7fc817e] ブレッドボードでの実験には、 [[QuickStart Board>http://www.embeddedartists.com/products/boards/lpc1343_qsb.php]] &ref(QuickStart_Board.png); がお薦めです。((DigiKeyから購入しました)) ** コメント [#y4525944] #vote(おもしろかった[3],そうでもない[0],わかりずらい[0]) #vote(おもしろかった[4],そうでもない[0],わかりずらい[0]) 皆様のご意見、ご希望をお待ちしております。 - 9月9日のオフ会発表の資料 &ref(トラ技オフ会発表用資料.ppt); -- [[竹本 浩]] &new{2011-09-10 (土) 21:44:13}; #comment_kcaptcha