前回と前々回に紹介したAndroidのUSBホストAPI。
これを使っていつものごとく日本が世界の誇るタカラトミー社製のチョロQ ハイブリッド を遠隔操作しました。
今回はそれのまとめ記事です。
ソースはGithub上でライブラリ化したものとサンプルソースで公開してます。
使用方法は、これまでに紹介したとおりAndroid 3.1以上が必要です。
自分はOptimus Padでのみテストしてますが、おそらく他のタブレットでもいけると信じてます。
ライブラリの方はまだ詰めが甘いのでUSBのパーミッション取得用のBroadcastReceiverを正しく開放できていない状態です。
また、シリアル通信のボーレートの計算方法がいまいちわかっていないので今の所9600で固定値になっています。
APIにはsetBaudrate()は実装しているのですが、中身は見てもらってもわかるとおり空っぽです。
ライブラリの使い方はgithub上のUSB_Lib_sampleがわかりやすいかと思ってます。
UsbSerialManagerを使ってUSBシリアル通信ができるデバイスの一覧をgetList()を使って取得します。
取得してデバイスの一番最初のデバイスの使用許可を要求します。
要求すると、要求ダイアログがでます。
public void onStart() { super.onStart(); Log.d(TAG, "onStart"); manager = new UsbSerialManager(this); if (serial == null) { Listlist = manager.getList(); if (list.size() > 0) { Log.d(TAG, "Device count=" + String.valueOf(list.size())); UsbDevice dev = list.get(0); manager.requestPermission(dev, listener); } else { Log.e(TAG, "USB Serial Device not found"); } } else { Log.e(TAG, "USB Serial Device has already got instance."); } }
要求が承認されるとコールバックが呼ばれるので、あとは、UsbDeviceからUsbSerialを生成して、オープンしてあげます。
この辺はちょっと苦肉の策を使っています。
/** USBシリアル通信デバイスを使用するパーミッションを取得した際のコールバックリスナー */ UsbSerialManager.OnGetPermissionListener listener = new UsbSerialManager.OnGetPermissionListener() { @Override public void onGetPermission(UsbSerial device) { Log.d(TAG, "onGetPermission"); UsbDevice dev = device.getDevice(); Log.d(TAG, "DeviceName=" + dev.getDeviceName()); Log.d(TAG, "id=" + String.valueOf(dev.getDeviceId())); serial = device; try { serial.open(); } catch (IOException e) { e.printStackTrace(); } threadStart(); } };
オープンすれば、あとはread()、write()で読み書きができます。
本当はストリームで実装しようと思ったのですが、ちょっとオーバーヘッドが大きかったので、手抜きしました。
今後はボーレートの計算とか調べようかと思います。
#以下アフィリエイト用の広告です
こんにちは。
返信削除以前Androidマーケットに公開されていた、ラジコン操縦アプリを再度公開していただけないでしょうか?
TPIP2ボードを使った実験を行なっているので、再度公開していただけるとありがたいです。