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経由でシリアルで送られてくる。
AndroidはUSBでHostShieldと繋がるのでEclipseでデバッグできなくなるが、logcatしておくとログを確認することができるようになる。
Android側のアプリ(ServoControl.apk)はこんな感じ
画面上の赤い四角をドラッグするとサーボが動く。(このデモはX,Y 2ch分の制御が可能なのだがサーボが1個しかなかった。)
画面左上の赤いバーはArduinoのアナログ入力値を表示している。(アナログ入力ピンには何も繋いでない。)
microbridgeを使用するアプリはsocketを使用するのでManifestでINTERNETアクセスを許可しておかなければならない。
簡単に動くと思っていたらまったくアプリが起動せず、INTERNETアクセスの許可していないことに気付くまでちょっとハマってしまった。(ログを見て気がついた。)
sparkfunのDEV-9947のリンクが間違っていたので、そ~っと直した。(2012/9/18)
« シュリンク基板 | トップページ | 教えるということ »
「Android」カテゴリの記事
- Android+microbridgeでネギ振り(2012.09.23)
- Android+microbridgeでI/O制御(2012.09.18)
- USB Host Shield(2012.09.14)
- Android 勉強会(2012.01.29)
「Arduino」カテゴリの記事
- Line tracer <ちびギアモータ>(2019.03.03)
- Android+microbridgeでネギ振り(2012.09.23)
- Android+microbridgeでI/O制御(2012.09.18)
- USB Host Shield(2012.09.14)
- Arduino用ユニバーサル基板(2012.09.08)
コメント