Introduction: The LED Strip Jellyfish Costume With Arduino & LPD8806 Led Strips

It all started when I saw a BBC documentary in 2002 about deep waters of the ocean. There was a biolimunescent jellyfish in the documentary, probably of the species "ctenophores" that grabbed my attention so in the later years I decided use it as a Halloween costume.

It wasn't until 2011 when the led strips using LPD8806 driver chips came on to market that I found the opportunity to do this cost effectively (of course cost effective meaning if you plan to use these waterproof strips elsewhere during the 364 days of the year).

I planned to use these strips with an Arduino. Sadly I couldnt code in Arduino but I used Adafruits forums to find someone who could do the programming. (kudos to Edwin Mak for help with the Arduino programming) 

Step 1: Project in Detail - Requirements

First I created slow motion version of the video so I could analyze the nature of the colors.
http://youtu.be/nQvV5s38MBU
http://youtu.be/5rc8JB82DKU

A few things I could put to words regarding requirements:
-Pattern: This is the colorful sequence that travels the strip.

--The color of the pattern: I wanted the color of the pattern to also change as it travelled down the strip.  From yellow, to blue, to red dominant pattern color. yellow-red, blue-yellow and to randomization of all these.

--The sequence of patterns: Also once a certain pattern travelled I wanted the next pattern to be of different color, so I needed a function that spits out random sequences of colors that matched on all strips, [Note: however this didnt prove to be easy so I went with a single pattern repeating: greens and yellows followed by red and black... the black in the pattern end is basically leds off. so if the pattern is 13 Leds long. it would be 3 leds green, 5 leds yellow, 3 leds red and 2 leds off. ]

-Style of pattern travel: The sequence changes once in a while . Style1: The pattern starts and then fades itself after about 30cm then begins again to start fade again in 30cm. Style2: It follows the whole led strip without fading. [Note: Style1 proved to be difficult so we went with Style2 where the ]

-Brightness: I wanted to attach a third potentiometer to control brightness.

Further requirements:
-If possible, I wanted a potentiometer to change the pattern color of the sequence. The dominant color would always be red but the overlay sequence of colors or the overlay style could be changed too. There were a couple of styles in the video. [This proved to be difficult so it wasnt done]

