スピードランナースマートフォン用の表示で見る遥かへのスピードランナーシリコンバレーでAndroidアプリの開発してます。コンピュータービジョン・3D・アルゴリズム界隈にもたまに出現します。この広告は、90日以上更新していないブログに表示しています。Accessory」です。簡単に言うと、Androidデバイスに接続するUSB周辺機器を、誰でも簡単に作ることができる仕組みです。I/Oではこの仕組みを試すための開発ボード「ADK」が無償で配られたり、日本のメーカーからも発売されたりしていますが、電子工作ということで敷居が高いと感じている人も多いんじゃないかと思います。Accessoryが適用できるのは、別に電子工作に限った話ではありません。PCとAndroid端末さえあれば、今すぐに試してみることができます。いうわけで、早速デモを作ってみたので簡単に解説していきます。PC上の実行ファイルとの間で、USBポートを介してデータの通信を行います。データ通信するだけでは面白くないので、KeyNoteのデモのように、端末の動きをゲームに反映させてみます。アーキテクチャは以下の図のような感じで、Androidの傾きセンサーやボタンクリックを検出して、その値をUSBを介して通信し、最終的にJavaScriptで作ったゲームに端末の傾きの値を反映させたり、アプリのボタンをクリックするとボールが追加されるようにします。JavaScriptのゲームはBox2DJSのデモをちょこっと改造した力学演算系のゲームです。実際に動かしてみるとこんな感じになります。https://github.com/thorikawa/android-openaccessory-with-pc-sampleにアップロードしています。アプリ側のソースandroid-app-usbフォルダがアプリ側のソースとなっています。Developersに記載されている内容に準拠します。AndroidManifestの記述USB周辺機器(今回はPC)が端末に接続されたイベントを捕捉できるように、AndroidManifestにIntent-Filterを記述します。/></activity>meta-dataのresourceにxmlファイルを指定していますが、これは別途作成します。filtering用のxmlファイル作成/res/xml以下に、上記Intent-Filterのmeta-dataに指定したaccessory_filter.xmlを作成します。Accessoryがフィルタリングされます。後で解説するPC側のプログラムでも、同じ値を指定します。Accessoryオブジェクトを取得できます。Accessoryoオブジェクトを取得することができます。Accessoryオブジェクトを取得することもできます。Accessory取得後はUsbManager.openAccessory()で、ParcelFileDescriptorを取得することで、普通のファイルストリームと同じように扱うことができます。fos.write(....);実際のデモプログラムの中では、傾きセンサーで取得された値と、ボール追加ボタンが押されたかどうかを、バイト列にしてFileOutputStreamに出力しています。PC側のソースpc-usb.cがPC側のソースになっています。protocolで通信を行う必要があります。Accessoryの記事で、Cとlibusbを使ったサンプルソースを公開している方がいらっしゃるので、ここではそれを参考にしてプログラムを書いてみます。Android端末との接続まず、USBで繋がっているAndroid端末の接続ハンドルを取得します。PID);ここでVendorIDとProductIDを指定して、ハンドルをオープンしていますが、このIDは機種ごとに異なり、また同じ端末でも、USBデバッグモードとそうでない時で異なるので注意してください。Oneのデバッグモードで指定するIDです。Proberなどを使って簡単に調べることができます。up次に、Android端末はそのままではAccessoryと通信を行うモードになっていないので、モードを変更します。modeに記載されている通信を、libusbを介して行います。protocolをサポートしていると判断します。Identificationの送信libusb_control_transfer(handle,0x40,52,0,0,(char*)manufacturer,strlen(manufacturer),0);libusb_control_transfer(handle,0x40,52,0,1,(char*)modelName,strlen(modelName)+1,0);libusb_control_transfer(handle,0x40,52,0,2,(char*)description,strlen(description)+1,0);libusb_control_transfer(handle,0x40,52,0,3,(char*)version,strlen(version)+1,0);libusb_control_transfer(handle,0x40,52,0,4,(char*)uri,strlen(uri)+1,0);libusb_control_transfer(handle,0x40,52,0,5,(char*)serialNumber,strlen(serialNumber)+1,0);この命令によって、USB機器を識別するためのManifactorer・Model・Versionなどの情報が端末に送信されます。accessory_filter.xmlに記載されたフィルタリング情報は、ここで送信された値と一致するかで判定します。Modeに変更されました。ModeのPIDで接続ハンドルを作り直します。ここまで行えば、後はlibusb_bulk_transfer関数を通じて、端末とバイトストリームをやりとりすることができます。...}ここで定数INとOUTは、それぞれAndroid側のUSBインターフェースを識別する値で、これも端末ごとに異なっています。今回はNexusOneの値を採用しています。Proberなどで確認してください。PC側プログラムではここで読み込んだ値を、JavaScriptからも読み込めるように、一旦テキストファイルに書きだしています。JavaScriptゲーム側box2d-with-usbフォルダ以下が、ブラウザで実行するJavaScriptゲームのソースになっています。詳細は省きますが、PC側プログラムがテキストファイルに書きだした取得された傾きセンサーの値と、ボールが追加されたかどうかのフラグを参照して、それに応じた力学アニメーションを行うようになっています。Accessoryは「オリジナルな周辺機器を自分で作れる」という面に目が行きがちですが、PCとAndroid端末でも簡単に通信できるよ!ということでサンプルの解説をしてみました。Wearをいじっているのでその話題。(1)はてなブログをはじめよう!thorikawaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。