Halloween 2013 – Mask of Light
So this year, my halloween options are either an interesting mask idea, or Krieger. I’m going to try the mask idea first, because I’d rather build something than just stick on a lab coat, and I’m also going to a burlesque ball, so the Krieger thing is a little off the mark…
I have this filigree metal mask left over from a party last year, and I thought it’d be pretty cool to see if I could find a way to bring it to life. Here it is, in it’s stock form.
So, what can I do to add a little life to it, and get it looking something more like… this:
Well, It’s pretty open, so any additions would have to be well hidden, so as not to ruin the aesthetic of this mask. LEDs would be nice, but I would like RGB, and even if I could hide the LEDs themselves, the wiring would surely be visible, even with the smallest hook-up wire I have. That’s also overlooking the fact that I’d need to hide a controller on the mask too, or deal with all those wires going to a controller elsewhere. Sounds messy, and overly complicated.
It’s about this point that I started envisioning laying bundles of optic fiber behind the metalwork, and having them run to a LED and battery pack, hidden in a pocket. I got so far as ordering 30m of 0.25mm and 20m of 0.5mm optic fibre from eBay, and starting to work out the mapping required to allow me to pipe light to different sections on the mask. I promptly gave up when trying to lay some fiber, as it quickly became obvious that I wasn’t going to be able to meet the tight bend radius of the corners of the pattern without damaging the fiber.
Back to the drawing board.
I then remembered another eBay purchase that I’d made on a whim, for some WS2812 “Smart” LEDs. These are just like the popular 5050-RGB LEDs that can be found in every LED strip on eBay, but with an integrated WS2811-type controller, and a single wire data interface. With these, the wiring needed to cram the mask full of RGB LEDs becomes much, much simpler: the LED’s are wired in a daisy-chain for data, sharing a common power bus.
So now I have a plan, for the hardware at least! I’m sure I have an example of how to drive these with an ATmega328 somewhere. Anyway, more on that later, let’s have a look at the LEDs. I took a photo of the mask, and inverted it, to allow me to plan where to place the LEDs.
Each LED is held on with a little dab of epoxy resin. There’s enough clearance within the mask, that the LEDs actually sit just off my face, meaning that I should be able to achieve some nice fades between segments, using my skin as a diffuser for the light!
After about half an hour of gluing and adjusting final positions as the resin set, the mask was fully populated.
Next up, wiring. I’ll be making a custom wiring harness for this mask, to allow me to minimise the amount of wire used, keeping things neat and tidy, and reducing the chance of something being visible.
[ONE MANIC WEEK LATER…]
So, the party is tonight, and I’ve just managed to finish off the software for the mask, after a late-night debugging session, trying to get all the connections sorted out. Surprisingly, there was very little to modify from the initial build, with the only real problem being a shorted 0.1uF capacitor on the very first LED. I know my luck though, and I started at the beginning of the chain, rather than the end, and was happy to find that short quite quickly!
So, after firing it up, what do we get? With my basic code to test out the wiring, I can cycle through colours comprised of all-on, or all-off values for R, G and B. It’s a proof of concept bit of code, where I’m misusing SPI to transmit the data in the format the LED’s require. It’s not perfect, and hence goes a bit weird when transmitting anything but 0xFF to a colour. I’ll fix it at some point, but right now, it does this;
Which is great, the mask looks lovely like that, but it’s not what I’m going for… Enter Adafruits NeoPixel Library, for use with WS2812 devices. With this code loaded into my mask, I can get that fading colour sequence I’m so fond of, which (on the mask), looks like this;