なんちゃってメディアアートを作ってみたよ
わたくし、アートのセンスとかサッパリ無いけど。
Processingに慣れるための勉強ってことで、
「あーーなんだかどっかで見た事ある」的な
メディアアートっぽい物を作ってみました。
この動画、音ズレが起きてます。ごめんなさい。
Make: Tokyo Meeting 02 に刺激されて、ってのが動機。
arduinoと、Processingで作ってみたです。
評判通り、Processingはグラフィック関連プログラムを作りやすい!
かなり簡単!
- ウインドウハンドルとか気にしなくて良い。
- openGLのライブラリとか明示して呼ばなくていい。
- 書き換えは勝手に、いいタイミングでやってくれる。
- 速度はけっこう速い。
- シリアル通信を標準搭載してるので、マイコンとの通信がとても楽々
- 3D関係とかも楽。関数一個で、図形一個ごとに回転できる。
CGとかメディアアートに興味がある人は是非とも触った方が良いかも。
C言語かVisualBASIC程度の基礎知識があったほうがいいかもです。
入力インターフェースはアヒルのおもちゃ。
ほら
メディアアートって、大抵変な入力デバイスじゃん w
単なる立方体とか、丸とか。
だから、わざわざ入力デバイスを作ってみた。
・・・・・・偏見ですね。ごめんなさい orz
裏に圧電素子を貼付けてる。
これがアヒルに加わる衝撃を検出するセンサになっている。
ピエゾ素子とも言うらしいね。エレアコギターのピックアップに使われたり。
たしか100円の目覚まし時計を分解した時取り出した物だった気がする。
赤い配線をハンダ付けして
圧電素子をガムテープで貼付けただけ。
回路図はコレ。
アンプは秋葉原でも簡単に買えるキットを使用。かなり無難な品物よ。
D1 C1 R2 でピークホールド回路を構成。
arduinoのA/D変換速度が遅いため、ピークホールドしないと
[参考 ピークホールドにみるダイオードのリカバリー特性 - nabeの雑記帳]
しっかりと波形の大きさを検出できない。
R1はコレ付けないとなぜかDC出力が出っぱなし w
LM386特有の現象かも。
想像以上にセンサ信号をマイコンで受けとるのが面倒くさかった。
最初はトランジスタのエミッタフォロワでやっていたけど、うまくいかず。
やっぱopampで電流稼がないとうまくいかんね。
arduinoに書き込んだスケッチ(プログラムソースコード的な意味)
これだけ。簡単でしょ
int ad; int peakval; int co; void setup() { Serial.begin(9600); peakval = 0; co = 0; } void loop() { ad = analogRead(2); //analog 2pin 電圧値をA/D変換 if (ad >= 255) { //上限を255で頭打ちにする ad = 255; } if(peakval < ad){ //マイコン側でもピークホールド peakval = ad; } co++; if(co == 20){ Serial.print(peakval,BYTE); //delay 5ms * 20 = 100ms ごとに送信 peakval = 0; co = 0; } delay(5); }
Processingで作ったスケッチ(プログラムソースコード的な意味)
グラフィック関係なのにこんなにシンプル。
表現する、だけに集中できる。
import processing.serial.*; Serial myPort; // Create object from Serial class int val; // Data received from the serial port int oldval = 0; PFont font; float a = 0.0; void setup() { size(640, 400); //size(screen.width, screen.height); //全画面で表示したい時はこちらで String portName = Serial.list()[1]; //うまく通信できない場合、Macの場合は[1]の数値を変える。winはググってね myPort = new Serial(this, portName, 9600); noStroke(); smooth(); font = loadFont("AmericanTypewriter-24.vlw"); //どんなフォントでも良い textFont(font, 18); background(0); // Set background to black } void draw() { int px,py,rplus; oldval = val; if ( myPort.available() > 0) { // If data is available, val = myPort.read(); // read it and store it in val } if (val <= 5 && oldval >= 1) { //AD値が5以上なら、ゆっくり減らして行く val = oldval - 1; } fill(0,15); //1フレームごとに透明度15で黒い四角を描く→ゆっくり暗くする rect(0,0,width,height); fill(200,255); px = width/2 + int( random(width * 0.4 * -1 , width * 0.4)); py = height/2 + int( random(height * 0.4 * -1 , height * 0.4)); rplus = int( random( -0.5 * val , 10 )); //円の半径もランダムに ellipse(px , py , val+rplus , val+rplus); text(str(val), 10, height-10); //確認のため数値表示 }
使用opampは、LM386。
昔、LM386のアンプキットを買ったので、それを流用。
386はスピーカーも直接駆動できるのでけっこうお気に入り。
今はもっと便利なopampもあるはず。