INDEX(各項目ごとの目次)

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

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

6/06/2008

Processing ドラッグしながら図形を描く


上はこのプログラムをキャプチャした画像です。
下の白いキャンバス内にドラッグして矩形を描くことができます。eキーで白紙に戻ります。







Processingでは、予めプログラム上で図形の座標やサイズを決めてから描画させますが、
一般の描画ソフト(イラストレータなど)のように、ドラッグしながら図形の大きさを決めて描くサンプルを以下に書きます。今回は、描く図形をrect()にし、マウスボタンを押した地点から描画を開始し、ドラッグ中はrect()のサイズが変化し、マウスボタンを放した時に描画完了とします(いわゆる描画ソフトでの一般的な描き方)。重ね描きできるようにするためには、毎回background()で画面を塗りつぶさず、今回はloadPixels()updatePixels()を使うことにします。重ね描きが分かりやすいように、noFill()で図形の塗り無しで、外形線だけの描画とします。「e」のキーを押せば、白紙に戻るようにします。

Processingのプログラム:

//図形描画開始点座標の変数
int x,y;

void setup(){
size(400,300);
//最初に背景色を白にしておく
background(255);
//始点と終点座標による描画に設定
rectMode(CORNERS);
//塗り無し
noFill();
}

void draw(){
//ここには何も書かない
}

//マウスボタンが押されたら
void mousePressed(){
//マウス座標を変数に入れておく
x=mouseX;
y=mouseY;
//画面内容を記憶しておく
loadPixels();
}

//ドラッグしたら
void mouseDragged(){
//画面内容を更新する
updatePixels();
//x,yを開始点、マウス座標を終点として描画
rect(x,y,mouseX,mouseY);
}

//キーが押されたら
void keyPressed(){
//「e」キーなら
if(key=='e'){
//白で塗りつぶす
background(255);
}
}

初期設定のsetup()では、rectMode(CORNERS)にして、開始点と終点の二点間の座標による定義にしておきます。マウスボタンを押した時に、マウス座標値mouseXmouseYrect()の描画の開始点としてxとyの変数に記憶させ、その時の画面内容をloadPixels()を使って記憶しておきます(ドラッグ中の処理のための下準備)。そしてドラッグ中には、loadPixels()の時の画面内容をupdatePixels()によって表示させつつ、xとyを開始点としてrect()を描き始め、終点はドラッグ中のmouseXとmouseYの座標を使って常に変化するようにします。loadPixels()によって、画面内容を記憶させておかなかったり、updatePixels()によってその画面内容を表示させなければ、ドラッグ中のrect()の線は重なり合うように描画されます(試しに、updatePixels()を消してランさせればどうなるか分かります/下画像)。


updatePixels()を使わない場合の画面。
このようにドラッグ中の変化する線も消されずに描画されます。敢えてこの方法を使うということも考えられます。

6/05/2008

Processing 手描きの線の表現




Processingにおいて、rect()ellipse()のような幾何学図形ではなく、マウスを使って「手描き」の表現をする場合のサンプルです。マウスボタン(クリック)を押しながらドラッグすると、手描きのような線を引くことができ、「e」のキーを押せば画面は真っ白に戻るという内容です。

以下の画面中央(白い矩形内)に描くことができます。









Processingのプログラム:

void setup(){
//画面サイズ幅400、高さ300
size(400,300);
//滑らかな描画(アンチエイリアス)
smooth();
//背景色を255(白)に設定
background(255);
}

void draw(){
//ここには何も書かなくてよい
}

//マウスドラッグ中のプログラム
void mouseDragged(){
//線を描画
line(pmouseX,pmouseY,mouseX,mouseY);
}

//キーが押された時のプログラム
void keyPressed(){
//もしキーが「e」なら
if(key=='e'){
//背景色を白で塗り直す
background(255);
}
}


上のプログラムでは、mouseDragged()keyPressed()の時にしか描画しないので、draw(){...}内には特に書く項目はありません。線を引くには、line(x1,y1,x2,y2)というように四つの値が入り、開始点(x1,y1)から終点(x2,y2)まで線を引きます。line()内のpmouseXは、一つ前(1ループ前)のマウスのX座標値であり、mouseX()は現在のX座標値です。つまり、一つ前のマウス座標値から現在のマウス座標値まで線を引くということになります。ドラッグ中は、その内容が繰り返され連続した線になります。すべてを白紙に戻すには、キーを押したときに、background()を用いて画面全体を塗り直します。draw(){..}内にbackground()を書いておくと、描画されている線も同時に上塗りされて消えてしまうので、setup(){...}の中で、最初に一度設定しておき、線だけが重ね描きされるようにします。

Arduinoにつないだセンサから読み取った値を、シリアル通信を通してline()内に入れれば、センサによって自由な線を描くことができます。応用的な使い方を考えてみて下さい。

6/02/2008

出力方法について

出力方法には、LEDのように発光表示する視覚的なもの、ものを動かす実際の力やエネルギーをつくりだすアクチュエータ、その他、熱や音を生成するものなどあります。特にアクチュエータの代表となるモータは、ギヤや機構の組合わせによって、様々な動き方を可能にしますが、電気以外に機械に対する知識や技術も必要になってきます。また、Arduino基盤と接続するには、モータドライバICFETトランジスタ、別電源が必要となります。
視覚的な表示方法であれば、Processingのプログラムを液晶プロジェクタで直接投影することも考えられます。
音に関しては、直接鳴らすブザーやスピーカがありますが、Processingの音のライブラリ(minimEssSonia)を用いることもできます。その場合は、既に用意してある音源データを再生したり、プログラム上で波形をつくって音を出力することもできます。
以下に、様々な出力方法のリストを挙げておきます。幾つかは、その他の部品を取付けないと作動しないものや、それに応じたプログラムが必要になるものも含まれていますが、今後授業で取り扱っていきたいと思います。

表示(発光)関係
 一般電球/蛍光灯
 LED(単色、3色)
 7セグLED
 ドットマトリックスLED
 液晶ディスプレイ
 小型有機ELディスプレイ
 冷陰極管
 レーザーモジュール
 EL発光シート

アクチュエータ関係
 DCモータ
 ギヤードモータ
 (平行ギヤ、ベベルギヤ、ウォームギヤ、ラック、遊星ギヤ)
 ステッピングモータ
 サーボモータ
 振動モータ

 電磁石
 ソレノイド

 気体ポンプ
 液体ポンプ
 電磁弁
 エアシリンダー

 バイオメタル人工筋肉
 通電性高分子人工筋肉

熱関係
 フィルムヒーター
 ニクロム線(発熱)
 ペルチェ素子(冷却)

音関係
 圧電スピーカ/ブザー
 コーンスピーカ
 Processingライブラリの利用(minimEssSoniaなど)
 関連:「スピーカ/音出力について

6/01/2008

センサについて

センサには、複雑なものもありますが、ArduinoのdigitalRead()analogRead()ですぐに使うことができるものも多くあります。いままで習った範囲でも制御できるセンサを挙げておきます。「四谷工作研究所(2007)」にも各種センサについて使い方を記載しているので参考にして下さい。
ツマミ回転式可変抵抗器:ツマミの回転量で出力値を変化
スライド式可変抵抗器:スライダの移動量で出力値を変化
ジョイスティック式可変抵抗器:スティックの動きで出力値を変化
圧電スピーカ:マイクとして使うことで衝撃音を計測
CDSセル(光センサ):光量を計測し出力値を変化
曲げセンサ:センサ自体を曲げることで出力値を変化
圧力センサ:押された圧力を計測
距離センサ:物体との距離を計測
加速度センサ:物体の重力方向に対する傾き角度/加速度を計測
人体感知センサ:人間の動きを感知しHIGH/LOWを出力


その他、スイッチ類を利用してセンサのように使うこともできます。


センサやスイッチ類をそのまま単体で使うだけでは、すぐには面白い表現にたどりつかないかもしれないので、複数のセンサやスイッチを組み合わせることを考えてみてください。例えば、単純なタクトスイッチを「Wooden Stick」に多数配置すれば、棒を握った箇所を判別するセンサになるように、応用的な使い方や配置の仕方を試してみるといいでしょう。


センサとArduinoの接続について:
可変抵抗器のように段階的に出力が可能なセンサは、大抵5V線、GND線、出力線の3つの端子があり、以下のようにつなぎます。

距離センサGP2Y0A21YK」の場合、電源(5V)とグランド(0V)にそれぞれつなぎ、出力線となる端子をArduinoのアナログ入力(ANALOG IN)のピンにつなぎ、出力線からの値をanalogRead()を使って読み込みます(プログラムについては、「Arduino シリアル通信1」または「Arduino アナログ入出力」を参照)。距離センサGP2Y0A21YKからanalogRead()で読み取った値を距離に置き換えるには、距離=220000/(読取値*5-200)にするといいそうです。
以下は距離センサGP2Y0A21YKの読取り電圧と距離(cm)の関係のグラフです。


このように3線(3端子)あるセンサの場合はいいのですが、2線(2端子)しかない場合は、必要な抵抗をつなぎ以下のようになります。

