2012年12月26日水曜日

[Android Advent Calendar] 自作のUSBデバイスを、Androidで動かす

Android Advent Calendar 2012/12/26(表) 向けの記事です。裏は@l_b__さんです。

今年の後半にかけてAndroidのUSBホスト周りに少し詳しくなってきた、@kshojiです。Android USB MIDI Driverなどというものを作って公開しております。

USBデバイスを自分で作って、Android側でドライバを書いたら、好きなデバイスを作ってAndroidで自由に動かせて、楽しいんじゃないかなー。ということで、今回この記事を書いてみます。
TwitterのTLで尋ねてみると、USB HIDなデバイスが今時の流行っぽいので、それに乗ってみることにします。USBデバイスの自作と、そのデバイスに対応するアプリ作成の参考になれば嬉しいです。

AndroidがUSBホストに対応

Android OS 3.1からUSBホスト機能に対応して、アプリで、JavaのAPIを使ってUSBデバイスのドライバが書けるようになりました。LinuxのデバイスドライバといえばC(libusb)で書く、もしくはカーネル側をいじるという印象があるので、これはすごく画期的なことだと思います。なんといっても、Javaはとっつきやすいですから。

Android SDKにもUSBミサイルランチャを操作するサンプルが付いています。USBミサイルランチャは色々な環境でサンプルとして使われているようです。

注:必ずしもUSBデバイスであればなんでも認識する、というわけではないようです。HTC J ButterflyではUSB HIDなデバイスは認識しましたが、USB MIDIなデバイスは認識しませんでした。

AndroidでのUSBホストの使いかた

Android の USBホストの公式ドキュメントはこちらからどうぞ。

githubのリポジトリにこの記事用のコード一式を置いてみました。
いちおう、見通しがよくなるようにしているつもりです。
…と言っても、AbstractDeviceActivityクラスあたりから見ていくと、なんとなくわかるかな、程度ですが。WTFPLにしてあるので、煮るなり焼くなりお好きにどうぞ。

2012年12月23日日曜日

[変態Advent Calendar] 実機TAS-codingコントローラを作る

ファミコン用実機TASコントローラとかも作っているkshojiです。
変態Advent Calendarへは初参戦となります。やらしくお願いします。

TASとは?

→ 詳しくはニコニコ大百科のTASの項目あたりがオススメです。

大雑把に言えば「最速でゲームをクリアする」ために必要な再現用データを作る、という競技です。
RAM書き換えなどのズルをしていないので「実機で再現できる」というのがポイントです。
実機で再現できるので、つまり、実際に実機で再生させるプロジェクトというのもいくつか存在します。

実機TASコントローラを作ろう

以前、ファミコン実機でTASるコントローラを作ったこともあり、その連想でなにか出来ないか模索してみました。

今回はエンジニア向けっぽい変態ネタということで、Tool Assisted Speed-codingのコントローラを作ってみます。codingでもあり、typingでもありますが。
「自動キー入力するUSBキーボード」を自作する感じになります。

ちなみに今回のTASのルールとしては、プログラムのソースコードを入力し終わるまで、としています。

まずは、完成したものがこちらにあるので、動画を観てみましょう。
ご覧の通り、エディタの表示が追いつかないほどの変態高速入力となっております。

2012年12月21日金曜日

In-App Billing version 3を使ってみた


先日、既存の有料アプリを無料化→アプリ内課金を追加しよう、という流れで実装をしてみました。
たまたま新しいバージョンのライブラリが出たタイミングだったようで、折角だからこのライブラリを使って実装してみたときのメモです。

In-App Billing version3との遭遇

いつも通りに、「In-App Billingのサンプルが載っているブログ・サイトを探して、それを参考にしながら実装を進めていこう!」 と思っていたところ、IInAppBillingService.aidlを使ったサンプルがさっぱり見つからず、見つかるのはIMarketBillingService.aidlを使うものばかり…。
記事がないとか、そんなバカな…とか思っていたら、Android Developer Blogの記事を見つけました。つい最近バージョンアップしてたんですね。

先の記事によると、向上した点はこんな感じのようです。

  • 設計を改善して、アプリが完結に書けてデバッグ・メンテナンスしやすくなった。以前だと数100行書かないといけなかったコードが、50行くらいでできるように。
  • 堅牢なアーキテクチャにより、決済のロストが少なくなった。
  • ローカルへのキャッシュによって、API 呼び出しが高速になった。
  • 待望されていた、「一度だけ購入できるアイテム」の購入や、アイテム情報の問合せができるようになった。

