INDEX(各項目ごとの目次)

[HOME]  [Processing関係]  [Arduino関係]  [マテリアル関係]  [秋葉原工作マップ]

2008年用ですが、部分的に内容を更新しています(2010/06/14)。
また、[建築農業工作ゼミ2009-2010]とも連動していますので、そちらにも幾つかサンプルがあります。
:

10/14/2008

次回授業(10/18):FURNI02



次回(10/18)の授業では、「身体と装置」に関するスライドショーを行います。その後、引き続き連続する姿勢/行為をもとに応用的な実験をします。
・パソコン、Arduino、入出力装置等を各自持参して来て下さい。

10/12/2008

Processing FileChooser2

以前「Processing FileChooser/ファイル選択画面の表示」でJava Swingを用いましたが、Processing 146以降からselectInput()によって、ファイル選択画面を通して任意の場所にあるファイルを読み込むことが簡単にできるようになりました。
以下は、「f」キーを押すとselectInput()で、ファイル選択画面を表示し、コンピュータの任意の場所にある画像を表示するサンプルです。表示された画像は、ドラッグすることで位置を変えられるようにしてあります。

//画像用インスタンス用意
PImage img;

//現在選択中のファイルパスの変数
String currentPath=null;
//画像配置座標の変数
int x,y;
//画像配置座標とクリック座標の差分の変数
int dx,dy;

void setup(){
  //画面サイズ設定
  size(600,400);
}

void draw(){
  //背景描画(黒)
  background(0);
  //現在選択中のファイルパスが空ではないとき
  if(currentPath!=null){
    //画像描画
    image(img,x,y);
  }
}

//クリックしたら
void mousePressed(){
  //画像配置座標とクリック座標の差分を求めておく
  dx=x-mouseX;
  dy=y-mouseY;
}

//ドラッグ中
void mouseDragged(){
  //マウス座標に差分座標を加えた値を画像配置座標とする
  x=mouseX+dx;
  y=mouseY+dy;
}

//キーを押した場合
void keyPressed(){
  //「f」キーなら
  if(key=='f'){
    //ファイル選択画面を表示し選択したファイルパス取得
    String loadPath = selectInput();
    //ファイルパスが空の場合
    if (loadPath == null) {
      //「ファイルが選ばれてない」メッセージを出力
      println("No file was selected...");
      //ファイルパスを前回のファイルパスにする
      loadPath=currentPath;
    } 
    else {//ファイルパスが選択された場合
      //ファイルパスのドット以降の文字列を取得(拡張子名を取得)
      String ext = loadPath.substring(loadPath.indexOf('.') + 1);
      //拡張子が「jpg」または「png」なら
      if(ext.equals("jpg") || ext.equals("png")){
        //選択ファイルパスの画像を取り込み
        img = loadImage(loadPath);
        //現在選択中のファイルパスを更新
        currentPath=loadPath;
        //現在選択中のファイルパスを出力
        println(currentPath);
      }else{//拡張子が「jpg」または「png」ではないとき
        //「画像ファイルではない」と出力
        println("Not image file.");
      }      
    }
  }
}


ファイル選択画面上で選択したファイルのパスを取得したら、substring()によってパスの文字列末尾に含まれる拡張子を調べます。その際、indexOf()を使うことで、パスの文字列に含まれる「.」を手掛かりに、パスの文字列末尾の拡張子を抜き出します(indexOf()は、括弧内に入れた文字が文字列中の何番目にあるかを教えてくれます)。
今回は、拡張子が「jpg」か「png」であれば、loadImage()で画像を取り込み、次回のためにファイルパスを記憶させておきます。それ以外の拡張子の場合は、"Not image file."だけを出力します。

selectInput()以外に、フォルダを選択するためのselectFolder()や、保存先を指定するselectOutput()も加えられています。

----------------------------------
以下は頂いたコメントに対するサンプルです。
import java.awt.*;

void setup() {
  size(200,200);
}

void draw(){  
}

