LED Ring Desk Lamp

A defunct desk lamp emerged from the clutter and cried out for bright, new LEDs. This adapter puts a small LED ring and nine white LEDs on the original lamp head:

Ring Light Mount - in operation
Ring Light Mount – in operation

Peering into the business end, before mounting it on the lamp, shows some abrasive adjustment on the inside layer:

Ring Light Mount - LEDs installed
Ring Light Mount – LEDs installed

That layer printed over a quick-and-easy support spider:

Ring Light Mount - solid model - bottom
Ring Light Mount – solid model – bottom

The Slic3r preview looking down through the layer just over the support shows that the perimeter of those LED holes doesn’t have much support:

Ring Light Mount - Slic3r preview - bridge layer
Ring Light Mount – Slic3r preview – bridge layer

The obvious threads drooped in the predictable way, so I just clipped them off, sanded the high spots into submission, and epoxied everything in place:

Ring Light Mount - LED wiring
Ring Light Mount – LED wiring

That nice Hilbert Curve infill is completely wasted inside the OEM shade, but the smooth curve around the rim had to be on the top surface.

Rather than beefing up the support, you should print the bottom ring (or the top rim) separately, then glue it back on, but I wanted to see how well simple support worked with PETG.

It came out reasonably well:

Ring Light Mount - support spider
Ring Light Mount – support spider

That’s far more hair than usual, even for PETG, because I made the spider’s legs exactly three thread widths wide. Slic3r reduced the single infill thread to, literally, a hair that didn’t stick to the platform; the model now has four-thread-wide legs.

Slic3r’s automatic support would do a better job of holding up the underside, albeit with more plastic and printing time:

Ring Light Mount - Slic3r preview - auto support
Ring Light Mount – Slic3r preview – auto support

The top view looks about like you’d expect:

Ring Light Mount - solid model - top
Ring Light Mount – solid model – top

Those two solid models show the small hole for the LED ring wiring, which I drilled into the as-printed plastic. The original layout included just the LED ring, with the wire through a big central hole, but then I realized the wall wart had enough moxie for a few more LEDs. So it goes.

Anyhow, the lamp provides just enough illumination below my big monitors to suffice. The gooseneck might not be quite long enough, but that’ll be another project…

The OpenSCAD source code:

// LED Ring Light Mount
// Ed Nisley KE4ZNU October 2015

DoSupport = true;

//- Extrusion parameters must match reality!

ThreadThick = 0.25;
ThreadWidth = 0.40;

HoleWindage = 0.2;

Protrusion = 0.1;			// make holes end cleanly

inch = 25.4;

function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);

//----------------------
// Dimensions

NumSides = 8*4;						// number of sides on each "cylinder"

LENGTH = 0;
ID = 1;
OD = 2;

Shade = [6.0,45.2,47.5];			// threaded end of OEM lamp shade
RingLED = [4.5,36.0,51.0];

SpotLED = [2.0,0,5.0];				// discrete LEDs in center
NumSpots = 8;						// discrete LEDs around the one in the middle

Support = [(RingLED[LENGTH] - 1*ThreadThick),0,(RingLED[OD] - 4*ThreadWidth)];
NumSupports = NumSides/2;

ThreadBase = RingLED[LENGTH] + SpotLED[LENGTH];
OAHeight = ThreadBase + Shade[LENGTH];

//----------------------
// Useful routines

module PolyCyl(Dia,Height,ForceSides=0) {			// based on nophead's polyholes

  Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2);

  FixDia = Dia / cos(180/Sides);

  cylinder(r=(FixDia + HoleWindage)/2,
           h=Height,
	   $fn=Sides);
}

//----------------------
// Build it

	difference() {
		union() {																				// overall shape
			translate([0,0,ThreadBase])
				rotate_extrude(convexity = 2, $fn=NumSides)
					translate([Shade[OD]/2,0])
						circle(r=Shade[LENGTH],$fn=NumSides);
			cylinder(d=(Shade[OD] + 2*Shade[LENGTH]),h=ThreadBase,$fn=NumSides);
			translate([0,0,ThreadBase])
				cylinder(d=Shade[OD],h=Shade[LENGTH],$fn=NumSides);
		}
		
		translate([0,0,ThreadBase - Protrusion])
			cylinder(d=(Shade[ID] + HoleWindage),h=(Shade[LENGTH] + 2*Protrusion),$fn=NumSides);	// opening for shade thread
			
		translate([0,0,-Protrusion])
			cylinder(d=(RingLED[OD] + HoleWindage),h=(RingLED[LENGTH] + Protrusion),$fn=NumSides);	// opening for LED ring
			
		rotate(180/NumSides)																		// LED ring power wire
			translate([RingLED[ID]/2,0,0])
				rotate(180/6)
					PolyCyl(2.5,OAHeight,6);
			
		rotate(180/8  - 180/NumSides)
			PolyCyl(SpotLED[OD],OAHeight,8);														// central LED SpotLED
			
		for (i=[0:NumSpots-1])																		// surrounding spots
			rotate(i*360/NumSpots - 180/NumSides)
				translate([(RingLED[ID] - 2*SpotLED[OD])/2,0,0])
						rotate(180/8)
							PolyCyl(SpotLED[OD],OAHeight,8);
	}
	
//-- Support structure

	if (DoSupport)
		color("Yellow")
		rotate(180/NumSides)													// align bars to flat internal faces
			for (i=[0:NumSupports/2 - 1]) {
				rotate(i * 360 / NumSupports)
					translate([0,0,Support[LENGTH]/2])
						cube([Support[OD],4*ThreadWidth,Support[LENGTH]],center=true);
			}