LED skirt

From RevSpace
Revision as of 21:00, 26 February 2020 by Noor (talk | contribs)
Jump to navigation Jump to search
Project LED-skirt
Photo5933744821665640847 - by WheezeNL.jpg
Status In progress
Contact Noor
Last Update 2020-02-26

To do

  • Reinforce wire connections with hot glue and/or zip ties.
  • Punch and grommet holes where velcro used to be.
  • Make LEDs addressable by position.
  • More programming designs.
  • Get aurora borealis palette working properly on circles and panel, and shooting stars display on strips.
  • Replace (or add to) strip in bottom tube with side-emitting LEDs?

LED count

  • 240 - circles (all used except one)
  • 64 - 8x8 panel.
  • 23 - strip 1.
  • 23 - strip 2.
  • 17 - strip 3.
  • 84 (?) - strip along bottom tube.

Total: 451 LEDs.

Timeline

Construction

2019-11-06 - 2019-11-11

Bought:

Old sketches:

2019-11-04 224115 - design1.png2019-11-04 224123 - led skirt 2.png2019-11-04 224131 - led skirt 3.png 2019-11-05 215433 - DSC06381.jpg2019-11-05 215437 - DSC06382.jpg

2019-11-12 - 2019-11-24

  • Played with layout of LEDs, waiting for items to arrive.
  • Tested out LEDs under layers and on crinoline.

2019-11-23 220454 - DSC06537.jpg 2019-11-23 221724 - DSC06542.jpg 2019-11-24 173747 - DSC06546.jpg

2019-11-25

  • Took apart seams of inner layers of black skirt to add extra panels to fit over crinoline.

2019-11-26

  • Measured skirt on top of crinoline. Extra panel with bottom arc length of 100+cm.
  • Decided to go with 6 strips of 23 LEDs each. Cut one strip.

2019-11-26 190451 - DSC06570.jpg 2019-11-26 190712 - DSC06573.jpg

2019-12-03 - 2019-12-05

  • Tested out LED rings. One wire was detached so had to be soldered on.

2019-12-03 174905 - DSC06589.jpg 2019-12-05 182443 - DSC06618.jpg

2019-12-06

  • Punched holes in crinoline, used zip ties to attach first LED strip.
  • Took apart LED circles and tested FastLED programs.
  • Set up LED circles, one strip, and panel together on crinoline and used zip ties to place everything but the panel on crinoline.
  • Ran FastLED programs on everything together.
  • Pictures posted by others to Facebook, RevSpace kiekjes, Twitter.

2019-12-06 193923 - DSC06635.jpg 2019-12-06 194452 - DSC06637.jpg 2019-12-06 200017 - DSC06639.jpg 2019-12-06 220618 - DSC06666.jpg 2019-12-06 220632 - DSC06667.jpg 2019-12-06 220710 - DSC06668.jpg

2019-12-20

  • Rearranged LED circles, mounted some back on with velcro. Mounted panel with velcro.
  • Cut two more strips. Attached wires to one and mounted it horizontally at an angle.

2019-12-20 214116 - DSC06775.JPG

2019-12-22

  • Folded up bottom hem and put velcro strips all across to partially make a tube along bottom.

2019-12-22 202231 - DSC06794.jpg 2019-12-22 203241 - DSC06795.jpg

2019-12-24

2019-12-25

  • Measured and cut panel for black layer of skirt.

2020-01-10

  • Used fabric glue along bottom hem tube, in between velcro strips.
  • Soldered wires to more LED strips.

2020-01-10 145148 - DSC08359.jpg 2020-01-10 165310 - DSC08360.jpg 2020-01-10 201701 - DSC08367.jpg 2020-01-10 205118 - DSC08368.jpg 2020-01-10 211717 - DSC08370.jpg 2020-01-10 213030 - DSC08371.jpg 2020-01-10 223034 - DSC08375.jpg 2020-01-10 225615 - DSC08377.jpg

2020-01-11

  • Soldered wires to remaining LED strips.
  • Connected everything together, hooked up to an Arduino.

2020-01-11 185141 - DSC08388.jpg 2020-01-11 191121 - DSC08389.jpg 2020-01-11 202121 - DSC08392.jpg 2020-01-11 202125 - DSC08393.jpg 2020-01-11 202717 - DSC08394.jpg 2020-01-11 203657 - DSC08396.jpg 2020-01-11 204945 - DSC08397.jpg 2020-01-11 210350 - DSC08401.jpg

2020-01-17

  • Added more velcro bits to fix placement of LEDs.
  • Experimented with modifying FastLED programs. BPM on circles?

2020-01-17 170344 - DSC08486.jpg 2020-01-17 174034 - DSC08489.jpg 2020-01-17 183719 - DSC08492.jpg 2020-01-17 195703 - DSC08503.jpg

