INDEX(各項目ごとの目次)

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

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

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-Arduino シリアル通信4


【変更】以下はArduino1.0まで対応したプログラム内容です。
特にシリアル通信においては、Arduino2.0使用の際、バイト送信する場合、
Serial.print(value,BYTE);
のかわりに、
Serial.write(value);
を使用してください。


前回までは、Arduino基盤に接続したセンサなどからProcessingの画像を動かしていましたが、今回はその逆で、Processingで制作した画像からArduinoを制御したいと思います。前回同様合図用のデータを送り、確認し合いながら通信します。Processingでマウスで動かすことができるスライダをつくり、256段階の値をArduino側に送り、PWM出力を用いてLEDの明るさを調節できる内容とします。Processing側から操作するので、まずProcessing側のプログラムから書きます。

Processingのプログラム:
//シリアルライブラリの取り込み
import processing.serial.*;
Serial port;

//X座標の変数
int x=0;

void setup(){
  size(255,100);
  //シリアルポートの設定
  port=new Serial(this,"/dev/tty.usbserial-A4001Kjl",9600);
}

void draw(){
  background(100);
  line(x,0,x,height);
}

void serialEvent(Serial p){
  //データ数が0個より多いとき
  if(port.available()>0){
    //X座標を送信
    port.write(x);
    //Arduinoからの合図用データを
    //読み込んでバッファを空にする
    port.read();
  }
}

void mouseDragged(){
  //ドラッグ中のX座標にマウスX座標を
  //最小値0,最大値255で入れる
  x=constrain(mouseX,0,255);
}

void keyPressed(){
  //sキーを押したら
  if(key=='s'){
    //通信開始用データ送信
    port.write(0);
  }
}


今回は、キーボードの「s」キーを押すことでシリアル通信を開始することにしました。「s」キーを押さなければ、Processing、Arduinoの両方のプログラムは、どちらも待機中となります。そのため、Processing側から「s」キーを押して、通信開始のきっかけとなるデータを1個(1バイト分)送ります。
Arduino側では、11番ピン(PWMピン)にLEDのプラス側を、GNDにマイナス側をつなぎます。必要に応じてその間に抵抗(220Ω)を直列つなぎします。

Arduinoのプログラム:
//読み取り値の変数
int val=0;

void setup(){
  //シリアル通信開始
  Serial.begin(9600);
}

void loop(){
  //データが0個より多いときの時
  if(Serial.available()>0){
    //データの読み込み
    val=Serial.read();
    //合図用データ送信(1バイト)
    Serial.write(65);
  }
  //アナログ出力(11番ピン)に読み込み値を入れる
  analogWrite(11,val);
}

手順としては、
(1)両方のプログラムが開始される。
(2)合図用データの待機中。
(3)Processingから「s」キーで通信開始用データを送信。
(4)Arduinoのバッファ内データを数える。
(5)Arduinoバッファ内データが1個以上ならデータ読み込み。
(6)その結果、Arduinoバッファ内データが空になる。
(7)Arduinoから合図用データ送信。
(8)Proccessingバッファ内データを数える。
(9)Processingバッファ内データが1個以上ならX座標データ送信。
(10)合図用データを読み込み、バッファを空にする。
 *以後は、(4)へ戻り通信を繰り返す。

追記:
上記プログラムで通信が途切れてしまう場合、ArduinoよりProcessingの処理速度が速すぎるのかもしれません。Processingのvoid setup(){...}内でframeRate(30)程度にするか、draw(){...}内にdelay(20)程度を挿入し少しスピードダウンすると安定するかもしれません。
あるいは、ProcessingからArduinoへ一方向的にデータを送る内容なので非同期通信にしてもいいかもしれません。その場合もProcessingのvoid setup(){...}内でframeRate(30)程度にスピードダウンし、void draw(){...}内にport.write(x)を入れて(serialEvent()は使わず)30fpsで定期的に送信し、Arduino側でそのデータを受け取るようにします(合図用データは送る必要はありません)。


関連:
Arduino-Processing シリアル通信1」(一つの値を送る/非同期通信)
Arduino-Processing シリアル通信2」(複数の値をバイトで送る/同期通信)
Arduino-Processing シリアル通信3」(大きな値を複数送る)
Arduino-Processing シリアル通信5」(複数の値を文字列で送信する)
Arduino-Processing シリアル通信6」 (2台のArduinoとProcessingを通信させる)


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