2011年5月22日日曜日

AndroidとArduinoをつなぐライブラリMicroBridgeのデモアプリを動かす

Arduino側は File -> Example -> Adb -> Demoのスケッチをそのまま使用します。

Android側のアプリには少し手を加えました。
フォーマッタもmicrobridgeのArduinoに近いフォーマットからAndroidのフォーマットへ変更

MicroBridge.java
初期化方法の変更
元のソースだとコンストラクタを使ってArduinoとの通信を行うServerを初期化してたのですが、
それをonCreate()へ移動した。理由はなんとなく。

シークバー周りでの変更
シークバーの最大値を制限するあたりがスマートじゃなかったので、
SeekBar#setMax()で最大値をきって、Arduinoへの信号の送信もString#format()から変更
(String#format()は処理が遅いから)

seekBar.setMax(180);

seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
    publicvoid onStopTrackingTouch(SeekBar arg0) {
    }

    publicvoid onStartTrackingTouch(SeekBar arg0) {
    }

    publicvoid onProgressChanged(SeekBar v, int progress, boolean flag) {
        try {
            byte[] data = {
                (byte) progress, (byte) progress
            };
            server.send(new String(data));

        } catch (IOException e) {<
             Log.e("SEEK", e.toString());
        }
    }
});

Server.java ・Server#addListener()でのエラーに対処 理由は良く解らんが、なぜかMicroBridge.javaで、Server#addListener()を呼ぶと ClassCastExceptionがでたので、とりあえずの対処。 元ソースだとTreeSetを使ってリスナーの管理をしているのだが、 多分Listでも動くだろうと思って変更。 TreeSetを使ったことがないのでなんでClassCastExceptionがでたのか理解は出来なかったけど、 Listにしても問題なかったのでいいのかな?
// private TreeSet<serverlistener> listeners = new TreeSet<serverlistener>();
private List<serverlistener> listeners = new ArrayList<serverlistener>();
とりあえずこれだけAndroid側のアプリには変更を加えて実行。



動作確認した動画