LED skirt

From RevSpace
Revision as of 16:13, 19 October 2020 by Noor (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
Project LED skirt
Photo5933744821665640847 - by WheezeNL.jpg
Status In progress
Contact Noor
Last Update 2020-10-19

To do

  • Reinforce wire connections with hot glue and/or zip ties.
  • Punch and grommet holes where velcro used to be.
  • Buy or make a carrying case (width ~80 cm, height ~110 cm), maybe pop-up tent bag.
  • 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;
  }
}

LED skirt corona-tion edition

2020-03-24 164127.jpg

Thought experiment: Corona-tion edition

  • Skirt needs to keep other people 1.5 m away, so bottom hoop with 3 m radius (~9.4245 m diameter).
  • Waist circumference (cut-off top of cone) is 65 cm, height is 1 m, bottom radius is 1.5 m.
  • First back-of-the-envelope calculation: surface area of 70,000 sq cm for LEDs (that many if assuming 1 LED per sq cm).
  • Requires a portable nuclear power station (can build them in openRA).
  • Weight of LEDs can be dealt with by using a proper wooden/metal hoop skirt, with roller wheels at bottom.
  • Plenty of space under skirt for batteries. Roller wheels can be powered wheels to move around.
  • Power consumption can be reduced massively by adding in motion detectors that light up only some LEDs at a time if someone gets near [noopwafel].
  • Addressable RGB leds will come at 5cts in bulk, so 3500 euro in LEDs excluding PCBs and other stuff [Sebastius].
  • A proper calculation resulted in 87,656.25 sq cm surface area. Assuming 1 LED per sq cm, and approx 7 LEDs per euro, the cost of the LEDs would be 12,522 euro.
  • Power consumption for 87,656 neopixel LEDs at 60 mA, 5 V each: 26+ kW, more than a 3x 35A mains set up to power [Peetz0r].
  • LEDs are more likely to be 20 mA each, resulting in 8.77 kW [Juerd].
  • With circle packing and lower density LEDs it might become affordable, if LEDs are placed inside circles with r = 2.5, ~4100 leds for triangular packing [supakeen].

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

2020-03-07

  • Took apart a couple of cracked LCD screens. Diffusion and reflective films had some trippy effects (that don't show so well in pictures). Plan is to use them as panels for some parts.

2020-03-07 175704 - DSC09635.jpg 2020-03-07 180407 - DSC09636.jpg 2020-03-07 180457 - DSC09639.jpg

2020-10

DSC02065.JPG

  • Several Velcro patches need re-gluing back on.