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]); } } }