2020-01-18 - 2020-02-13

  • Experimented more with FastLED programs.
  • For custom color palettes, used PaletteKnife bookmarklet to generate codes for palettes. Add to sketch directly, or add to Arduino/libraries/FastLED/colorpalettes.cpp and palette name to colorpalettes.h.
  • Cut up plastic bag for panel over skirt, attached with velcro.
  • Finished up everything on black outer skirt.
  • Bought 2x SilverCrest power banks.

2020-01-28 202925 - DSC08667.jpg 2020-01-28 205606 - DSC08678.jpg 2020-01-28 205645 - DSC08682.jpg 2020-01-31 201610 - DSC08697.jpg 2020-02-05 222300 - DSC08979.jpg 2020-02-07 214159 - DSC09010.jpg 2020-02-07 214322 - DSC09012.jpg 2020-02-09 184847 - DSC09137.jpg 2020-02-11 182635 - DSC09159.jpg 2020-02-11 185833 - DSC09164.jpg 2020-02-11 201149 - DSC09169.jpg 2020-02-11 233802 - DSC09223.jpg 2020-02-13 170031 - DSC09231.jpg 2020-02-13 195455 - DSC09237.jpg 2020-02-13 201536 - DSC09239.jpg 2020-02-13 204153 - DSC09242.jpg 2020-02-13 205404 - DSC09244.jpg 2020-02-13 213221 - DSC09245.jpg

HackerHotel 2020

2020-02-14 -2020-02-16

  • Debut as Princess of Lights went excellent, with paparazzi taking pictures and video all weekend.
  • About a dozen wires broke off throughout the weekend and had to be soldered back on, some with reinforcements of zip ties to hold them in place.
  • LEDs kept weighing down crinoline, and since the string in the waist came out a long time ago, the velcro was not enough to hold it up. Used an opened paperclip to hold it together, and then a safety pin. Need to add a hook fastener, or use a large safety pin (through grommeted holes) or some other kind of fastener.

2020-02-14 215110 - DSC09343.jpg 2020-02-15 004016 - DSC09369.jpg Photo5933744821665640847 - by WheezeNL.jpg

Modified fastLED sketches that I used at HH2020:

Arduino 1 (for circles and panel):

#include <FastLED.h>

FASTLED_USING_NAMESPACE

#if defined(FASTLED_VERSION) && (FASTLED_VERSION < 3001000)
#warning "Requires FastLED 3.1 or later; check github for latest code."
#endif

#define DATA_PIN    6
//#define CLK_PIN   4
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
#define NUM_LEDS    304
CRGB leds[NUM_LEDS];

#define BRIGHTNESS          15
#define FRAMES_PER_SECOND  120
#define SHIFT_PER_SECOND  15

void setup() {
  delay(3000); // 3 second delay for recovery
  
  // tell FastLED about the LED strip configuration
  FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  //FastLED.addLeds<LED_TYPE,DATA_PIN,CLK_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);

  // set master brightness control
  FastLED.setBrightness(BRIGHTNESS);
}


// List of patterns to cycle through.  Each is defined as a separate function below.
typedef void (*SimplePatternList[])();
SimplePatternList gPatterns = { rainbowWithGlitter, bpm, confetti, flowingwater };

uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current
uint8_t gHue = 0; // rotating "base color" used by many of the patterns

DEFINE_GRADIENT_PALETTE( Aleutian_Clouds_gp ) {
    0,  37,184,133,
   12,  37,184,133,
   25,  46,168, 98,
   37,  55,152, 67,
   51,  22,104, 77,
   63,   5, 66, 88,
   76,   1, 31, 49,
   88,   1, 19, 32,
  100,   1,  2, 11,
  112,   1,  3,  9,
  125,   1,  6,  20,
  137,   1,  10, 20,
  149,   1,  2, 11, 
  161,   1,  19, 32,
  173,   1, 31, 49,
  185,   5, 66, 88,
  200,  22,104, 77,
  212,  55,152, 67,
  225,  46,168, 98,
  237,  37,184,133,
  255,  37,184,133,
  };
  
void loop()
{
  // Call the current pattern function once, updating the 'leds' array
  gPatterns[gCurrentPatternNumber]();

  // send the 'leds' array out to the actual LED strip
  FastLED.show();  
  // insert a delay to keep the framerate modest
  FastLED.delay(1000/FRAMES_PER_SECOND); 

  // do some periodic updates
  EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the "base color" through the rainbow
  EVERY_N_SECONDS( 10 ) { nextPattern(); } // change patterns periodically
}

#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))

void nextPattern()
{
  // add one to the current pattern number, and wrap around at the end
  gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns);
}

void rainbow() 
{
  // FastLED's built-in rainbow generator
  fill_rainbow( leds, NUM_LEDS, gHue, 35);
}

