Since I’ve been working on this project for about a year and a half, and my motivation has continued to hold up, I think it’s time I wrote a bit about it. Understand as you’re reading this that there have been many dead ends along the way (I haven’t written about most of them here) as I tried to figure out how to accomplish this well-beyond-my-abilities project. I’ve learned an incredible amount along the way, which is as every bit as important to me as the finished project.
It all started with a piece of metal I found in a Vancouver antique shop, in mid 2012.
I think it’s made of bronze. I’m pretty sure it’s a bearing cage (see the yellow bit in the 2nd diagram), possibly from a ship of some sort, since bronze is highly resistant to corrosion from salt water. According to Wikipedia:
Bronze was especially suitable for use in boat and ship fittings prior to the wide employment of stainless steel owing to its combination of toughness and resistance to salt water corrosion. Bronze is still commonly used in ship propellers and submerged bearings.
I saw a few of these in an antique store, and immediately thought they would make a great lamp. It turned out they weren’t really for sale, but I pleaded with the owner a bit, and they named a price. Once I had the idea of a lamp, I couldn’t let them go!
Originally, I had planned to have the small one sit inside the big one and rotate, with LEDs inside the inner one. Over the months, as the idea for the lamp matured in my head, I decided not to use the small one at all, scrap the idea of having anything that rotates, and “just” try to make a colour changing lamp that was capable of being as bright as a 100w incandescent bulb. Inside each of the “windows” in the bronze would sit a single RGB LED. Each LED would be independently controllable, so each could be a different colour. This would allow for neat effects, such as the whole lamp being a nice warm white colour, with a green light that “spins” around a few times when I get an email. Or whole lamp could tint red for a moment late at night as a reminder that I should probably go to bed.
Well, a year and a half later, “just” doing that has turned out to be much, much harder than I originally expected. I knew the project would take me at least a year, but the learning curve for dealing with that much power, and individually changeable RGB LEDs, was way steeper than I imagined. I’ve persevered though, making progress here and there, as time and money permits, and one day I hope to finish building the coolest lamp ever. I have no idea what I’m going to call it though, so I’m open to suggestions.
The visual concept is basically naval, though some people have said it has a bit of a steampunk aesthetic to it. The brass ring will be the focus, with the LEDs in the “windows”. I hope to fashion lightly-frosted glass rings to mount in the windows with the LEDs behind them.
Below the ring will be a piece of turned wood. I’m still trying to decide what kind of hardwood to use, and what colour to have it stained. Since wood turning is an art of it’s own, one I don’t have the inclination (not to mention space) to learn, I’ll be hiring someone from the local woodturners guild (I had no idea such a thing existed!) to do it. Since this is one of the few projects I’ve done that is actually going to belong to me when it’s done (most are gifts), I’m hoping to do something “personalized” for the turned wood, and use my face for the profile of the wood, like a Rubin vase. It will be partially hollow, to make room for the electronics, and to take air in from the bottom for cooling.
On top of the bronze, I’m still not entirely sure what I’ll do. I would like to use another piece of turned wood, but it depends a lot on how much heat the lamp produces. I’m hoping that the large bronze piece will provide sufficient area to radiate the heat produced by the LEDs and power conversion. If it doesn’t, I’ll need a heatsink or hot air outlets above the bronze. I would like to avoid noise, so using a fan will be last resort. Hopefully convection will be sufficient, but I have a lot of designing and testing different heatsink arrangements to do before I’ll know. I won’t even know how much heat the whole thing generates until I have it all wired up on my workbench for testing.
100 Watts of LED Power
I spent some time researching lumens, candela, and LED efficiency, and testing out a few different LEDs, trying to find out what I would need to have 12 RGB LEDs that, combined, are as bright as a 100 watt incandescent bulb. I know that a 100 watt bulb is around 1800 lumens, but I don’t know how to take the “luminous flux” of the red, green, and blue LEDs that make up RGB LEDs, and calculate the lumens of white light it will product. Since I couldn’t figure that out, I just approximated, a lot. LEDs convert more of their electrical power to light than an incandescent bulb, and produce less heat as a result, so I think that supplying 90 watts of power to LEDs should be brighter than a 100 watt light bulb. In the end, I think the LEDs and power supplies I’ve chosen are a bit overpowered for the job, but this means I can run them at less than peak power the vast majority of the time, which should be more efficient, and thus produce less heat. I won’t know how bright they are until everything is hooked up, which should be happening soon, but has been a long and slow process.
The LEDs I’m currently planning to use are LED Engin 10W RGGB LEDs. Each green LED will be running at half of what it’s rated though, so I should only be drawing about 7.5 watts. With 12 LEDs running at that, level of power, that should be drawing around 90 watts.
Powering LEDs this powerful isn’t terribly difficult, in it’s simplest form. However, doing so efficiently (to reduce heat) and in a small package has turned out to be a challenge. The simple resistor method, so common in hobby electronics for small LEDs, produces a lot of heat at these power levels. It also regulates constant(ish) voltage, not current, and constant-current regulation is what you need if you want LEDs to last a long time. Even simple constant-current circuits using transistors product just as much heat though. The only efficient way to regulate the current to LEDs of this power is to use a switching power supply, a constant-current buck driver. Unfortunately, my electronics knowledge isn’t extensive enough to allow me to design and build buck drivers. I tried. I spent a lot of time reading, learning, and trying. I had some fun, learned a bit, but I was never able to come up with something that worked.
Thankfully, I didn’t need to! Just as I was getting frustrated with my inability to create a constant current buck driver, the wonderful Ethan Zonca of Protofusion designed the excellent PicoBuck, and collaborated with SparkFun to sell them. As sold, it regulates current at 350ma, but swapping one resistor will bring that up to 700ma, which is (only just) within the tolerances of the parts used. Armed with 12 of these, and the resistors to swap, I should be able to safely power these 12 LEDs. The parts only just arrived recently, so I have yet to get all the soldering done and test everything.
Upstream of all this, a 192 watt AC to 12v DC adapter will be feeding power to the lamp. Having this power adapter in-line like that, rather than inside the lamp, helps move some of the heat production out to where I won’t have to deal with it.
PWM controlling the LEDs has been another interesting challenge. After a few attempts at writing code to do bit-banging 10 or 12 bit PWM from an ATTiny85, I noticed that Adafruit had just announced a new product, a 24-channel 12-bit PWM controller. It’s basically exactly what I was looking for, two of those should do the trick perfectly. I need more than the standard 8 bit PWM resolution so that I have some extra resolution to use to compensate for the fact that all 12 LEDs won’t be the same brightness due to manufacturing differences. With the extra resolution, the software should be able to do a bit of adjustment to account for this.
The part of the lamp that excites me the most is the peripherals. An idea I had early on in the project was that on it’s own, the lamp wouldn’t actually do anything. Everything would be driven by peripherals. A processor inside the lamp will work with what I’m calling “virtual lights”, which are light sources which have a hue, saturation, brightness, and angle. Peripherals will send commands to the processor in the lamp, to create and destroy virtual lights, and to change their angle and colour. The lamp processor will take these virtual lights and blend them into the 12 LEDs.
For example, one peripheral might create 12 virtual lights, spaced evenly around 360 degrees, and set them to white, at some level of brightness. The lamp would seem like just a lamp. However, another peripheral could check my email, and when it sees new emails, create a new virtual light, tell the lamp to make it red, and sweep it from 0 degrees all the way around to 359 degrees, before fading it back out. That peripheral would not know or care that another peripheral has created the white lights. The lamp processor would take care of blending all the virtual lights together.
An “override” feature would allow a peripheral to apply an offset to the hue, saturation, luminance, and/or angle of all virtual lights on the lamp, so that peripherals could dim the light momentarily, or perhaps slowly shift the colour towards red as the evening wears on.
The lamp will detect when peripherals are unplugged, and remove any of the virtual lights that were created by the peripheral. This way, peripherals can be plugged in and unplugged without concern. There will probably be some peripherals that are somewhat permanent though, that are mounted inside the lamp, rather than plugging in to the outside. A wifi peripheral is one that would potentially be “built in” like that.
I’ve made good progress on the software for peripherals, with one demonstration video posted on YouTube. It demonstrates quite nicely how 4 peripherals could interact, creating different coloured lights, that are blended together by the lamp.
At the moment, I’m trying to determine the electrical end of things for the peripheral bus. My original attempt involved i2c, taking advantage of it’s multi-master ability to have peripherals send commands to the lamp processor. However, the slow speed (maximum of 400kbit on an ATMega328, more commonly known as the microcontroller in the Arduino) of i2c wasn’t compatible with what I’m aiming for. I would like for the lamp to be able to handle 100 virtual lights, at 60 frames per second updates, and one command per virtual light sent from peripherals every frame. That works out to 6000 commands per second, which at 400kbit, only allows for 8 bytes per command. They will probably fit, but that’s still a bit tight, and doesn’t even allow for the lamp’s processor to spend the time it needs blending the virtual lights, and updating the LEDs’ PWM controllers.
Instead, I’ve decided to use SPI, which allows much faster communication. However, the requirement of the chip-select line means more pins needed on the connection to peripherals, and more pins needed from the lamp controller. This has taken me down the path of using 74xx150 and 74xx154 chips to multiplex/demultiplex both the chip select, and the peripheral detect. I’ll be breadboarding potential bus layouts over the next few weeks, as well as getting the LEDs all hooked up and run at full power for the first time. It’s getting exciting. 🙂