[[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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc