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

  • Kitchen Blender Base Spacer

    We don’t use the blender much, so the most recent bearing replacement continues to work. I never got around to re-making the overly long shaft spacer from the first bearing replacement, which I compensated for with a spacer kludge cut from a random chunk of bendy plastic sheet.

    Which we put up with For. Eleven. Years.

    The blender recently emerged from hiding and, with my solid modeling-fu cranked up to a dangerous chattering whine, I conjured a real spacer:

    Blender base spacer - Slic3r preview
    Blender base spacer – Slic3r preview

    It pretty much disappears into the blender base, which is the whole point of the operation:

    Blender base spacer - installed
    Blender base spacer – installed

    When the bearings fail again, I promise to make a proper shaft spacer and toss this bodge.

    The OpenSCAD code as a GitHub Gist:

    // Kitchen blender base adapter
    // Ed Nisley KE4ZNU June 2019
    //- Extrusion parameters must match reality!
    /* [Hidden] */
    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);
    ID = 0;
    OD = 1;
    LENGTH = 2;
    //———-
    // Just build it
    Spacer = [48.0,66.0,1.8]; // LENGTH raises blade holder
    Aligner = [Spacer[ID],52.0,Spacer[LENGTH] + 3.0]; // LENGTH locks into base ring
    NumSides = 4*3*4;
    //———-
    // Just build it
    difference() {
    union() {
    cylinder(d=Spacer[OD],h=IntegerMultiple(Spacer[LENGTH],ThreadThick),$fn=NumSides);
    cylinder(d=Aligner[OD],h=Aligner[LENGTH],$fn=NumSides);
    }
    translate([0,0,-Protrusion])
    cylinder(d=Spacer[ID],h=10*Aligner[LENGTH],$fn=NumSides);
    }

    Not that it really deserves so much attention …

  • Dryer Vent Adapter Rebuild

    When we bought this house, it had its original clothes dryer, which was vented directly through the wall with a few inches of 3×10 inch square duct. Alas, contemporary dryers use 4 inch round hoses, so I conjured a round-to-square adapter from a length of air handler duct:

    Dryer Vent - end view
    Dryer Vent – end view

    I’d used … wait for it … duct tape to hold the end caps on, because I knew I’d be taking it apart to clean out the fuzz every now & again. The most recent cleanout occurred when I noticed the end cap had eased its way out of the adapter, releasing warm fuzzy air behind the dryer.

    The solution, which I should have done decades ago, holds the end caps in place with sheet metal screws:

    Dryer Vent - screws installed
    Dryer Vent – screws installed

    A pair of small clamps held everything in the proper location while I applied a suitable step drill and installed the screw:

    Dryer Vent - screw clamps
    Dryer Vent – screw clamps

    Now the duct tape just seals the gaps, rather than holding against the minimal pressure in the box, and it should be all good until the next cleanout.

    So simple I should’a done it decades ago. Right?

  • Hearphone Deterioration

    I bought my Bose Hearphones in late August 2017, so they’re just shy of two years old, and have used them more-or-less daily since then. Although the innards still improve my hearing, the exterior is falling apart:

    Bose Hearphones - cosmetic repairs
    Bose Hearphones – cosmetic repairs

    The conspicuous blue tips come from silicone tape holding the “soft touch” silicone shell together:

    Bose Hearphones - detached band cover
    Bose Hearphones – detached band cover

    The white line seems to be silicone glue holding the hard cover plate to the equally hard base. So far, it’s working, but the two-piece soft cover is peeling away from the very thin adhesive (?) holding it to the hard parts.

    The silicone glue under the flexy cover on the control pod along the right earbud cable hasn’t fared as well:

    Bose Hearphones - failed control cover
    Bose Hearphones – failed control cover

    I blobbed ordinary RTV silicone under the cover, ignoring the caveats about acetic acid corrosion, because I don’t have any platinum-cure silicone on the shelf.

    When the blue tape wears out / falls off, I’ll replace it with black silicone tape going further up the ring to hold the rest of the soft cover in place:

    Bose Hearphones - cosmetic repairs - detail
    Bose Hearphones – cosmetic repairs – detail

    The ear buds have soft silicone strain relief tubes around the cables. The friction holding them in place failed long ago and, because no adhesive will work with silicone, I wrapped enough double-sided tape around the cables to produce a sticky lump jamming them in place:

    Bose Hearphones - ear piece strain relief
    Bose Hearphones – ear piece strain relief

    A bit of the muck sticks out on both ends and I expect to replace the tape every now and again:

    Bose Hearphones - earpiece repairs - detail
    Bose Hearphones – earpiece repairs – detail

    I also expect to replace the non-replaceable lithium battery / cell in about a year, as they’re now barely adequate for a day’s use.

    Fortunately, I can’t see any of this hackery while I’m wearing the things:

    my face I don’t mind it,

    Because I’m behind it —

    ‘Tis the folks in the front that I jar.

    https://www.azquotes.com/quote/1243103

    [Update: Bose apparently had a QC failure on the silicone covering and, much to my surprise, swapped me entirely new Hearphones. The new covering feels slightly different, the USB cable hatch is a distinct piece of plastic, and maybe it’ll survive until the battery gives out. Color me satisfied! ]

  • MPCNC Drag Knife: Ground Shaft in LM12UU Bearing

    The 12 mm drag knife holder on the left slides nicely in an LM12UU bearing:

    Drag Knife holders - detail
    Drag Knife holders – detail

    However, its aluminum body isn’t really intended as a bearing surface and it extends only halfway through the LM12UU, so I finally got around to modifying the 11.5 mm body on the right to fit into a section of 12 mm ground shaft:

    Drag Knife - turning 11.5 mm body to 10 mm
    Drag Knife – turning 11.5 mm body to 10 mm

    The general idea is to turn the body down to 10 mm OD; the picture shows the first pass over the nose after turning the far end down and removing the flange in the process. Exact concentricity of both ends isn’t important (it gets epoxied into a 10 mm hole through the 12 mm ground shaft), but it came out rather pretty:

    Drag Knife - 11.5 mm body - turned to 10 mm
    Drag Knife – 11.5 mm body – turned to 10 mm

    The ground shaft started as a pen holder:

    DW660 Pen Holder - ground shaft
    DW660 Pen Holder – ground shaft

    I knocked off the ring and bored the interior to fit the 10 mm knife body. The large end of the existing bore came from a 25/64 inch = 9.92 mm drill, so it was just shy of 10.0 mm, and I drilled the small end upward from 0.33 inch = 8.4 mm.

    The smallest trio of a new set of cheap carbide boring bars allegedly went into a 5/16 inch = 7.9 mm bore, but I had to file the bar body down and diamond-file more end relief into the carbide for clearance inside the drilled hole:

    Modified boring bar vs original
    Modified boring bar vs original

    I blued the bit, kissed it against the drilled bore, filed off whatever wasn’t blued, and iterated until the carbide edge started cutting. Sissy cuts all the way, with no pix to show for all the flailing around.

    Epoxying the turned-down drag knife body into the shaft: anticlimactic.

    The solid model features a stylin’ tapered snout:

    Drag Knife LM12UU holder - tapered end
    Drag Knife LM12UU holder – tapered end

    Which gets an LM12UU bearing rammed into place:

    Drag Knife - LM12UU holder - inserting bearing
    Drag Knife – LM12UU holder – inserting bearing

    The steel block leaves the bearing flush with the plastic surface, rather than having it continue onward and indent itself into the wood; I can learn from my mistakes.

    The new idea: a single spring pressing the knife holder downward, reacting against a fixed plastic plate:

    Drag Knife - LM12UU ground shaft - assembled
    Drag Knife – LM12UU ground shaft – assembled

    Unlike the previous design, the upper plate doesn’t move, so there’s no problem caused by sliding along the screw threads. I should run nylock nuts up against the plate to keep it in place, stiffen the structure, and provide some friction to keep the screws from loosening.

    The top of the knife holder now has a boss anchoring the spring:

    Drag Knife - turning spring recess
    Drag Knife – turning spring recess

    As you’d expect, the ground shaft slides wonderfully in the bearing, because that’s what it’s designed to do, and the knife has essentially zero stiction and friction at any point along the bearing, which is exactly what I wanted.

    The spring, from the same assortment as all the others, has a 48 g/mm rate.

    The OpenSCAD source code as a GitHub Gist:

    // Drag Knife Holder using LM12UU linear bearing
    // Ed Nisley KE4ZNU – 2019-04-26
    // 2019-06-01 Taper the nose
    Layout = "Build"; // [Build, Show, Puck, Mount, Plate]
    /* [Extrusion] */
    ThreadThick = 0.25; // [0.20, 0.25]
    ThreadWidth = 0.40; // [0.40]
    /* [Hidden] */
    Protrusion = 0.1; // [0.01, 0.1]
    HoleWindage = 0.2;
    inch = 25.4;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    ID = 0;
    OD = 1;
    LENGTH = 2;
    //- 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);
    }
    //- Dimensions
    // Basic shape of DW660 snout fitting into the holder
    // Lip goes upward to lock into MPCNC mount
    Snout = [44.6,50.0,9.6]; // LENGTH = ID height
    Lip = 4.0; // height of lip at end of snout
    // Knife holder & suchlike
    KnifeBody = [12.0,18.0,2.0]; // body OD, flange OD, flange thickness
    Spring = [9.5,10.0,3*ThreadThick]; // compression spring loading knife blade
    PinAccess = 4.0; // hole to reach knife ejection pin
    WallThick = 4.0; // minimum thickness / width
    Screw = [4.0,8.5,25.0]; // thread ID, washer OD, length
    Insert = [4.0,6.0,10.0]; // brass insert
    Bearing = [12.0,21.0,30.0]; // linear bearing body
    Plate = [PinAccess,Snout[OD] – WallThick,WallThick]; // spring reaction plate
    echo(str("Plate: ",Plate));
    SpringSeat = [0.56,7.2,2*ThreadThick]; // wire = ID, coil = OD, seat depth = length
    PuckOAL = max(Bearing[LENGTH],(Snout[LENGTH] + Lip)); // total height of DW660 fitting
    echo(str("PuckOAL: ",PuckOAL));
    Key = [Snout[ID],25.7,(Snout[LENGTH] + Lip)]; // rectangular key
    NumScrews = 3;
    //ScrewBCD = 2.0*(Bearing[OD]/2 + Insert[OD]/2 + WallThick);
    ScrewBCD = (Snout[ID] + Bearing[OD])/2;
    NumSides = 9*4; // cylinder facets (multiple of 3 for lathe trimming)
    module DW660Puck() {
    translate([0,0,PuckOAL])
    rotate([180,0,0]) {
    cylinder(d=Snout[OD],h=Lip/2,$fn=NumSides);
    translate([0,0,Lip/2])
    cylinder(d1=Snout[OD],d2=Snout[ID],h=Lip/2,$fn=NumSides);
    cylinder(d=Snout[ID],h=(Snout[LENGTH] + Lip),$fn=NumSides);
    translate([0,0,(Snout[LENGTH] + Lip) – Protrusion])
    cylinder(d1=Snout[ID],d2=2*WallThick + Bearing[OD],h=PuckOAL – (Snout[LENGTH] + Lip),$fn=NumSides);
    intersection() {
    translate([0,0,0*Lip + Key.z/2])
    cube(Key,center=true);
    cylinder(d=Snout[OD],h=Lip + Key.z,$fn=NumSides);
    }
    }
    }
    module MountBase() {
    difference() {
    DW660Puck();
    translate([0,0,-Protrusion]) // bearing
    PolyCyl(Bearing[OD],2*PuckOAL,NumSides);
    for (i=[0:NumScrews – 1]) // clamp screws
    rotate(i*360/NumScrews)
    translate([ScrewBCD/2,0,-Protrusion])
    rotate(180/8)
    PolyCyl(Insert[OD],2*PuckOAL,8);
    }
    }
    module SpringPlate() {
    difference() {
    cylinder(d=Plate[OD],h=Plate[LENGTH],$fn=NumSides);
    translate([0,0,-Protrusion]) // ejection pin hole
    PolyCyl(PinAccess,2*Plate[LENGTH],NumSides);
    translate([0,0,Plate[LENGTH] – Spring[LENGTH]]) // spring retaining recess
    PolyCyl(Spring[OD],Spring[LENGTH] + Protrusion,NumSides);
    for (i=[0:NumScrews – 1]) // clamp screws
    rotate(i*360/NumScrews)
    translate([ScrewBCD/2,0,-Protrusion])
    rotate(180/8)
    PolyCyl(Screw[ID],2*PuckOAL,8);
    if (false)
    for (i=[0:NumScrews – 1]) // coil positioning recess
    rotate(i*360/NumScrews)
    translate([ScrewBCD/2,0,-Protrusion])
    rotate(180/8)
    PolyCyl(SpringSeat[OD],SpringSeat[LENGTH] + Protrusion,8);
    }
    }
    //—–
    // Build it
    if (Layout == "Puck")
    DW660Puck();
    if (Layout == "Plate")
    SpringPlate();
    if (Layout == "Mount")
    MountBase();
    if (Layout == "Show") {
    MountBase();
    translate([0,0,1.6*PuckOAL])
    rotate([180,0,0])
    SpringPlate();
    }
    if (Layout == "Build") {
    translate([0,Snout[OD]/2,PuckOAL])
    rotate([180,0,0])
    MountBase();
    translate([0,-Snout[OD]/2,0])
    SpringPlate();
    }

  • MPCNC Diamond Engraver: LM3UU Bearings, First Pass

    Gripping a diamond engraver in a collet chuck worked well enough, but the MPCNC’s pen holder lacks sufficient downforce and lateral stiffness. The bit has a chrome-ish plated 3 mm shank, so I tinkered up a mount for a pair of LM3UU linear bearings from the LM12UU drag knife holder:

    Diamond Scribe - LM3UU - Rev 1 - point view
    Diamond Scribe – LM3UU – Rev 1 – point view

    The shank isn’t exactly a precision part, but a few licks with a diamond file knocked off enough of the high spots so it slides reasonably well through the bearings. The bearing alignment is more critical than a simple 3D printed plastic part can provide, so a real version may need bearings in a metal shaft press-fit into the plastic; brute-forcing the bearings into alignment sufficed for now.

    The butt end of the shank press-fits into a disk held down with three springs, similar to the LM12UU mount:

    Diamond Scribe - LM3UU - Rev 1 - top view
    Diamond Scribe – LM3UU – Rev 1 – top view

    It draws Guilloché patterns just fine:

    Diamond Scribe - LM3UU - Rev 1 - first light
    Diamond Scribe – LM3UU – Rev 1 – first light

    I don’t like how the spring-around-screw motion works, even if it’s OK for small excursions.

  • MPCNC Drag Knife: LM12UU Linear Bearing

    The anodized body of the drag knife on the left measures exactly 12.0 mm OD:

    Drag Knife holders - detail
    Drag Knife holders – detail

    Which happy fact suggested I might be able to use a standard LM12UU linear bearing, despite the obvious stupidity of running an aluminum “shaft” in a steel-ball bearing race:

    Drag Knife - LM12UU holder - solid model
    Drag Knife – LM12UU holder – solid model

    The 12 mm section extends about halfway through the bearing, with barely 3 mm extending out the far end:

    Drag Knife - LM12UU - knife blade detail
    Drag Knife – LM12UU – knife blade detail

    Because the knife body isn’t touching the bearing for the lower half of its length, it’ll probably deflect too much in the XY plane, but it’s simple enough to try out.

    As before, the knife body’s flange is a snug fit in the hole bored in the upper disk:

    Drag Knife - spring plate test fit
    Drag Knife – spring plate test fit

    This time, I tried faking stripper bolts by filling the threads of ordinary socket head cap screws with epoxy:

    Ersatz stripper bolts - epoxy fill
    Ersatz stripper bolts – epoxy fill

    Turning the filled section to match the thread OD showed this just wasn’t going to work at all, so I turned the gunked section of the threads down to about 3.5 mm and continued the mission:

    Drag Knife - LM12UU holder - assembled
    Drag Knife – LM12UU holder – assembled

    Next time, I’ll try mounting the disk on telescoping brass tubing nested around the screws. The motivation for the epoxy nonsense came from the discovery that real stainless steel stripper bolts run five bucks each, which means I’m just not stocking up on the things.

    It slide surprisingly well on the cut-down screws, though:

    Drag Knife - applique templates
    Drag Knife – applique templates

    Those appliqué templates came from patterns for a block in one of Mary’s current quilting projects, so perhaps I can be of some use whenever she next needs intricate cutouts.

    The OpenSCAD source code as a GitHub Gist:

    // Drag Knife Holder using LM12UU linear bearing
    // Ed Nisley KE4ZNU – 2019-04-26
    Layout = "Show"; // [Build, Show, Puck, Mount, Plate]
    /* [Extrusion] */
    ThreadThick = 0.25; // [0.20, 0.25]
    ThreadWidth = 0.40; // [0.40]
    /* [Hidden] */
    Protrusion = 0.1; // [0.01, 0.1]
    HoleWindage = 0.2;
    inch = 25.4;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    ID = 0;
    OD = 1;
    LENGTH = 2;
    //- 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);
    }
    //- Dimensions
    // Basic shape of DW660 snout fitting into the holder
    // Lip goes upward to lock into MPCNC mount
    Snout = [44.6,50.0,9.6]; // LENGTH = ID height
    Lip = 4.0; // height of lip at end of snout
    // Knife holder & suchlike
    KnifeBody = [12.0,15.9,2.0]; // flange epoxied to top of diamond shaft, with epoxy fillet
    WallThick = 4.0; // minimum thickness / width
    Screw = [4.0,8.5,8.0]; // holding it all together, OD = washer
    Insert = [4.0,6.0,10.0]; // brass insert
    Bearing = [12.0,21.0,30.0]; // linear bearing body
    Plate = [KnifeBody[ID],Snout[OD] – WallThick,KnifeBody[LENGTH] + WallThick]; // spring reaction plate
    PlateGuide = [4.0,4.8,Plate[LENGTH]]; // … guide tubes
    PuckOAL = max(Bearing[LENGTH],(Snout[LENGTH] + Lip)); // total height of DW660 fitting
    echo(str("PuckOAL: ",PuckOAL));
    Key = [Snout[ID],25.7,(Snout[LENGTH] + Lip)]; // rectangular key
    NumScrews = 3;
    ScrewBCD = 2.0*(Bearing[OD]/2 + Insert[OD]/2 + WallThick);
    NumSides = 9*4; // cylinder facets (multiple of 3 for lathe trimming)
    module DW660Puck() {
    translate([0,0,PuckOAL])
    rotate([180,0,0]) {
    cylinder(d=Snout[OD],h=Lip/2,$fn=NumSides);
    translate([0,0,Lip/2])
    cylinder(d1=Snout[OD],d2=Snout[ID],h=Lip/2,$fn=NumSides);
    cylinder(d=Snout[ID],h=PuckOAL,$fn=NumSides);
    intersection() {
    translate([0,0,0*Lip + Key.z/2])
    cube(Key,center=true);
    cylinder(d=Snout[OD],h=Lip + Key.z,$fn=NumSides);
    }
    }
    }
    module MountBase() {
    difference() {
    DW660Puck();
    translate([0,0,-Protrusion]) // bearing
    PolyCyl(Bearing[OD],2*PuckOAL,NumSides);
    for (i=[0:NumScrews – 1]) // clamp screws
    rotate(i*360/NumScrews)
    translate([ScrewBCD/2,0,-Protrusion])
    rotate(180/8)
    PolyCyl(Insert[OD],2*PuckOAL,8);
    }
    }
    module SpringPlate() {
    difference() {
    cylinder(d=Plate[OD],h=Plate[LENGTH],$fn=NumSides);
    translate([0,0,-Protrusion]) // knife holder body
    PolyCyl(KnifeBody[ID],2*PuckOAL,NumSides);
    translate([0,0,Plate[LENGTH] – KnifeBody[LENGTH]]) // flange, snug fit
    PolyCyl(KnifeBody[OD],KnifeBody[LENGTH] + Protrusion,NumSides);
    for (i=[0:NumScrews – 1]) // clamp screws
    rotate(i*360/NumScrews)
    translate([ScrewBCD/2,0,-Protrusion])
    rotate(180/8)
    PolyCyl(PlateGuide[OD],2*PuckOAL,8);
    }
    }
    //—–
    // Build it
    if (Layout == "Puck")
    DW660Puck();
    if (Layout == "Plate")
    SpringPlate();
    if (Layout == "Mount")
    MountBase();
    if (Layout == "Show") {
    MountBase();
    translate([0,0,1.6*PuckOAL])
    rotate([180,0,0])
    SpringPlate();
    }
    if (Layout == "Build") {
    translate([0,Snout[OD]/2,PuckOAL])
    rotate([180,0,0])
    MountBase();
    translate([0,-Snout[OD]/2,0])
    SpringPlate();
    }

  • MPCNC Drag Knife: PETG Linear Bearing

    Having reasonable success using a 12 mm hole bored in a 3D printed mount for the nice drag knife holder on the left, I thought I’d try the same trick for the raw aluminum holder on the right side:

    Drag Knife holders - detail
    Drag Knife holders – detail

    The 11.5 mm body is long enough to justify making a longer holder with more bearing surface:

    Drag Knife Holder - 11.5 mm body - Slic3r preview
    Drag Knife Holder – 11.5 mm body – Slic3r preview

    Slicing with four perimeter threads lays down enough reasonably solid plastic to bore the central hole to a nice sliding fit:

    Drag Knife - 11.5 mm body - boring
    Drag Knife – 11.5 mm body – boring

    The top disk gets bored to a snug press fit around the flange and upper body:

    Drag Knife - 11.5 mm body - flange boring
    Drag Knife – 11.5 mm body – flange boring

    Assemble with springs and it pretty much works:

    Drag Knife - hexagon depth setting
    Drag Knife – hexagon depth setting

    Unfortunately, it doesn’t work particularly well, because the two screws tightening the MPCNC’s DW660 tool holder (the black band) can apply enough force to deform the PETG mount and lock the drag knife body in the bore, while not being quite tight enough to prevent the mount from moving.

    I think the holder for the black knife (on the left) worked better, because:

    • The anodized surface is much smoother & slipperier
    • The body is shorter, so less friction

    In any event, I reached a sufficiently happy compromise for some heavy paper / light cardboard test shapes, but a PETG bearing won’t suffice for dependable drag knife cuttery.

    Back to the laboratory …