-I wanted to change the speed with another potentiometer. [This was done successfully]
-Of-Off-Flickering Effect: I wanted to have an on-off button or a switch that would help me turn OFF the display of the sequence when pushed and ON when pushed again. However I wanted the sequence to continue behind so that when I switch back it would display where it was as it continued. I was planning to use this for manual / really crude beatmatching. [I didnt have time to do this as well so I basically snapped the cables off Arduino when I wanted to do this and it worked pretty good. That was pretty awesome for beatmatching. Note: I had arduino's power connected to a seperate 9V battery. So when I turned up the led strips power, which used led acid battery, the strip and Arduino continued running. This made flickering of the led strips much more attractive.]

Step 2: HARDWARE

I connected the led strips to an Arduino 2560

I used two kinds of strips for this job. I made a mistake by not ordering from Adafruit. http://www.adafruit.com/products/306

One of my strips was from Ebay and the other one was from China. So I had 2 strips of 5meters each.
http://www.aliexpress.com/item/free-shipping-Magic-digital-dream-color-strip-rgb-led-lpd8806-IC-digital-5m-Ribbon-Strip-

Rope/594865384.html
Model No.: SD-FL-lpd8806
LED Qty  : 32pcs   5050smd
IC:      16pcs
Power; 10w
Pixel: 32
Gray scale: 256
Voltage: 5v
Waterproof: silicon tube waterproof
5m is one roll


I believe they are of similar quality, but sadly the colors of the two strips did not match exactly somehow. It didn't create a  big problem but then again I wish I'd ordered from Adafruit since they provide 2 connectors and also many other accessories were available that would make soldering easier.

For testing I needed a power supply and I used an ATX Power supply:
http://www.wikihow.com/Convert-a-Computer-ATX-Power-Supply-to-a-Lab-Power-Supply

Battery:
For the battery I used a 6v 4.5ah lead-acid battery which went for about 2 hours when powering 10 meters of LED strips.  I used 2 of these which was enough for the Halloween night.

IMPORTANT: I successfully used a 6V battery lead-acid for these however this is not advised. The maximum for these strips is 6V so its not advised to use 6V without using a diode [namely 1N5400 or 1N4001 diode] so you might want to check options on that.

For the Ardunio I used a 9V standard battery which also went about 1.5 hours. Sadly I noticed not all 9V batteries were powerful enough somehow. So prior testing is required for these batteries. You might connect the Arduino directly to lead-acid battery. However see on initial requirements the On-Off-Flickering effect section.

Step 3: PREPERATION

There are a few rules of caution here:
1- Be careful about where you cut the strip. Read tutorials on this subject before you cut any strip.
2- Beware the direction of the strip. You can see in the photo that I connected them on the IN side.

Once you cut enough lengths you need to carefully align all these strips so that IN pads are together and connect all their in pads. So GND, DI(DAT), CI (CLK), 5V pads. All GND pads of the strips should be connected together. DI should be connected together and so on.

The photo you see shows all GND connections connected together 

IMPORTANT: I successfully used a 6V battery lead-acid for these however this is not advised. The maximum for these strips is 6V so its not advised to use 6V without using a diode [namely 1N5400 or 1N4001 diode] so you might want to check options on that.

Step 4: CONNECTIONS and WIRING


The connections were not easy job and I also didnt have a shield for the Arduino. The code currently requires that:

Red +5V Power wire from the strips to your 5V (6V in my case..) power supply.
Ground (Black) from the wires to any ground pin of the microcontroller (this is for data and power ground) 
ALL DI (DAT) connections from all strips to Arduino Pin 2;
ALL CLK (CK) connections from all stripsto Arduino Pin 3;

Now this is for a single strip. However I used many (6 strips in total of differing lengths around 6 feet ) strips so I had to connect all these strips parallel before connecting them to power, ground, Di or Clk.

Potmeter (controls speed)
Connect the pot to the 5V and GND. The middle pin of the potentiometer should go to Arduino pin A0.

Connect 9V power to your Arduino or use the power supply to power Arduino as well.

Step 5: CODE

-
First install the  https://github.com/adafruit/LPD8806 library into your library folder. Again Adafruit are the ones making all the magic happen here, I feel guilty (plus regret as mentioned) that I didn't order the led strips from these guys. You may have to rename the folder into something like "LPD" but that doesn't matter very much.


Then upload the code into your Arduino:




#include "LPD8806.h"
#include "SPI.h"

//s1 variables
LPD8806 s1 = LPD8806(160,2,3);
int s1track[200];
unsigned int s1ti = 0;
unsigned int s1tf = 0;
int sx = 0;
//CONTROLS;
int s1speed = 50; //How far apart are the patterns on a single line?
int s1sep = 30; //How many LEDS in between each pattern?

void setup() {
  Serial.begin(9600);
  s1.begin();
  for (int i = 0; i < s1.numPixels()+40; i++) {
    s1track[i] = 0;
  }
  for (int i = 0; i < s1.numPixels(); i++) {
    s1.setPixelColor(i, s1.Color(127,0,0));
  }
  s1.show();
}

void loop() {
  //s1speed = analogRead(A0);
  //s1speed = map(s1speed,0,1023,10,500);
  //Serial.println(s1speed);
  s1strip();
  s1.show();
}

void s1strip() {
    if (s1ti == 0) { s1ti = millis(); }
  s1tf = millis();
  if ( s1tf-s1ti >= s1speed ) {
    Serial.println(s1speed);
    s1ti = millis();
    if (sx == 0) {
      s1track[0] = 1;
    }
    for (int i = 0; i < s1.numPixels()+40; i++) {
      if (s1track[i] == 1) {
        s1track[i] = 2;
        for (int z = 0; z < 3; z++) {
          s1.setPixelColor(i-z,s1.Color(0,0,127));
        }
        for (int z = 3; z < 8; z++) {
          s1.setPixelColor(i-z,s1.Color(127,0,127));
        }
        for (int z = 8; z < 11; z++) {
          s1.setPixelColor(i-z,s1.Color(127,0,0));
        }
        for (int z = 11; z < 13; z++) {
          s1.setPixelColor(i-z,s1.Color(0,0,0));
        }
        for (int z = 13; z < 14; z++) {
          s1.setPixelColor(i-z,s1.Color(127,0,0));
        }       
      }
    }
    for (int i = 0; i < s1.numPixels()+40; i++) {
      if (s1track[i] == 2) {
        s1track[i] = 0;
        s1track[i+1] = 1;
      }
    }
    sx++;
    if (sx == s1sep) {
      sx = 0;
    }
  }
}

Step 6: BUILD - FINAL PRODUCT and FURTHER IMPROVEMENTS

For the final product I needed clear or near clear raincoats. I wanted two of them for a diffuse effect. One was the inside layer where I taped the led strips. Which was not strong enough. And the other one was the outside raincoat worked as a diffuser. White transparent version of this raincoat is the one I used, I only had one so I had to purchase another:

http://www.muji.us/store/accessories/rain/welder-raincoat-freecut-grey.html

I attached the 6 led strips on the inside raincode and secured them with transparent tape. All the IN pads of strips met over my head and from there I had the 4 cables from connectors coming down to Arduino.

http://youtu.be/HVBDDio5lak

The result was a major success. The only thing was that it was a bit too hot inside the raincoat.

FURTHER IMPROVEMENTS

I would appreciate any suggestions, improvements or code that could help here.

Halloween Costume Contest

Participated in the
Halloween Costume Contest

Microcontroller Contest

Participated in the
Microcontroller Contest