Needy Wearable is a shirt that reacts heavily when no one is close/when someone is far away, and only calms down the closer one gets. The shirt moves with the help of two servomotors and an ultrasonic ranger positioned on the chest. The wearable goes to a full stop once person2 is within 20cm of the individual wearing the shirt (i.e. way too close).

 

Process 

We noticed from the start that we had a shared interest in making reactive wearables. One of us being a costume designer in the school of drama, and the other being a media artist, we decided to create a wearable at the intersection of beauty and humor. Our concept was to design a jacket from scratch and include roughly 10 servomotors into it. These servomotors, sewn into the fabric in bunched up areas, would make our coat dynamic and eternally changing.

For the design of the coat itself, we opted to include folds and knots over the length of the sleeves. This would allow for the draping to move freely and elegantly once the servomotors were included underneath them.

 

Original wearable design inspiration (cloth draping). The final design was meant to take the form of a coat or jacket, with the knots along the length of the sleeves. 

 

After discussing the concept further, we decided that making the wearable more reactive when people are far away from it, and calmer when closer, would be more unusual and humorous. M took on the task of designing and creating the coat, while C worked on the hardware and software. C started with the implementation of the interaction in two servomotors (as seen below) before moving on to a larger number.

 

Setup with the ultrasonic range sensor and two servomotors.

 

Fastest servomotor reaction, i.e. when no one is near the wearable.

 

Slowest servomotor reaction, i.e. when it calms down as someone stays close.

 

C spent a significant amount of time working on the subtle differences in servomotor movements and speeds to try and depict the emotion of “neediness” through mechanics.

 

Unfortunately, the wearable itself was never created according to the common plan, and was sewn into a t-shirt instead. C changed the code last minute in order to include only two servomotors, which were placed on the chest area by M. An inside pocket which was supposed to include battery, arduino and breadboard had not been created in advance either, so electronics were placed within a pencil pouch, sewn to the inside of the shirt.

 

Test sewing of the ultrasonic range sensor to verify its functionality.

 

Final Documentation

 

Full electronic setup over the shirt used for the demonstration.

 

Internal mechanics of the reactive shirt.

 

The shirt as it is seen from the outside.

 

 

 

Gif of functioning wearable.

 

Discussion

This week had been very busy for M in particular, and our project unfortunately suffered from the lack of wearable. In the future, we would spend a significant amount of time working on the wearable creation and design, in addition to the software and hardware. We would also work on better group communication and time management, in order to bring a well executed product to the table. Both of us could have been more satisfied with the outcome of this project and will keep this is mind for future endeavors.

 

 

Schematic

 

 

Code

// Needy Wearable: Project I
// by Mohan Yeh (menghany) and Chloé Desaulles (cdesaull)
// Intro to Physical Computing, Fall 2018

// A shirt worn by person1 which moves due to the active state of servomotors
// if a person2 is far away from it. The Needy Wearble calms down
// as the person2 gets closer. 
// This project was built upon the NewPing library sketch.
// ---------------------------------------------------------------------------

#include <NewPing.h>
#include<Servo.h> // Object oriented programming 

#define TRIGGER_PIN  12  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     11  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

int pingVal; 

Servo charlie;
const int CHARLIE = 6;

Servo june;
const int JUNE = 9;


NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

void setup() {
  
  Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
  charlie.attach(CHARLIE);
  june.attach(JUNE);
}

void loop() {

  //__________________________________ ULTRASONIC RANGER _____________________________________________
  
  delay(50);                     // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range)
  Serial.println("cm");

  pingVal = sonar.ping_cm();
  
  //__________________________________ SERVOMOTORS __________________________________________________


//LARGE DISTANCE
  if (pingVal > 100 || pingVal == 0){
  charlie.write(10);
  june.write(10);
  delay(450);
  
  charlie.write(179);
  june.write(179);
  delay(450);

  charlie.write(10);
  june.write(10);
  delay(450);
  
  charlie.write(179);
  june.write(179);
  delay(450);

  charlie.write(10);
  june.write(10);
  delay(450);
  
  charlie.write(179);
  june.write(179);
  delay(450);
    }

//MEDIUM DISTANCE
 else if (50 < pingVal && pingVal <100){

  Serial.println("WORKING?");
  
  charlie.write(10);
  june.write(10);
  delay(600);

  june.write(120);
  charlie.write(120);
  delay(600);

  charlie.write(10);
  june.write(10);
  delay(600);

  june.write(120);
  charlie.write(120);
  delay(600);

  charlie.write(10);
  june.write(10);
  delay(600);

  june.write(120);
  charlie.write(120);
  delay(600);
 }

//TINY DISTANCE
  else if (20 < pingVal && pingVal < 50){

  charlie.write(10);
  june.write(10);
  delay(2000);

  charlie.write(30);
  june.write(30);
  delay(2000);

    
  charlie.write(10);
  june.write(10);
  delay(2000);

  charlie.write(30);
  june.write(30);
  delay(2000);

    
  charlie.write(10);
  june.write(10);
  delay(2000);

  charlie.write(30);
  june.write(30);
  delay(2000);

 }


 //WEARABLE CALM (CLOSE ENOUGH)
  else if (1 < pingVal && pingVal < 19){
    
  //charlie.detach();
  //june.detach();
  charlie.write(10);
  june.write(10);
  delay(2000);
  charlie.write(10);
  june.write(10);
  delay(2000);
 }

}