Light up your desk with this dimmable LED softbox! With 3D printed diffuser and honeycomb light shaper.
Powered by a LiPo battery (4S-7S) with an XT-60 connector. It has rails on the bottom for adding mounts and accessories!
Designed to fit on the Prusa i3's bed: a 250mm by 210mm build area is required for best results.
A 240x200mm bed is okay if you don't need to print the honeycomb light modifier, or if you remove its two little handles.
A 210x130mm bed is okay if you don't want to print either the diffuser or the light modifier. You can make a diffuser using baking paper stretched over a cardboard frame instead, or design a diffuser that can be printed in two pieces.
Note: Slicing instructions are based on Slicer PE 1.42-alpha3
- Mean Well dimmable DC-DC LED driver: LDD-1500LW, LDD-1200LW or LDD-1000LW (datasheet PDF), I bought mine from Mouser
- LED strip (white), I used 1 metre of it: From banggood
- Blade fuse holder: From banggood. The fuse holder that the panel cutout is designed for is marked "JEF" inside the fuse cover, and I believe this is that model.
- 2A blade fuse (or source a single fuse locally): From banggood
- 20mm diameter circular snap-fit panel-mounted power switch
- 24AWG silicone wire (1m should be enough): From banggood. Silicone-jacketed wire is nice because of its high temperature resistance. 26AWG would also work.
- XT-60 male connector: From HobbyKing (buy them in pairs because you should have the female connector plugged into the male during soldering for heatsinking and alignment)
- 12mm 5k potentiometer with 1/4 inch shaft. The one I designed for was from my local hobby shop, and appears to be Alpha brand, however it's not on their current product list
- 2.5V voltage reference (LM336-2.5 datasheet)
- 3x10k trimpots, or 1/4 watt resistors
- Circuit prototyping board that can be cut down to be around 20mm wide (score the board with a knife and snap it through a line of drill holes). You could skip this and build it rats-nest style.
- 220x150mmx0.5mm aluminium sheet. The thickness is not critical, but 0.5mm is easy to work with.
- 200mm velcro battery strap: from HobbyKing
- Optionally, a little strip of velcro to anchor the battery tray to the lightbox
- Soldering iron
- Tin snips and file/sandpaper for cleaning up burrs if you need to cut your aluminium sheet to size
- Drill and 3mm drill bit for drilling aluminium plate and for cleaning up screwholes
- Hot glue gun, or similar adhesive like double-sided foam tape, for securing electronics
- 4x M3x10 cap head screws and nuts for securing fuse holder and XT-60 mount
- 4x M3x12 cap head screws and nuts for securing aluminium plate
- Designed to use this kit of Suleve screws: From banggood
- 6-36V is the input range of the LED driver. The datasheet for it notes that the minimum step-down voltage as 3V, so you'll want to give it 12+ volts for a 12V LED strip to achieve maximum brightness. My driver only drops 0.4V, so I'm not sure if 3V is a typo for 0.3V.
- If you choose to power it with a LiPo battery, use a 4S-7S battery. 3S works but won't maintain maximum brightness. Example 4S 2200mAh battery from HobbyKing, example 4S 3000mAh
- If you're using a hobby LiPo, note that these batteries do not have built-in over-discharge protection, so they could be destroyed if you use the light to completely flatten them. Use a voltage alarm like this one from HobbyKing to alert you, although you will want to cover those buzzers with tape to make them quieter for indoor use!
- Any other DC supply in the right voltage range and with at least enough wattage to satisfy your LED strips will work, you can adapt a DC barrel jack to XT-60. An old laptop charger would be perfect. However, if you want to power it exclusively by AC, you may want to just redesign the electronics around a Mean Well AC-DC LED driver instead!
This softbox is built around the Mean Well LDD-1500LW DC-DC LED driver. This accepts 6-36V DC as input, and at full brightness will step down that input voltage in order to drive its output at 1500mA. See the full specifications here:
There is also an LDD-1000L and LDD-1200L (with 1000mAh and 1200mAh peak output currents) that support the analog dimming used here, so choose the one that most closely matches your LED strip's current.
If your LED strips demand less current at their rated input voltage than the Mean Well is configured for, the strips could be overdriven and burn out. In order to prevent this, resistors can be added to the dimming control circuit in order to limit the maximum drive current.
Here's the dimming response curve from the LED driver's datasheet:
I measured the current draw of my 1 metre of LED strips to be 1200mA, and I was using the LDD-1500, so I had to use the dimmer to limit the current (Iout) to 80% of maximum. Looking at the curve, that occurs at approximately 1.9V dimming voltage.
Here's the drive circuit (full size):
The LM336 provides a 2.5V reference voltage, and this is divided by R2, the 5K potentiometer, and R3, to drive the dimming input of the LED driver. R1 limits the current through the system to avoid overdriving the voltage reference when the potentiometer is turned to 0.
Since I want to drive the dimming input to a maximum of 1.9V to limit it to 80% current, R2 needs to drop 2.5-1.9 = 0.6V. If you chose a driver whose output current matches or is lower than your LED strip current, R2 can be omitted.
The Mean Well driver has a large region at the bottom of the dimming curve where the light simply turns off, and this wastes a lot of the rotation of the potentiometer. So I want to drop 0.3V over R3 to cut off most of this region.
This leaves 2.5 - 0.6 - 0.3 = 1.6V to be dropped over the 5k potentiometer.
This allows us to compute the values of R2 and R3 like so:
R2 = 0.6 / 1.6 * 5000 = 1875 ohms
R3 = 0.3 / 1.6 * 5000 = 937 ohms
I used 1.8k for R2 and 1k for R3, since these are standard resistor values, but you could also use a trimpot for R2 and R3 and dial it in to your desired value.
Now it only remains to set R1 to control the current through the voltage reference. TI has an application note all you need to know about voltage references which explains how to choose this:
Rmin = (Vin_max - Vout) / (I_load_min + I_q_max)
Rmax = (Vin_min - Vout) / (I_load_max + I_q_min)
- Vout is 2.5V (the reference voltage).
- I_q_max for my voltage reference was 10mA
- I_q_min was 0.4mA
- My power supply is a 4S LiPo, which varies from 4.2 * 4 = 16.8V (Vin_max) when fully charged to around 3.0 * 4 = 12V (Vin_min) when dead
- I_load_max occurs when the potentiometer is set to 0, so the current is limited by R2 and R3. In my case this was
I_load_max = 2.5 / (1800 + 1000) = 0.00089A
- I_load_min occurs when the potentiometer is set to 5k, so
I_load_min = 2.5 / (1800 + 5000 + 1000) = 0.00032A
Substituting these values in:
Rmin = (16.8 - 2.5) / (0.00032 + 0.01)
Rmax = (12 - 2.5) / (0.00089 + 0.0004)
Rmin = 1386 ohms
Rmax = 7364 ohms
R1 needs to be somewhere inside that range (but avoid setting it to exactly Rmin since this would be driving the voltage reference right on its maximum rating!). I chose 5.6k.
So my final choices for driving 1200mAh of LEDs using the LDD-1500 with a 4S LiPo as a power source:
R1 = 5.6k
R2 = 1.8k
R3 = 1k
Printing the lightbox body
The lightbox should be printed in a neutral PLA colour. Black and silver are both good choices (I went with Prusament Galaxy Silver). White will work too, but it may be too translucent and make the whole lightbox glow. The printed weight is around 400 grams.
The lightbox is designed to be printed in two pieces which slot together with dovetails, and are finished off by gluing a cap to the join at the top. This limits the printing time for each half to around 13 hours each, to avoid overnight printing.
To print a side:
- Add Lightbox - left side.stl (or right side) to the build plate
- Layer height 0.20mm
- Infill 20% rectilinear
- Supports "everywhere"
- On "support material" tab, untick "auto generated supports"
- Add a Support Enforcer to the part using "Lightbox - support enforcer.stl"
Repeat this process to print the other side.
Finally, print "Lightbox - top face joiner.stl" with no supports.
Printing as one piece would use up the entire bed!
Printing as a single piece
Although the lightbox can be printed as a single piece, this will use up every millimetre of the 250x210mm bed, so bed adhesion may be a challenge, and the expected print time is 24 hours.
You can load up the "Lightbox single piece.3mf" file in Slic3r to get a pre-configured project. Otherwise:
Now slice the model and verify that there is no "toolpath detected outside build area" warning on the layers tab (caused by supports extending outside the build plate).
Diffuser with 5% Rectilinear transparent PETG infill
Diffuser with 15% "Scattered Rectilinear" transparent PETG infill
This is a multi-material print, with a 0.1mm white PLA base, 4.8mm of transparent PETG infill, and a 0.1mm white PLA top. Because the bottom layer is so thin, it requires an extremely well calibrated bed level.
Traditional infill patterns build columns to join the bottom and top faces of a part. This is a problem for making diffusers, because those columns will block the horizontal transfer of light, and their shadows will be visible on the face of the diffuser.
Above you can see the result of filling the diffuser with 5% transparent PETG rectilinear infill, compared to a new infill type I'm calling Scattered Rectilinear, at 15%.
Scattered Rectilinear is like Rectilinear, except each layer runs at a random angle, random offset, and with random gaps between lines. Although the resulting infill is very weak, this eliminates the periodic structures of regular Rectilinear infill that are so visually disturbing. The end-result kind of looks like a natural fibre.
Who ordered the spaghetti?
Slicing the STL
I've included presliced gcode for the Prusa i3 MK2, MK2.5 and MK3, but if you want to build it yourself, read on!
Building gcode with Scattered Rectilinear infill requires a customised version of Slic3r. I've compiled a binary for macOS here, based on 1.42.0-alpha3:
To assemble this in Slic3r "Scattered Rectilinear edition", load the FilterBody.stl file, then add FilterHandle.stl to it as a child part. Place the part on the bed so the text faces upwards. Set these print settings:
- Layer height 0.1mm
- First layer height 0.1mm
- Material PETG
- Infill density 15%
- Infill pattern Scattered Rectilinear
- Combine infill every 2 layers
- 2 bottom layers
- 2 top layers
- The default "Start G Code" for the MK3 sets the extrusion multiplier to 95 using the M221 command. I found that 107 worked best for me, and I would recommend setting it to at least 100 in order to get a continuous first layer. MK2 and MK2.5 don't appear to do this.
Add settings to the FilterHandle.stl part:
- 10% rectilinear infill
- 3 tops and 3 bases
- 3 perimeters (it must be set to a different number of perimeters to the rest of the object)
Add a colour change at 0.20mm and another one at 5.0mm.
Switch the display to "Colour Print" and verify that you have one solid layer, then a second solid layer with a new colour, followed by a whole bunch of spaghetti, then one solid layer, then another solid layer in a new colour.
The generated GCode will use PETG temperatures for the whole print, which we don't want. Open it up in a text editor and find this block near the start that sets the initial temperatures:
M104 S230 ; set extruder temp
M140 S85 ; set bed temp
M190 S85 ; wait for bed temp
M109 S230 ; wait for extruder temp
Replace that with:
M104 S215 ; set extruder temp for PLA
M140 S60 ; set bed temp for PLA
M190 S60 ; wait for bed temp
M109 S215 ; wait for extruder temp
And replace "M900 K45; Filament gcode" with "M900 K30; Filament gcode". Now search for "M600", which is the filament change command. The first occurrence looks like this:
M104 S240 ; set temperature
M140 S90 ; set bed temperature
We want to switch to PETG temperatures at this point without changing the bed temperature, so replace that with:
M104 S240 ; set temperature
M900 K45; Filament gcode
Finally, search for M600 again and replace this:
M104 S230 ; Start cooling to an acceptable PETG purge temperature
M104 S215 ; Continue cooling to PLA temperatures as the PLA layer begins
Because the first layer is a thin 0.1mm layer of PLA, your bed must be very well levelled, e.g. with mechanical adjustment. (I used this custom firmware for 7x7 mesh bed levelling, then used the regular bed levelling adjustments in the menus for final adjustments). To tune the extrusion of the first layer to make it nicely continuous, you will need to tweak both the Flow and Live-Z settings.
You can use the Customizable Bed Level Test to tune your settings before attempting to print the diffuser. Configure it to print just a single 0.1mm layer.
Once the first layer successfully completes, the printer will beep at you for a filament swap. Eject the PLA, then wait at least 10 seconds for the nozzle to heat up to PETG temperatures before you start loading the transparent PETG. Note that after confirming that the filament change was successful, the printer will extrude an additional squirt of PETG before zooming off to begin the print - you may want to already have some tweezers ready to grab the waste filament as it departs. Otherwise it makes a big mess that gets baked into the diffuser.
Now a solid PETG layer will print, followed by the scattered rectilinear infill. The printer will sound a little different from normal while printing the infill, since printing at weird angles causes the axes to run at different rates.
Another solid PETG layer and now it's time to switch back to white PLA. You don't need to wait for the nozzle temperature to change this time, as it will only start cooling down to PLA temperatures after the entire filament swap is complete and printing the white PLA top begins.
Phew! If you were successful, now is the time to bask in your printing prowess!
Bed adhesion note
If you're printing on the i3 MK3 with the removable spring-steel plate, you've probably been picking up the plate and holding it by the corners to bend it to remove prints. This leaves fingerprints that ruin PLA adhesion, and you may not have noticed the effect of these if you haven't tried to print to the edges of the plate before. Since these don't clean off completely with isopropyl alcohol, I found I had to clean the bed with acetone to get rid of these and fix my adhesion at the edge. The difference was dramatic, and I no longer had problems with the corners of the diffuser lifting up.
Honeycomb viewed from top - look how little light is visible!
Objects in front of the softbox get the full blast of light.
The honeycomb light modifier restricts the angle of view of the softbox, shaping it into a tighter beam. This is useful when you don't want light to spill onto nearby objects that you're lighting separately.
Printed in black PLA. Avoid white or silver filament, as that would ruin the whole light blocking effect you're trying to achieve!
In Slic3r, load up "Light Modifier.stl". Set these settings:
- Layer height 0.2mm
- Top layers 0
- Bottom layers 0
- Infill type Honeycomb
- Infill Percentage 7%
- Skirt loops 0
Right click on the STL in the object tree and add a Modifier - "Light modifier handle slice zone.stl". Add to the modifier these settings:
- Infill 20% rectilinear
- 3 bottoms, 3 tops, 3 perimeters
The handle modifier must be set to a different number of perimeters to the rest of the object, because otherwise the infill that Slic3r generates will overlap its perimeters and print as an overextruded mess. (Double check this using the layers view).
Orient the print so the little stubby handles are lying on the print-bed. This print spans the entire 250mm width of the Prusa i3 MK3, so you may need to click the "Arrange" button at the top to have Slic3r keep it all within the bed area for you.
The XT-60 connector needs to be installed into the panel mount using a tap from a hammer. The original XT-60 connectors from HobbyKing are high quality nylon and should survive this process without a problem.
Because the pins of the connector will protrude out of the bottom of the panel mount once installed, be sure not to just stand the mount up on your desk to tap it in (you'll end up with two dents in your desk from the pins!). Instead, print two copies of the panel mount, and hold them together as a stack as shown above while you tap the connector in. The bottom mount will act as a protector for the pins.
The panel mount prints without supports, at 100% infill and 0.1mm layer heights. PLA works fine. You may want to add a brim to increase bed adhesion.
Prepare your aluminium mounting plate by cutting it to size and drilling the 3mm mounting holes (in a 200mm x 130mm grid as shown in the PDF). Clean the plate off with isopropyl alcohol, then trim and stick your LED strips to it (I used 5 rows of 4 units). Solder wires to put the strips in parallel with each other (+ to +, - to -), taking care not to allow solder to spill off the side of the strip and short it to the plate.
Use your 3mm drill to clear out the sacrificial bridges that are filling the 4 LED plate mounting holes (you can drill from the front side to use the inside of the mounting posts as a drill bit guide). Thread the longer cap head screws in from the back, slot the plate down on top of them, and secure with 4 M3 nuts. Ensure that the bottom edge of the plate does not foul the XT-60 connector.
Install the XT-60 connector and blade fuse holder into the panel using the shorter M3 screws and M3 nuts. You can use the screw to grab the nuts and pull them into the nut wells - but be sure to align the nut correctly with the well as you do so. Install the power switch into the panel (it should be a snap fit). Slide the potentiometer shaft through and secure with a nut on the front side.
Follow the circuit diagram from the "post-printing" section to add the resistors and the voltage reference to your prototyping board.
Now solder wires between the panel components and LED strips and the circuit board.
Secure the completed board and the LED driver to the bottom of the case (I used hot glue to do so, but you could use double-sided foam tape). Tuck any loose wires behind the mounting plate - everything must sit clear of the slot where the diffuser will slide in from the top of the case.
Note that during operation the aluminium plate will heat up to around 50-60 degrees Celsius with the diffuser installed.
Install a 2A blade fuse into the fuse holder.
Finish assembly by gluing the joiner cap to the top of the lightbox (where there are two halves flapping in the breeze with no dovetail to secure them). I used medium CA and CA activator to get an instant bond.
Use a multimeter across the rails of one of the LED strips to verify that the strip isn't receiving more than its rated voltage (probably 12V) when the dimmer control is set to 100%.
This one is an easy print. PLA, 0.2mm layer height, no supports.
Thread the velcro battery strap through the included holes. You may need to add a thin strip of velcro to the side of the tray (as shown above) to hold the tray securely against the lightbox when installed.