2011年7月16日土曜日

Android Bazaar and Conference 2011 Summerで講演/出展します



半年に一回のペースでやっているABC
今回はついに講演者側に回ることになりました。

Robotトラックの15:00〜のロボットサミットで登壇します。
16:00ごろからの予定です。
その後にパネルディスカッションの予定です。
興味のあるかたはぜひいらしてください。
http://www.android-group.jp/abc2011s/conference.html#robot

また、当日はバザールで、横浜ロボ部としてブースをだしています。
こちらは、8号館の3Fコミュニティーブース3でだしています。
今まで作ったロボとかチョロQとか持っていく予定です。
http://www.android-group.jp/abc2011s/bazaar.html


Android Bazaar and Conference 2011 Summer
http://www.android-group.jp/abc2011s/


#以下アフィリエイト用の広告です

2011年7月15日金曜日

MicroBridgeでADKのアプリインストール動作を真似る

ADKでは対応するアプリがインストールされていなかったら
自動でマーケットへ飛ばしてくれるらしいです。
ADKを使える端末を持っていないのであくまでらしいです。

神戸支部のMLで日曜エレクトロニクス(日エレ)の管理人の石井さんの投稿を見て
そんな機能をMicroBridgeでも作れないかとインスパイアさせて頂きました。

やり方は至って簡単で、adb shellのamコマンドを使って起動したいアプリをintentを使って
起動しようとします。
もし、アプリが起動したらバンザイ。それでおしまい。そのままお好きに通信開始。
アプリが起動出来ないと、amコマンドが色々とエラーを吐いてきてくれます。
エラーが出てたら、そのままamコマンドでマーケットへ飛ばしてあげるだけです。
小さいapkファイルだったらそのまま書き込みをしてみてもいいかもしれないです。

これで、ABCや、マイスマではチョロQ展示用の端末を自前で用意しなくても
来場者の端末を使って操縦できそうです。

最後に動作している動画です。


#以下アフィリエイト用の広告です

2011年7月10日日曜日

MicroBridgeを使ったスケッチのテンプレート

MicroBridgeを使ったスケッチのテンプレート。


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

// ADB接続
Connection *connection;

// ADB接続のイベントハンドラ
void adbEventHandler(Connection *connection, adb_eventType event, uint16_t length, uint8_t *data) {

  if (event == ADB_CONNECTION_RECEIVE) {

  }
}


void setup(){

  // ADBの初期化 
  ADB::init();

  // ADB接続の開始
  connection = ADB::addConnection("tcp:4567", true, adbEventHandler);  

}

void loop() {
  // ADB接続のポーリング
  ADB::poll();
}



Arduino pro miniでADK互換ボードを構成する

どうもArduino UNOだと大きいのでArduino pro miniを使って小さく構成してみました。

といっても市販品?で構成できるので簡単でした。

構成部品

  1. Arduino pro mini
  2. FT232RL搭載小型USB-シリアルアダプタ 3.3V
  3. USB Host Shield for Arduino Pro Mini


Arduino pro miniはスイッチサイエンスで購入。
注意点として3.3V版を購入すること。

FT232RL搭載小型USB-シリアルアダプタ 3.3Vはスケッチの書き込みで使います。
間違って5V版を買わないこと!

USB Host Shield for Arduino Pro MiniはCircuits@Homeで購入。
何故か国内で取り扱っている店が無いので、海外から購入。
海外からの発送なので1週間ほど時間がかかります。
ちなみに自分はFlat Rateで発送してもらいました。
Paypalで購入したら荷物番号みたいなのを送ってきてくれたのですが
USPSで追跡はできなかったです。
Expressだともっと早いし追跡できるのかな?

上から

横から

組み合わせてみるとこんなくらいのサイズ。
ジャンパが基板表面上にあるみたいで、どう影響するかいまいちわからなかったので
コネクタを使ってArduinoとシールドを外せれるようにしておいた。
でもそのまま使えたので、2セット目はそのまま直結してもよさそう。

これでテストでLogcatのサンプルを書きこんでみたら
そのまま動いた。

とっても簡単でした。

2011年7月2日土曜日

ADKリファレンスボードでMicroBridgeを使う

神戸支部の吉田さんからGalileo 7 ADK Main BoardでMicroBridgeが使えないか?と頼まれたので
いろいろと調べてみました。

Galileo 7 ADK Main BoardはADK互換ボードでサイズはUNOを少し大きくした感じです。
詳しくはこちら

