Final Project (Rudi) – Kennedy

My goal was to create a natural way for travelers to alleviate stress through a serene art piece. Users were meant to create the environment in which the flower is able to bloom and see how the flower reacts to their auditory prompts. Initially, I intended to use an external mic to measure the surrounding environment sound however, upon suggestion I chose to use the computer’s internal microphone instead. This proved to be a great idea given the project was meant to be light and the fewer components helped to achieve this. However, this did pose an issue with the interactive design. In the last iteration of my design and code, I had it so the flower closes sharply in reaction to loud sounds. This action was noticeable and much more obvious than previously designed but, it gave users an obvious response to their interaction with the flower thus, lending some clarity to its intention.

*This shows the starting point of my creation. Using the sweep example as the foundation I worked up from there.

IMG_4206

All materials I chose had to carry along with my central theme: Nature. Therefore, everything had to fall within that realm of feeling or it had to be easily concealable. Therefore, I chose to use thin paper as my primary material. This allowed me to create the intricate fold pattern that served as the focal textural point for my project. The sharp lines created by the folds faced outwards giving a contrast to the simple light paper it is made out of. The servo motors where chosen purely out of the fact that they have more torque than stepper motors thus, giving me the ability to have them pull out in three different directions.

IMG_4131

 

Before and after user testing I ran into many issues such as the paper foldings ripping under the stress of the servos, the servo legs coming off from the “petals”, voltage and current issues, and many more. These problems helped me to fine tune the design as I went from three column petals to five column petals and worked out a sleeve like design for the longer servo legs. The voltage and current issue was simply solved with a change in power source. During user testing I received great feedback regarding the design and assembly of this project. Users were confused as the what it was supposed to do therefore, I made minor changes to the interaction element. The reaction from the flower would be much sharper than first imagined. While this change was a minor deviation from my initial design, it was such a great deviation from my initial intention I believe it was ultimately a bad decision.

IMG_4210

IMG_4212

I hoped to create a serene and enchanting experience for my audience. However, due to the limited interaction I was only able to achieve one half of my goal. While users were initially interested and easy to attract it was almost impossible to create an experience captivating enough to create the effect of “entrancing” my audience. I believe this stems from the limited interaction and uninspired movements I ended up creating. While I am proud of the product I wish I spent more time fine tuning the movement of the servos that balanced both the intuitive design and aesthetic design. The sharp movements meant to give users a better idea of what the flower is reacting to was a bad idea because it took a lot away from the “natural” aspects. The unnatural movements ripped users out of the serene environment it is meant to provide. Due to this shortcoming I think my project doesn’t allow users to have a continuous dialogue with it. On the other hand, I do believe that it does meet the physical aspects of my definition of interaction with its prompt and response. With more time I would like to work more on creating that fluid motion and using processing in a way that props up this project instead of hinder it. Throughout this process I learned that it is not enough to fail and recognize from your mistakes. Failure is only worthwhile if you learn from them and move forward with active changes. User testing is a great example of this. There are small changes I would now like to make that I recognized as valid criticisms but chose not to address due to their difficulty and scale. This should be something I strive to work on in the future.  

Resources:

Code:

Processing 

// sound library
import processing.sound.*;

//// serial library
import processing.serial.*;
Serial myPort;

AudioIn input;
Amplitude rms;

int scale=1;

float m = 0;
boolean go;

void setup() {

size(800,800);
background(255);
Serial.list();
printArray(Serial.list());
myPort = new Serial(this, Serial.list()[3],9600);

//Create an Audio input and grab the 1st channel
input = new AudioIn(this, 0);

// start the Audio Input
input.start();

// create a new Amplitude analyzer
rms = new Amplitude(this);

// Patch the input to an volume analyzer
rms.input(input);
}

 

void draw() {
// rms.analyze() return a value between 0 and 1. To adjust
// the scaling and mapping of servo arm angle we scale from 0 to 0.5
scale=int(map(rms.analyze(), 0, 0.5, 1, 100));
//println(scale);

println(scale);
println(m);

m ++;
if (scale >= 1 && scale <= 19){
stroke(random(255), random(255), random(255), 50);
strokeWeight(5);

line(width/2, height/2, random(800), scale|100-scale);
delay(10);
go = true;
println(go);
}if (scale > 20 && scale <= 40){
stroke(random(255), random(255), random(255), 50);
strokeWeight(5);
go = false;
println(go);
line(width/2, height/2, random(800), scale);
delay(10);

}
if (go){
myPort.write(1);

}if (!go){
myPort.write(0);
}

}

Arduino

#include <Servo.h>

Servo myservo8; // create servo object to control a servo
Servo myservo9; // create servo object to control a servo
Servo myservo10; // create servo object to control a servo

boolean cont = true;

 

int pos = 90; // variable to store the servo position
int pos2 = 115;

 

int valueFromProcessing;

void setup() {
myservo8.attach(8); // attaches the servo on pin 8 to the servo object
myservo9.attach(9); // attaches the servo on pin 9 to the servo object
myservo10.attach(10); // attaches the servo on pin 10 to the servo object
pinMode(13, OUTPUT);
Serial.begin(9600);
}

void loop() {
while (Serial.available()) {
valueFromProcessing = Serial.read();
}

if (valueFromProcessing == 1) {

// for (pos = 80; pos <= 145; pos += 1 ) { // goes from 0 degrees to 180 degrees
//// in steps of 1 degree
myservo8.write(pos2); // tell servo to go to position in variable ‘pos’
myservo9.write(pos2); // tell servo to go to position in variable ‘pos’
myservo10.write(pos2); // tell servo to go to position in variable ‘pos’

delay(150); // waits 15ms for the servo to reach the position

//Serial.println(“open”);

 

}
if (valueFromProcessing == 0) {
//for (pos = 145; pos <= 80; pos -= 1) {
myservo8.write(pos); // tell servo to go to position in variable ‘pos’
myservo9.write(pos); // tell servo to go to position in variable ‘pos’
myservo10.write(pos); // tell servo to go to position in variable ‘pos’

delay(150); // waits 15ms for the servo to reach the position

 

}
}

 

//
// }

Leave a Reply