なんちゃってメディアアートを作ってみたよ

わたくし、アートのセンスとかサッパリ無いけど。
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もあるはず。







【関連記事】
arduinoのA/D変換速度遅いなあ - 花夢電科雑多log