肝心のMicroBridgeを使う方法ですが、拍子抜けするくらい簡単でした。

まずArduinoのライブラリフォルダにMicroBridgeのライブラリを追加します。
追加方法は過去記事を参考にしてください。

過去記事の「Arduinoのライブラリをインストール」が終わったら、
ARDUINO/librarys/Adk/max3421e.h
を編集します。

max3421e.hをひらいて、


#include "max3421e_constants.h"
#include "pins_arduino.h"





#include "max3421e_constants.h"
#include "pins_arduino.h"
#define ADK_REF_BOARD

としてください。
あとは、過去記事と同じようにlogcatのデモを実行すればAndroidのログが見れます。



おそらく

PIN_MAX_SS、PIN_MAX_INT、PIN_MAX_GPX、PIN_MAX_RESET
でピン配置を決定しているのだとわかるのですが、SPIの端子はどこで設定しているのか
よくわかりませんでした。そのあたりがわかればもう少し自由が効くようになりそうなのですが・・・



2011年6月27日月曜日

AndroidのMonkeyRunnerを使うためのメモ

自分用のメモ

MonkeyRunnerは自動テストツールらしいよ。

使うためには/tools/monkeyrunnerにJythonでかいたソースを投げればいい。
Activityの起動はintentで直書きするのと似た書き方

2011年6月20日月曜日

AndroidからAndroidの乗ったロボを操縦する


ABC2011sへ持ってく予定の新作です。
端末がいっぱいあったので、タブレットからAndroid携帯とBluetoothで通信して、
Android携帯からはMicroBridgeを使ってArduinoと通信するといった構成で
遠隔操縦ロボつくりました。

詳細は続きから

2011年6月10日金曜日

Amazonで買えるArduino関連商品

Amazonで買えるArduino関連商品をまとめた

・本体
Arduino Uno
¥2,995
言わずもがな、一番大切な本体。一番最初に買うなら一番オススメ。Unoからドライバを入れないとWinで認識してくれない。Macは何故かモデムとして認識する。

Arduino Fio
¥2,495
Zigbeeとかバッテリーが必要だとかで追加で買う物があったはず。

Netduino
¥3,495
.Net環境で開発ができる変わり種。一番最初に買うのはあまりオススメしないかな。
でもVC#で開発ができて、ステップ実行とかできるのでデバッグがすごく遣り易いらしい。

Seeeduino328

¥3,200
Arduino 互換らしいけど詳しくはしらないな。

Arduinoをはじめようキット
本当はこのキットがオススメなのだが、最近ずっと売り切れになってる。
ブレッドボードやLED等があってすぐに遊べるキットになってる。


・シールド
LCDシールドキット
¥1,980
ちょっと興味があるかな。まんまLCDを表示するためのシールド。

Arduino用ユニバーサル基板 UB-ARD01
¥704
自分で作った回路を載せるための基板

Arduinoイーサネットシールド(microSDスロット付)
在庫切れ
便利。Arduino に有線LANをつなぐ事ができる。ただノイズに弱いのか電源が貧弱なのかモータードライバと一緒にして動かすとリセットがかかってしまい使えない。
サーボ、LEDなら大丈夫だった。
PLANEX 手のひらサイズ 300Mbps ハイパワー無線LANルータ/アクセスポイント/コンバータ FFP-PKR01と組み合わせれば、無線LAN化してArduino とAndroidを繋げられる。

・その他
RBT-001 Bluetooth evaluation kit
Bluetoothをシリアル通信化してくれるキット。技適もとってるから安心。

Prototyping Lab Kit Vol.1
Prototyping Lab Kit Vol.2
正直バラで買ったほうがオススメ。






2011年6月2日木曜日

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);

2011年4月29日金曜日

javadocのdocletをEclipceで作る

自分用のメモだけど、javadocのdocletをちょっと作る機会があったのでメモ。


ここを参考にした
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/javadoc/doclet/overview.html


Eclipseだと文字エンコードで怒られなくなる。なんでだろ?


・ListClass.java
ソースに含まれるクラスを標準出力へ吐き出してくれる。
パッケージをデフォルト・パッケージにすると実行時に楽みたい

import com.sun.javadoc.*;