void rainbowWithGlitter() 
{
  // built-in FastLED rainbow, plus some random sparkly glitter
  rainbow();
  addGlitter(80);
}

void addGlitter( fract8 chanceOfGlitter) 
{
  if( random8() < chanceOfGlitter) {
    leds[ random16(NUM_LEDS) ] += CRGB::White;
  }
}

void confetti() 
{
  // random colored speckles that blink in and fade smoothly
  fadeToBlackBy( leds, NUM_LEDS, 10);
  int pos = random16(NUM_LEDS);
  leds[pos] += CHSV( gHue + random8(64), 200, 255);
}

void bpm()
{
  // colored stripes pulsing at a defined Beats-Per-Minute (BPM)
  uint8_t BeatsPerMinute = 62;
  CRGBPalette16 palette = PartyColors_p;
  uint8_t beat = beatsin8( BeatsPerMinute, 64, 255);
  for( int i = 0; i < NUM_LEDS; i++) { //9948
    leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));
  }
}

int offset = 0;
int framecounter = 0;
void flowingwater()
{

  CRGBPalette16 palette = Aleutian_Clouds_gp;

  for( int i = 0; i < NUM_LEDS; i++) { 
    leds[i] = ColorFromPalette(palette, ((i+offset)%256), 128);
      addGlitter(1);
  }
  framecounter++;
  if (framecounter > FRAMES_PER_SECOND / SHIFT_PER_SECOND) {
  offset++;
  //offset = offset + random8(4);
  if (offset >= 256) {
    offset = 0;
  }
  framecounter = 0;
  }
}

Arduino 2 (for strips), from fastLED's demo reel:

#include <FastLED.h>

FASTLED_USING_NAMESPACE

#if defined(FASTLED_VERSION) && (FASTLED_VERSION < 3001000)
#warning "Requires FastLED 3.1 or later; check github for latest code."
#endif

#define DATA_PIN    6
//#define CLK_PIN   4
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
#define NUM_LEDS    147
CRGB leds[NUM_LEDS];

#define BRIGHTNESS          75
#define FRAMES_PER_SECOND  40

void setup() {
  delay(3000); // 3 second delay for recovery
  
  // tell FastLED about the LED strip configuration
  FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  //FastLED.addLeds<LED_TYPE,DATA_PIN,CLK_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);

  // set master brightness control
  FastLED.setBrightness(BRIGHTNESS);
}


// List of patterns to cycle through.  Each is defined as a separate function below.
typedef void (*SimplePatternList[])();
SimplePatternList gPatterns = { confetti, sinelon, juggle, bpm };

uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current
uint8_t gHue = 0; // rotating "base color" used by many of the patterns
  
void loop()
{
  // Call the current pattern function once, updating the 'leds' array
  gPatterns[gCurrentPatternNumber]();

  // send the 'leds' array out to the actual LED strip
  FastLED.show();  
  // insert a delay to keep the framerate modest
  FastLED.delay(1000/FRAMES_PER_SECOND); 

  // do some periodic updates
  EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the "base color" through the rainbow
  EVERY_N_SECONDS( 10 ) { nextPattern(); } // change patterns periodically
}

#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))

void nextPattern()
{
  // add one to the current pattern number, and wrap around at the end
  gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns);
}


void confetti() 
{
  // random colored speckles that blink in and fade smoothly
  fadeToBlackBy( leds, NUM_LEDS, 10);
  int pos = random16(NUM_LEDS);
  leds[pos] += CHSV( gHue + random8(64), 200, 255);
}

void sinelon()
{
  // a colored dot sweeping back and forth, with fading trails
  fadeToBlackBy( leds, NUM_LEDS, 20);
  int pos = beatsin16( 13, 0, NUM_LEDS-1 );
  leds[pos] += CHSV( gHue, 255, 192);
}

void bpm()
{
  // colored stripes pulsing at a defined Beats-Per-Minute (BPM)
  uint8_t BeatsPerMinute = 62;
  CRGBPalette16 palette = PartyColors_p;
  uint8_t beat = beatsin8( BeatsPerMinute, 64, 255);
  for( int i = 0; i < NUM_LEDS; i++) { //9948
    leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));
  }
}

void juggle() {
  // eight colored dots, weaving in and out of sync with each other
  fadeToBlackBy( leds, NUM_LEDS, 20);
  byte dothue = 0;
  for( int i = 0; i < 8; i++) {
    leds[beatsin16( i+7, 0, NUM_LEDS-1 )] |= CHSV(dothue, 200, 255);
    dothue += 32;
  }
}

Further work

2020-02-21 and 2020-02-25

  • Removed velcro pads from skirt as they were coming apart and were useless at Hacker Hotel.
  • Applied Mod Podge where velcro pads used to be, sealing loose threads.

2020-02-25 212846 - DSC09574.jpg 2020-02-21 161944 - DSC09517.jpg