2011年5月27日金曜日

AndroidとArduinoを使ってチョロQを操縦する ソース公開編



AndroidとArduinoをUSBホストシールドを使って通信するMicroBridgeを利用して
チョロQを操縦するアプリのソースを公開しました。
先人の知恵をお借りすることで簡単に操縦が出来ました。

http://code.google.com/p/iwatan-lab/downloads/list

ArduinoにMicroBridgeのライブラリを追加する方法は
AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)
を参照してください。


Google Codeで公開しているのはAndroid側のアプリのソースです。
Arduino側のソースはここを参考にさせて頂いているので改変部分のみ公開します。

以下のソースに参考元からコピペで追加してください。

  • void setch(byte bb)
  • void setbit(byte bb)
  • void execpwm()
  • void setpwm(int pwm)
  • void runpwm()
  • void sendpwm()

#include <spi.h>
#include <adb.h>

#define LED 2


// Adb connection.
Connection * connection;

int data[15];
int g = 0;
byte b = B001111;

// Event handler for the shell connection. 
void adbEventHandler(Connection * connection, adb_eventType event, uint16_t length, uint8_t * data) {
  
  // Data packets contain two bytes, one for each servo, in the range of [0..180]
  if (event == ADB_CONNECTION_RECEIVE) {
    char ch = data[0];
    Serial.println(ch, DEC);
    if (ch < 0x20) {
        setbit(ch);
    } else {
        setch(ch - 0x20);
    }
  }
}


void setup(){
  Serial.begin(57600);
  Serial.println("Ready"); 
  pinMode(LED , OUTPUT);
 
  // Initialise the ADB subsystem.  
  ADB::init();

  // Open an ADB stream to the phone's shell. Auto-reconnect
  connection = ADB::addConnection("tcp:4567", true, adbEventHandler);  
 
}

void loop(){
  
  // Poll the ADB subsystem.
  ADB::poll();
}

ここまでやっておいてなんですが、やはり標準のコントローラーの方が操縦しやすいです。

2011年5月26日木曜日

AndroidとArduinoを使ってチョロQを操縦する その2

AndroidとArduinoを使ってチョロQを操縦する
AndroidとArduinoをつなぐライブラリMicroBridgeのデモアプリを動かす
AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)

上の続きです。

!追記
この記事のソース公開編

TVの音入っちゃってるけど気にしない。




配線を少し綺麗にしました(前のでは切れちゃったから)
アプリ側では複数チャンネルに対応して、チャンネルを切り替えることで
複数台のQステアを操縦することができるようにしました。
また、トグルボタンでターボのオン/オフも切り替えができるようにしました。
これで、Qステアへの充電以外の機能はすべて実装しました。

Qステアも少しドレスアップしちゃいました。


ボディを開けて、LEDを仕込みました。




2011年5月23日月曜日

AndroidとArduinoを使ってチョロQを操縦する

AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)
AndroidとArduinoをつなぐライブラリMicroBridgeのデモアプリを動かす

土日試した上の記事をもとにAndroid(IS01)を使ってQSteerを動かしてみました。
IS01には赤外線通信機能がついてはいますが、独自の信号を出すことが出来ないので諦めていましたが、ここに来て思いが再燃してきました。
わざわざIS01を使ったのは1.6でも動くことの確認とIS01だって未来へ行くことができることの証明です!



用意するもの
・日本が世界に誇るHENTAI端末 IS01
Arduino
・Arduino USBホストシールド
Qステア

Arduinoが約3000円、ホストシールドが約2500円、Qステアが約1500円なので、合計7000円ほどです。あと動画だとモバブー使ってますが、普通にPCのUSB電源からでも動きます。
ただ、このUSBホストシールドはここを参考にして電源周りをすこし修正しています。
半田をすこし触ったことがある方ならそんなに難しくはないと思います。
自信がない方はArduino用に外部電源を用意する必要があります。

Qステアとは赤外線で操縦するチョロQの事です。通信規格もいろいろな方が解析しているようで、公開されています。
参考にしたのはここです。
あと、Arduinoのスケッチの実装はここを参考にさせて頂きました。

コードはまだ完成していないので今回は載せませんが、比較的簡単に実装できてます。
先人の方々の知恵があるおかげで簡単にQステアが動かせました。
動作のイメージとしては

  1. AndroidのonKeyDownメソッドで上下左右のキー入力を受け付ける
  2. MicroBridgeを使用してArduinoへ押されたキーの情報を送信
  3. Arduinoが受信したキー情報に対応する情報を赤外線で送信
  4. Qステアが勝手に動く

