PICマイコンといろいろなバージョンのAndroid端末を接続し、マイコンと端末とが自在に連携できるソフトウェアスタック「
Microbridge/PIC」を公開しました!!
Google code : microbridge-pic
http://code.google.com/p/microbridge-pic/元々Niels Brouwer氏作成のArduinoとUSB Host Shieldとを組み合わせたシステム向けのC++実装によるライブラリ「MicroBridge」というものがあり、これをUSBホスト内蔵PIC向けにポーティングしたものになります。
本家MicroBridge :
http://code.google.com/p/microbridge/MicroBridgeは、ADK(というかAndroid Open Accessory)に対応していない端末でも、本来ADKで実現するような外部機器連携を実現したい、という課題に対して、
本来AndroidとPCとが、デバッグの目的で通信する為のプロトコル
ADB(Android Debug Bridge)のPC側通信相当をマイコンにやらせる事で、ADBはAndroidの古いバージョンにも実装されているので、例えばAndroid1.6のHT-03AやIS01でもADKの様な電子機器連携実験が出来る、というものになります。
では、ADBで何が出来るか?なのですが、例えば、PCでAndroidのログデータを取得する時は、
adb logcatというコマンドを実行しますよね。
また、
adb push ファイルや、
adb shellでLinuxのシェルのコマンドを叩いたりとか
PC側アプリとAndroidアプリとがソケット通信で連携したい時には、
adb forward tcp:port_no tcp:port_noとしたり、
また、DDMSでのスクリーンショット取得などしたりしますが、これらは実際には、内部でADBの通信で実現されているものですので、そのような事がマイコンから実行出来るというわけです。従って、古いバージョンにも搭載されているADBを利用しますから、ADKに対応していないバージョンのAndroid端末でもADKと似たような、外部機器連携に使用できるというわけです。ADBによるADKの置き換えをする場合、上記のadb forwardによるソケット通信が丁度代替手段になります。
さて、今回は、1チップでUSBホスト出来るPICマイコン向けにPIC用gccのMicrochip C30コンパイラと、MicrochipのUSB Hostフレームワーク上で動作できるよう移植をする際、PIC ADK Miniboard Rev.1を使用しています。PIC24FJ64GB002の神戸支部オリジナルマイコンボードです。
Google codeにアップしているソースは、まだデバッグ後の整理がきちんと出来ていません。
特に、microbridge/Adb_pic.c はMicrobridge/PICのメインモジュールになりますが、Arduino実装も#if 0〜#endifで残していたりしてかなりごちゃごちゃしてしまっています^^;まあ動きますので^^;;
これからメンテしていきます^^;
現在Microbridge/PICのサイトにアップしているソースは、Android端末と接続することで、端末のログデータ(logcat)を取得し、PICのUARTから吐き続けるものになります。
アップしているツリーではmain.cにメインの処理を実装しています。(元祖MicroBridgeがArduinoプロジェクトだったのでメインアプリがスケッチになっています。main.cはMicroBridgeでのスケッチに相当するイメージです)
Microbridge/PICの基本的な使い方はシンプルで、
(1)ADB_init()して、
(2)handle=ADB_addConnection(connectionString,flag)でADB接続を開始し、ハンドルを取得し、
(
3)ADB_poll(handle)でポーリングさせるだけです。イベントがあれば、adbEventHandler()がMicrobridge/PIC側から呼び出されるのでイベントに応じた処理をハンドラ内に実装すればOKです。
例えば、logcatのログデータを取得するという場合でしたら、(2)のパラメータconnectionStringに「"shell:exec logcat"」を設定します。
flagは、コマンド終了後再度同じコマンドを連続して実行する事でずっと指定した内容を実行しつづけたい時にtrueにします。
shellを使用した、別な例として、例えばAndroidのLinuxのロードアベレージを取得したい場合には、
ADB_init();
c=ADB_addConnection("shell:exec cat /proc/loadavg",false);
while(1){
ADB_poll(c);
}
などとすれば、Android端末のロードアベレージのデータが取得できたとき、adbEventHandlerが呼び出されます。
また、以下のブログで記載させていただきました、Android端末に外部キーパッドを接続して操作する実験でも、ブログにも記載させていただいておりますが、shellのinputコマンドを叩くことで実現しています。結構Androidのシェルから叩いて実現できることは多そうで楽しそうです。
http://projectc3.seesaa.net/article/218366776.htmlDDMSでスクリーンショットを取得する操作をMicrobridge/PICでする事もできます。
http://projectc3.seesaa.net/article/216842505.htmlまた、Android端末のアプリとソケット接続で繋ぎたい時には、例えばポート番号60101で接続したいとした場合、
ADB_init();
c=ADB_addConnection("tcp:60101",true);
while(1){
ADB_poll(c);
}
とすることで、PCのADBでの操作の「adb forward tcp:xxxxx tcp:60101」に相当するADBデーモンに対する制御を行ってアプリとソケット通信を介して連携できます。
日本Androidの会・神戸支部のGoogle codeのリポジトリでは、上記のadb forwardでの簡単なアプリとの連携サンプルコードをアップしています。
(先日、大阪日本橋の電気街ででんでんタウンもくもく会というPIC ADK Miniboardのイベント
http://atnd.org/events/18402 がありまして、それに目がけて取り急ぎこしらえました)
Google codeサイト側もこれからコンテンツやソース等充実していきます。
なお、本家MicroBridgeでは、Android端末とマイコンの間で複数個の接続を並列して確立できる作りになっています。
(例:logcatを取得する接続を切断せず、並行してadb forwardも行う、等)
現状のMicrobridge/PICでの既知の制限事項は、一つのADB接続のみをハンドリングしているというものです(実装上はほぼ考慮しているるのですが、全てのAPIで対応できていない)。本家同様の複数接続対応(ポーリングでデータを取得した時にどの接続のものかIDで判断するようにする)自体は困難では無さそうなので、近日中にアップデートしようかなと思っています〜。
なお、PIC ADK Miniboard Rev.1については、過去記事でも何度か記事にさせていただいておりますのでよろしければご参照くださいませ。
また、ボード及びソフト関連について詳しくはGoogle Groupsの
日本Androidの会・神戸支部へどうぞー。
http://groups.google.com/group/android-jp-kobe?hl=ja現在、PIC ADK Miniboard Rev.2に関する議論も進めています。
パナソニック (2011-06-24)
売り上げランキング: 186
出村 成和
秀和システム
売り上げランキング: 725
スイッチサイエンス
売り上げランキング: 10101