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 コード

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


日本語を 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 に変換すれば問題が無くなりました。そんなに検証してないので問題あったら教えて欲しいっす!

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

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

syphon

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

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


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

}

以上でできました。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 等々の好きなフォーマットで何度も落とせたり、突然半額セールがあったり、本のエディションアップグレードが安くできたりするのでオススメです。

 


ProcessingでModelbuilder のサンプルプログラムを動かす。: Processing

ProcessingからMakerbot/Reprap等の3Dプリンターで印刷が可能な.stlフォーマットを出力できる Modelbuilderという素晴らしいライブラリがあります。サンプルプログラムを動かす為に一苦労したので、動かし方をメモ代わりに書いておきます。あくまで今日の時点で動いた構成ですので、ProcessingやModelBuilder、ControlP5のバージョンが新しくなった場合は、この限りでは無いと思います。

  1. Processing 1.5.1 を利用する。原因は調べられていないですが最新版の2.0では、上手く動きませんでした。個人的にProcessing2.0と共存させたかったので、Processing1.5.1は、アプリケーション名をProcessing.app → Processing151.appへと変えて、2.0と共存させています。
  2. Modelbuilder v0007a03.zip をダウンロード&ライブラリフォルダに入れる。自分の環境だと/Document/Processing/Libraries の直下
  3. ControlP5 の controlP5_0.5.4.zip をダウンロード&ライブラリフォルダに入れる。(補足 Modelbuilderの作者さんがcontrolP5の0.5.4を使っているようです。Processing2.0対応の際には、最新版に対応したいとブログで言及されていました。)
  4. 2.のフォルダ内  modelbuilder/examples の中にある.pde ファイルを開いて実行。
  5. Stlで出力し、3Dプリンターで印刷