The TTC Shirt

Concept

For those of you who don’t have smart phones, are you sick of waiting for the TTC not knowing when the next bus or streetcar will come? If there was a way for other people of letting you know would you be interested? The TTC shirt solves this problem by broadcasting when the next TTC vehicle will arrive at a specific stop. Much like the Next Vehicle Arrival Information boards in the subways and at some TTC stops, the TTC Shirt will provide that information except it will be worn by someone. There is no way the TTC will be able to install these boards at every bus or streetcar stop, so why not engage the community in helping solve this problem? People can make their own shirts by following instructions or they can buy a patch with the LED’s and sew it onto their own piece of clothing. If many people start wearing this shirt, we’ll be able to get this information to more people without costing the TTC a dime.

 

Circuit

The first thing I started off with was designing the circuit. I decided to layout the circuit in layers. I also wanted to make the shirt modular so instead of sewing the LED’s directly onto a shirt I decided to make it a patch with a smaller removable patch for the Arduino, bluetooth and battery power supply. That way the entire patch is washable and you can put it on different pieces of clothing. Here are the components:

15 x super bright LilyPad LEDs
conductive thread
1 x Arduino mini pro (5V)
1 x LilyPad Lithium power charger (5V output)
1 x bluetooth mate silver
1 x 3.7V 800mAH Lithium Ion battery
17 x snap buttons
black cloth

Overall Circuit:

Circuit diagram showing all components

Small Removable Patch Circuit:

Circuit diagram showing top and bottom side of small removable patch with Arduino, bluetooth module and power supply

Main Patch Circuit:

Top layer (side up) of main patch - LED's

Top layer (side down) of main patch - ground connections

Bottom layer (side down) of main patch - signal connections

 

 

 

 

 

 

 

 

 

 

 

 

Process

