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

  • Plant Stand Feet

    The houseplants have migrated indoors after spending a summer charging up in the sun on the patio, which means it’s time to replace the silicone rubber feet on the bottom of the plant shelves. This year, I printed a set of feet to fit the hex-head adjustable feet:

    Plant Stand Foot - installed
    Plant Stand Foot – installed

    The pencil-stem plant on the left, for whatever it’s worth, is a perfectly healthy Rhipsalis that greatly enjoyed the summer sun.

    The feet print upside-down to give the surface around the hex a smooth finish. I used Slic3r’s Hilbert Curve for pattern a bit more interesting than the usual parallel lines:

    Plant Shelf Foot - as built
    Plant Shelf Foot – as built

    The Hilbert curve doesn’t fit neatly into a non-rectangular shape, but it’s close enough.

    The solid model includes the support structure:

    Plant Shelf Foot - solid model - bottom
    Plant Shelf Foot – solid model – bottom

    Which pops out cleanly:

    Plant Shelf Foot - support material detail
    Plant Shelf Foot – support material detail

    Yes, that’s a shred of red filament embedded on the left side. Cleanliness is next to impossible…

    The fuzzy felt feet come from a 6 mm thick slab of the stuff:

    Plant Shelf Foot - cutting felt plugs
    Plant Shelf Foot – cutting felt plugs

    The round socket wall leaves about 2 mm of felt showing at the bottom; it’s not very compressible and that should suffice to keep the plastic off the table.

    The OpenSCAD source code:

    // Feet for a wire-shelf plant stand
    // Ed Nisley KE4ZNU October 2013
    
    Layout = "Build";			// Show Build
    
    Support = true;
    
    //- Extrusion parameters must match reality!
    //  Print with 2 shells and 3 solid layers
    
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    
    HoleWindage = 0.2;
    
    Protrusion = 0.1;			// make holes end cleanly
    
    //----------------------
    // Dimensions
    
    StandFootOD = 18.0;			// hex across flats
    StandFootDepth = 5.0;		//  ... socket depth
    
    FeltPadOD = 25.0;			// felt foot diameter
    FeltPadDepth = 4.0;			//  ... depth
    
    FootBaseThick = 6*ThreadThick;	// between foot and pad
    FootWall = 4*ThreadWidth;		// around exterior
    
    FootOD = 2*FootWall + max(StandFootOD,FeltPadOD);
    echo(str("Foot OD: ",FootOD));
    
    FootTall = StandFootDepth + FootBaseThick + FeltPadDepth;
    echo(str(" ... height: "),FootTall);
    
    NumSides = 8*4;
    
    //----------------------
    // Useful routines
    
    module FootPad() {
    
    	difference() {
    
    		cylinder(r=FootOD/2,h=FootTall,$fn=NumSides);
    
    		translate([0,0,FeltPadDepth + FootBaseThick])
    			PolyCyl(StandFootOD,2*StandFootDepth,6);
    
    		translate([0,0,-Protrusion])
    			PolyCyl(FeltPadOD,(FeltPadDepth + Protrusion),NumSides);
    
    	}
    }
    
    // Locating pin hole with glue recess
    
    module LocatingPin() {
    
    	translate([0,0,-ThreadThick])
    		PolyCyl((PinOD + 2*ThreadWidth),2*ThreadThick,4);
    	translate([0,0,-(PinLength/2 + ThreadThick)])
    		PolyCyl(PinOD,(PinLength + 2*ThreadThick),4);
    
    }
    
    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);
    }
    
    module ShowPegGrid(Space = 10.0,Size = 1.0) {
    
      Range = floor(50 / Space);
    
    	for (x=[-Range:Range])
    	  for (y=[-Range:Range])
    		translate([x*Space,y*Space,Size/2])
    		  %cube(Size,center=true);
    
    }
    
    //-------------------
    // Build it...
    
    ShowPegGrid();
    
    if (Layout == "Show")
    	FootPad();
    
    if (Layout == "Build") {
    	translate([0,0,FootTall])
    		rotate([180,0,0])
    			FootPad();
    	if (Support)
    		color("Yellow")
    			for (Seg=[0:5]) {
    				rotate(30 + 360*Seg/6)
    				translate([0,0,(StandFootDepth - ThreadThick)/2])
    					cube([(StandFootOD - 3*ThreadWidth),
    						  2*ThreadWidth,
    						  (StandFootDepth - ThreadThick)],
    						  center=true);
    				}
    }
    
  • 3D Printed Bike Helmet Mirror Mount: Two Years Later

    A bit over two years ago, I hoped my design for a bike helmet mirror mount would prove to be more durable than the fragile commercial mirrors I’d given up on:

    Helmet mirror mount - 3D model - Fit layout
    Helmet mirror mount – 3D model – Fit layout

    Having just tightened the teeny screws that hold the joints in place for the first time since I glued it to the helmet, I’d say it’s working fine. The 2-56 elevation setscrew has worn a slight dent in the arc and the 3-48 azimuth screw worked slightly loose; the mirror didn’t fall apart, but the position wasn’t as stable as it should be.

    If I ever re-do the design, I’ll try adding a recessed metal (brass?) strip along the top of that arc, as that’s the most finicky adjustment. Perhaps a shoe under the setscrew would be better?

    Two years of road grit show up clearly against the yellow plastic, though:

    Bike helmet mirror mount - two years
    Bike helmet mirror mount – two years

    For the record, those 2-56 setscrews require 35 mil hex keys; as Eks reminds me, any design requiring those screws is just crazy talk.

  • Makergear M2: Re-Relocated Z-min Platform Height Switch

    A few trips with the M2 convinced me that the cable to the relocated Z-min switch along the front of the X gantry needed a clip on each end and should not run under the gantry. This time I used the full width of the steel strap and bashed a neater curve around a length of drill rod:

    M2 Z-min Cable Clip - forming
    M2 Z-min Cable Clip – forming

    The new clips look a bit better with straight edges:

    M2 Z-min Cable Clips - old vs new
    M2 Z-min Cable Clips – old vs new

    The top view shows the new clips and cable location:

    M2 Z-min Switch - top view
    M2 Z-min Switch – top view

    While I was at it, I trimmed the edges off the switch mounting block. Rather than figure out the trig required to hack off the corners, I applied linear_extrude() to a polygon() defined by some obvious points, then poked the same holes in the block:

    Z-min Front Mount Switch Block - chamfer - solid model
    Z-min Front Mount Switch Block – chamfer – solid model

    It pretty much vanishes in the top view, but here’s a view from the +Y end of the platform:

    M2 Z-min Switch - bottom view
    M2 Z-min Switch – bottom view

    Despite all that maneuvering, the G92 Z-4.55 touchoff value remained the same!

    If you’ve forgotten why all this makes sense, it’s a first pass at detecting the actual build platform position. The stock M2 uses that switch to detect the top of a screw attached to the Z-axis stage, which means it can’t sense the actual platform. The Z-min switch I added to the Thing-O-Matic convinced me that was the only way to fly; given the TOM’s plywood-and-acrylic frame, it was essentially mandatory.

    Mounting the switch on the extruder would allow probing the entire platform, which would allow on-the-fly correction for both average height and (non-)flatness, but that’s a whole ‘nother project.

    The OpenSCAD source code:

    // Block to mount M2 Z-min switch on X gantry
    // Ed Nisley KE4ZNU - Oct 2013
    
    //- Extrusion parameters - must match reality!
    
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    Protrusion = 0.1;
    
    HoleWindage = 0.2;
    
    //- Sizes
    
    SwitchLength = 20.0;					// switch size across front of block
    
    SwitchScrewOD = 2.05;					// microswitch screw tapping
    SwitchScrewOC = 9.5;					//  ... on-center spacing
    
    GantryScrewOD = 3.0;					// X rail screw clearance
    GantryScrewOC = 25.0;					//  ... on-center spacing along X
    GantryScrewOffset = 12.0;				//  ... Y offset from gantry front
    
    BlockSize = [1.5*GantryScrewOC,17.0,5.0];			// XYZ dimensions as mounted
    HalfBlock = BlockSize/2;
    
    SwitchScrewLength = BlockSize[1] - 5*ThreadWidth;	// net length of switch screws
    echo("Max switch screw length: ",SwitchScrewLength + 5.0);		// ... allow switch thickness
    
    ChamferAngle = atan((BlockSize[0] - SwitchLength)/(BlockSize[1]/2));
    echo("Chamfer Angle: ",ChamferAngle);
    
    //- Adjust hole diameter to make the size come out right
    
    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);
    }
    
    //- Put peg grid on build surface
    
    module ShowPegGrid(Space = 10.0,Size = 1.0) {
    
      RangeX = floor(100 / Space);
      RangeY = floor(125 / Space);
    
    	for (x=[-RangeX:RangeX])
    	  for (y=[-RangeY:RangeY])
    		translate([x*Space,y*Space,Size/2])
    		  %cube(Size,center=true);
    
    }
    
    //- Define basic block shape
    
    module BaseBlock() {
    	translate([0,-GantryScrewOffset,0])
    		linear_extrude(height=BlockSize[2])
    		polygon(points=[[-HalfBlock[0],BlockSize[1]],
    						[HalfBlock[0],BlockSize[1]],
    						[HalfBlock[0],HalfBlock[1]],
    						[SwitchLength/2,0],
    						[-SwitchLength/2,0],
    						[-HalfBlock[0],HalfBlock[1]]
    						]);
    }
    
    //- Build it
    
    ShowPegGrid();
    
    difference() {
    	BaseBlock();
    	for (i=[-1,1]) {
    		translate([i*GantryScrewOC/2,0,-Protrusion])
    			rotate(-90)
    				PolyCyl(GantryScrewOD,(BlockSize[2] + 2*Protrusion));
    		translate([i*SwitchScrewOC/2,-(GantryScrewOffset + Protrusion),BlockSize[2]/2])
    			rotate([-90,0,0])
    				rotate(90)
    					PolyCyl(SwitchScrewOD,(SwitchScrewLength + Protrusion));
    	}
    }
    
  • Brita Water Pitcher: Reinforced Lid Screws

    While I had the epoxy for the last step in the eyeglass frame repair, I fixed the lid on the never-sufficiently-to-be-damned Brita filter pitcher, as it had just tossed one of its miniature screws somewhere on the kitchen floor.

    Nothing too challenging and, as nobody else ever sees this side of the lid, not very pretty:

    Brita Pitcher - reinforced lid screws
    Brita Pitcher – reinforced lid screws

    I probably should have added a brass reinforcement strip around the cracked plastic mounts, but JB Weld epoxy should be strong enough for this job all by itself. Assuming, that is, it can maintain a grip on the plastic; I’m hoping the various fractures will lock it in place.

  • Silhouette Eyeglass Repair: Broken Temple Mount

    The left temple mount of Mary’s five-year-old and staggeringly expensive titanium Silhouette glasses snapped. Here’s the intact right earpiece and the broken piece from the left temple (the lens is upside-down on the paper):

    Silhouette frame - broken temple part
    Silhouette frame – broken temple part

    They’re just about ideal glasses, with nothing more than two lenses and three metal bits, but that means simple repairs don’t come easily. The Official Repair Price was about $120 to install a whole new earpiece, so, seeing as how she had these customized for computer work and wouldn’t be wearing them when anybody else was around, I got the job…

    First off, mask the lenses with Parafilm to avoid scuffs:

    Silhouette glasses - lens protection
    Silhouette glasses – lens protection

    Then cut out the broken part shown in the first picture. It’s attached to the lens with a U-shaped bit of transparent plastic that fits into the frame holes and captures its two peg legs; I used flush-cutting pliers to carve away the plastic bar on the inside of the lens.

    The lens mount fragment is flat-out not reparable, but the broken end of the earpiece lies flush against the lens and is roughly circular. Even better, a 1/16 inch brass tube from the Little Box o’ Cutoffs fit the temple end perfectly: OD = 62 mils, ID = 35 mils.

    The Little Box o’ Tiny Screws produced a pair of stainless steel screws (intended for the hinges in ordinary eyeglass temples) that also fit the holes in the lens and were precisely the right length, so the overall plan came together. The screws seem a bit over 1 mm diameter and I don’t have a nut for them, but epoxy is my co-pilot…

    Line up and drill a pair of 47 mil clearance holes in that piece of 62 mil OD brass tubing, leaving barely 7 mil behind on each side:

    Drilling brass tube
    Drilling brass tube

    I may have to frame that picture…

    Much to my astonishment, drilling those two holes worked on the first try. I’d chamfered the end with a #1 center drill while mulling over how all this would work out.

    File off the screw heads to leave a thin plate:

    Silhouette frame - temple mount parts
    Silhouette frame – temple mount parts

    A dry fit shows how everything hangs together:

    Silhouette frame - temple trial fit
    Silhouette frame – temple trial fit

    The intact earpiece holds the lens at the proper angle on a flat surface, so as long as I can keep the repair parts in place on the lens, the temple angle will take care of itself.

    I scuffed up the broken end of the earpiece to encourage a good epoxy bond, bent the edges of those flat plates around the tube, and cleaned everything with acetone. Tiny dabs of JB Weld epoxy hold the screws and the temple piece in the tube, with those little machinist’s squares encouraging the lenses to stay put:

    Silhouette frame - mount curing
    Silhouette frame – mount curing

    A day later, lay the lenses face down so the screws point straight up and dab on more JB Weld:

    Silhouette frame - lens mount curing
    Silhouette frame – lens mount curing

    Those dots aren’t quite as round as I’d like, but they’re the better part of 2 mm OD and I’m not complaining much. Note the nice fillet around the temple piece at end of the tubing.

    Pause another day for curing…

    Then file off the rough edges and peel off the Parafilm. It’s a bit on the garish side, but Mary preferred the Steampunk look over a crude paint job, particularly because it’s invisible from her side of the lens:

    Silhouette frame - repaired
    Silhouette frame – repaired

    There, now, that wasn’t so hard after all…

  • Outdoor Display: Diurnal Pumping

    The HRECOS folks installed a display on the Walkway Over the Hudson that shows current environmental conditions at the river sampling station just north of the bridge:

    HRECOS Display with internal condensation
    HRECOS Display with internal condensation

    Those two blurry white rectangles are paper charts taped to the inside of the case below the scrolling LED display, so I think they’re discovering what happens when you trap ambient air inside a sealed enclosure without dehumidification. Even if they weren’t opening the case every now and again to change the charts, diurnal pumping would pull outside air past any affordable non-hermetic seal.

    That fancy electronics won’t last long under those conditions; I foresee several pounds of silica gel in their future…

  • Makergear M2 Filament Guide Tube: Bigger Is Better

    The whole point of the new guide tube block is to see if a larger ID tube will reduce the force required to pull the filament through it; long after Dan suggested simply using a larger tube, I got around to picking up a lifetime supply of 1/4 inch OD polyethylene tubing: 25 feet for $3. The ID is about 0.17 inch = 4.3 mm, large enough to let the 1.75 mm filament move smoothly, and the inside clearance provides a few millimeters of free motion so that retraction moves don’t require pushing the guide tube around.

    The new filament guide + wire cover anchors the spool end of the tube:

    M2 Larger Filament Guide - overview
    M2 Larger Filament Guide – overview

    On the other end, I blobbed a piece of 1/4 inch ID tubing to anchor the guide tube. It’s nicer than the twist of cardboard I used before, but nothing to get excited about:

    M2 Extruder - nested filament guide tubes
    M2 Extruder – nested filament guide tubes

    There exists a printed tubing anchor that attaches to the bolt that adjusts the force pressing the filament against the drive gear, but:

    • It’s just an STL model
    • That fits the original guide tube
    • So I’d have to reverse engineer it
    • And I don’t want to fiddle with the extruder

    This will suffice for a while.

    As I hoped, the larger guide tube reduces the force required to pull the filament into the extruder under 1 pound. Most of that force comes from persuading the filament spool to drag-rotate around the plastic support arm, so some simple improvements should help there, as well. I foresee some bearings in its future.

    Fine tuning of the tubing length is also in order, but that’ll require more printing sessions.