- 追加された行はこの色です。
- 削除された行はこの色です。
[[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