Introduction: Build the Ultimate Larson Scanner!
I have watched the availability of high power (>10W) LED's jump over the past year or so and... drop in price. I came across some very inexpensive 10W white LED's from Deal Extreme that were in the $3 dollar range and put out 900lumens, which is more than a 60W incandescent bulb. I immediately thought 16 of these would make a great Larson scanner. What exact neuron sequence fired in my brain that caused this thought is unknown, but it seemed like a good idea! So as we say in Texas, “Hold my beer, I want to try something”.
To be able to use these I needed the ability to easily regulate the current to them and to be able use a PWM signal to adjust the brightness. So I started thinking about it and doing some research. I also needed it to be simple and not require surface mount components and making circuit boards. I found some nice designs based on switching inverters but most of these were intended to be efficient constant current LED drivers with one brightness level. Or in the case of flashlight drivers, a couple of brightness levels.
To be able to use these I needed the ability to easily regulate the current to them and to be able use a PWM signal to adjust the brightness. So I started thinking about it and doing some research. I also needed it to be simple and not require surface mount components and making circuit boards. I found some nice designs based on switching inverters but most of these were intended to be efficient constant current LED drivers with one brightness level. Or in the case of flashlight drivers, a couple of brightness levels.
Step 1: The Driver
Then I came across the classic MOSFET constant current driver for LED's. There is a great instructable for this one here:
Below is my rendering of the schematic. (Original then with two mods to allow PWM)
The only thing missing was how to PWM it. I had an idea. What if instead of connecting the collector resistor to the main positive supply, I connected it to the output pin on an Arduino? If the pin was low (ground) it should turn the MOSFET off and thus the LED. After a little breadboarding I discovered that it worked great! This opened up a lot of possibilities for driving high power LED's as the component costs for each one of these is about a dollar and they are simple to build. Instead of a breadboard. I used the old standby: Point to point.
Doing a little research on Digikey I found a great MOSFET to use. It is T-220 mount and the case is entirely plastic. This means you don't have to worry about insulating the electrical connection to the metal tab when you mount it. And, it was less than a dollar if you buy in bulk.
Along with the 10W LED's from Deal Extreme, I found an 80W warm white one for $18 and a 60W RGB one for $21. That site is dangerous. 60WRGB LED's are like crack. I ordered a couple of each and some of the plastic reflectors to go with them.
How it works (yea, the math stuff):
The heart of this current regulator is the NPN transistor. I am using the 2n3904 which has a .7V drop on the Base Emitter junction when forward biased. This voltage is also present across the Sensing Resistor Rsense. Which is also where the LED current flows to ground. Because we always have .7V here we can pick a value for this resistor that sets our LED current. To function properly the NPN transistor needs to be biased into its normal range of somewhere between 1 and 10 milliamps of current. This is where the Collector Resistor comes into play We need to size this based on the supply voltage. If it is a stand alone regulator, meaning you just want to always light the LED's at the correct current, you should use 3.3K to 4.7K and that will work with 12VDC all the way up to 35VDC. Why would we need the different voltages? We will see when we look at the different high powered LED's.
There are a couple versions of the constant current regulator:
The first is the classic, I just want to have my LED supplied by a constant current and not control it. Use the first circuit for that one.
Second it the “I am going to control it from and Arduino pin directly” This one also will also work for any 5volt logic gate such as the wonderful 74595 TTL shift register. There are libraries out there to drive these from an Arduino and string many of them together. This circuit will work for this application. The only real difference is that we are connecting the collector resistor to the logic output pin. If you use a 3.3K resistor the most load the gate will see is 1.5ma of current. Well within the drive capability of the TTL chip and an Arduino.
Third (and this is what I am using for my 6 foot Larson scanner!) is this one. It is the Sparkfun breakout board for the TLC5490 which conveniently has a 2.2K resistor tied to VCC on the PWM outputs. For those of you new to this chip, it features 12bit PWM and is meant to directly drive LED's up to 100ma or servo's. There are libraries for the Arduino to do just that. In particular there is a great one written by Alex Leone. You can find it here: This is the one I am using to drive my Larson Scanner.
Because the Sparkfun breakout board includes a 2.2 K resistor, I don't have to include a resistor on my current regulator. How awesome is that? You have to be aware that now when the TLC5490 is “off” the 2.2K resistor turns "on" the transistor and the LED. So to turn the LED off, you have to turn on the TLC5490 output. In the code driving it you just have to think backwards sending the TLC a value of 0 turns the LED on full brightness and a value of 4095 turns it off.
I have played around with this chip for awhile and have always wanted to use it to drive larger loads. Plus running it at 100ma per output gets it very hot. Using an external current regulator for the load like this barely gets the chip warm.
Below is my rendering of the schematic. (Original then with two mods to allow PWM)
The only thing missing was how to PWM it. I had an idea. What if instead of connecting the collector resistor to the main positive supply, I connected it to the output pin on an Arduino? If the pin was low (ground) it should turn the MOSFET off and thus the LED. After a little breadboarding I discovered that it worked great! This opened up a lot of possibilities for driving high power LED's as the component costs for each one of these is about a dollar and they are simple to build. Instead of a breadboard. I used the old standby: Point to point.
Doing a little research on Digikey I found a great MOSFET to use. It is T-220 mount and the case is entirely plastic. This means you don't have to worry about insulating the electrical connection to the metal tab when you mount it. And, it was less than a dollar if you buy in bulk.
Along with the 10W LED's from Deal Extreme, I found an 80W warm white one for $18 and a 60W RGB one for $21. That site is dangerous. 60WRGB LED's are like crack. I ordered a couple of each and some of the plastic reflectors to go with them.
How it works (yea, the math stuff):
The heart of this current regulator is the NPN transistor. I am using the 2n3904 which has a .7V drop on the Base Emitter junction when forward biased. This voltage is also present across the Sensing Resistor Rsense. Which is also where the LED current flows to ground. Because we always have .7V here we can pick a value for this resistor that sets our LED current. To function properly the NPN transistor needs to be biased into its normal range of somewhere between 1 and 10 milliamps of current. This is where the Collector Resistor comes into play We need to size this based on the supply voltage. If it is a stand alone regulator, meaning you just want to always light the LED's at the correct current, you should use 3.3K to 4.7K and that will work with 12VDC all the way up to 35VDC. Why would we need the different voltages? We will see when we look at the different high powered LED's.
There are a couple versions of the constant current regulator:
The first is the classic, I just want to have my LED supplied by a constant current and not control it. Use the first circuit for that one.
Second it the “I am going to control it from and Arduino pin directly” This one also will also work for any 5volt logic gate such as the wonderful 74595 TTL shift register. There are libraries out there to drive these from an Arduino and string many of them together. This circuit will work for this application. The only real difference is that we are connecting the collector resistor to the logic output pin. If you use a 3.3K resistor the most load the gate will see is 1.5ma of current. Well within the drive capability of the TTL chip and an Arduino.
Third (and this is what I am using for my 6 foot Larson scanner!) is this one. It is the Sparkfun breakout board for the TLC5490 which conveniently has a 2.2K resistor tied to VCC on the PWM outputs. For those of you new to this chip, it features 12bit PWM and is meant to directly drive LED's up to 100ma or servo's. There are libraries for the Arduino to do just that. In particular there is a great one written by Alex Leone. You can find it here: This is the one I am using to drive my Larson Scanner.
Because the Sparkfun breakout board includes a 2.2 K resistor, I don't have to include a resistor on my current regulator. How awesome is that? You have to be aware that now when the TLC5490 is “off” the 2.2K resistor turns "on" the transistor and the LED. So to turn the LED off, you have to turn on the TLC5490 output. In the code driving it you just have to think backwards sending the TLC a value of 0 turns the LED on full brightness and a value of 4095 turns it off.
I have played around with this chip for awhile and have always wanted to use it to drive larger loads. Plus running it at 100ma per output gets it very hot. Using an external current regulator for the load like this barely gets the chip warm.
Step 2: Let's Build It!
To build the Ultimate Larson Scanner, you will need the following things:
16 10W LED's (Deal Extreme) here
16 Constant Current Regulators consisting of:
1 N-Channel MOSFET Digikey
1 .75Ohm 1W Resistor Digikey
1 2n3904 Transistor Digikey
1 TLC5940 Breakout Board from Sparkfun
1 Arduino Pro Mini Sparkfun or Boarduino Adafruit I have used both
16 Heatsinks I got mine surplus. They need to be about the size of the ones I am using or your LED's will overheat
6ft angle aluminum 1 1/2”X 1 1/2” Home Depot or Lowes
Wire: 22 gauge for the control connection
18 gauge for the power leads
A 12 volt power supply capable of at least 16 amp output (assuming all the LED's are lit at once)
Stand to hold the scanner once complete This one is cheap and works great 140-ENDZONE-M
miscellaneous screws nuts etc to mount all the LED modules.
4-40 standoff's Digikey
Tools:
Soldering tools
Drill and drill bits
4-40 tap
8-32 tap
Heat shrink tubing
tie wraps
16 10W LED's (Deal Extreme) here
16 Constant Current Regulators consisting of:
1 N-Channel MOSFET Digikey
1 .75Ohm 1W Resistor Digikey
1 2n3904 Transistor Digikey
1 TLC5940 Breakout Board from Sparkfun
1 Arduino Pro Mini Sparkfun or Boarduino Adafruit I have used both
16 Heatsinks I got mine surplus. They need to be about the size of the ones I am using or your LED's will overheat
6ft angle aluminum 1 1/2”X 1 1/2” Home Depot or Lowes
Wire: 22 gauge for the control connection
18 gauge for the power leads
A 12 volt power supply capable of at least 16 amp output (assuming all the LED's are lit at once)
Stand to hold the scanner once complete This one is cheap and works great 140-ENDZONE-M
miscellaneous screws nuts etc to mount all the LED modules.
4-40 standoff's Digikey
Tools:
Soldering tools
Drill and drill bits
4-40 tap
8-32 tap
Heat shrink tubing
tie wraps
Step 3: Build the 16 LED Modules
Now we are going to build the modules that contain the constant current regulators and the LED's
Prepare the heat sinks. I found these rectangular ones at Tanner Electronics in Dallas. I drilled and tapped 4-40 holes to mount the LED module in. There were already some holes tapped for 4-40 screws and I used one of those for the MOSFET. I also drilled and tapped a 8-32 hole to mount to the angle aluminum.
Mount the MOSFET onto the heat sink using a 4-40 screw. Then bend the two outside leads up leaving the middle one straight. Lay the transistor flat side down and bend the right hand lead at a 90 degree angle. Now spread the other two leads apart around 45 degrees. Form a half loop in both of these leads. Attach the two loops to the outer leads on the MOSFET and solder. Attach the .75 Ohm resistor to the right hand lead of the MOSFET and the transistor lead that was bent at a 90 degree angle. Form a loop with some of the remaining resistor lead. This is the Ground connection.
Connect the center lead of the MOSFET to the Cathode (negative side) of the LED module.
Now build 15 more of these!
Prepare the heat sinks. I found these rectangular ones at Tanner Electronics in Dallas. I drilled and tapped 4-40 holes to mount the LED module in. There were already some holes tapped for 4-40 screws and I used one of those for the MOSFET. I also drilled and tapped a 8-32 hole to mount to the angle aluminum.
Mount the MOSFET onto the heat sink using a 4-40 screw. Then bend the two outside leads up leaving the middle one straight. Lay the transistor flat side down and bend the right hand lead at a 90 degree angle. Now spread the other two leads apart around 45 degrees. Form a half loop in both of these leads. Attach the two loops to the outer leads on the MOSFET and solder. Attach the .75 Ohm resistor to the right hand lead of the MOSFET and the transistor lead that was bent at a 90 degree angle. Form a loop with some of the remaining resistor lead. This is the Ground connection.
Connect the center lead of the MOSFET to the Cathode (negative side) of the LED module.
Now build 15 more of these!
Step 4: Connect the Arduino and the Breakout Board
I used this diagram to connect the two circuit boards. It is from the Arduino Playground and the github repository for the TLC5940 library. Now for power. You need to connect the ground from both boards together. If you are using the Sparkfun Arduino Pro Mini there is a unregulated positive voltage pin called RAW. Connect that to the VCC pin on the breakout board. Both of these boards have a +5volt regulator that can handle up to 17 volts. If you are using a Boardunio you can use a plug to supply raw power to the board. The Boarduino has a 7805 regulator on board that will easily work up to 12VDC. You have to set the jumper to power it from the programming cable then back to external when finished.
Prior to mounting the circuit boards you must program the Arduino.
My code uses the TLC5940 library written by Alex Leone. I am using the fade function and assigning a fade to an LED, waiting 40msec with a fade time of 470msec then moving to the next LED. Once the scan completes in one direction, I scan back the other way. You can easily change values, scan one direction only or do other cool things. Note that because there is bascially an inverted function for lighting the LED's I initialize all the outputs of the TLC5940 to 4095 which turns them off. The fade value is from 0 to 4095 which is full on to full off.
Code:
#include "Tlc5940.h"
#include "tlc_fades.h"
TLC_CHANNEL_TYPE channel;
void setup()
{
Tlc.init(4095);
}
uint16_t duration = 470;
int maxValue = 4095;
int fadeTime = 40;
uint32_t startMillis;
uint32_t endMillis;
void loop()
{
if (tlc_fadeBufferSize == 0)
{
// no fades are currently running
startMillis = millis();
endMillis = startMillis + duration;
for (int i=0; i<16; ++i) {
tlc_addFade(15-i, 0, maxValue, startMillis+fadeTime*i, endMillis+fadeTime*i);
}
}
tlc_updateFades();
delay(5);
if (tlc_fadeBufferSize == 0)
{
// no fades are currently running
startMillis = millis();
endMillis = startMillis + duration;
for (int i=0; i<16; ++i) {
tlc_addFade(i, 0, maxValue, startMillis+fadeTime*i, endMillis+fadeTime*i);
}
}
tlc_updateFades();
delay(5);
}
Prior to mounting the circuit boards you must program the Arduino.
My code uses the TLC5940 library written by Alex Leone. I am using the fade function and assigning a fade to an LED, waiting 40msec with a fade time of 470msec then moving to the next LED. Once the scan completes in one direction, I scan back the other way. You can easily change values, scan one direction only or do other cool things. Note that because there is bascially an inverted function for lighting the LED's I initialize all the outputs of the TLC5940 to 4095 which turns them off. The fade value is from 0 to 4095 which is full on to full off.
Code:
#include "Tlc5940.h"
#include "tlc_fades.h"
TLC_CHANNEL_TYPE channel;
void setup()
{
Tlc.init(4095);
}
uint16_t duration = 470;
int maxValue = 4095;
int fadeTime = 40;
uint32_t startMillis;
uint32_t endMillis;
void loop()
{
if (tlc_fadeBufferSize == 0)
{
// no fades are currently running
startMillis = millis();
endMillis = startMillis + duration;
for (int i=0; i<16; ++i) {
tlc_addFade(15-i, 0, maxValue, startMillis+fadeTime*i, endMillis+fadeTime*i);
}
}
tlc_updateFades();
delay(5);
if (tlc_fadeBufferSize == 0)
{
// no fades are currently running
startMillis = millis();
endMillis = startMillis + duration;
for (int i=0; i<16; ++i) {
tlc_addFade(i, 0, maxValue, startMillis+fadeTime*i, endMillis+fadeTime*i);
}
}
tlc_updateFades();
delay(5);
}
Step 5: Mount the Modules
We need to prepare the aluminum angle to hold everything. Measure 16 evenly spaced holes to mount the LED modules on. This works out to 4.5” apart for a six foot span. I started 2” in from one end. Then on the inside of the angle aluminum, I drilled a few holes to mount the breakout board and the Arduino. I used a couple 4-40 standoffs.
Mount the LED Modules and the two circuit boards to the aluminum angle
I used 8-32 screws to hold the heat sinks to the angle aluminum. When they are all mounted it is time to connect every thing. For power I split the the modules into four zones. I wired the Positive and Ground wires to four modules then connected the wires for the four sets together at one junction. I used 18 gauge wire for this. Remember, each LED can draw almost one amp of current. Then I connected the four power wires (and the circuit board power for a total of five) to a 16 gauge wire that I ran to the power supply.
After the power wires are connected you need to connect each module control line (the collector of the transistor to the Sparkfun breakout board. I used tie wraps to keep everything neat and tidy (or as best as I could!)
Once you have wired everything up, take a break then double check your work. You can do some serious damage with a switching power supply that can put out 20 amps. I know this one the hard way. I smoked a 10W led because I essentially connected it straight across the supply. It got very bright then released a lot of smoke. It then got dark and stayed dark.
Once you are satisfied you wired everything correctly, fire the bad boy up! Remember, this puts out several thousand lumens. Just the thing to point at your neighbors windows at night!
Mount the LED Modules and the two circuit boards to the aluminum angle
I used 8-32 screws to hold the heat sinks to the angle aluminum. When they are all mounted it is time to connect every thing. For power I split the the modules into four zones. I wired the Positive and Ground wires to four modules then connected the wires for the four sets together at one junction. I used 18 gauge wire for this. Remember, each LED can draw almost one amp of current. Then I connected the four power wires (and the circuit board power for a total of five) to a 16 gauge wire that I ran to the power supply.
After the power wires are connected you need to connect each module control line (the collector of the transistor to the Sparkfun breakout board. I used tie wraps to keep everything neat and tidy (or as best as I could!)
Once you have wired everything up, take a break then double check your work. You can do some serious damage with a switching power supply that can put out 20 amps. I know this one the hard way. I smoked a 10W led because I essentially connected it straight across the supply. It got very bright then released a lot of smoke. It then got dark and stayed dark.
Once you are satisfied you wired everything correctly, fire the bad boy up! Remember, this puts out several thousand lumens. Just the thing to point at your neighbors windows at night!
Step 6: Taking It Further
If you just want to make an on "all the time light" all you need to do is connect a 3.3K to 6.8K 1/4 ohm 1/4W resistor between the control input (the collector on the transistor) and the positive lead of the LED.
If you want to control different high power LED's such as this 30W RGB and 60W RGB you need to change the size of the sensing resistor Rsense. You will also need a different supply voltage. For example the 30W LED has 10 emitters in series. The 60W has two of the series strings in parallel. Here are the thumb rules for LED's like this: Each LED is a one watt emitter. It needs 300-350ma to produce one watt of output. So for every string you need 100-350ma. This is why our Larson Scanner constant current supply puts out almost an amp of current. There are three strings in series. The next thing to figure out is how much voltage do I need to get these LED's lit? The Red LED's use about 1.8 volts and Blue and Green need about 3.2V or so. With ten in series we need about a 35VDC supply for the blue and green. I used three of these regulators to run a 60W RGB and with an Arduino turned it into the brightest color fading behemoth ever! They run off of a 35VDC switching supply. I had to use a 7812 to drop the 35volts down before going into the Boardunio's 5 volt regulator. I see a couple really cool projects with these LED's coupled to some lenses. They put out enough light to make single LED wall washers and stage lights.
One final note, you must heat sink these kind of LED's or they will fail. As much as I love Deal Extreme, they do not supply data sheets with their parts. A general rule for LED's like these is that the die must remain below 150C. I prefer to keep them below 80C. The heat sinks I am using on the 10W emitters keep the die at around 55C. By themselves the heat sinks get to hot to touch but they protect the LED's
Enjoy and MAKE IT GLOW!
If you want to control different high power LED's such as this 30W RGB and 60W RGB you need to change the size of the sensing resistor Rsense. You will also need a different supply voltage. For example the 30W LED has 10 emitters in series. The 60W has two of the series strings in parallel. Here are the thumb rules for LED's like this: Each LED is a one watt emitter. It needs 300-350ma to produce one watt of output. So for every string you need 100-350ma. This is why our Larson Scanner constant current supply puts out almost an amp of current. There are three strings in series. The next thing to figure out is how much voltage do I need to get these LED's lit? The Red LED's use about 1.8 volts and Blue and Green need about 3.2V or so. With ten in series we need about a 35VDC supply for the blue and green. I used three of these regulators to run a 60W RGB and with an Arduino turned it into the brightest color fading behemoth ever! They run off of a 35VDC switching supply. I had to use a 7812 to drop the 35volts down before going into the Boardunio's 5 volt regulator. I see a couple really cool projects with these LED's coupled to some lenses. They put out enough light to make single LED wall washers and stage lights.
One final note, you must heat sink these kind of LED's or they will fail. As much as I love Deal Extreme, they do not supply data sheets with their parts. A general rule for LED's like these is that the die must remain below 150C. I prefer to keep them below 80C. The heat sinks I am using on the 10W emitters keep the die at around 55C. By themselves the heat sinks get to hot to touch but they protect the LED's
Enjoy and MAKE IT GLOW!