Using my concept sketch, I created a digital version of the design in Illustrator.
With the laser cutter and assistance from and lab mate, we cut out a piece of non-adhering paper to sandwich between the heat sealable nylon.
To get the pouches in the prototype to bend, I referenced the work done by the MIT Media Lab. “aeroMorph – Heat-sealing Inflatable Shape-change Materials for Interaction Design”
After fusing the nylon with a heat press, but leaving one side open, the small valves were installed, and then the last side sealed.
Test with a hand pump:
This wasn’t quit the dramatic shape change I was hoping for, but not too bad for a first try.
The next step was to hook it up to a system with tubes, an air pump and small solenoid valves.
Test Code
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
int sValve_0 = 1; | |
int sValve_1 = 2; | |
int sValve_2 = 3; | |
int pump = 8; | |
void setup() { | |
Serial.begin(9600); | |
pinMode(sValve_0, OUTPUT); | |
pinMode(sValve_1, OUTPUT); | |
pinMode(sValve_2, OUTPUT); | |
pinMode(pump, OUTPUT); | |
} | |
void loop() { | |
digitalWrite(sValve_0, LOW); | |
Serial.print("0 on"); | |
Serial.println(); | |
digitalWrite(sValve_0, HIGH); | |
delay(500); | |
digitalWrite(sValve_0, LOW); | |
delay(500); | |
digitalWrite(sValve_1, LOW); | |
Serial.print("1 on"); | |
Serial.println(); | |
digitalWrite(sValve_1, HIGH); | |
delay(500); | |
digitalWrite(sValve_1, LOW); | |
delay(500); | |
digitalWrite(sValve_2, LOW); | |
Serial.print("2 on"); | |
Serial.println(); | |
digitalWrite(sValve_2, HIGH); | |
delay(500); | |
digitalWrite(sValve_2, LOW); | |
delay(500); | |
digitalWrite(pump, LOW); | |
Serial.print("pump on"); | |
Serial.println(); | |
digitalWrite(pump, HIGH); | |
delay(500); | |
digitalWrite(pump, LOW); | |
delay(500); | |
} |
Even with all the components wired to a bread board, all the components, except for power, for this project fit into a small flat box. Still a bit big to wear on your arm, but a few adjustments and I think it will work.
Functional Code with Buttons
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
int upPin = A0; // select analog input pins for the pressure sensors | |
int downPin = A1; | |
int up; // declare variables to store the values coming from the sensors | |
int down; | |
int pump = 8; //this pin is named to keep track of which pin the air pump is on | |
int level; //declare variable to track the selected level | |
void setup() { | |
Serial.begin(9600); | |
// setup pins to be inputs or outputs | |
pinMode(1, OUTPUT); | |
pinMode(2, OUTPUT); | |
pinMode(3, OUTPUT); | |
// for pins controlling solenoid valves, HIGH means the valve is closed and not letting air through, | |
//for the pump, HIGH means it is on and pumping air into the system. | |
digitalWrite(1, HIGH); | |
digitalWrite(2, HIGH); | |
digitalWrite(3, HIGH); | |
digitalWrite(pump, LOW); | |
level = 0; //set the "score" of the level to 0 to start | |
} | |
void loop() { | |
up= analogRead(upPin); | |
down = analogRead(downPin); | |
Serial.println(up); | |
Serial.println(down); | |
// calculate current level and set the bounds of the levels so that the "level" is | |
//always a number that aligns with one of the defined states | |
if (up >= 10) { | |
level = (level +1); | |
delay(500); | |
} | |
if (down >= 10) { | |
level = (level – 1); | |
delay(500); | |
} | |
if (level < 0) { | |
level = 0; | |
} | |
if (level > 3) { | |
level = 3; | |
} | |
Serial.print("level = "); | |
Serial.println(level); | |
//inflate pouches for visual and tactile level indication | |
if (level == 1) { | |
digitalWrite(pump, HIGH); | |
digitalWrite(1, LOW); | |
digitalWrite(2, HIGH); | |
digitalWrite(3, HIGH); | |
} | |
else if (level == 2) { | |
digitalWrite(pump, HIGH); | |
digitalWrite(1, LOW); | |
digitalWrite(2, LOW); | |
digitalWrite(3, HIGH); | |
} | |
else if (level == 3) { | |
digitalWrite(pump, HIGH); | |
digitalWrite(1, LOW); | |
digitalWrite(2, LOW); | |
digitalWrite(3, LOW); | |
} | |
else { | |
digitalWrite(pump, LOW); | |
digitalWrite(1, HIGH); | |
digitalWrite(2, HIGH); | |
digitalWrite(3, HIGH); | |
} | |
} |
The prototype worked pretty well. The level tracking function worked, and partially inflated the correct pouches.
Problems:
- Power! The current system needs different power sources to run the valves, pump, and microcontroller. Additionally, a 12V battery pack will certainly interfere with the “wearability” of the device.
- Shape changing is too subtle. Need to make the pouches bigger, or change the angle of the fused shape in middle of pouches, or separate the pouches and make them individual, or rewrite code so there is more air pressure flowing into each pouch, or some combination of these options.
- Material. After running the test code for a while, some of the pouches started to leak and wouldn’t inflate all the way. I’d also like to look into getting plastic fixtures for attaching the pump to the pouches to lower weight and cost.
https://gist.github.com/melPlett/b2b248c19e86bfb3a7c90e6ad84719a6.js