SDKのサンプルを試そう

というわけで、SDKのサンプルを見ていくことにしました。まずは、SDK Managerから「Google Play Billing Library」をインストールします。
サンプルプロジェクトはSDKをインストールしたディレクトリ内の「extras/google/play_billing/in-app-billing-v03」にあります。Eclipseに取り込んでビルドします。

2012年11月2日金曜日

複数PCの楽器アプリ同士を繋ぐUSB MIDIケーブルを作ってみた

AndroidタブレットとMacを接続して演奏してみたかったので、USB MIDIクライアントを2つ結合したものを作ってみました。
近い将来、これを使ってAndroidタブレット用のPCDJコントローラでも作れたらいいな、という感じです。

方針

今回は、AVRのV-USBを使って、USB MIDIを扱います。ソースコードはMICO-MOCOを参考にしました。

MICO-MOCOではUSB MIDI→レガシーMIDIに変換する必要があったので、送受信を含めるとATtiny2313のメモリには収まらなかったのですが、今回のものは「USB MIDIのプロトコルをそのままブリッジする」という作りになっているため、プロトコル変換処理をばっさり省略できています。
MIDIを介さない利点として「31250baudでシリアル通信する必要がない」という点が挙げられます。クロックが最速20MHzのものを選択できるので、取りこぼしが少なくなることが期待できます(今回の試作では、16MHz/125000baudで通信しています)。送受信用のバッファは短かいですし、USB MIDIのプロトコルそのままなので、MIDIのパケット長はレガシーMIDIよりも長くなっていますが…。

Android USB MIDI Driverのご紹介

Android USB MIDI Driverって?

「Android 3.1 (API Level 12)以降向けの、USB MIDIを使うためのライブラリ」です。
Android 3系のタブレットや、Android4系のスマートフォンを使って、特に改造やroot化することなしに、USB MIDI対応の楽器や機器を繋げることができるようになります。

注意:端末がUSB Host機能に対応している必要があります。USB Host対応端末であっても、USB MIDI機器が認識しない場合があります。

USB MIDI対応デバイスの例:キーボード、電子ピアノ、シンセサイザー、音源モジュールなどの楽器・コントローラ、変換ケーブルなどのPC用MIDIインタフェースなど。

ライブラリのソースコードは、こちらのgithubリポジトリからダウンロードできます。Apache ライセンス バージョン 2.0です。
https://github.com/kshoji/USB-MIDI-Driver

応用アプリの例

  • (楽器のほうの)キーボードを使ってプレゼンを操作
  • 演奏をディスプレイ上にリアルタイムで可視化
  • TENORI-ON/monomeのようなインタラクティブなシーケンサー
  • 加速度やジャイロなどのセンサーを使用したコントローラ
などなど…

2012年10月17日水曜日

仮想マシン上のAndroidでUSBホストを使う

Android SDKに含まれるエミュレータはUSBデバイスの接続に対応していません。
「android-x86」のLiveCDイメージを使うことで、USBホストのテストがPC上で可能になります。
今回はVMWare FusionとVirtualBoxで動かしてみました。


  • ISOイメージをこちらからダウンロードします。「new version here」というリンクのもの(android-x86-vm-20120130.iso.gz)を使用しました。→ http://www.buildroid.org/blog/?p=86 
  • 新しい仮想マシンをセットアップし、CDドライブにLiveCDを指定してVMを開始します。
  • 「Live CD - Run Android-x86 without installation」を選択して、Androidを起動します。
  • VirtualBoxの場合、「Machine」メニューから「Disable Mouse Integration」をチェックします。
  • VMware/VirtualBoxの「ネットワークアダプタ」のモードを「ブリッジ(自動設定)」「Bridged Adapter」に変更します。
  • Android側の「Terminal Emulator」アプリを開き、以下のコマンドを実行します。固定IPを設定するので、LAN内で空いているIPアドレスを確認しておいてください。(今回は192.168.1.111とします)。
$ su
# ifconfig eth0 192.168.1.111 up



  • ホストOS上から、下記のコマンドを実行します。
$ adb connect 192.168.1.111

これで、仮想マシンのAndroidとadbが接続され、Eclipseなどからアプリが流しこめます。
仮想マシン側にUSBデバイスを接続することで、そのデバイスをAndroidで使用することができます。