フォト
無料ブログはココログ

MyList

« シュリンク基板 | トップページ | 教えるということ »

2012年9月18日 (火)

Android+microbridgeでI/O制御

HostShieldそっくりさんができたのでAndroidと繋いでみた。
スマホは使っていないので(裸眼で使えそうなスマホはラクラクホンしかない)LifeTouchNoteを使った。LTNはAndroid2.2でAOA(
Android Open Accessory Protocol )をサポートしていないのでmicrobridgeでLTNと繋いだ。

 microbridgeは、ADBを利用して制御するハードに接続するのでUSBデバッグを許可するとどのバージョンのAndroidでも使える。USB-Host機能を持ったハードからADB経由で tcp:xxxxを実行し、Android上のアプリはlocalhost:xxxx経由でハードと通信を行う仕掛けだ。

 microbridgeのサイトからHostShieldのF/W(MicroBridge-Arduino.zip)とAndrodのアプリ(ServoControl.zip)をDLしてサーボを制御するデモを実行してみるとうまく動かないので、パッチを当てた。

  • HostShieldのRESET,GPXの配線が逆
    原因:
    DEV-09628
    の回路図を参考にしたのでRESETとGPXの配線が逆になっていた。DEV-09628のページにも説明がある。(DEV-09947はサンプルソースのとおりになっているようだ)
    対策:
    max3421e.hの#define PIN_MAX_GPX 8 #define PIN_MAX_RESET 7 を書き換えて逆にした。
  • HostShield初期化時に"Error: OSCOKIRQ failed to assert"が出力される
    原因:
    MAX3412Eは電源ONの際に、内部の48MHzPLL発振器が外部の12MHzX'tal発振器にロックすると割り込みを発生する。
    max3421e.cppの max3421e_reset()関数で、この割り込みを待っているのだが、タイムアウト用の変数を8bit(unit8_t tmp)で宣言しているため、PLLがロックする前にタイムアウトが発生している
    対策:
    uint16_t tmp にした。
  • LTNが認識されない(10回に9回は認識に失敗する)
    原因:
    Adb.cppのADB::isAdbDevice()関数でコンフィグデスクリプタの取得に失敗している(getConfigurationDescriptor()の戻り値が負)
    対策:
    getConfigurationDescriptor()の戻り値が負ならばもう一度実行するようにした。

 HostShieldのF/Wでadb logcatしておくとAndroidのログがHostShield経由でシリアルで送られてくる。
Logcat
AndroidはUSBでHostShieldと繋がるのでEclipseでデバッグできなくなるが、logcatしておくとログを確認することができるようになる。

 Android側のアプリ(ServoControl.apk)はこんな感じ
Servocontrol1

画面上の赤い四角をドラッグするとサーボが動く。(このデモはX,Y 2ch分の制御が可能なのだがサーボが1個しかなかった。)
画面左上の赤いバーはArduinoのアナログ入力値を表示している。(アナログ入力ピンには何も繋いでない。)

 microbridgeを使用するアプリはsocketを使用するのでManifestでINTERNETアクセスを許可しておかなければならない。
簡単に動くと思っていたらまったくアプリが起動せず、INTERNETアクセスの許可していないことに気付くまでちょっとハマってしまった。(ログを見て気がついた。)


sparkfunのDEV-9947のリンクが間違っていたので、そ~っと直した。(2012/9/18)

« シュリンク基板 | トップページ | 教えるということ »

Android」カテゴリの記事

Arduino」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: Android+microbridgeでI/O制御:

« シュリンク基板 | トップページ | 教えるということ »