2011年08月12日

PICとAndroidとUSB接続する Microbridge/PIC公開!

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の神戸支部オリジナルマイコンボードです。

R1205964.JPG


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.html

DDMSでスクリーンショットを取得する操作を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に関する議論も進めています。




Android NDKネイティブプログラミング―Native Development Kit
出村 成和
秀和システム
売り上げランキング: 725



Arduino Uno
Arduino Uno
posted with amazlet at 11.08.02
スイッチサイエンス
売り上げランキング: 10101



posted by いしいっち at 13:52| Comment(0) | TrackBack(1) | Android開発関連 | このブログの読者になる | 更新情報をチェックする

掃除機のホースを修復する

5年くらい使用していた掃除機、それなりに使い込んでいたらホースの付け根が破断しかかってきました。

R1205988.JPG

もうダメかなーというわけで、交換用ホースを楽天で検索していたら5000円くらいしたんです。まぁ、ホース、といっても操作用のボタン等もついてましたのでそんなもんかな?とも思いました。とはいえ、ホースだけの為にそれ以外の部分をも交換しなければならないのも勿体無い。

そもそも分解したらホースの接合部分があるでしょうから、破損部のホースを切ってつなげば直せるのでは?と思ってやってみました。
メーカーやモデルによって補修の手順や可否も異なるでしょうが、一例としてご紹介します。

1.ホース接合部を分解する
ネジ2本緩め、プラスチック部品を外します。結構力が必要でした。
R1205989.JPG
ホースとプラスチック部品との接合部には白いビニールテープが巻かれていました。

2.ビニールテープを剥がす

R1205990.JPG

ホース内は3本の針金がスパイラル状になっていました。これがコントロールの系のようです。ケーブルがハンダ付けされています。

3. ニッパーとカッターナイフでホースの破損部を切り離す

R1205991.JPG
針金が結構かたかったので大きめのニッパーがやりやすいです。

4. だいたい同じ形状になるよう加工する
R1205992.JPG

5. 被覆をむく

R1205993.JPG

6. 元の配線を半田ごてで外す
R1205994.JPG

7. プラスチック部品に新たに接合する部分として4.で加工したホースをはめる

R1205995.JPG

8. ビニールテープを巻く
R1205996.JPG

9. 完了!
R1205997.JPG

結果ホースは数センチ短くなりましたが、使い勝手には変化を感じません。おかげで5000円失わずに済みました!

Apple Magic Trackpad MC380J/A
Apple Magic Trackpad MC380J/A
posted with amazlet at 11.08.12
アップル (2010-07-29)
売り上げランキング: 259



ビニールテープS 白 19mm×10M
ニトムズ
売り上げランキング: 669


TTC 強力ニッパー JIS 160mm
ツノダ
売り上げランキング: 92

posted by いしいっち at 09:03| Comment(0) | TrackBack(0) | 家電活用関連 | このブログの読者になる | 更新情報をチェックする

2011年08月04日

素のAndroid端末を外部のキーにより操作する実験

Android端末にはいろいろなハードウェアボタン、ソフトウェアボタンがついており、そのボタンを使って操作します。
日本Androidの会・神戸支部のMLでたろサさんが、ADBなら好きなキーイベント発行できますよね、と発言されていたので実際に実現してみることにしました。
IMG_20110804_232153.jpg

ADBを使用してPCからキーイベントを発行する方法は、ここに詳しく載っています。
TechBooster : adbを使って端末にキーイベントを送る
http://techbooster.jpn.org/andriod/environment/6422/

これを今回はMicrobridge/PICでやってみます。実際にADBから送る場合には、以下のような文字列を送ればキーイベントが発行されます。
shell:exec input keyevent 23
コード23はセンターボタンの押下です。
キーイベントと対応するキーコードはここでわかります。
http://developer.android.com/reference/android/view/KeyEvent.html

昔作成したATARI仕様ボタンとPIC ADK Miniboard(のプロト版)を接続し、ボタンの操作でDOWNキーとCENTERキーを発行してみました。
うまくいきました〜。
動画二本立てでIS01編、NexusS編です。どちらも標準OS状態で専用のアプリ等インストールしていません。








Android NDKネイティブプログラミング―Native Development Kit
出村 成和
秀和システム
売り上げランキング: 725



Arduino Uno
Arduino Uno
posted with amazlet at 11.08.02
スイッチサイエンス
売り上げランキング: 10101


posted by いしいっち at 23:33| Comment(0) | TrackBack(1) | Android開発関連 | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。