といった流れです。
ただ、onKeyDownメソッドを使用しているので、長押しを検出するまで時間がかかり、
少し動いたと思ったら止まってしまい、しばらくしたら動き続けるといった少し怪しい動きになってしまっています。

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側のアプリには変更を加えて実行。



動作確認した動画


2011年5月21日土曜日

AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)

巷はにわかにADK(Android Open Accessory Development Kit)で盛り上がっている中、
自分はN1やNSを持っていない為このBIG WAVEに乗りきれていません。
悔しいのでADKを使わなくてもAndroidとArduinoをつないでBIG WAVEにあやかろうと思います。


準備するもの(ハードウェア編)
  1. Android(できればDesire HD
  2. Arduino UnoかDeicimila。Megaとかでも動くみたい
  3. USBホストシールド(スイッチサイエンス千石電商
  4. USBホストシールドをArduino本体とつなぐ連結用のピン
これだけです。USBホストシールドは千石電商の店頭で購入しましたが、
連結用のピンが実装されていなかったので、これは個人でやらないといけなさそうです。



準備するもの(ソフトウェア編)
  1. Arduinoの開発環境
  2. MicroBridgeのライブラリ
今回はArduinoでAndroidのlogcatを表示しようと思うので、特にAndroid側のソフトはつくりません。


Arduinoのライブラリをインストール
MicroBridgeのダウンロードのページ(http://code.google.com/p/microbridge/downloads/list)からMicroBridge-Arduino.zipをダウンロードしてきます。
解凍したらARDUINO/librariesの下にAdbというフォルダ名でソースを配置します。


logcatサンプルの実行
Arduino IDEを起動して File -> Example -> AdbからLogcatを選択して、サンプルを開きます。
開けたらコンパイルして、Arduinoへ書きこむ。


logcatを見る
ターミナルやシリアルモニターを起動して、通信レートを57600に設定する。
そしたら、AndroidとUSBホストシールドとをつなぐとLogCatが出力されてくる。



動作確認した端末の結果
Desire HD 正常に動作した
Optimus Pad デバッグ接続まで行ったが、logcatのメッセージが出力されなかった
Xperia mini pro うんともすんとも言わない



まとめ
非常に簡単にArduinoとAndroidがつながりました。
USBホストシールドはADKでも使うので、もしDesire HDに2.3.4が降ってくるなんて
奇跡が起きたとしても今後使えるので購入しても良いかと思っていた程度でしたが、
意外とこのままでも使い物になるんじゃないかと期待ができそうです。


2011年5月17日火曜日

Optimus Padのケース

Optimus Padのケースを2つほど試してみました。
レザータイプとラバーコーティングタイプの2つです。
シリコンタイプはしばらく使うとべろべろになっちゃうので論外です。キリッ!

ラバーコーティングタイプ



本体を買うのと同時に買ったやつです。
プラスチック製で意外としっかりとハマる感じです。
手に持った感じサラサラでいい感じです。

・Good
ラバーコーティングタイプのいいところはやはりしっかりした作りです。
あと、重さもそれほど増えず、サイズもほぼ変わらないのがよいです。

・Bad
単体で立てることができないので、何かにもたれるようにしないといけないです。


レザータイプ



革製(人工かな?)でちょっと高級感ある感じ。
入れると本みたいな雰囲気になります。

・Good
高級感ある。単体で画面の保護もするので、かばんに無造作に入れることができる。
単体で立てることができるので動画見る際には便利。

・Bad
でかい。分厚い。重い。ちょっといただけない3拍子です。
あと、致命的なのが、立てるとUSB端子がそのまま刺さらないこと。
開発をやる際にはいただけないです。


あまり種類がないOptimus Padのケースですが、2つほど試してみてやはり、ラバーコーティングタイプがいい気がします。ただ、単体で立てれないので、何かしらグッズが必要そうです。

2011年5月2日月曜日

macでjavaのsplitを使うときの注意

macでjavaのsplitを使う際にハマりました。
splitに限らず正規表現での問題なんですが、エスケープ文字が「¥」だと思っていたら、
「\(バックスラッシュ)」じゃないと認識してくれないようで、ハマりました。
多分winの人から見るとわからない問題かもしれないです。

これだと動く
String url = "www.blogger.com";
String[] s = url.split("\\.", 0);


これだとダメ
String url = "www.blogger.com";
String[] s = url.split("¥¥.", 0);