Willkommen auf unserem Seminar-Blog

Immer auf dem aktuellen Stand bleiben

Dieser Seminar-Blog befindet sich noch im Aufbau und wird in den kommenden Tagen entsprechend verfeinert.

Member Login

Lost your password?

Registration is closed

Sorry, you are not allowed to register by yourself on this site!

You must either be invited by one of our team member or request an invitation by email at viad.info {at} zhdk {dot} ch.

09 AnalogIn: DNA

16. November 2011

DNA Interactive

[ VIDEO ] Nun galt es Arduino mit Processing zu verbinden und Sensor-Eingaben visuell mit Processing abzubilden. Ich habe dafür einen Druck- und Biegesensor verwendet. In Processing habe ich einen Emitter programmiert, der im Zentrum der Stage kleine Kreise ausspuckt. Mit dem Biegesensor kann die Drehrichtung des Emitters gesteuert werden und mithilfe des Drucksensors die Grösse der Kreise. Um die Animation noch attraktiver zu gestalten habe ich ein Farb-Array eingeführt, welches die RGB-Werte von verschiedenen Farben speichert und diese durchläuft. Zwischen den einzelnen Farbwerten werden Zwischenwerte berechnet, sodass eine Farbe nahtlos in die nächste überläuft. Interessante Wertekombinationen habe ich zusätzlich noch auf Keyboard-Tasten gemappt, sodass die Animation auch via Tastatur steuerbar ist.
import processing.serial.*;
import ddf.minim.*;
Serial myPort;

import fullscreen.*;
SoftFullScreen _fullScreen;

AudioPlayer song;

int z = 0;
int potiValue = 500;
int pressValue = 950;
float rotation = 0;
ArrayList shots = new ArrayList();
Shot cListCount;

  int cRed;
  int cGreen;
  int cBlue;
  int cRedPrev;
  int cGreenPrev;
  int cBluePrev;
  int cRedNext;
  int cGreenNext;
  int cBlueNext;
  int colorIndex=0;
  int colorIndexPrev=-1;
  int colors[][] = {
        { 51, 153, 255 },
        { 255, 102, 0 },
        { 102, 102, 255 },
        { 51, 255, 51 },
        { 255, 255, 0 }
  };

void setup() {
  frameRate(25);
  smooth();
  size(1024,768);
  noStroke();
  background(0);
  println(Serial.list()); // print all available serial ports
  myPort = new Serial(this,Serial.list()[0],9600);

  // FULLSCREEN
  _fullScreen = new SoftFullScreen(this);
  _fullScreen.enter();

  cListCount = new Shot(0,0,0,0,colorIndex);

  Minim minim = new Minim(this);
  song = minim.loadFile("10 Fairyland.aif", 2048);
  song.play();
}

void draw() {
  rotation+= (map(potiValue,500,800,-1,1))/2;
  background(0);
  println(potiValue + " :: " + pressValue);

  if (z%300==0) {
    colorIndex++;
  }
  if (colorIndex>=colors.length) colorIndex=0;

    if (colorIndex!=colorIndexPrev) {
      cRedPrev=cRed;
      cGreenPrev=cGreen;
      cBluePrev=cBlue;
      colorIndexPrev = colorIndex;
      cRedNext = colors[colorIndex][0];
      cGreenNext = colors[colorIndex][1];
      cBlueNext = colors[colorIndex][2];
    }

    color c = color(cRed, cGreen, cBlue, 102);

    if (cRed!=cRedNext) {
      if (abs(cRedNext-cRed)>10) {
        cRed+= (cRedNext-cRedPrev)/50;
      } else {
        cRed = cRedNext;
      }
    }
    if (cGreen!=cGreenNext) {
      if (abs(cGreenNext-cGreen)>10) {
        cGreen+= (cGreenNext-cGreenPrev)/50;
      } else {
        cGreen = cGreenNext;
      }
    }
    if (cBlue!=cBlueNext) {
      if (abs(cBlueNext-cBlue)>10) {
        cBlue+= (cBlueNext-cBluePrev)/50;
      } else {
        cBlue = cBlueNext;
      }
    }

  for(int i=0; i<shots.size(); i++) {
    Shot shot = (Shot)shots.get(i);
    shot.draw();
    //println(shot.speed);
    if (shot.speed<-0.5) shots.remove(i);
  }
  shots.add(new Shot(0,0,rotation,map(pressValue,0,1023,150,10),c));

  z++;
}

void keyPressed()
{
  switch(key)
  {
  case 'a':
    pressValue-=100;
    break;
    case 's':
    pressValue+=100;
    break;
    case 'y':
    potiValue-=10;
    break;
    case 'x':
    potiValue+=10;
    break;
    case '1':
    pressValue=1150;
    break;
    case '2':
    potiValue=5350;
    break;
    case '3':
    potiValue=3800;
    break;
    case '4':
    potiValue=4200;
    break;
    case '5':
    potiValue=6300;
    break;
    case '6':
      potiValue=4600;
      pressValue=1800;
    break;
    case 'p':
    save("screens/dots_"+hour()+"-"+minute()+"-"+second()+".jpg");
    break;
  }
}

void serialEvent(Serial myPort) {
  if (myPort.available()>0) {
    String completeString = myPort.readStringUntil(10); // 10 = carriage return
    if (completeString != null) {
      trim(completeString);
      String[] seperateValues = split(completeString, ",");
      potiValue = int(seperateValues[0]);
      pressValue = int(seperateValues[1]);
    }
  }
}