Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/320-d4fdacd1

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Arduino+Processing

前回の工作Gディスプレイのマネごとは、加速度センサーの値をLEDの点灯で表現した。LEDは10×10で暫定的な実験と終わった。本格的に作り込むとしたら、大量のLEDを配置して、シフトレジスタも増設する必要がある。

ー>メンドクサイ!!

カメラに加速度をビジュアル的に表現したもを写す事が目的なら、他にもやりようがある。
カメラ映像にオーバーレイ、今風に言うとAR(Augmented Reality)してしまえば良い。
現にそう言う商品がKaazさんからでてる。 この商品は映像出力端子を制御してるようだ。基本的な方法の作例などの紹介はぐぐれば出てくるが、踏み込んでは行けない世界の様な気がするし、映像出力端子がついてるカメラは最近見ないのでパス。

他にもいろいろ方法はあるだろうが、今回は、ARと言えば、「Processing」が前頭筆頭のようなので、USBのWebカメラで取得した映像にArduino経由で取得した加速度センサーの値をパソコン上で「Processing」でオーバーレイしてみる。
Arduino<->Processing間はUSBでシリアル通信するわけだが、そこのプロトコルの整理及び実装はメンドクサイなぁ。。。と思ってググってると「Firmata」に任せるって方法があるらしいので、それにする。

ArduinoとKXM52-1050(加速度センサー)の接続は、こんな感じ。
IMG_9920.jpg

IMG_9919.jpg

まず手持ちの環境は、
Mac OSX 10.6.8
java version 1.6.0_37
カメラはLogicool HD Webcam C615
これに、Processingの最新版2.0b7をインストールし、カメラを認識させようと試みるが、うまくいかない。
コードはこちらを使用。
String[] cameras = Capture.list();でNullPointerExceptionになってしまう。
macamを入れると良いなどの文献もあるが、うまくいかない。
Processingを最新版から安定板1.5.1に落として、サンプルソースは、
[File]->[Examples..] Libraries/video/Capture/GettingStarteCaptureの以下2行のコメントを外して、

String[] devices = Capture.list();
println(devices);

まずは実行すると、Processingのスケッチの下部に認識したカメラのリストが以下の様に出力されるので、

[0] "CamTwist"
[1] "DV ビデオ"
[2] "IIDC FireWire Video"
[3] "ManyCamVDig RGB"
[4] "ManyCamVDig YCbCr"
[5] "USB Video Class Video"

つぎに同サンプルソースに使いたい番号をスケッチに反映する。今回私の場合だと5番を使いたい。

import processing.video.*;

Capture cam;

void setup() {
size(640, 480);

// If no device is specified, will just use the default.
//cam = new Capture(this, 320, 240);

// To use another device (i.e. if the default device causes an error),
// list all available capture devices to the console to find your camera.
String[] devices = Capture.list();
println(devices);

// Change devices[0] to the proper index for your camera.
cam = new Capture(this, width, height, devices[5]); //0から5に変更

// Opens the settings page for this capture device.
//camera.settings();
}

void draw() {
if (cam.available() == true) {
cam.read();
//image(cam, 160, 100);
image(cam, 0, 0);
// The following does the same, and is faster when just drawing the image
// without any additional resizing, transformations, or tint.
//set(160, 100, cam);
}
}

これで、とりあえず下地となるカメラ映像を取り込めた。
次にArduinoのIDEで[ファイル]->[スケッチの例]->[Firmata]->[Standard Firmata]ででてきたスケッチをロード。これで終了。あとは全部Processingで制御するのでArduinoのIDEは閉じてかまわない。

そしたら、http://playground.arduino.cc//Interfacing/Processingから、 processing-arduino.zipをもらってきて、解凍されたフォルダ:arduinoを書類/Processing/librariesの下に移動。(ここでProcessingのIDEは再起動しないとlibを認識しなかったかな)
で、最終的なスケッチ(コード)を以下に

import processing.video.*;
import processing.serial.*;
import cc.arduino.*;

Capture cam;
Arduino arduino;
MovieMaker mm;

void setup() {
size(640, 480);
String[] devices = Capture.list();
//println(devices);
cam = new Capture(this, width, height, devices[5]);
//String[] list = Arduino.list();
//println(list);
// /dev/cu. から始まるデバイスをみつけて、その番号を指定する。今回は1
arduino = new Arduino(this,Arduino.list()[1]); //デバイス番号1を指定
mm = new MovieMaker(this, width, height, "test001.mov", 30, MovieMaker.H263, MovieMaker.HIGH);
}

void draw() {
if (cam.available() == true) {
cam.read();
int x = arduino.analogRead(0); //加速度センサーのX軸はArduinoのアナログ0PINに繋がってる
int y = arduino.analogRead(1); //加速度センサーのY軸はArduinoのアナログ1PINに繋がってる
background(0xff);
image(cam, 0, 0);
//text(x+":"+y, 10, 35, 70, 40);
rect(510,350,115,115);
ellipse(700-x/4,280+y/4,10,10);
mm.addFrame();
}
}

void keyPressed() {
if (key == ' ') {
mm.finish();
}
}

実行結果は、
http://www.youtube.com/watch?v=LPJwjXzoZEg

フレームレイトあってない??

ん〜 でも、まぁ簡単。
追記

FPSがあってなかったので、以下の様に小細工してみる。

import processing.video.*;
import processing.serial.*;
import cc.arduino.*;

Capture cam;
Arduino arduino;
MovieMaker mm;

void setup() {
size(640, 480);
String[] devices = Capture.list();
//println(devices);
cam = new Capture(this, width, height, devices[5],30);
//String[] list = Arduino.list();
//println(list);
// /dev/cu.
arduino = new Arduino(this,Arduino.list()[1]);
mm = new MovieMaker(this, width, height, "test001.mov", 30, MovieMaker.H263, MovieMaker.HIGH);
noLoop();
}

void captureEvent(Capture c) {
if (cam.available() == true) {
c.read();
loop();
}
}

void draw() {
// cam.read();
int x = arduino.analogRead(0);
int y = arduino.analogRead(1);
background(0xff);
image(cam, 0, 0);
//text(x+":"+y, 10, 35, 70, 40);
rect(510,350,115,115);
ellipse(700-x/4,280+y/4,10,10);
mm.addFrame();
noLoop();
}

void keyPressed() {
if (key == ' ') {
mm.finish();
}
}

でもまた、ずれてる。 このへんがProcessingの限界かな。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/320-d4fdacd1

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

kovayashi

Author:kovayashi
・嫌いなもの
 →好きなもの

・インストール
 →バンドル
・バックアップ
 →アップロード
・努力
 →チート

最近のトラックバック

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。