Mac OS X Marvericks で Arduino Fio + Funnel + Processing を使いたいー!

Marvericks 環境で Arduino Fio + Funnel を構築するのに苦労したのでメモ。基本的にはFunnel Libraryに含まれているドキュメント通りにセッティングします。
写真

メモ

  • Processing は 1.5.1 を利用する。Processing 2.0 には非対応。
  • Funnel Library は、funnel-1.0-r801.zip を使う。
  • 806の方だとProcessingのExampleが全く立ち上がらない。
  • 801でもExample起動した段階でNullPointerException が出ますが無視。
  • XBee S1 を使う。XBee S2 ではFunnel 対応していないようです。

Arduino Fio の Analog 8 入力取得

スクリーンショット 2014-01-24 14.47.51

画像をドット化するスクリプト:Processing

Processingで読み込んだ画像をドット化し、PNG書き出すスクリプトを書きましたメモ。ちなみにドットは、四角じゃなくて円に変換してます。

Before

a

After

aDot

Processing コード

[java]
int NUM_BALL_X = 60;
int SIZE = 6;
PImage img;
String loadFile = "a.jpg";

void setup(){

img= loadImage(loadFile);

println("width:" + img.width + " height:" + img.height);

size(img.width,img.height,P3D);
background(0);
smooth();

img.loadPixels();
println("img.pixels.length:" + img.pixels.length);

float distanceOfBall = img.width / ((float)NUM_BALL_X);
int NUM_BALL_Y = int(NUM_BALL_X * img.height / (float)img.width);

println("distanceOfBall:" + distanceOfBall);

for( int i = 0 ; i < NUM_BALL_X ; i++){

for(int j = 0 ; j < NUM_BALL_Y ; j++){

int x = int(i * distanceOfBall + distanceOfBall/2.);
int y = int(j * distanceOfBall + distanceOfBall/2.);

color col= img.pixels[int(x + width * y)];
fill(col);
ellipse(x,y,SIZE,SIZE);
}
}

save(loadFile +"Dot.png");
}

[/java]

日本語を Max6 から Processing に OSC 経由で送る際の文字化けについて

oscP5-1

Max6 は文字コードのエンコーディングに UTF-8 を、Processing は内部的には Java なので UTF-16 を用いているのではと推測されます。そのため Processing 向けのoscP5は、Max6から受け取った UTF-8 の日本語バイト列を toString() すると、UTF-16 として解釈して文字化けしてしまいます(たぶん)。OscMessage や OscArgument のクラスなどひと通りみたのですが、エンコーディングに関するメソッドが見当たりませんでした。

そこで対策ですが、Max6 から受け取った OscMessage の Byte 列を一旦 UTF-8 として String に変換すれば問題が無くなりました。そんなに検証してないので問題あったら教えて欲しいっす!

[java]
void oscEvent(OscMessage theOscMessage) {

//このprintでは日本語の文字化けが確認される。
theOscMessage.print();

//OSCをByte列として取得
byte[] bytes = theOscMessage.getBytes();

try {

//Byte列をUTF-8として解釈
String str = new String(bytes, "UTF-8");

//Addrpatternとtypetagを削除する
String typeTagStr = theOscMessage.typetag();
str = str.substring(str.indexOf(typeTagStr) + typeTagStr.length());

//コンソールにMax6から送った日本語のメッセージが表示される
println("String:"+str);

}
catch(UnsupportedEncodingException e) {

e.printStackTrace();

};

}
}
[/java]

Syphon Server に Processing から簡単に映像を送る方法:Processing

syphon

映像をアプリ間でシェアできるライブラリ Syphon 。Processing では、FullScreen Library が使えなくて困っていたので、 Max6 に映像送って全画面化して使ってます。

Processing から Syphon Server へ映像を送る時に、Example には createGraphics した PGraphics にオフスクリーンで描画しておいて、PGraphics を Sypohon サーバーに送るという方法が書かれています。ただし、途中まで作ってSyphon化したい時なんかに、描画命令全部を拾って PGraphicsするのは面倒くさいです・・・。実は、もっと簡単な方法があります。

[javascript]

import processing.opengl.*;
import codeanticode.syphon.*;

SyphonServer server;

void setup(){

// Create syhpon server to send frames out.
server = new SyphonServer(this, "Processing Syphon");
}

void draw(){

//いつもの通りアプリを書く

//syphon server へ映像を送る
server.sendImage(g);

}
[/javascript]

以上でできました。Processing の PApplet のドキュメントを読むと g というPGraphics型の変数が定義されています。Processing の内部的には、gに対して色々と描画をしていたようです。

3Dプリンターと3Dスキャナーで自分をフィギュア化(できてない): Processing , Makerbot , Kinect

3Dプリンターを持っているのだから、3Dスキャンできれば、物をコピーしたり自分フィギュアつくれるのかなぁ。という訳で手元にあるXtionPROで3Dスキャン、Makerbotで印刷をやってみました。

結果がコレですよ・・・。フィギュアというか、マイノリティ・リポートで見たホログラム映像みたいになってます。


3Dスキャンしたデータはこんな感じです。

プログラムが達者になれば、こういう事もできるようです・・・。

使用したソフト・ハード

上3つはフリーです。方法は、英O’REILLYのMAKE:本 Making Things See のChapter 5に書いてあります。サンプルプログラムもサイトにあるので、本買わなくてもできますが、Kinectについて丁寧に説明があってわかりやすいので、買ってあげてください!Modelbuilderのバージョンが最新版だとaddFaceメソッドの引数の型が違うとコンパイルエラーでますが、メッセージ見れば修正はできると思います。

※・・・オライリー本の電子書籍は、英語版で買うとpdf / epub 等々の好きなフォーマットで何度も落とせたり、突然半額セールがあったり、本のエディションアップグレードが安くできたりするのでオススメです。