void fileSelected(File selection) {
  if (selection == null) {
    println("Window was closed or the user hit cancel.");
  } else {
    println("User selected " + selection.getAbsolutePath());
  }
}

void mousePressed(){
  FileDialog fd = new FileDialog(new Frame(),"Choose a file");
  fd.setDirectory("/Users/username/Desktop");//ここのディレクトリを任意に変えてください。
  fd.setVisible(true);
  if(fd.getFile()==null){
    println("Canceled");
  }else{
    println("FILE NAME:"+fd.getFile());
    println("DIRECTORY:"+fd.getDirectory());
  }
}

10/11/2008

Processing Webカメラ/定点記録画像

身体の動作などを連続写真として記録するために、Webカメラを用いインデックス番号をつけて画像保存する方法です。設定したフレームレートで撮影画像を順番に保存していきます。以下は、フレームレート2の速度(0.5秒/フレーム)で処理するサンプルです。sキーで連続写真の画像を0.5秒おきに保存し、eキーで保存を終了、cキーでカメラセッティング画面に切り替わります。
videoライブラリの基本的な使い方は「Processing Video(Webカメラ)」を参照して下さい。

*Windowsの場合、そのままの設定ではこのVideoライブラリを使用することができません。WinVDIG 1.0.1をインストールする必要があります。


//ライブラリの取り込み
import processing.video.*;
Capture myCapture;

//記録開始用のフラグ
boolean start=false;
//記録画像インデックス用変数
int num=0;

void setup() {
//画面サイズ設定
size(320, 240);
//キャプチャする映像の設定(2フレーム/秒)
myCapture = new Capture(this, width, height, 2);
//ループのフレームレート(2フレーム/秒)
frameRate(2);
}

void draw() {
//映像を画面に配置
image(myCapture, 0, 0);
if(start){
//記録中の目印表示
rect(0,0,10,10);
//記録画像インデックス名(jpgで保存)
String s="image_"+num+".jpg";
//画像を保存
save(s);
//インデックス番号を更新
num++;
}
}

//映像の読み込み
void captureEvent(Capture myCapture) {
myCapture.read();
}

void keyPressed(){
//sキーで画像記録開始
if(key=='s'){
start=true;
}
//eキーで記録終了
if(key=='e'){
start=false;
}
//cキーでカメラセッティング
if(key=='c'){
myCapture.settings();
}
}


連続写真の画像は、撮影された数だけスケッチフォルダのなかに保存されます。

(スケッチフォルダの中にインデックス番号を含んだ保存名で保存される/MacOSXの場合)

上図の場合、「image_0.jpg」から「image_10.jpg」までの合計11枚の画像が保存されています。フレームレートは2なので、約5.5秒間撮影(連続保存)したことになります。

関連:
Processing Video (Webカメラ)」--Webカメラの使い方/映像にフィルタをかけて表示。
Arduino+Processing マトリクスLED+Webカメラ」--Webカメラ映像をマトリクスLEDに映す。
Processing Webカメラを光センサとして使う」--点光源で画面内に線を描く。
Processing Webカメラ/カラートラッキング」--Webカメラを使い、色を手がかりに物体を追いかける。
Processing Webカメラ/モーショントラッキング」--Webカメラを使って動体検知する。

Arduino タッチセンサ

今回は、ArduinoのPlaygroundサイト内のCapacitive Sensing(静電容量式)を参考に、タッチセンサをつくりたいと思います。基本的には、Arduino基盤に抵抗(1MΩ)を接続するだけです(その他ミノムシクリップや金属板などがあるといいかもしれません)。この方法によって、主に抵抗だけでセンサを容易につくることができます。指先などが入力用端子に近づくと静電容量が変化し、その変化量を読み取ることで判断する仕組みになります。
接続方法は以下の通りです。8番、9番ピンに抵抗を接続し、9番ピン側に入力用のタッチセンサとなる金属片を接続しておきます。金属片に指などで触れると感知するセンサとなります。紙などのシートで金属片を覆った上から触れても感知します。