public class ListClass {
    public static boolean start(RootDoc root) {
        ClassDoc[] classes = root.classes();
        for (int i = 0; i < classes.length; ++i) {
            System.out.println(classes[i]);
        }
        return true;
    }
}
・プロジェクトの実行の構成を変える メイン・クラス com.sun.tools.javadoc.Main 引数 -docletpath ${workspace_loc:doclet/bin} -doclet MyDoclet -sourcepath ${workspace_loc:対象になるソース} -subpackages パッケージ名 -private 


2011年4月26日火曜日

ByteBufferの速度

ByteBufferはプリミティブな型の数値からbyte配列を簡単につくってくれる。
だけど、ByteBuffer.classの中身を見るとabstractとか使ってたりインスタンス生成したりするので意外とコストがかかる。
なので、自前でビットシフトを使って作ったメソッドを作ってみた。ByteBuffer.classの中身を追った感じは同じ用な考え方で実装してた。
速度を測ってみたら自前でつくったメソッドの方が早く動作した。

・Main.java
ByteBufferと自前でビットシフトをするメソッドで1000000回変換した場合の時間を測定

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {

        final int LOOP = 1000000;
        final int value = 0x12345678;

        ByteBuffer buf = ByteBuffer.allocate(16);
        buf.order(ByteOrder.LITTLE_ENDIAN);
        byte[] dat = new byte[16];

        long s_time = System.nanoTime();

        for (int i = 0; i < LOOP; i++) {
            DataConverter.setValue(dat, 0, value);
            DataConverter.setValue(dat, 3, value);
            DataConverter.setValue(dat, 7, value);
            DataConverter.setValue(dat, 11, value);
        }

        System.out.println("Convertor:" + (System.nanoTime() - s_time) / LOOP);

        for (int i = 0; i < dat.length; i++) {
            System.out.format("%02X ", dat[i]);
        }
        System.out.println();
        System.out.println();

        s_time = System.nanoTime();

        for (int i = 0; i < LOOP; i++) {
            buf.putInt(0, value);
            buf.putInt(3, value);
            buf.putInt(7, value);
            buf.putInt(11, value);
            // byte[] d = buf.array();
        }
        System.out.println("ByteBuffer:" + (System.nanoTime() - s_time) / LOOP);

        byte[] d = buf.array();
        for (int i = 0; i < d.length; i++) {
            System.out.format("%02X ", d[i]);
        }

    }
}
・DataConvertor.java
public final class DataConverter {

    /** int型のバイトサイズ */
    private static final int SIZE_INTEGER = Integer.SIZE / Byte.SIZE;

    /** マスク */
    private static final int MASK = 0xFF;

    public static void setValue(final byte[] dest, final int offset, final int src) {
        for (int i = 0; i < SIZE_INTEGER; i++) {
            dest[offset + i] = (byte)(src >> Byte.SIZE * i & MASK);
        }
    }
}
●結果
Convertor:56
78 56 34 78 56 34 12 78 56 34 12 78 56 34 12 00

ByteBuffer:130
78 56 34 78 56 34 12 78 56 34 12 78 56 34 12 00
どちらも出力の形は一緒になったけど、時間に差が出た。 10回やってみた結果。
cnt = 1
Convertor :  54ns
ByteBuffer: 139ns
cnt = 2
Convertor :  53ns
ByteBuffer: 130ns
cnt = 3
Convertor :  49ns
ByteBuffer: 131ns
cnt = 4
Convertor :  50ns
ByteBuffer: 134ns
cnt = 5
Convertor :  50ns
ByteBuffer: 129ns
cnt = 6
Convertor :  50ns
ByteBuffer: 130ns
cnt = 7
Convertor :  52ns
ByteBuffer: 131ns
cnt = 8
Convertor :  50ns
ByteBuffer: 127ns
cnt = 9
Convertor :  50ns
ByteBuffer: 131ns
cnt = 10
Convertor :  50ns
ByteBuffer: 131ns

2011年4月24日日曜日

JavaのMapの動作

ちょっとJavaでMapの動作について気になったからテストしてみた。
気になったことはMapに同じキーでputしてからgetするとデータはどうなっちゃうのかなって。
結果としては、Mapはあとから同じキーでputされると以前設定されていた内容に上書きしてくれる。
Javadocにもそう書いてあった。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/Map.html#put(K, V)

Map map = new HashMap();

map.put(1, "1st");
map.put(2, "2nd");
map.put(3, "3rd");
map.put(4, "4th");
map.put(5, "5th");
map.put(6, "6th");
map.put(1, "いち");


for (int i = 1; i <= 6; i++) 
{
      System.out.println(map.get(i)); 
}