Introduction: Making the TFF: a Dress That Gets Excited When Tweeted
These online connections happen quietly in fiber-optical pulses, dimensions accessed through my iPhone. The TFF brings the excitement and interaction back into the physical world. When the wearer receives a tweet, the vintage-inspired dress flutters its wings and sings like a bird. Surely, this celebratory display will attract tweets—and moreTFFs. It was debuted at the 2012 Museums and the Web conference where I was united IRL with my TFFs
This dress aspires to be an homage to the many fulfilling friendships that have been able to hatch and grow online.
Step 1: What's in This Instructable?
- Dress - Reviewed resources for designing clothes from Built by Wendy-Dresses and Pattern Magic books. Vintage-inspired KAS fabric
- Bird songs - From the start I just wanted to cannibalize greeting cards with bird sounds. I love these songs.
- Wings - Looked at many a costume designer videos on YouTube. These wings are not be huge, just a little flutter and hopefully not costume-like
- Tweet sensor - to activates the dress
- Arduino Code - to pull it all together
Step 2: Designing the Dress
The key is to do all your testing and iterating with cheap fabric called muslin. I recommend starting with a dress pattern model. For example, I started with a simple dress pattern from the Built by Wendy book. Trace that model and sew it in muslin. Try it on, play with it! Modify the design with pins and rubberbands, by cut and re-sew it. Turn on music, dance in front of a mirror, cut it more (don't cut yourself.)
When you've got something you like in the muslin, then trace it back to paper, marking folds, seams and match ups. Use a ruler and only trace half of each element (if the dress is intended to be symmetrical.) Then, cut that pattern on a fold in muslin, re-sew it and see if it works. (or play with it, dance with it and repeat.)
I'm sure an experienced designer could simplify this step, but I must have looped through this step 4 or 5 times to iterate the design. When evaluating your progress, take into consideration the differences between your quality of your final fabric and the muslin. In the case of the TFF, the vintage canvas fabric is vastly different from the diaphanous muslin.
Have fun at this stage--make it what you want!
Step 3: Sewing the Dress
Preparing the pleated top
With such busy fabric, my design called for the pleating of the bodice (the shirt part of the dress) to provide extra texture and abstract the figurative graphic pattern which would be visible on other parts of the dress. Using the paper pattern I defined how much fabric height I would need for the bodice and cut it a width of it (with patterned fabric it's important to always cut the same direction.)
I folded 1/2 inch overlaps and pressed with an iron creating the pleats. Beware: I had seriously underestimated how much fabric this treatment would require and had to sew widths together just for my small top. I almost ran out of fabric!
With the pleats ironed in place, I used fusable interfacing to hold the seams in place for sewing.
Cutting/Sewing
With the pleats, you can't really cut on the fold, so I folded the final paper pattern and cut a new final full sized pattern of the top front in paper. Otherwise treat the pleated fabric as you would any fabric in the sewing--really thick barely manageable fabric.
Some problemsolving had to happen along the way to make up for this very thick fabric. For example, the shoulder seams would have never laid flat down using regular seams. Instead, I tucked the pleated front into the back pieces (like a coin going into a slot) and hand sewed these parts together to obscure the construction.
Indeed many little issues needed to be solved at this step since the muslin hadn't needed to deal with finished seams. Putting it together in the right order can be complicated, but that's part of the fun.
Step 4: Adding Bird Songs
For the TFF, I found wonderful high-quality bird song cards at PadBlocks. Since they were $8.00 each, I first experimented with the cheapest cheesiest Easter singing card from the drug store (always experiment with the cheapest thing possible!) I soldered to the + and -. Touching the wires closes the circuit and makes the bird sing.
I attached the speaker card under the waist of the dress with speaker facing out and fed the wires to the back opening of the dress.
Step 5: Making the Wings
Using the paper designs, seam allowances are added to create new paper patterns. Four of each size of the triangle shapes are cut--two sets of two for for each side. Two triangles are sewn together on two of the three sides and the third side tucked in to leave the shape open as a pocket. All of the triangles are placed and pinned to the back of the dress and sewn with pockets facing inward to hide the wire structure.
Moving the wings
I investigated several options for moving the wings such as electric motors with flaps, levers and muscle wire. The challenge in this project was that we want reliable movement, but the dress moves and is soft. I ultimately settled on using servos since they were easy to guarantee and control movement. You may come up with a better movement... let me know!
Heavy gauge wire is bent into the wing pockets with a hook at the waist. The servos are attached to the hooks and then attached to the same Arduino pin to guarantee symmetrical movement on each side.
The servos don't really give the wings a 'flutter', but rather a nice slowish movement.
Arduino code for Servos:
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// set pin numbers:
const int servoPin = 9; // Servos Pin (using one pin for both to mirror wing movement
// variables will change:
int servoCounter = 0; // initial position of servos
void setup() {
myservo.attach(servoPin); // attaches the servo on pin 9 to the servo object
void loop(){
//SERVOS (based on Sweep)
for (int servoCounter = 0; servoCounter < 15; servoCounter++){ //repeat this pattern 15 times
for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(1); // waits 1ms - very fast for the servo to reach the position
}
for(pos = 180; pos>=1; pos-=1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(1); // waits 11ms for the servo to reach the position
}
}
Step 6: Using the IPhone Headphone Jack As the Tweet Trigger
I originally believed the best way would be through using the Twitter API and moving data around through Processing talking to the Arduino through TouchOSC. When I realized that the Twitter4J Java library wouldn't load on iOS and other limitations of mobile. I read books asked friends, my head was spinning.
Enter the lo-fi solution!
Now that Twitter is well integrated into the iPhone, the phone can be set to make a sound notification whenever my twitter name is mentioned. This solution harnesses that sound to trigger the dress through use of the LM339 voltage comparator. (Thanks to my dad for leading me in this direction!)
The LM339 compares two voltages and acts as a voltage switch when those two voltages are different. Using Rob Paisley's tutorial, I was able to connect the headphone jack and determine when a sound came through the iPhone.
Please note, this solution does not require the Arduino, it's purely a voltage switch. In fact, the whole project would not need an arduino or any coding if the wing solution did not use servos. The servos require signal from the Arduino to direct their movement.
Step 7: Putting Together the Electronics
- Voltage switch is attached as an input pin on the Arduino
- Birds and Servos are attached to output pins
- 4 AA battery power supply
- The code watches the input pin and when the switch is closed, the birds sing and then the Servos turn 15 times
/*
#TFF Twitter Dress
with lots of inspiration from across the internet (Sweep, Button, Arduino Cookbook)
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created
// constants won't change. They're used here to
// set pin numbers:
const int headphonePin = 2; // the number of the headphone comparative pin
const int ledPin = 13; // the number of the LED pin
const int servoPin = 9; // Servos Pin (using one pin for both to mirror wing movement
const int birdPin = 6;
// variables will change:
int headphoneState = 1; // variable for reading the headphone status
int servoCounter = 0; // counter for the number of button presses
int pos = 0; // variable to store the servo position
void setup() {
myservo.attach(servoPin); // attaches the servo on pin 9 to the servo object
pinMode(ledPin, OUTPUT); //LED test pin
pinMode(birdPin, OUTPUT); //Birdsongs pin
pinMode(headphonePin, INPUT); // initialize the Headphone comparator pin as input
//for troubleshooting--take out in final
// Serial.begin(9600);
}
void loop(){
// int val;
// val = digitalRead(headphonePin); //for troubleshooting over serial
// digitalWrite(birdPin, LOW); // set the Birds off
// read the state of the headphones:
headphoneState = digitalRead(headphonePin); //Is there a tweet noise, or is it quiet?
/*
*****QUIET STATE*****
*/
// In the circuit, when there is no noise, output is HIGH
// In this quiet state, we want nothing triggered, or LOW
if (headphoneState == HIGH) {
// keep functions off
digitalWrite(ledPin, LOW);
digitalWrite(birdPin, HIGH);
}
/*
*****TRIGGERED STATE*****
*/
else {
// Else means a tweet has triggered an alert
// For this we want to set off the sequense of bird songs and servo wings
//turn LED on:
digitalWrite(ledPin, HIGH);
digitalWrite(birdPin, LOW); // set the LED on
delay(10000);
digitalWrite(birdPin, HIGH);
//SERVOS (based on Sweep)
for (int servoCounter = 0; servoCounter < 15; servoCounter++){ //repeat this pattern 15 times
for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(1); // waits 1ms - very fast for the servo to reach the position
}
for(pos = 180; pos>=1; pos-=1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(1); // waits 11ms for the servo to reach the position
}
}
}
}
Step 8: Attaching the Electronics Into the #TFF Dress
Thanks! I hope you got something out of this instructable. Be sure to tweet me, and the dress, @lili_czarina! Final video to come!