For the first paper prototype please see my previous blog entry (http://blog.ocad.ca/wordpress/gdes3b16-fw201202-01/2012/11/the-ttc-shirt-proposal/). I wanted to use the minimum number of LED’s to create a matrix that would still be legible. I decided on a 5×3 LED matrix and to make sure that it would be legible I did some mock up of numbers:

 

 

 

 

 

 

 

 

 

 

 

 

The next thing I did was layout my fabric for the small removable patch and start sewing on the Arduino and the snap the buttons which would act as connectors to the main patch:

 

 

 

 

 

 

I then took a piece of fabric and screen printed the words “THE NEXT TTC VEHICLE IS IN… MIN”. After that I sewed on the LED’s and the ground connections:

 

 

 

 

 

 

 

 

 

 

 

On another piece of fabric I sewed on the signal connections:

 

 

 

 

 

 

 

 

 

And finally I sewed the two main pieces of fabric together and sewed on velcro strips along the sides and put together the small removable patch as well:

 

 

 

 

 

 

 

 

 

 

 

The final result is this:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Here is a short video of the shirt changing numbers and displaying a text message:

For the shirt to display TTC data, an internet connection is required. For now, I used a bluetooth mate silver to connect the arduino and a laptop wirelessly. I then used Processing to extract the next vehicle arrival information from the internet and then have it sent to the arduino. The entire circuit is powered by a 3.7V Lithium Ion battery.

Improvements

If I had more time, instead of conductive thread, I would have used laser cut conductive fabric. Currently the conductive thread is not reliable and the LED’s are intermittently lighting up. I believe conductive fabric would have produced a more stable connection.

Code

Processing Code:

import controlP5.*;
ControlP5 cP5;
ControlFont ButtonFont;
String StopValue = “6850”;
String TextValue = “HELLO”;
//Textfield StopNumber;

import processing.serial.*;

Serial port;
PImage backgroundImg;
int VehicleWaitTime;
int DelayTimer;
int DelayValue;
int Mode = 0;

final int TTCMode = 0;
final int TextMode = 1;
final int NotifyMode = 2;
final int FlashTime = 500;
boolean TextSent = false;
int lastTime;

float n;

//LED [] LEDsOff = new LED [15];

void setup() {

// set up serial port
PFont font = createFont(“arial”,81,true);
ButtonFont = new ControlFont(createFont(“arial”,60),60);
//ButtonFont.setSmooth(true);
lastTime = millis();
cP5 = new ControlP5(this);

cP5.addTextfield(“StopNumber”)
.setPosition(111,341)
.setSize(768,119)
.setFont(font)
.setFocus(true)
.setColor(color(255,255,255))
.setText(StopValue);
;
/*cP5.addBang(“submit”)
.setPosition(40, 300)
.setSize(280, 40)
.setTriggerEvent(Bang.RELEASE)
.setLabel(“Submit”)
;*/
cP5.addButton(“Submit”)
.setPosition(111,518)
.setSize(239,95)
//.setFont(font)
.setValue(0)
;
cP5.addButton(“Text”)
.setPosition(401, 518)
.setSize(239,95)
.setValue(0)
;

cP5.addButton(“Notify”)
.setPosition(693, 518)
.setSize(239,95)
.setValue(0)
;

cP5.controller(“Submit”).captionLabel().setControlFont(ButtonFont);
cP5.controller(“Submit”).captionLabel().setControlFontSize(60);
cP5.controller(“Text”).captionLabel().setControlFont(ButtonFont);
cP5.controller(“Text”).captionLabel().setControlFontSize(60);
cP5.controller(“Notify”).captionLabel().setControlFont(ButtonFont);
cP5.controller(“Notify”).captionLabel().setControlFontSize(60);

//controlP5.setFocus(true);
//controlP5.setColor(color(255,255,255));

println(“Available serial ports:”);
println(Serial.list());

port = new Serial(this, Serial.list()[6], 115200);

size (1280, 800);
backgroundImg = loadImage(“background.png”);

DelayTimer = millis();
DelayValue = 1000;
//LEDPlace = new LED;
//int k = 0;

}

void draw() {
//imageMode (CORNER);
image(backgroundImg, 0, 0);

if (Mode == TTCMode) {
VehicleWaitTime = CheckWaitTime(StopValue, VehicleWaitTime);

// station ID 6850 is for 501 Queen Westbound at Shaw street
println(“Time: ” + VehicleWaitTime);
println(“Stop Number: ” + StopValue);
if (VehicleWaitTime > 9) {

port.write(” “);
} else {

port.write(VehicleWaitTime);
}
} else if(Mode == TextMode) {
//port.write(“HELLO”);
if (TextSent == true) {
port.write(” “);
port.write(TextValue);
println(“Text mode”);
TextSent = false;
port.write(” “);
}
} else if(Mode == NotifyMode) {
//port.write(” “);
if (millis() – lastTime >= FlashTime) {
port.write(TextValue);
println(“Notify mode”);
lastTime = millis();
}
}
//port.write(25);

/*for (int i = 0; i <=14; i ++) {
LEDsOff[i].display();
}*/

}

public void controlEvent(ControlEvent theEvent) {
println(theEvent.getController().getName());

}

public void Submit(int theValue) {

StopValue = cP5.get(Textfield.class, “StopNumber”).getText();
println(“a button event from Submit: “+StopValue);
Mode = TTCMode;
}

public void Text(int theValue) {
TextValue = cP5.get(Textfield.class, “StopNumber”).getText();
println(“a button event from Text: ” + TextValue);
Mode = TextMode;
TextSent = true;
}

public void Notify(int theValue) {
TextValue = “!”;
Mode = NotifyMode;
//TextSent = true;
}

int CheckWaitTime(String StopID, int LastValue) {
// The URL for the XML document

// using XML to get data
String url = “http://webservices.nextbus.com/service/publicXMLFeed?command=predictions&a=ttc&stopId=” + StopID;
XML xml;
int WaitTime = 0;
// Load the XML document
if ((millis() – DelayTimer) < DelayValue) {
xml = loadXML(url);
//XML NextVehicle = xml.getChild(“predictions”).getChild(“direction”).getChild(“prediction”);
XML[] NextVehicle = xml.getChildren(“predictions”);

for (int i = 0; i <= NextVehicle.length-1; i++) {
String NoPrediction = NextVehicle[i].getString(“dirTitleBecauseNoPredictions”);
print(“Counter: ” + i + ” “);
println(“XML String: ” + NoPrediction);
if (NoPrediction == null) {
XML NextVehicle2 = NextVehicle[i].getChild(“direction”).getChild(“prediction”);
WaitTime = NextVehicle2.getInt(“minutes”);
}
//WaitTime = 10;
}

//println(NextVehicle[1].getContent());

//XML NextVehicle2 = NextVehicle[1].getChild(“direction”).getChild(“prediction”);
//println(NextVehicles);

//XML Vehicles [];
//NumberOfCars = NextVehicles.getChildCount();
//Vehicles = NextVehicles.getChildren();
//println(Vehicles);

return WaitTime;
} else {
DelayTimer = millis();
WaitTime = LastValue;
return WaitTime;

}
}
//maps numbers to data

Arduino Code:

//Pin Numbers
const int LED0 = A1;
const int LED1 = A2;
const int LED2 = 2;
const int LED3 = 13;
const int LED4 = A0;
const int LED5 = 3;
const int LED6 = 11;
const int LED7 = 12;
const int LED8 = 4;
const int LED9 = 9;
const int LED10 = 10;
const int LED11 = 5;
const int LED12 = 7;
const int LED13 = 8;
const int LED14 = 6;
const int VibePin = A3;

unsigned long StartTimer;
unsigned long EndTimer;
unsigned long PresentTime;
int DelayValue;

boolean Changed = false;
byte PreviousCommand = 0;

void setup() {

Serial.begin(115200);
//set up pins
for (int i = LED2; i <= LED7; i++) {
pinMode(i, OUTPUT);
LEDOff(i);
}

pinMode (LED0, OUTPUT);
LEDOff(LED0);
pinMode (LED1, OUTPUT);
LEDOff(LED1);
pinMode (LED4, OUTPUT);
LEDOff(LED4);
pinMode (VibePin, OUTPUT);
LEDOff(VibePin);

DelayValue = 500;
}

void loop() {

byte Number;
if (Serial.available()) {
Number = Serial.read();
if (Number >=0 && Number <= 32) {
if (Number != PreviousCommand) {
DisplayOff(true);
}
DisplayNumber(Number);
} else if (Number == 33) {
DisplayNumber(Number);
} else {
DisplayNumber(Number);
delay(500);
DisplayOff(true);
}
}
//DisplayNumber(35);
}
void LEDOn (int PinNumber) {
digitalWrite(PinNumber, HIGH);
}

void LEDOff (int PinNumber) {
digitalWrite(PinNumber, LOW);
}

void DisplayOff (boolean Delay) {
LEDOff(LED0);
LEDOff(LED1);
LEDOff(LED2);
LEDOff(LED3);
LEDOff(LED4);
LEDOff(LED5);
LEDOff(LED6);
LEDOff(LED7);
LEDOff(LED8);
LEDOff(LED9);
LEDOff(LED10);
LEDOff(LED11);
LEDOff(LED12);
LEDOff(LED13);
LEDOff(LED14);
if (Delay == true) {
delay(200);
}
}

void Row1On() {
LEDOn(LED12);
LEDOn(LED13);
LEDOn(LED14);
}

void Row1Off() {
LEDOff(LED12);
LEDOff(LED13);
LEDOff(LED14);
}

void Row2On() {
LEDOn(LED9);
LEDOn(LED10);
LEDOn(LED11);
}

void Row2Off() {
LEDOff(LED9);
LEDOff(LED10);
LEDOff(LED11);
}
void Row3On() {
LEDOn(LED6);
LEDOn(LED7);
LEDOn(LED8);
}

void Row3Off() {
LEDOff(LED6);
LEDOff(LED7);
LEDOff(LED8);
}

void Row4On() {
LEDOn(LED3);
LEDOn(LED4);
LEDOn(LED5);
}

void Row4Off() {
LEDOff(LED3);
LEDOff(LED4);
LEDOff(LED5);
}

void Row5On() {
LEDOn(LED0);
LEDOn(LED1);
LEDOn(LED2);
}

void Row5Off() {
LEDOff(LED0);
LEDOff(LED1);
LEDOff(LED2);
}

void FlashPattern() {
DisplayOff(false);
Row1On();
delay(15);
Row2On();
delay(15);
Row3On();
delay(15);
Row4On();
delay(15);
Row5On();
delay(15);
Row5Off();
delay(15);
Row4Off();
delay(15);
Row3Off();
delay(15);
Row2Off();
delay(15);
Row1Off();
delay(15);
}

void DisplayNumber (byte Number) {
//DisplayOff();
switch (Number) {
case 0:

LEDOn(LED0);
LEDOn(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOff(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOn(LED12);
LEDOn(LED13);
LEDOn(LED14);
//StartTimer = millis();
//Serial.println(“Start:” + StartTimer);
//EndTimer = StartTimer + DelayValue;
//Serial.println(“End:” + EndTimer);
//Serial.println(“present: ” + millis());
//println(StartTimer);
//if ((StartTimer + DelayValue) < millis()) {
//Serial.println(“Vibe On”);
LEDOn(VibePin);
//} else {
//Serial.println(“Vibe Off”);
// LEDOff(VibePin);
//}
PreviousCommand = 0;
break;

case 1:

LEDOff(LED0);
LEDOn(LED1);
LEDOff(LED2);
LEDOff(LED3);
LEDOn(LED4);
LEDOff(LED5);
LEDOff(LED6);
LEDOn(LED7);
LEDOff(LED8);
LEDOff(LED9);
LEDOn(LED10);
LEDOff(LED11);
LEDOff(LED12);
LEDOn(LED13);
LEDOff(LED14);

LEDOff(VibePin);
PreviousCommand = 1;
break;

case 2:

LEDOn(LED0);
LEDOn(LED1);
LEDOn(LED2);
LEDOff(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOff(LED11);
LEDOn(LED12);
LEDOn(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 2;
break;

case 3:

LEDOn(LED0);
LEDOn(LED1);
LEDOn(LED2);
LEDOff(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOn(LED8);
LEDOff(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOn(LED12);
LEDOn(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 3;

break;
case 4:

LEDOn(LED0);
LEDOff(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOn(LED8);
LEDOff(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOff(LED12);
LEDOff(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 4;
break;
case 5:
LEDOn(LED0);
LEDOn(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOff(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOn(LED8);
LEDOff(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOn(LED12);
LEDOn(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 5;
break;
case 6:

LEDOn(LED0);
LEDOn(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOff(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOn(LED12);
LEDOn(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 6;
break;
case 7:

LEDOn(LED0);
LEDOn(LED1);
LEDOn(LED2);
LEDOff(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOff(LED6);
LEDOff(LED7);
LEDOn(LED8);
LEDOff(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOff(LED12);
LEDOff(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 7;
break;
case 8:
LEDOn(LED0);
LEDOn(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOn(LED12);
LEDOn(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 8;
break;
case 9:

LEDOn(LED0);
LEDOn(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOn(LED8);
LEDOff(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOff(LED12);
LEDOff(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 9;
break;

case 65: //A

LEDOff(LED0);
LEDOn(LED1);
LEDOff(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOn(LED12);
LEDOff(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 65;
break;
case 66: //B

LEDOn(LED0);
LEDOn(LED1);
LEDOff(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOff(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOn(LED12);
LEDOn(LED13);
LEDOff(LED14);

LEDOff(VibePin);
PreviousCommand = 66;
break;
case 67: //C

LEDOff(LED0);
LEDOn(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOff(LED5);
LEDOn(LED6);
LEDOff(LED7);
LEDOff(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOff(LED11);
LEDOff(LED12);
LEDOn(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 67;
break;
case 68: //D

LEDOn(LED0);
LEDOn(LED1);
LEDOff(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOff(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOn(LED12);
LEDOn(LED13);
LEDOff(LED14);

LEDOff(VibePin);
PreviousCommand = 68;
break;
case 69: //E

LEDOn(LED0);
LEDOn(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOff(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOff(LED11);
LEDOn(LED12);
LEDOn(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 69;
break;
case 70: //F

LEDOn(LED0);
LEDOn(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOff(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOff(LED11);
LEDOn(LED12);
LEDOff(LED13);
LEDOff(LED14);

LEDOff(VibePin);
PreviousCommand = 70;
break;
case 71: //G

LEDOff(LED0);
LEDOn(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOff(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOff(LED12);
LEDOn(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 71;
break;
case 72: //H

LEDOn(LED0);
LEDOff(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOn(LED12);
LEDOff(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 72;
break;
case 73: //I

LEDOn(LED0);
LEDOn(LED1);
LEDOn(LED2);
LEDOff(LED3);
LEDOn(LED4);
LEDOff(LED5);
LEDOff(LED6);
LEDOn(LED7);
LEDOff(LED8);
LEDOff(LED9);
LEDOn(LED10);
LEDOff(LED11);
LEDOn(LED12);
LEDOn(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 73;
break;
case 74: //J

LEDOff(LED0);
LEDOff(LED1);
LEDOn(LED2);
LEDOff(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOff(LED6);
LEDOff(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOff(LED12);
LEDOn(LED13);
LEDOff(LED14);

LEDOff(VibePin);
PreviousCommand = 74;
break;
case 75: //K

LEDOn(LED0);
LEDOff(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOff(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOff(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOff(LED11);
LEDOn(LED12);
LEDOff(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 75;
break;
case 76: //L

LEDOn(LED0);
LEDOff(LED1);
LEDOff(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOff(LED5);
LEDOn(LED6);
LEDOff(LED7);
LEDOff(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOff(LED11);
LEDOn(LED12);
LEDOn(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 76;
break;
case 77: //M

LEDOn(LED0);
LEDOff(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOn(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOff(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOn(LED12);
LEDOff(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 77;
break;
case 78: //N

LEDOn(LED0);
LEDOn(LED1);
LEDOff(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOff(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOn(LED12);
LEDOff(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 78;
break;
case 79: //O

LEDOff(LED0);
LEDOn(LED1);
LEDOff(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOff(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOff(LED12);
LEDOn(LED13);
LEDOff(LED14);

LEDOff(VibePin);
PreviousCommand = 79;
break;
case 80: //P

LEDOn(LED0);
LEDOn(LED1);
LEDOff(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOff(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOff(LED11);
LEDOn(LED12);
LEDOff(LED13);
LEDOff(LED14);

LEDOff(VibePin);
PreviousCommand = 80;
break;
case 81: //Q

LEDOff(LED0);
LEDOn(LED1);
LEDOff(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOff(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOn(LED10);
LEDOff(LED11);
LEDOff(LED12);
LEDOn(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 81;
break;
case 82: //R

LEDOn(LED0);
LEDOn(LED1);
LEDOff(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOff(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOff(LED11);
LEDOn(LED12);
LEDOff(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 82;
break;
case 83: //S

LEDOff(LED0);
LEDOn(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOff(LED5);
LEDOn(LED6);
LEDOn(LED7);
LEDOn(LED8);
LEDOff(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOn(LED12);
LEDOn(LED13);
LEDOff(LED14);

LEDOff(VibePin);
PreviousCommand = 83;
break;
case 84: //T

LEDOn(LED0);
LEDOn(LED1);
LEDOn(LED2);
LEDOff(LED3);
LEDOn(LED4);
LEDOff(LED5);
LEDOff(LED6);
LEDOn(LED7);
LEDOff(LED8);
LEDOff(LED9);
LEDOn(LED10);
LEDOff(LED11);
LEDOff(LED12);
LEDOn(LED13);
LEDOff(LED14);

LEDOff(VibePin);
PreviousCommand = 84;
break;
case 85: //U

LEDOn(LED0);
LEDOff(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOff(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOn(LED12);
LEDOn(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 85;
break;
case 86: //V

LEDOn(LED0);
LEDOff(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOff(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOn(LED11);
LEDOff(LED12);
LEDOn(LED13);
LEDOff(LED14);

LEDOff(VibePin);
PreviousCommand = 86;
break;
case 87: //W

LEDOn(LED0);
LEDOff(LED1);
LEDOn(LED2);
LEDOn(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOn(LED6);
LEDOff(LED7);
LEDOn(LED8);
LEDOn(LED9);
LEDOn(LED10);
LEDOn(LED11);
LEDOn(LED12);
LEDOn(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 87;
break;
case 88://X

LEDOn(LED0);
LEDOff(LED1);
LEDOn(LED2);
LEDOff(LED3);
LEDOff(LED4);
LEDOff(LED5);
LEDOff(LED6);
LEDOn(LED7);
LEDOff(LED8);
LEDOff(LED9);
LEDOff(LED10);
LEDOff(LED11);
LEDOn(LED12);
LEDOff(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 88;
break;
case 89://Y

LEDOn(LED0);
LEDOff(LED1);
LEDOn(LED2);
LEDOff(LED3);
LEDOn(LED4);
LEDOff(LED5);
LEDOff(LED6);
LEDOn(LED7);
LEDOff(LED8);
LEDOff(LED9);
LEDOn(LED10);
LEDOff(LED11);
LEDOff(LED12);
LEDOn(LED13);
LEDOff(LED14);

LEDOff(VibePin);
PreviousCommand = 89;
break;
case 90://Z

LEDOn(LED0);
LEDOn(LED1);
LEDOn(LED2);
LEDOff(LED3);
LEDOff(LED4);
LEDOn(LED5);
LEDOff(LED6);
LEDOn(LED7);
LEDOff(LED8);
LEDOn(LED9);
LEDOff(LED10);
LEDOff(LED11);
LEDOn(LED12);
LEDOn(LED13);
LEDOn(LED14);

LEDOff(VibePin);
PreviousCommand = 90;
break;
case 32://space

LEDOff(LED0);
LEDOff(LED1);
LEDOff(LED2);
LEDOff(LED3);
LEDOff(LED4);
LEDOff(LED5);
LEDOff(LED6);
LEDOff(LED7);
LEDOff(LED8);
LEDOff(LED9);
LEDOff(LED10);
LEDOff(LED11);
LEDOff(LED12);
LEDOff(LED13);
LEDOff(LED14);

LEDOff(VibePin);
PreviousCommand = 32;
delay(500);
break;
case 33://”!”

FlashPattern();
PreviousCommand = 32;
//delay(500);
break;

if (Number != 33) {
delay (1000);
}

}
}

Egan Final Project

Concept: So I decided to make a night gown to match a bed I made for my other class Physical Computing. The bed says “we all die” in EL wire and I made it because I have gained some new insight on death in the past few weeks. In our culture death is seen as sort of a really horrible and sad thing and something to be constantly afraid of and worried about. However, humans, animals, plants and whatever else is living, will die. Basically anything living is just a big electronic circuit that eventually, will break, fail, or run out of battery. And there is something about this idea that I find comforting and that I like. You can’t fight it, so just enjoy yourself now. For some reason working with electronics has brought these feelings out in me. The idea of documenting things that are working right now, because it might brake in 2 seconds, and how things sometimes just don’t work, I find it a very beautiful process, however scary and painful it may be. The reason I made a bed and a night gown is because, I have really been liking the idea of beds lately, what happens in the bed, who is in the bed, where the bed is, etc. etc. all these things have been interesting me. The bed is a very personal place that one will either be alone in, or with someone that the person is intimate with (usually). Beds are where personal stuff goes on. Beds are where the body recharges. Beds are where you sleep, where you are at your most vulnerable state. Bed are where you have sex, and beds are places your share with your lovers or siblings or friends, or whatever the situation may be. There is a lot of thinking done in bed, (at least for me anyway) and sometimes it i where we suffer because we can’t sleep. My bed that I made is meant to make you not be able to sleep and force you to think about death and things that one might try and avoid. The night gown pushes you away from sleep more, because you really would not be able to sleep in that, it would be way to uncomfortable (and bright). I just wanted to make some things that would have the viewer think about things that he or she might not think of on their own, and give them new opinions on something.

Intended Scenario: I guess it would be intended as a sculpture. I wore it in the picture and it made it sort of a costumer, sculpture and performance piece, and although I have sworn off performance art I guess it might be something like that. I will not do a performance in this, it is mostly a sculptural piece.
Context: My inspiration came from Tracey Emins work, “My Bed” a piece she made that was her actual bed. The bed was dirty and slept in and the exact way it had been left after she said she was so depressed because of issues with her boyfriend that she was suicidal and could not get out of bed for weeks. This piece made me start thinking about the vulnerable space that is the bed and made me think about what type of things we do in the bed, and what else can be said with the bed as a platform.

Parts & Materials: I bought the little nighty, just to keep things simple. And I used conductive paint, Leds, and 9V batteries.
Challenges & Successes: It was fairly straightforward after a while. At first I started the project thinking it would be silk screened conductive ink. However, as soon as I opened the paint and felt the consistency I felt it would not work to silk screen. I did a few tests, and the paint was not good to silk screen with at all. It was far to gummy and thick to go through the silk. I did some research and on the website for the paint they said that it was fine to be silk screened with, but with a thicker screen. But using a thicker screen is not really silk screening then. So , the paint is not actually good for silk screening. They said something about coming out with a paint that will be better for silk screening. Also you need nice globs of the paint to make a strong connection. This is obviously not going to happen with a silk screen. So what I did is I silk screened my words on first with regular ink, this created like a platform for the ink to sit on so it didn’t just sink into the fabric and I outlined the letters with 2 lines, one for + and one for – , and had the battery and resistor at one end, and the LEDs at the other. Because the letters were very small it was sort of difficult to work with and broke a lot. Sort of annoying but no big deal.
Next Steps: I wouldn’t mind trying different patterns with this product, or working with it again. Because it is a great substitute for wires especially in textiles. It might be interesting to make a type of conducive string by coating yarn or something in the paint. I would work with this paint more, in terms of the project, that concept is finished for now, but I am going to make more beds one day.

Knit button dress (Final Project)

I used a fine singer knitting machine model 360 with a merino wool and wild silk as well as conductive thread and craft foam.

 

https://mail-attachment.googleusercontent.com/attachment/u/0/?ui=2&ik=c7e3d64f48&view=att&th=13b75ad0d5a629fd&attid=0.1&disp=inline&safe=1&zw&saduie=AG9B_P_10TQTWUinwWPnr1jIb2H-&sadet=1354889017419&sads=imf69Nkvg0MY6YPMSe2VFqnGKpI&sadssc=1 Knit button: two squares of wool knitted with conductive thread and trimmed with wild silk yarn with a piece of craft foam between them with holes cut in it.

For this project I wanted to focus on working with knit to create the sensors/buttons of the circuit. I ended up making about ten different knit buttons till I got the thread in the right spot on the knit so it would connect with the other side through the holes in the craft foam.

I didn’t use the lily pad mostly because I wanted to keep this simple and the focus on the knit buttons. I used a total of 15 LEDs that I stitched onto the slip part of the skirt. I connected half of the LEDs to one knit pad and the other half to another knit pad.

photo.JPG

I placed the knit buttons on the hip/waist area where where when dancing, the dance partner would place their hands on the knit buttons and turn on the LEDs.

Music gloves

 

When Kate first launched the project, I tried to deliver a different way to experience music. The first concept was a musical belt, but it was too difficult because there was insufficient surface area to incorporate the module onto the belt. With more brain storming, I decided to move onto the musical glove. I chose the musical glove because I can deliver a visual part of the music along with the audio to the audience. Prior to the final product, I first set the layout of the design with normal thread, and with success I completed it with conductive thread. The most challenging part of the whole project was to apply a switch to the Lilypad to make the two sets of notes (C Major, C Minor).

Codes

#include <Bounce.h>

// Variable setup
int speakerPin = A2;
int keyPin = A1;
int gndPin = 3;
int gndPin2 = A0;
int switchPin5 = 5;
int switchPin6 = 6;
int switchPin7 = 7;
int switchPin8 = 8;
int switchPin9 = 9;
int switchPin10 = 10;
int switchPin11 = 11;
int switchPin12 = 12;
int ledPin = 13;
int minorKey = 0;
Bounce bouncer = Bounce(keyPin,50); // Button debounce
int soundLength = 500;

// Setup
void setup() {
pinMode(vibratorPin, OUTPUT);
pinMode(speakerPin, OUTPUT);
pinMode(gndPin,OUTPUT);
pinMode(gndPin2,OUTPUT);
digitalWrite(gndPin,LOW);
digitalWrite(gndPin2,LOW);
pinMode(keyPin, INPUT);
pinMode(switchPin5, INPUT);
pinMode(switchPin5, INPUT);
pinMode(switchPin6, INPUT);
pinMode(switchPin7, INPUT);
pinMode(switchPin8, INPUT);
pinMode(switchPin9, INPUT);
pinMode(switchPin10, INPUT);
pinMode(switchPin11, INPUT);
pinMode(switchPin12, INPUT);
pinMode(ledPin, OUTPUT);
// Turn on internal pullup resistor
digitalWrite(keyPin, HIGH);
int i = 5;
while (i < 13) {
digitalWrite(i, HIGH);
i++;
}
}

void loop() {

while (1) {
bouncer.update();
// Play sound depends on which pin is touched
if (digitalRead(switchPin5) == LOW) {
if (minorKey)
tone (speakerPin,2093);  // Minor C
else
tone(speakerPin,2093);  // Major C

delay(soundLength);
}
else if (digitalRead(switchPin6) == LOW) {
if (minorKey)
tone (speakerPin,2349);  // Minor D
else
tone(speakerPin,2349);  // Major D
delay(soundLength);
}
else if (digitalRead(switchPin7) == LOW) {
if (minorKey)
tone (speakerPin,2489);  // Minor E
else
tone(speakerPin,2637);  // Major E
delay(soundLength);
}
else if (digitalRead(switchPin8) == LOW) {
if (minorKey)
tone (speakerPin,2793);  // Minor F
else
tone(speakerPin,2794);  // Major F
delay(soundLength);
}
else if (digitalRead(switchPin9) == LOW) {
if (minorKey)
tone (speakerPin,3136);  // Minor G
else
tone(speakerPin,3136);  //Major G
delay(soundLength);
noTone(speakerPin);
}
else if (digitalRead(switchPin10) == LOW) {
if (minorKey)
tone (speakerPin,3322);  // Minor A
else
tone(speakerPin,3520);  //Major A
delay(soundLength);
}
else if (digitalRead(switchPin11) == LOW) {
if (minorKey)
tone (speakerPin,3729);  // Minor B
else
tone(speakerPin,3951);  //Major B
delay(soundLength);
}
else if (digitalRead(switchPin12) == LOW) {
if (minorKey)
tone (speakerPin,4186);  // Minor C
else
tone(speakerPin,4186);  //Major C
delay(soundLength);
}
noTone(speakerPin);

// Detect Switching key button
if (bouncer.fallingEdge())  {
minorKey = !minorKey;
digitalWrite(ledPin,HIGH);
}

}

}

 

Process:

<testing the led before sewing onto conductive thread.

Final product:

Videos:

iLuminate

Im a big fan of “America’s got talent”. I still remember the first time when team iLuminate performed; I was so amazed from their EL light costumes. There on, I decided to research about the EL technologies on costumes.

 

Team iLuminate is a dancing crew which imbedded EL light system designed by the iLuminate™  that can be control via different mediums. Control mediums include DMX consoles, ProTools, MIDI devices, pre-programmed sequences or own custom iPod/iPad applications.

 

The glowing tubes and panel they used are Electroluminescent Wirex (often abbreviated to EL wire) which are commonly used in costumes and toys due to its 360 degree unbroken line of visible light.

 

 

While I was doing research for iLuminate, I found it impossible to get information about how the costumes are constructed. Therefore, I researched online and found some of the DIYs that demonstrates how it could be possibly made. Among all of the DIY ones, I found this one the most similar and easy to follow:

 

http://makeprojects.com/Project/Light-Up+EL+Wire+Costume/1392/1#.UKVJFHE6-OU

Here are the following online stores that sell Electroluminescent Wire that I think may be useful for the upcoming projects:

 

http://www.ellumiglow.com/

http://elwirecalgary.com/shop/

 

Health & Fitness Tracking Devices

Presentation File (PDF)

Visible but omnipresent and unobtrusive accelerometer-based fitness and health devices track daily activities of the wearer. Self-tracking devices are gaining popularity because people have an increasing interest in knowing the data of their lives. In other words, knowledge of the self gives power to the user to make the right proactive changes to their own health and wellness; people are far more likely to correct negative behaviour if they know more about it.

Unlike niche, athletic tracking devices, companies are creating ones that target the mass majority by fashioning the product. The social aspects of these devices also allow users to compare data with friends. Friendly competition are likely to motivate people to change their habits.

The following devices are ones that I mentioned and talked about in depth.

Fitbit: Zip

Review by WIRED.

Misfit: Shine

A new player to the scene, the Shine is currently on Indiegogo looking for funders.

Nike: Fuelband

An interesting article on the Fuelband, from The New York Times.

Jawbone: Up

Yves Behar talks about the design and manufacturing of the Jawbone Up.

http://youtu.be/l3xk48GsPIg

Many people will agree that the Jawbone Up is a beautifully designed object, but you’ll have to wear it to assess it’s usability. And apparently, the downfalls in it’s interactions will teach you a few things about user experience design, according to this Fast Co.Design article.

 

These self-tracking devices claim to be designed for everyday life and is meant to be worn 24/7, which leads to the two questions I posed to the class:

  1. How secure is your data?
    Who has access to your data? Companies? Your girlfriend? Don’t get caught cheating with these on!
  2. Is this something that you would ‘never’ take off?
    And if you only wear it occasionally, do you think it defeats the purpose of the device?

Hussein Chalayan : Fashion, Innovation and Technology

Hello Everyone!

Below are the links to my Power Point presentation as well as my rough talking notes for the presentation. I also attached some of the images I used in the presentation as well as some additional ones.

Thanks!

PowerPoint presentation :

Hussein Chalayan Powerpoint Presentation

Video Links:

http://www.youtube.com/watch?v=wXaONmuCgWE (video for Transformer dresses)

http://www.youtube.com/watch?v=c0IyDWm_bSo (video for LED dress)

http://showstudio.com/project/readings/fashion_film (video for Laser dresses…they’re featured near the end of the video)

Talking Notes:

Hussein Chalayan Talking Notes

Images:

 

 

 

Wearables & Rapid Prototyping

Laser Cutting

3D Printing

On Thingiverse

Projects