Drowning
Concept & Design
Yasmin, Rainee and I worked together for this project of New Bodies. We initiated the design with the ocean living creature, fish. Although human are quite familiar with fish, and are being exposed to this creature from time to time, there is actually huge gap between human and fish. We have different organs and different living habits. When thinking of fish, people would relate to the mystery ocean environment. Indeed, there are still so much we do not know about fish, and their habits. Therefore, we tend to explore and extend the relationship between human and fish through creating new bodies for human beings that alters senses into the water-living creature style.
” ‘Drowning’ is a bio-mimic textile of deep-ocean creatures. We choose to alter a shared body part of both human and fish – the spine, to create empathy between us and ocean creatures who might be suffering from plastic and oil pollutions.
We chose to use metal wire to create the structure net for the wearable ‘spine’, and use reflective textiles to create fish scale along the structure. When moving, the lighting will alter our perception of its navigation, while the person inside it feeling trapped – a beauty prison.” —- Rainee
See more detailed design process through Rainee’s Post.
Optic Fibers
In our initial plan, we wanted to use optic fiber around the shoulder. One end of the optic fiber is on the back, connected with the light sauce, the fiber would extend from the back, go through the shoulder, and end at the chest position. With the special kind of optic fiber that could show light from all its body instead of only two ends, the light sauce at the back would light up our whole piece, with varying colors.
The main reason we abandoned this plan was because we failed to find a kind of light that is bright enough to “power up” the optic fiber. I first tried the normal LED bulb for Arduino, which is not bright enough to light up the fiber. I then used the NeoPixel LED strip, the LED on that strip was brighter, but was also not bright enough. the strip would only light up around 5 to 10 centimeters of the fiber. The only light sauce strong enough was my phone flashlight, which would light up meters of the fiber. But the phone flashlight could neither change colors nor easily connected to the Arduino.
Therefore, we changed our design to not include the optic fiber. Hope that with stronger light sauce, we could play with the optic fiber in the future.
Circuits & Codes
After failing to take advantage of the optic fibers, we then turned to NeoPixel LED Strip. With the initial intention to have the light changes brightness corresponding to the surrounding sound, we used the microphone sound sensor as input.
The circuit itself is pretty simple, just to connect both NeoPixel strip and the sound sensor directly to the Arduino Uno, the sound sensor has one analog input and the LED strip has one output. I first tried to use Lilypad instead of Uno board for building the circuit, though Lilypad is much smaller than Uno, the sensor and LED ports are all in line with Uno ports, so using Uno avoids the mess of having too many jumpers and wires to connect the sensor.
At first, we did not decide on whether to use the sound sensor or not, so the Arduino code for the LED strip was simple, I just used the example code called “rainbow” from the FastLED_NeoPixel library. As we wanted the color to be blue and purple, I changed the color range from all colors to a specific range of blue-related colors.
void rainbow(unsigned long wait) {
for (unsigned long firstPixelHue = 30000; firstPixelHue < 50000; firstPixelHue += 20) {
for (unsigned int i = 0; i < strip.numPixels(); i++) {
unsigned long pixelHue=firstPixelHue+(i*10000UL/strip.numPixels());
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));}
strip.show();
delay(wait);}
The most difficult part of the circuit was the microphone sound sensor. The sensor was designed for both 5V and 3.3V, in order to keep our circuit tide, I chose to use the 3.3V for sound sensor, so that I need no breadboards or other wires to share the 5V input for both the LED and the sensor. However, I found that the analog input Varys in a smaller range when plugged with 3.3V instead of 5V, meaning that the sensor is less sensitive to the changes in sound loudness.
One other problem I found, for both 5V and 3.3V input, was that the analog input has very huge jumps given any sound. When there is no sound, the sensor would output a constant value of 97, (110 when using 5V). However, when there is sound, the sensor would normally have higher analog output, such that the louder the sound, the bigger the number. But the sensor also keeps having abnormal outputs that are around 97, might be either higher or lower. Therefore, when having loud sound, the sensor would not return a constant high output, but keeps jump between the baseline and the high value. So I cannot directly map the sensor value into the LED brightness, which would cause the LED to blink so rapidly, showing no clear reaction to the sound.
To solve this problem, I changed the code so that the LED would not dim or shine directly to the sensor value. Instead, I chose three ranges of value, so that when the sensor value did not change a lot (in the first range), the LED would dim a little bit, when the sensor output is relatively high (in the. second range), the LED brights up a little bit, but would not exceed a certain upper limit, if already exceeds, it would dim back to this limit. When sensor has extreme values (in the third range), the LED would also brights up a little bit, but all the way to the brightest. In this way, the LED strip would not blink from no light to the brightest, instead it would gradually change the brightness no matter what sensor output is. Also with the unstable sensor value, the LED would keep varying its brightness, which looks more dynamic than having constant brightness.
(See the end of this post for detailed code)
Limitations & Further improvements
Regarding the circuits part, there are actually several points to improve. Besides the varying output, the microphone sound sensor was also not sensitive to sounds from a distance. Only when the sound sauce is very close to the microphone can the sensor return informative values. So we had to play the music very close to the sensor when expecting the designed interaction between sound and light. To further improve the circuit, it might be a better idea to use some other sound sensors instead of this microphone one.
Another improvement is to fix the circuit onto our “cloth”. As now the Arduino board and the sensor were not fixed at any certain place, but and be moved around a little bit. We could sew the whole circuit onto some fabric that is attached to the project piece, so that the whole circuit would be more stable, and maybe hide into the piece.
I also met the problem that the Arduino board would be disconnected from time to time. I highly suspect that was because the NeoPixel strip used too much power from the Arduino board, because such situation would not happen when the strip was not connected. Therefore, it would be better to have an individual power sauce for the LED strip, instead of having 5V power directly from the Arduino board.
Other improvements besides the circuits are to build a larger piece of “body”. Instead of having only the back, we could have covered the whole body, and maybe having face or head covered. For the NeoPixel LED strip, we could have a plastic cover on it so that each LED light would not be so apparent, the plastic cover could blur the light so each bulb would not have straight light. It is also exciting to explore about how to make our project move or rotate, making it not only a piece of cloth, but more dynamic like a living creature.
#include <FastLED_NeoPixel.h>
#define SENSOR_PIN A0
#define DATA_PIN 2
#define NUM_LEDS 71
// LED brightness, 0 (min) to 255 (max)
int BRIGHTNESS = 20;
long firstPixelHue = 30000;
int INCREASE = 1;
CRGB leds[NUM_LEDS];
FastLED_NeoPixel_Variant strip(leds, NUM_LEDS);
void setup() {
pinMode(SENSOR_PIN, INPUT);
pinMode(DATA_PIN, OUTPUT);
strip.begin(FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS));
strip.setBrightness(BRIGHTNESS);
Serial.begin(9600);
}
void loop() {
if ((firstPixelHue < 30000) || (firstPixelHue > 50000)) {
INCREASE = INCREASE * -1;
}
firstPixelHue = firstPixelHue + INCREASE * 20;
for (unsigned int i = 0; i < strip.numPixels(); i++) {
unsigned long pixelHue = firstPixelHue + (i * 10000UL / strip.numPixels()); // vary LED hue based on position
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue))); // assign color, using gamma curve for a more natural look
}
int sensorValue = analogRead(SENSOR_PIN);
sensorValue = abs(sensorValue - 98);
if (sensorValue < 20 ) {
if (BRIGHTNESS > 0){
BRIGHTNESS -=10;
}
else {
BRIGHTNESS = 0;
}
}
else if (sensorValue < 60) {
if (BRIGHTNESS < 125){
BRIGHTNESS +=5;
}
if (BRIGHTNESS > 125){
BRIGHTNESS -=5;
}
}
else if (sensorValue < 100) {
if (BRIGHTNESS < 255){
BRIGHTNESS +=5;
}
}
else {
if (BRIGHTNESS < 255){
BRIGHTNESS +=5;
}
}
Serial.println(sensorValue);
strip.setBrightness(BRIGHTNESS);
strip.show();
delay(25);
}