Saturday, December 19, 2009

Final project

Summary:

For my final project, I decided to explore Wearable technologies. I have been interested in 3D body scanning for a while now, so I decided to play with geometry and polygons. I always wanted to create a dress that moves according to body movements. My interactive system is a performance dress controlled by a dancer. When the wearer will move, the dress will transform and take another shape, like 3D geometrical muscles.

How the system was build?

• Body suit with 3 sensors. One bend sensor on the right side, 1 bend sensor at middle front and 1 pressure sensor behind the right knee.
• Hand made bend sensors: made with neoprene, conductive thread, and conductive fabric.
• I choose to use thin wires instead of thread because we experience that it can break easily, more solid.
• I use a small pocket to hide any Arduino Lilypad and batteries. In the future, I would use the Lilypad powered device so I can sew both on.
• I made the suit sleeveless so it could be worn underneath clothing. (Dress, suit).
• The actual dress was made of numerous geometrical shapes.
• I used metal strips to create an internal skeleton and choose carefully where to attach fishing thread so it’s pulled to shape specific or more controlled forms.
• Inside the dress, I attached (on the hanger) a foam board with servos. There are 3 different areas on the dress where polygons will be shaped according to the servos pulling and pushing the dress.
• I choose Skin color materials to emphasis the idea of extension of the body. I decided to hang the dress to represent a separate entity to really show….like virtual body extensions.

Programming

• I am using a Lilypad Arduino to run the circuit. The three sensors values are sent to Arduino and the data are sent to the servos. (two 360 and one 180)

The codes

Lilypad


int analogPin1 = 0;
int analogPin2 = 1;
int analogPin3 = 2;

int analogValue1 = 0;
int analogValue2 = 0;
int analogValue3 = 0;

void setup()
{
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
pinMode (13,OUTPUT);
pinMode (analogPin1, INPUT);
pinMode (analogPin2, INPUT);
pinMode (analogPin3, INPUT);
}

void loop()
{
digitalWrite(13,HIGH);

int analogValue1 = analogRead(analogPin1);
int analogValue2 = analogRead(analogPin2);
int analogValue3 = analogRead(analogPin3);

analogValue1 = constrain(analogValue1, 600 ,850);
analogValue2 = constrain(analogValue2, 650, 850);
analogValue3 = constrain(analogValue3, 0, 400);


analogValue1 = map(analogValue1, 600, 850, 0, 254);
analogValue2 = map(analogValue2, 650, 850, 0, 254);
analogValue3 = map(analogValue3, 0, 400, 0, 254);


/*Serial.print(255, BYTE);
Serial.print(analogValue1, BYTE);
Serial.print(analogValue2, BYTE);
Serial.print(analogValue3, BYTE);*/



Serial.print(analogValue1, DEC);
Serial.print(",");
Serial.print(analogValue2, DEC);
Serial.print(",");
Serial.println(analogValue3, DEC);

digitalWrite(13,LOW);

delay(1000); // wait for 5 mili seconds

}

Arduino

int servoPin = 10; // Control pin for servo motor
int minPulse = 500; // Minimum servo position
int maxPulse = 2500; // Maximum servo position
int pulse = 0; // Amount to pulse the servo
int incomingByte = 0; // for incoming serial data
long lastPulse = 0; // the time in milliseconds of the last pulse
int refreshTime = 20; // the time needed in between pulses

int analogValue = 0; // the value returned from the analog sensor
int analogPin = 0; // the analog pin that the sensor's on

void setup() {
pinMode(servoPin, OUTPUT); // Set servo pin as an output pin
pulse = minPulse; // Set the motor position value to the minimum
Serial.begin(9600);
}
void loop() {
if (Serial.available()>0) {
// read the incoming byte:
incomingByte = Serial.read();
incomingByte = map(incomingByte,0,255,0,1023); // convert the analog value
//analogValue = analogRead(analogPin); // read the analog input
pulse = map(incomingByte,0,1023,minPulse,maxPulse); // convert the analog value
// to a range between minPulse
Serial.println(incomingByte); // and maxPulse.

// pulse the servo again if rhe refresh time (20 ms) have passed:
if (millis() - lastPulse >= refreshTime) {
digitalWrite(servoPin, HIGH); // Turn the motor on
delayMicroseconds(pulse); // Length of the pulse sets the motor position
digitalWrite(servoPin, LOW); // Turn the motor off
lastPulse = millis(); // save the time of the last pulse
}
}
}

Conclusion:

As you know, interactive design is not my main subject. So it has been a challenge and hard for me, especially the programming part.

I would like to continue making this work efficiently and stable; maybe make 2 others for a performance, with bigger polygons. My aim is to make a short film with someone wearing the dress. I would also like to film different people wearing the dress to get different data.

This adventure has been a great experience, where I learned the technically of physical interactive design and understanding electricity.

No comments:

Post a Comment