My first shot at LightWalker was way more involved and elaborate than I originally planned and definitely more involved on the hardware side than I thought I could deal with. But, it did actually work. Mostly.
I don't know how most people face difficult problems they've never handled before, but whether it's rebuilding an engine, repairing a hole I put in the wall, or something like LightWalker, I usually do it once just to figure out what the hell is going on and then immediately do it again to do it correctly. Now, I'm definitely still a noob when it comes to hardware and embedded stuff, so I'm not going to claim that I'm doing everything correctly here, but I do think it's a step in the right direction.
Main complaints from LightWalker 1.0
- Difficulty producing desired results in the RGB color space
- Lack of memory available
- Limited frame rates possible with the Arduino Mega (ATmega2560)
- Overall bulkiness of the unit
- My own half-baked software design
So, here's LightWalker 2.0 so far:
Initial build of LightWalker 2.0 |
- Hardware
- Teensy 3.1 (32-bit ARM Cortex m4, 72Mhz, 256Kb Flash, 64Kb RAM)
- Schmartboard SMT to DIP board sporting a TI PCA9546A I2C multiplixer allowing communication to four ADXL345 ±16 g accelerometers
- Bluefruit EZ-Link bluetooth
- Electret microphone
- Software
- Moved away from Cool Neon and Chris De Vrie's TCL Arduino library for controlling lights and to FastLED 2.1
- I also removed my MSEQ7 shield and am doing audio processing in software now. This allows me to do a bit of max/min adjustment on the fly instead of having to cover the microphone in hot glue to deal with being within a half mile of an 85k watt stereo.
As you can see, this is way more compact than an Arduino mega with two shields and a separate bluetooth breakout board. Hell, the whole thing is smaller than the mega alone! But, the main advantage to this new unit is speed and lighting effects.
Before I get into the speed portion, I've gotta say that using FastLED to work in the HSV color space is amazing. I've only touched the surface of what you can do, but it is extremely simple to create smooth and subtle LED effects when working with HSV. You can easily create transitions between colors instead of just doing a hard switch from one to the other. And making things smooth and subtle is the name of the game when it comes to LEDs. Otherwise they hurt your eyeballs.
Before I get into the speed portion, I've gotta say that using FastLED to work in the HSV color space is amazing. I've only touched the surface of what you can do, but it is extremely simple to create smooth and subtle LED effects when working with HSV. You can easily create transitions between colors instead of just doing a hard switch from one to the other. And making things smooth and subtle is the name of the game when it comes to LEDs. Otherwise they hurt your eyeballs.
Now for the speed thing. This is kinda interesting to me...
configuration/mode | equalizer (fps) | gravity* (fps) | sparkle* (fps) | pulse (fps) | bubble* (fps) | rainbow* (fps) | zebra* (fps) |
---|---|---|---|---|---|---|---|
LightWalker 1.0, arduino, TCL | 87 | 7 | 18 | 93 | 16 | n/a | n/a |
LW 2.0, arduino, fastLED 2 | 36 | 7 | 15 | 135 | 16 | 25 | 32 |
LW 2.0, arduino, fastLED 2.1 | 35 | 7 | 15 | 135 | 16 | 25 | 33 |
LW 2.0, teensy 3.1, FastLED 2 | 98 | 86 | 81 | 173 | 90 | 85 | 73 |
LW 2.0, teensy 3.1, FastLED 2.1 | 250 | 124 | 130 | 465 | 134 | 123 | 100 |
[Update] Note that all of these tests are done against a strand of 352 P9813 driven RGB LEDs (AKA Total Control Lighting)
Couple things to keep in mind:
- The equalizer mode on the arduino is using hardware to calculate "loudness". The teensy configurations are using software to calculate the same. Obviously something is off with the equalizer stuff in 2.0 as the frame rate was chopped in half when it should have stayed the same or gone up. It's on my to-do list to look into it.
- FastLED 2.0 does *not* officially support the P9813 chip that I'm using in my Cool Neon TCL strands, but I was able to port the 2.1 code for that chipset to the 2.0 release. That's what my FastLED 2 testing was run against. That was not an official FastLED 2 release.
- The different modes obviously do a bunch of different lighting effects and some are more complex and slower than others.
- The modes marked with an asterisk read data from four different accelerometers and perform calculations on the data *for each frame*. This is why the pulse mode is so much quicker than the others, it is not reading any sensor data for it's effects.
Some conclusions
- The obvious result is that it pays to be on the new hardware and on FastLED 2.1. Now hopefully 2.1 is officially released soon...
- I think it's fairly interesting that the arduino based platform didn't benefit from the move to FastLED 2.1 from a speed perspective. The no-sensor-reading pulse mode did see about a 40% increase on the TCL -> FastLED 2 move, so my guess is that the sensor reading and calculations I'm doing are so slow on the arduino that the LED writing speed is negligible.
- The 100+ average frame-rate is really really nice for doing smooth LED transitions and effects. I'm really happy to see this kind of improvement and am already adding new effects based on the new abilities.
The code is up at https://github.com/gerstle/LightWalker if you want to check it out. Think that's all I've got for now, but now that I have two full LightWalker controllers...