Difference between revisions of "LED skirt"

From RevSpace
Jump to navigation Jump to search
m
 
(48 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
   {{Project
 
   {{Project
   |Name=LED-skirt
+
   |Name=LED skirt
 
   |Status=In progress
 
   |Status=In progress
   |Picture=2019-11-26 190712 - DSC06573.jpg
+
   |Picture=Photo5933744821665640847 - by WheezeNL.jpg
 
   |Contact=Noor
 
   |Contact=Noor
 
   }}
 
   }}
 
==To do==
 
==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 '''[http://soliton.vm.bytemark.co.uk/pub/cpt-city/pd/astro/tn/aurora_borealis.png.index.html aurora borealis palette]''' working properly on circles and panel, and shooting stars display on strips.
 +
* Replace (or add to) strip in bottom tube with '''[https://nl.aliexpress.com/item/32885384695.html side-emitting LEDs]'''?
  
* Cut up rest of LED strip into sections of 23 LEDs.
+
==LED count==
* Fix rest of LED strips onto crinoline.
+
*240 - circles (all used except one)
* Microcontrollers and wiring.
+
*64 - 8x8 panel.
* Figure out how much power is needed and battery holders.
 
  
* Want [https://nl.aliexpress.com/item/32885384695.html side-emitting LEDs] along the bottom, but can't find side-emitting LEDs that are also waterproof, and can't put more than 1m of non-waterproof ones in a silicon tube.
+
*23 - strip 1.
* Diameter of crinoline bottom hoop is 80 cm. Need to add an extra 100+cm of arc length of black paneling and tulle paneling to inner layers.
+
*23 - strip 2.
 +
*17 - strip 3.
 +
*84 (?) - strip along bottom tube.
 +
 
 +
Total: 451 LEDs.
  
 
==Timeline==
 
==Timeline==
  
 +
===Construction===
 
'''2019-11-06 - 2019-11-11'''
 
'''2019-11-06 - 2019-11-11'''
  
 
Bought:
 
Bought:
* [https://nl.aliexpress.com/item/32911854822.html 8x8 cm WS2812 LED panel]
+
* '''[https://nl.aliexpress.com/item/32911854822.html 8x8 cm WS2812 LED panel]'''
* [https://nl.aliexpress.com/item/32966375934.html 5m, 30 LEDs/m, IP67, black LED pixel strip]
+
* '''[https://nl.aliexpress.com/item/32966375934.html 5m, 30 LEDs/m, IP67, black LED pixel strip]'''
* [https://nl.aliexpress.com/item/4000146649971.html 241 LEDs, rings of varying sizes from 3 to 17 cm]
+
* '''[https://nl.aliexpress.com/item/4000146649971.html 241 LEDs, rings of varying sizes from 3 to 17 cm]'''
* [x2] [https://nl.aliexpress.com/item/32988614802.html 2-hoop crinolines to attach LEDs to]
+
* [x2] '''[https://nl.aliexpress.com/item/32988614802.html 2-hoop crinolines to attach LEDs to]'''
* [https://nl.aliexpress.com/item/32846977474.html?spm=a2g0s.9042311.0.0.ce634c4dCN7q6F 88 cm black skirt]
+
* '''[https://nl.aliexpress.com/item/32846977474.html?spm=a2g0s.9042311.0.0.ce634c4dCN7q6F 88 cm black skirt]'''
  
 
Old sketches:
 
Old sketches:
  
[[File:2019-11-04 224115 - design1.png|90px]]
+
[[File:2019-11-04 224115 - design1.png|100px]][[File:2019-11-04 224123 - led skirt 2.png|100px]][[File:2019-11-04 224131 - led skirt 3.png|100px]]
[[File:2019-11-04 224123 - led skirt 2.png|90px]]
+
[[File:2019-11-05 215433 - DSC06381.jpg|214px]][[File:2019-11-05 215437 - DSC06382.jpg|214px]]
[[File:2019-11-04 224131 - led skirt 3.png|90px]]
 
[[File:2019-11-05 215433 - DSC06381.jpg|130px]]
 
[[File:2019-11-05 215437 - DSC06382.jpg|130px]]
 
  
 
'''2019-11-12 - 2019-11-24'''
 
'''2019-11-12 - 2019-11-24'''
* Layout of LEDs, waiting for items to arrive.
+
* Played with layout of LEDs, waiting for items to arrive.
 
* Tested out LEDs under layers and on crinoline.
 
* Tested out LEDs under layers and on crinoline.
  
[[File:2019-11-23 220454 - DSC06537.jpg|120px]]
+
[[File:2019-11-23 220454 - DSC06537.jpg|150px]]
[[File:2019-11-23 221724 - DSC06542.jpg|120px]]
+
[[File:2019-11-23 221724 - DSC06542.jpg|150px]]
[[File:2019-11-24 173747 - DSC06546.jpg|150px]]
+
[[File:2019-11-24 173747 - DSC06546.jpg|200px]]
  
 
'''2019-11-25'''
 
'''2019-11-25'''
Line 49: Line 57:
 
* Decided to go with 6 strips of 23 LEDs each. Cut one strip.
 
* Decided to go with 6 strips of 23 LEDs each. Cut one strip.
  
[[File:2019-11-26 190451 - DSC06570.jpg|120px]]
+
[[File:2019-11-26 190451 - DSC06570.jpg|150px]]
[[File:2019-11-26 190712 - DSC06573.jpg|120px]]
+
[[File:2019-11-26 190712 - DSC06573.jpg|150px]]
 +
 
 +
'''2019-12-03 - 2019-12-05'''
 +
* Tested out LED rings. One wire was detached so had to be soldered on.
 +
[[File:2019-12-03 174905 - DSC06589.jpg|200px]]
 +
[[File:2019-12-05 182443 - DSC06618.jpg|200px]]
 +
 
 +
[[File:2019-12-05 172105 - MAH06604.mp4|250px]]
 +
[[File:2019-12-05 182150 - MAH06614.mp4|250px]]
 +
[[File:2019-12-05 203225 - MAH06620.mp4|250px]]
  
 
'''2019-12-06'''
 
'''2019-12-06'''
Line 57: Line 74:
 
*Set up LED circles, one strip, and panel together on crinoline and used zip ties to place everything but the panel on crinoline.
 
*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.
 
*Ran FastLED programs on everything together.
*Pictures posted by others to [https://www.facebook.com/story.php?story_fbid=2623825531015894&id=249310478467423 Facebook], [https://revspace.nl/kiekjes/view/20191206/P1000995.JPG RevSpace kiekjes], [https://twitter.com/revspacenl/status/1203094244057059329 Twitter].
+
*Pictures posted by others to '''[https://www.facebook.com/story.php?story_fbid=2623825531015894&id=249310478467423 Facebook]''', '''[https://revspace.nl/kiekjes/view/20191206/P1000995.JPG RevSpace kiekjes]''', '''[https://twitter.com/revspacenl/status/1203094244057059329 Twitter]'''.
 +
 
 +
[[File:2019-12-06 193923 - DSC06635.jpg|150px]]
 +
[[File:2019-12-06 194452 - DSC06637.jpg|150px]]
 +
[[File:2019-12-06 200017 - DSC06639.jpg|266px]]
 +
[[File:2019-12-06 220618 - DSC06666.jpg|150px]]
 +
[[File:2019-12-06 220632 - DSC06667.jpg|150px]]
 +
[[File:2019-12-06 220710 - DSC06668.jpg|150px]]
 +
[[File:2019-12-06 181804 - MAH06633.mp4|250px]]
 +
[[File:2019-12-06 201308 - MAH06641.mp4|250px]]
 +
[[File:2019-12-06 220455 - MAH06664.mp4|150px]]
 +
[[File:2019-12-06 220715 - MAH06669.mp4|150px]]
 +
 
 +
'''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.
 +
 
 +
[[File:2019-12-20 214116 - DSC06775.JPG|150px]]
 +
 
 +
'''2019-12-22'''
 +
*Folded up bottom hem and put velcro strips all across to partially make a tube along bottom.
 +
[[File:2019-12-22 202231 - DSC06794.jpg|200px]]
 +
[[File:2019-12-22 203241 - DSC06795.jpg|150px]]
 +
 
 +
'''2019-12-24'''
 +
*Bought '''[https://www.aliexpress.com/item/32801353259.html LED connectors (20 pairs, 3-pin)]'''.
 +
 
 +
'''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.
 +
 
 +
[[File:2020-01-10 145148 - DSC08359.jpg|200px]]
 +
[[File:2020-01-10 165310 - DSC08360.jpg|200px]]
 +
[[File:2020-01-10 201701 - DSC08367.jpg|200px]]
 +
[[File:2020-01-10 205118 - DSC08368.jpg|150px]]
 +
[[File:2020-01-10 211717 - DSC08370.jpg|200px]]
 +
[[File:2020-01-10 213030 - DSC08371.jpg|200px]]
 +
[[File:2020-01-10 223034 - DSC08375.jpg|200px]]
 +
[[File:2020-01-10 225615 - DSC08377.jpg|150px]]
 +
 
 +
'''2020-01-11'''
 +
*Soldered wires to remaining LED strips.
 +
*Connected everything together, hooked up to an Arduino.
 +
 
 +
[[File:2020-01-11 185141 - DSC08388.jpg|200px]]
 +
[[File:2020-01-11 191121 - DSC08389.jpg|150px]]
 +
[[File:2020-01-11 202121 - DSC08392.jpg|200px]]
 +
[[File:2020-01-11 202125 - DSC08393.jpg|200px]]
 +
[[File:2020-01-11 202717 - DSC08394.jpg|200px]]
 +
[[File:2020-01-11 203657 - DSC08396.jpg|200px]]
 +
[[File:2020-01-11 204945 - DSC08397.jpg|200px]]
 +
[[File:2020-01-11 210350 - DSC08401.jpg|200px]]
 +
 
 +
[[File:2020-01-11 195305 - MAH08399 3.mp4|150px]]
 +
[[File:2020-01-11 201459 - MAH08404 2.mp4|150px]]
 +
 
 +
'''2020-01-17'''
 +
*Added more velcro bits to fix placement of LEDs.
 +
*Experimented with modifying FastLED programs. BPM on circles?
 +
 
 +
[[File:2020-01-17 170344 - DSC08486.jpg|200px]]
 +
[[File:2020-01-17 174034 - DSC08489.jpg|200px]]
 +
[[File:2020-01-17 183719 - DSC08492.jpg|150px]]
 +
[[File:2020-01-17 195703 - DSC08503.jpg|150px]]
 +
 
 +
[[File:2020-01-17 183546 - MAH08490.mp4|150px]]
 +
[[File:2020-01-17 195232 - MAH08497.mp4|150px]]
 +
 
 +
'''2020-01-18 - 2020-02-13'''
 +
 
 +
* Experimented more with FastLED programs.
 +
* For custom color palettes, used '''[http://fastled.io/tools/paletteknife/ 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 '''[https://www.lidl-shop.nl/SILVERCREST-Powerbank-10-000-mAh/p100264867 SilverCrest power banks]'''.
 +
 
 +
[[File:2020-01-28 202925 - DSC08667.jpg|240px]]
 +
[[File:2020-01-28 205606 - DSC08678.jpg|240px]]
 +
[[File:2020-01-28 205645 - DSC08682.jpg|135px]]
 +
[[File:2020-01-31 201610 - DSC08697.jpg|240px]]
 +
[[File:2020-02-05 222300 - DSC08979.jpg|240px]]
 +
[[File:2020-02-07 214159 - DSC09010.jpg|135px]]
 +
[[File:2020-02-07 214322 - DSC09012.jpg|240px]]
 +
[[File:2020-02-09 184847 - DSC09137.jpg|135px]]
 +
[[File:2020-02-11 182635 - DSC09159.jpg|240px]]
 +
[[File:2020-02-11 185833 - DSC09164.jpg|240px]]
 +
[[File:2020-02-11 201149 - DSC09169.jpg|135px]]
 +
[[File:2020-02-11 233802 - DSC09223.jpg|135px]]
 +
[[File:2020-02-13 170031 - DSC09231.jpg|240px]]
 +
[[File:2020-02-13 195455 - DSC09237.jpg|240px]]
 +
[[File:2020-02-13 201536 - DSC09239.jpg|240px]]
 +
[[File:2020-02-13 204153 - DSC09242.jpg|135px]]
 +
[[File:2020-02-13 205404 - DSC09244.jpg|135px]]
 +
[[File:2020-02-13 213221 - DSC09245.jpg|240px]]
 +
 
 +
[[File:2020-02-05 212228 - MAH08977.mkv|250px]]
 +
[[File:2020-02-13 204138 - MAH09241.mkv|150px]]
 +
[[File:2020-02-13 205005 - MAH09243.mkv|150px]]
 +
 
 +
===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.
 +
 
 +
[[File:2020-02-14 215110 - DSC09343.jpg|170px]]
 +
[[File:2020-02-15 004016 - DSC09369.jpg|240px]]
 +
[[File:photo5933744821665640847 - by WheezeNL.jpg|170px]]
 +
 
 +
[[File:2020-02-14 205051 - MAH09341.mkv|200px]]
 +
[[File:2020-02-14 205124 - MAH09344.mkv|194px]]
 +
[[File:t_video5933782887504545062 - by WheezeNL.mkv|216px]]
 +
[[File:t_video5931592870795413162 - by Rowan8k.mkv|165px]]
 +
 
 +
Modified fastLED sketches that I used at HH2020:
 +
 
 +
Arduino 1 (for circles and panel):
 +
 
 +
<div style="height: 200px; overflow: scroll;">
 +
<pre>
 +
#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;
 +
  }
 +
}
 +
</pre>
 +
</div>
 +
 
 +
Arduino 2 (for strips), from fastLED's demo reel:
 +
 
 +
<div style="height: 200px; overflow: scroll;">
 +
<pre>
 +
#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;
 +
  }
 +
}
 +
</pre>
 +
</div>
 +
 
 +
===LED skirt corona-tion edition===
 +
 
 +
[[File:2020-03-24 164127.jpg|200px|right]]
 +
 
 +
Thought experiment: Corona-tion edition
 +
 
 +
* Skirt needs to keep other people 1.5 m away, so bottom hoop with 3 m diameter (~9.4248 m circumference).
 +
* 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.
 +
 
 +
[[File:2020-02-25 212846 - DSC09574.jpg|200px]]
 +
[[File:2020-02-21 161944 - DSC09517.jpg|200px]]
 +
 
 +
'''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.
 +
 
 +
[[File:2020-03-07 175704 - DSC09635.jpg|200px]]
 +
[[File:2020-03-07 180407 - DSC09636.jpg|200px]]
 +
[[File:2020-03-07 180457 - DSC09639.jpg|200px]]
 +
 
 +
'''2020-10'''
 +
 
 +
[[File:DSC02065.JPG|200px]]
 +
 
 +
*Several Velcro patches need re-gluing back on.

Latest revision as of 22:31, 20 April 2021

Project LED skirt
Photo5933744821665640847 - by WheezeNL.jpg
Status In progress
Contact Noor
Last Update 2021-04-20

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 diameter (~9.4248 m circumference).
  • 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.