まず以下のプログラムで実験してみることにします。指で金属板に触れると、9番ピンの読み取り値がLOWからHIGHへ変化していきます。HIGHになるまでの時間をカウントアップしていき、その変化量をシリアル通信でモニタリングしてみます。

void setup(){
//モニタリングのためシリアル通信開始
Serial.begin(9600);
//8番ピンをデジタル出力
pinMode(8,OUTPUT);
//9番ピンをデジタル入力
pinMode(9,INPUT);
}

void loop(){
//静電容量変化量の変数を用意
int a=0;
//8番ピンをHIGHで出力
digitalWrite(8, HIGH);
//指が触れたとき9番ピンがHIGHになるまでをカウント
while (digitalRead(9)!=HIGH){
//カウントする
a++;
}
delay(1);
//8番ピンをLOWにする
digitalWrite(8, LOW);
//モニタリング:値を出力
Serial.println(a);
}



モニタリング結果として、指で触れてない時は、

3
3
2
3
3
3
4
3
2
3

という感じで2〜4程度の値が確認されました。
指で触れている間は、

0
32
78
24
0
0
15
32
33
9

という感じで、5以上の値かつ、たまに0を出力していました。
値に多少ばらつきがあるので、プログラムに出力値を滑らかにするフィルタをつけくわえることにします。更に、指先を感知するごとに、13番ピンに接続されたLEDが点灯するプログラムも追加することにします。


int f=0;//フィルタ用変数

void setup(){
//モニタリングのためシリアル通信開始
Serial.begin(9600);
//8番ピンをデジタル出力
pinMode(8,OUTPUT);
//9番ピンをデジタル出力
pinMode(9,INPUT);
//LED点灯用に13番ピンをデジタル出力
pinMode(13,OUTPUT);
}

void loop(){
//静電容量変化量の変数を用意
int a=0;
//8番ピンをHIGHで出力
digitalWrite(8, HIGH);
//指が触れたとき9番ピンがHIGHになるまでをカウント
while (digitalRead(9)!=HIGH){
//カウントする
a++;
}
delay(1);
//8番ピンをLOWにする
digitalWrite(8, LOW);

//値を滑らかにするフィルタ式
f+=(a-f)/2;
//モニタリング:フィルタ値を出力
Serial.println(f);

//LED点灯のプログラム
if(f>5){//値が5より大きい場合点灯
digitalWrite(13,HIGH);
}else{ //それ以外消灯
digitalWrite(13,LOW);
}
}



フィルタ式を付け加えると、指を触れていないときの値は3程度であり、触れている時は

749
375
188
802
401
201
751
376
188

のように、ある程度大きな値が並んで出力されました。よって、LEDのオンとオフのしきい値を5にしておき、5より大きい値であればLEDを点灯させるプログラムにしてみました。1MΩの抵抗のかわりに10MΩの抵抗(より抵抗値が高い)を用いれば感度が高くなり、金属片と指先の距離が離れていても(数センチ)、充分反応するとサイトでは説明しています。

10/06/2008

次回授業(10/11):FURNI01



次回から、「姿勢」、「行為」、「行動」と関わる実験をしていきたいと思います。通常、ある目的やアイデアを最初に設定し、その目的を実現するために、表現方法や技術的解決を行います。プログラミングや電子工作の様々な実験を繰り返していると、「何のための技術であるのか?」という疑問は残るはずです。しかしながら、このゼミでは敢えて最初に目的を設定せず(目的の保留)、方法や技術あるいは表現の冗長な組合わせの実験を行い、その冗長な手続きをヒントに連鎖する「姿勢」の組合わせを導き出します。そして、複数の「姿勢」の組合わせによって、新たな「行為」の発見を試みたいと思います。

パソコン、Webカメラ、Arduino、センサ類、出力部品類を持参してください(学校にあるセンサや出力部品の利用も可)。

The Human Figure in Motion
The Human Figure in Motion
posted with amazlet at 09.03.31
Eadweard Muybridge
Dover Pubns
売り上げランキング: 499


[目次:Processing関係]  [HOMEへ戻る]  [目次:Arduino関係]