Paper Doll!

For my Halloween costume, I chose to become a paper doll. This costume was inspired by my childhood self, who loved to play with paper dolls. Paper doll is a toy where you’re able to put together different outfits for your doll/character and by putting different clothing cut-outs together. This was one of my favorite ways to play. I went through a phase where me and friend started to make our own outfit pieces. We loved to draw, color those drawings and cut them out and store them all in a wardrobe we made out of shoebox for our dolls. 

So when I was thinking of the Halloween costume for this class, I was excited to create a paper doll outfit for my own self! This idea Laos particularly excited me since it would look all DIY and I was excited to see a 2D paper dress on me with a an LED strip that serves as its very sparkly border.

Here’s the final outcome:

Making this was fun and definitely a learning experience!

I was running off of this simple sketch!

I used one of my dress as an overlay to get a ballpark idea of my sizing.
I used foam core and divided the board for horizontally symmetry. Later, I scored the line with a bone tool, for it to sit better on me. Something I learnt only by trying it out.
This captures the dress making experience.

Talking about the code. I had worked ahead of time and customized the ‘button cycler’ example code and soldered the button on my Gemma and light trip for testing the code. In the code I changed the code to have some colors that I thought would work better with my outfit like – pink, teal, peach and the rainbow and got rid of any excess buttons I wasn’t a fan off.

Here’s a link to the code and may circuit diagram.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket

#define BUTTON_PIN   7

#define PIXEL_PIN    2  // Digital IO pin connected to the NeoPixels.

#define PIXEL_COUNT 8  // Number of NeoPixels

#define BRIGHTNESS 160

Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

boolean oldState = HIGH;
int     mode     = 0;    // Currently-active animation mode, 0-9

void setup() {
  strip.begin(); // Initialize NeoPixel strip object (REQUIRED);  // Initialize all pixels to 'off'

void loop() {
  // Get current button state.
  boolean newState = digitalRead(BUTTON_PIN);

  // Check if state changed from high to low (button press).
  if((newState == LOW) && (oldState == HIGH)) {
    // Short delay to debounce button.
    // Check if button is still low after debounce.
    newState = digitalRead(BUTTON_PIN);
    if(newState == LOW) {      // Yes, still low
      if(++mode > 3) mode = 0; // Advance to next mode, wrap around after #8
      switch(mode) {           // Start the new animation...
        case 0:
          colorWipe(strip.Color(  0,   0,   0, 0), 50);    // Black/off
        case 1:
          colorWipe(strip.Color(251,   93,   129,0), 50);    // PINK
        case 2:
          colorWipe(strip.Color(  36, 210,   241,0), 50);    // TEAL
        case 3:
          colorWipe(strip.Color(  241,   151, 148), 50);    // Peach
        case 4:

  // Set the last-read button state to the old state.
  oldState = newState;

void colorWipe(uint32_t color, int wait) {
  for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
    strip.setPixelColor(i, color);         //  Set pixel's color (in RAM);                          //  Update strip to match
    delay(wait);                           //  Pause for a moment

// Rainbow cycle along whole strip. Pass delay time (in ms) between frames.
void rainbow(int wait) {
  // Hue of first pixel runs 3 complete loops through the color wheel.
  // Color wheel has a range of 65536 but it's OK if we roll over, so
  // just count from 0 to 3*65536. Adding 256 to firstPixelHue each time
  // means we'll make 3*65536/256 = 768 passes through this outer loop:
  for(long firstPixelHue = 0; firstPixelHue < 3*65536; firstPixelHue += 256) {
    for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
      // Offset pixel hue by an amount to make one full revolution of the
      // color wheel (range of 65536) along the length of the strip
      // (strip.numPixels() steps):
      int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
      // strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
      // optionally add saturation and value (brightness) (each 0 to 255).
      // Here we're using just the single-argument hue variant. The result
      // is passed through strip.gamma32() to provide 'truer' colors
      // before assigning to each pixel:
      strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
    }; // Update strip with new contents
    delay(wait);  // Pause for a moment

I also ran into a lot of troubles that my Gemma gave me. Even though my code was ready to go, my Gemma decided to not work or even reset. After trying everything – restarting my computer, double tapping may Gemma, changing the wires incase the one I am using has some free charges, I was sad and thought I would have to work from a new Gemma.

Gemma reset not working 😕

The next day, before changing my Gemma, I gave my Gemma a last try and somehow the double tap turned green. I believe I carried an extra wire from home and it was this wire that actually made the Gemma work and detect the port in the Aurdino software for me to upload the code. Still a mystery though since it was the Gemma that finally responded to the rest double tap.

Some Magic! I was so relieved though.

Then came the soldering fun! I had then ordered this neopixel strip from adafruit’s website. The advantage of this was that the LED’s were visible in the front. This looked great on the outfit and attached to the top very easily with a few pins that I dug into my foam board to secure it.

However, it was a nightmare to solder if you had to make a parallel connection. It was too thin a strip. So when I would try to solder one wire, the other one would come off or the chrome of the strip itself would come off, I tried it 5 times and took about 6 hours to solder the parallel part.

My littles soldering video!

What I would do better next time here maybe is all three wires on separate joints. (Something I learnt by asking becky.)

The first strip worked yay!

The second one working was the best feeling ever!

Onto attaching the carefully soldered Gemma and the strip to may outfit.

To wear my outfit, I used velcro and Duct Tape to secure the velcro joints. It survived the entire parade. Yay!

Here’s a little video of the code working