LED skirt: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| Line 7: | Line 7: | ||
==To do== | ==To do== | ||
* 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. | ||
* Make LEDs addressable by position. | |||
* More programming designs. | * 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. | * 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 strip in bottom tube with '''[https://nl.aliexpress.com/item/32885384695.html side-emitting LEDs]'''? | * Replace (or add to) strip in bottom tube with '''[https://nl.aliexpress.com/item/32885384695.html side-emitting LEDs]'''? | ||
==LED count== | ==LED count== | ||
| Line 180: | Line 181: | ||
* Debut as Princess of Lights went excellent, with paparazzi taking pictures and video all weekend. | * 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. | * 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. | ||
| Line 191: | Line 192: | ||
[[File:t_video5933782887504545062 - by WheezeNL.mkv|216px]] | [[File:t_video5933782887504545062 - by WheezeNL.mkv|216px]] | ||
[[File:t_video5931592870795413162 - by Rowan8k.mkv|165px]] | [[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> | |||
===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]] | |||
Revision as of 21:00, 26 February 2020
| Project LED-skirt | |
|---|---|
| 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:
- 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.