The Smell of Molten Projects in the Morning

Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.

Category: Machine Shop

Mechanical widgetry

  • 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);
    			}
    
    
  • Stabbing Guides

    Many of my solid models have holes for alignment pins made from filament snippets that let me glue the pieces together with near-perfect registration:

    Alignment Hole and Pin
    Alignment Hole and Pin

    A reader who designs oil-field equipment for a living pointed out that, in his world, they’re called “stabbing guides”:

    Stabbing_Point_on_Leg_1
    Stabbing_Point_on_Leg_1

    He specifies steel plate and welding instructions:

    Stabbing_Guide_Type_3
    Stabbing_Guide_Type_3

    Stabbing guides for large modules may rise 25 feet above the deck plates…

    After they install all the little bits on a “part” like this:

    Generator Module - during assembly
    Generator Module – during assembly

    It fits neatly atop the stabbing guides and gets welded to a somewhat larger structure:

    Generator Module - installed
    Generator Module – installed

    No sissy plastic for him!

    My puny pins don’t qualify as stabbing guides, but forgive me if I sneak the term in every now and then…

    Thanks, Tom!

  • Swept Claw Model

    Our Larval Engineer asked for help with an OpenSCAD model of a 3D printable claw that, she says, has nothing at all to do with the upcoming Night of Little Horrors. Not having had an excuse to fiddle with the new (and lightly documented) sweep() functions, I gnawed on the sweep-drop.scad example until this popped out:

    Swept Claw - solid model
    Swept Claw – solid model

    That might be too aggressively sloped up near the top, but it’s a start.

    The OpenSCAD source code:

    use <sweep.scad>
    use <scad-utils/transformations.scad>
    
    function shape() = [[0,-25],[0,25],[100,0]];
    
    function path(t) = [100*(1+sin(-90-t*90)), 0, (100 * t)];
    
    step = 0.01;
    
    path_transforms = [for (t=[0:step:1-step]) 
        translation(path(t)) * 
        scaling([0.5*(1-t) + 0.1,0.75*(1-t) + 0.1,1])];
        
    sweep(shape(), path_transforms);
    
    

    It’s perfectly manifold and slices just as you’d expect; you could affix it to a mounting bracket easily enough.

    Some notes on what’s going on…

    The t index determines all the other values as a function of the layer from the base at t=0 to the top at t=0.99.

    The shape() defines the overall triangular blade cross-section at the base; change the points / size to make it look like you want.

    The path() defines the XYZ translation of each slab that’s extruded from the shape() cross-section. I think the Z value sets the offset & thickness of each slab. The constant 100 in the X value interacts with the overall size of the shape(). The 90 values inside the sin() function set the phase & scale t so the claw bends the right way; that took some fiddling.

    The parameters in scaling() determine how the shape() shrinks along the path() as a function of the t parameter. The 0.1 Finagle Constants prevent the claw from tapering to a non-printable point at the tip. I think the Z value must be 1.000 to avoid weird non-manifold issues: the slabs must remain whatever thickness the sweep functions set them to be.

    It compiles & renders almost instantly: much faster than I expected from the demos.

    The folks who can (and do!) figure that kind of model (and the libraries behind it) from first principles have my undying admiration!

  • Painting By Numbers

    The south- and snowplow-facing numbers on the mailbox weren’t up to the challenge:

    Mailbox - faded numbers
    Mailbox – faded numbers

    I wiped the crud off the reflective labels with denatured alcohol before painting, but that was the extent of the surface preparation.

    I’m not getting graded on my ability to paint within the lines using a foam brush and that’s a Good Thing:

    Mailbox - repainted numbers
    Mailbox – repainted numbers

    That’s Rustoleum Rusty Metal Primer, chosen entirely because it was oil-based, outdoor-rated, and near the front of the shelf. I’m not going to topcoat it; that stuff is on its own. The slight color variations show still-wet primer here & there.

    The north-facing numbers were in better shape, so a few dabs covered the obvious problems.

    Hey, I wiped that peeling paint off the top of the box, too…

  • NSA Zipper Pull Tab: Recovered!

    The NSA pull tab went missing from my belt pack on the way back from a Squidwrench meeting and, despite diligent searching, remained missing for a several weeks. It reappeared from far under the Forester’s front seat, still attached to the severely eroded YKK zipper pull tab:

    Eroded YKK Zipper Tab
    Eroded YKK Zipper Tab

    A stout jump ring from the heap should avoid that problem for the foreseeable future:

    NSA Zipper Pull - restored
    NSA Zipper Pull – restored

    Dang, I missed that thing…

  • Realigning Tweezer Tips

    It’s been a while since the last time I repointed the tweezer collection, but eventually they get to the, ah, point where you can’t pick up a hair:

    Misaligned tweezer jaws
    Misaligned tweezer jaws

    In the midst of shaping the tip of another tweezer:

    Tweezer jaw tips
    Tweezer jaw tips

    The jaws meet at the point, but those end bevels definitely need more attention!

    All in all, a pleasant half hour of Quality Shop Time:

    Realigned tweezers
    Realigned tweezers
  • Leitz Trinovid Eye Tube Lube

    We’ve had this/these Leitz Trinovid 8×20 binocular(s) approximately forever:

    Leitz Trinovid binoculars
    Leitz Trinovid binoculars

    The logo indicates we bought them before Leitz became Leica in 1986…

    Recently, the eye cups became difficult to pull out. The problem seemed to lie in the seal around the exterior of each tube, rather than with the internal mechanism, so I eased the tiniest possible drop of clock oil into each gap, spun the tubes, cycled them in-and-out, and wiped off essentially all of the oil as it spread over the exterior of the tubes.

    The eye cups work fine again!

    Frankly, I felt a like a Visigoth upgrading the Large Hadron Collider, but I trusted those old-school Leitz engineers would protect their optics from everything happening outside the sealed tubes.

    The new Leica Trinovids carry 8×42 optics, with 8×20 glass in the Ultravid Compact Field Optics line. They’re definitely spendy, but probably less in constant dollars than the ones we have; in any event, they’re definitely a a buy-and-hold investment.