LED skirt: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| Line 8: | Line 8: | ||
* Reinforce wire connections with hot glue and/or zip ties. | * Reinforce wire connections with hot glue and/or zip ties. | ||
* Punch and grommet holes where velcro used to be. | * 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. | * Make LEDs addressable by position. | ||
* More programming designs. | * More programming designs. | ||
| Line 455: | Line 456: | ||
'''2020-02-21 and 2020-02-25''' | '''2020-02-21 and 2020-02-25''' | ||
* Removed velcro pads from skirt as they were coming apart and were useless at Hacker Hotel. | * 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. | * Applied Mod Podge where velcro pads used to be, sealing loose threads. | ||
[[File:2020-02-25 212846 - DSC09574.jpg|200px]] | [[File:2020-02-25 212846 - DSC09574.jpg|200px]] | ||
[[File:2020-02-21 161944 - DSC09517.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]] | |||
Revision as of 01:46, 19 March 2020
| Project LED-skirt | |
|---|---|
| Status | In progress |
| Contact | Noor |
| Last Update | 2020-03-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:
- 8x8 cm WS2812 LED panel
- 5m, 30 LEDs/m, IP67, black LED pixel strip
- 241 LEDs, rings of varying sizes from 3 to 17 cm
- [x2] 2-hoop crinolines to attach LEDs to
- 88 cm black skirt
Old sketches:
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-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-12-03 - 2019-12-05
- Tested out LED rings. One wire was detached so had to be soldered on.
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-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-22
- Folded up bottom hem and put velcro strips all across to partially make a tube along bottom.
2019-12-24
- Bought 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.
2020-01-11
- Soldered wires to remaining LED strips.
- Connected everything together, hooked up to an Arduino.
2020-01-17
- Added more velcro bits to fix placement of LEDs.
- Experimented with modifying FastLED programs. BPM on circles?
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.
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.
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-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.