2011/11/20

Processing + ADK

この間、Basculeさん主催のMAKEイベントに参加したのですが、ProcessingやArduinoを用いたADK(The Android Open Accessory Development Kit)の話しとか、スペースバルーンプロジェクトの話しとか聞けて、かなり面白かったんですよ。

で、前々からADKは何かやってみたいなぁとは思ってたんだけど、基板とか弄るのはちょっと個人的にハードルが高いので、前々から見つけてたここのblogを参考にNexus OneとMacで自分もちょっと遊んでみました。

と言っても、やってることはほとんどそのまんま(笑。でも、まるっきり同じだとつまらないし、せっかくProcessingに興味が沸いたところなので、Nexus Oneの傾きセンサーの値をProcessingの描画パラメータに活用する(しょぼい)サンプルを作りました。

で、前述のblogに詳しいのですが、ADKって結局アクセサリーの認証方法だけ標準化してあって、アクセサリーとAndroid側のアプリの間に流すデータはBulk転送を使って独自のおれおれフォーマットで良いんですね?

まぁ、アクセサリーによって起動するアプリが選択されるから、そういう仕様の方が自由度が大きくて、開発者にとっては作り易いですよね。

では、動作時の動画を以下に貼りつけておきます。左手前のNexus Oneを傾けると立方体の群れが同じように傾いているのがわかりますでしょうか?


オリジナルのままだと傾きセンサーのデータを更新する頻度がちょっと少なすぎて、Processing上での描画がスムーズに見えなかったので、更新頻度を5倍にしてあります。

まぁ、こんな感じでMacとADKを使えば、簡単にAndroid機器と連携した何かを作ることはできそうです(これくらいだったらソケット通信でやればええやんってのは言いっこ無し)。

今回は、どっちかと言うとNexus Oneの方がアクセサリーっぽい役割になってますけど(ADK的にはMacの方がアクセサリー)、逆に例えばMacにKinectをつないで、そこで解析したデータをAndroid側に渡すなどしたら、何か面白いアプリが作れるかも知れませんね。

と、何だか伏線っぽい締め方になってますが、気が向いたら本当にやってみるかも知れませんけど(笑。

あ、今回はコード等は前述のblogからダウンロードできるからいいかな?と思ってましたが、せっかくですのでProcessingのsketchだけ、晒しておきますか。
int angle;
BufferedReader reader;
String line;

void setup() {
  size(440, 330, P3D);
  noStroke();
  fill(255);
  angle = 0;
}

void draw() {
  lights();  
  background(0);
  
  // カメラの設定
  float camZ = (height/2.0) / tan(PI*60.0 / 360.0);
  camera(width/2.0, height/2.0 - 100, camZ, width/2.0, height/2.0, 0, 0, 1, 0);
  
  translate(width/2, height/2, -20);
  int dim = 27;
  
  // 角度の書きこまれたファイルの中身を参照
  try {
    reader = createReader("angle.txt");
    line = reader.readLine();
  } catch (IOException e) {
    e.printStackTrace();
    line = null;
  }
  
  // 角度の文字列データを数値に変換
  if (line != null) {
    angle = (line.charAt(1) - '0') * 100;
    angle += (line.charAt(2) - '0') * 10;
    angle += (line.charAt(3) - '0');
    if (line.charAt(0) == '-') {
      angle = 360 - angle;
    }
  }
  
  // 演算した角度で回転
  rotateZ(radians(angle));

  // 長方形を並べる
  for (int i = -height/2; i < height/2; i += dim*1.4) {
    for (int j = -height/2; j < height/2; j += dim*1.4) {
       pushMatrix();
       translate(i, j, 0);
       box(dim, dim, dim);
       popMatrix();
    }
  }
}

0 件のコメント:

コメントを投稿