2011/09/02からのアクセス回数 9144
2011年9月9日のトラ技オフ会にそなえて、これまで調べた
をまとめて見ることにしました。
電子工作でUSBデバイスを作る場合に問題となるのは、
等がありました。
これに対する解が、 インターネット・ガジェット設計 で紹介されている、
でした。これを試してみたのが、
でした。
しかしながら、ARMマイコンパーフェクト学習基板でUSBのデバイスを作成しようとすると、 USB-ROMのドライバーを使用するため、avr/USB接続で行ったusb_control_msg関数 で情報を受け渡しする方法が使えません。
そこで、libhidを使ってARMマイコンパーフェクト学習基板を制御することにしました。 ( arm/libhidでARMマイコンパーフェクト学習基板にアクセス参照)
つぎに、OSに依存しないアプリケーションを作成するために、libhidを参考にjavaで ARMマイコンパーフェクト学習基板にアクセスしてみました。 (arm/JavaからARMマイコンパーフェクト学習基板にアクセス参照)
今回の発表に備えて、javaで作ったGUIを持つHIDクライアントソフトから、
ARMマイコンパーフェクト学習基板に接続したブレッドボードのLEDとスイッチ を制御してみることにしました。
ここまで、OSやドライバーに依存しない環境を求めてきたので、 開発環境もOSに依存しないものにしました。
arm/CodeBaseを使ったARMマイコンパーフェクト学習基板の使い方で紹介しましたCodeBaseは、 GCCベースのコンパイラーを使ったLPC1343用のライブラリーです。
元々は、 LPC1343 Reference Design に開発されたみたいですが、今はBSD licenseで公開されているます。
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をアップします。
javaでのGUIはEclipseのプラグインVisualEditorを使って簡単に作成できます。 ほとんどお絵かき状態!
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のソース一式を以下にアップします。
ブレッドボードでの実験には、 QuickStart Board
がお薦めです。*1
皆様のご意見、ご希望をお待ちしております。