CDSセル(光センサ)」や「曲げセンサ」などは、2線(2端子)のまま売られている場合が多いので、適宜抵抗を取付けて、分岐する3つ目の線をのばし(出力線)、アナログ入力のピンへつないで下さい。つまり、2線(2端子)を3線(3端子)にするということになります。この際必要となる抵抗は、「プルアップ抵抗」と呼ばれます(プラス側に取付けた抵抗)。例えば、「曲げセンサ」の場合、もともと10KΩ〜30KΩ程度の抵抗があるので、10KΩの抵抗をつなぐとちょうどいいでしょう。「CDSセル(光センサ)」の場合も、同様のつなぎ方をします。取付ける抵抗(上図の場合10KΩ)の目安は、センサ自体の抵抗値と同程度のものとなります。取付ける抵抗を変えれば、出力される電圧や出力幅も変わるので、幾つかの抵抗を試してみて、読み取る際に丁度いいものを選んでください(プログラムについては、「Arduino シリアル通信1」または「Arduino アナログ入出力」を参照)。

また、スイッチなども2端子しかついていないので、抵抗をつなぎ、分岐させた3つ目の線(出力線)を取付けて、デジタル入力ピンへつなぎます。

タクトスイッチ」(あるいは2端子しかないスイッチ類)の場合、抵抗はマイナス(GND)側にとりつけてあります。これを「プルダウン抵抗」といいます。スイッチを押すと5V、放すと0Vの状態になります。5V/0Vのスイッチなので、デジタル入力によって読み取ります。
以下は、タクトスイッチを押すと13番ピンのLEDが光るプログラムです。

void setup(){
//12番ピンをデジタル入力に設定
pinMode(12,INPUT);
//13番ピンをデジタル出力に設定
pinMode(13,OUTPUT);
}

void loop(){
 //デジタル入力(12番ピン)がHIGH(5V)なら
if(digitalRead(12)==HIGH){
//13番ピンをHIGH(5V)で出力
digitalWrite(13,HIGH);
}else{ //デジタル入力がLOW(0V)なら
//13番ピンをLOW(0V)で出力
digitalWrite(13,LOW);
}
}

プルダウン抵抗/プルアップ抵抗:
もし、タクトスイッチから抵抗を通してGND端子へ線を接続していなければ、スイッチを押したときだけ5Vが出力されてデジタル入力の12番ピンがHIGHとして読み取りますが、スイッチを押していない時は12番ピンがどこにも接続されていない状態になってしまい、12番ピンにおいて不安定な値が読み取られます。読み取り値が不安定な値にならないためにも、抵抗を通してGNDピンに接続しておく必要があります。そうすれば、スイッチを押していない時は、GNDピンから抵抗を通して0Vが出力され、12番ピンはLOWとして読み取ることができます。つまり、スイッチを押したときの状態(5V出力)だけでなく、押していない時の状態(0V)もきちんと定義しなければならないということになります。
また、抵抗をプラス(5V)側に取付けて線を分岐させれば、「プルアップ抵抗」となります。プルアップにした場合は、押すと0V、放すと5Vになります。スイッチを押さない時の状態、押した時の状態の設定に応じて使い分けます。


「Wooden Stick」:作品制作



これまでの授業/ブログにおける、ProcessingとArduinoの基本操作方法を用いて、「Wooden Stick」の制作を開始したいと思います。以下に「Wooden Stick」の概要を再度書いておきます。

身体の描写:
物質上に、アナログ表現とデジタル表現をコラージュする。

日常生活の中から身体動作/行為を選びとり、素材をキャンバスとして、その動作や行為に含まれる以下の内容を写し取る。(例:ドアを開けるときの手や指先の動き、階段をのぼる際の、足/脚の動き)

身体部分の形状(動作や行為につながる部位)
身体部分のサイズ(幅、厚み、高さ、間接間の長さなど)
身体部分の動き(角度、方向)



「Wooden Stick」:
二次元や三次元に対して、一次元としての棒状/線状のオブジェクトに身体動作に関する内容を投影する。
投影方法:描く、塗る、刻む、削る、また他の素材を貼る、取付けるなど

木棒に転写された身体動作の描写の一部をデジタル技術に置き換える、あるいは重ね合わせる。



尚、「Wooden Stick」の後は、「Fabric Square」というサブテーマで次の制作を行う予定です。「Wooden Stick」を「Fabric Square」と対比的に捉えてみるといいでしょう。

「Fabric Square」の概要:
一次元や三次元に対して、二次元としての平面状のオブジェクトに身体動作に関する内容を投影する。
素材の持つ特性(柔軟性、透過性、包容性など)と、電気的表現、機械的表現を重ね合わせる。


次回(6/7)は、主に「Wooden Stick」をベースとして、表現や技術について授業を行いたいと思います。6/14までに、各自「Wooden Stick」を制作して来て下さい。


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