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

  • KEDSUM LED Shop Lights: Cheapnification Thereof

    As the basement’s fluorescent fixtures and lamps gradually die, I’ve been rewiring the fixtures for LED tubes, all bought from KEDSUM through Amazon. The first few batches looked like this:

    Kedsum - good LED lamp
    Kedsum – good LED lamp

    The most recent two batches seem cheapnified:

    Kedsum - poor LED lamp
    Kedsum – poor LED lamp

    The tubes show similar changes, going from a stylin’ version to a simple cylindrical cap:

    Kedsum vs Kedsun - tube end caps
    Kedsum vs Kedsun – tube end caps

    The most recent carton label might lead you to think they’re counterfeits, but it could just be a simple typo:

    Kedsum vs Kedsun - LED lamp carton
    Kedsum vs Kedsun – LED lamp carton

    There’s absolutely no way to tell what you’re going to get from any vendor on Amazon (or anywhere else, for that matter), so there’s no point in returning them, but I’d hoped buying “the same thing” from “the same seller” would produce a consistent result.

  • American Standard Kitchen Faucet: Valve Shaft Mystery

    The latest in a continuing series of annoyances from our American Standard kitchen faucet: it became increasingly hard to turn it on with the handle all the way to the left in the “hot” position. Bear in mind this valve is less than a year old and I replaced its predecessor two years before that, after maybe a decade of service from the OEM valve.

    Pulling it apart revealed the problem, which requires a close inspection.

    The view from the “cold” side:

    American Standard faucet cartridge - cold side
    American Standard faucet cartridge – cold side

    And from the “hot” side:

    American Standard faucet cartridge - hot side
    American Standard faucet cartridge – hot side

    See it?

    The valve handle stem pivots on the 4 mm shaft passing through the black “engineering plastic” shape inside the red hot-limit ring. This top view shows the overall layout:

    American Standard faucet - hot limit ring
    American Standard faucet – hot limit ring

    The shaft has worked its way leftward, toward the “hot” side, until it bumped into the limit ring. The right end of the shaft hasn’t come completely out of the inside of its pivot, but it’s apparently gone far enough to stop pivoting freely.

    This may also explain how the previous hot-limit ring worked loose: the misplaced shaft applies torque to the limit ring as we move the lever to the “cold” side. I don’t know how the ring worked its way upward from its positioning notches. Overall, it seem plausible.

    Installing a new valve isn’t going to get us a better design, so I must figure out how to keep the shaft in the middle of its travel. Perhaps replacing it with a slightly longer shaft will work around the problem, because it simply can’t slide in either direction.

    Loosening the three screws holding the cartridge down (and applying pressure against the seals) reduces the force required to move the faucet, even with the shaft in the wrong position. This suggests the valve body distorts slightly, so I loosened all three and (roughly) equalized their torque; the valve isn’t leaking and we’ll see what happens next.

  • MPCNC Diamond Engraver: LM3UU Bearings, Second Pass

    Having a single spring and a fixed upper plate works much better than the first version:

    Diamond Scribe - LM3UU Rev 2 - overview
    Diamond Scribe – LM3UU Rev 2 – overview

    The (lubricated!) nyloc nuts under the plate provide a little friction and stabilize the whole affair.

    The solid model has the same stylin’ tapered snout as the LM12UU drag knife mount:

    Diamond Scribe - LM3UU bearings
    Diamond Scribe – LM3UU bearings

    The spring seats in the plate recess, with the 3 mm shank passing through the hole as the tool holder presses the tip against the workpiece.

    I diamond-filed a broken carbide end mill to make a slotting tool:

    Diamond Scribe - LM3UU - Rev 2 - carbide notch tool
    Diamond Scribe – LM3UU – Rev 2 – carbide notch tool

    Lacking any better method (“a tiny clip spreader tool”), I rammed the Jesus clip the length of the shank with a (loose-fitting) chuck in the tailstock:

    Diamond Scribe - LM3UU - Rev 2 - clip installation
    Diamond Scribe – LM3UU – Rev 2 – clip installation

    Even without nyloc nuts, the first test worked fine:

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

    The 53 g/mm spring rate may be too low for serious engraving, but it suffices for subtle Guilloché patterns on scrap platters.

    The OpenSCAD source code as a GitHub Gist:

    // Drag Knife Holder using LM12UU linear bearing
    // Ed Nisley KE4ZNU – 2019-04-26
    // 2019-05-09 LM3UU for diamond scribe
    // 2019-05-28 taper end, single spring around shaft
    Layout = "Build"; // [Build, Show, Puck, Mount, Plate]
    /* [Extrusion] */
    ThreadThick = 0.25; // [0.20, 0.25]
    ThreadWidth = 0.40; // [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
    // Knife holder & suchlike
    KnifeBody = [3.0,9.0,2.0]; // washer epoxied to diamond shaft, with epoxy fillet
    Spring = [9.5,10.0,3*ThreadThick]; // compression spring around shaft, LENGTH = socket depth
    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 = [3.0,7.0,2*10.0 + WallThick]; // linear bearing body (pair + small gap)
    // 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
    Plate = [KnifeBody[ID],Snout[OD] – WallThick,WallThick]; // spring reaction plate
    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.5*(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=(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]) // ample shaft clearance
    PolyCyl(1.5*KnifeBody[ID],2*PuckOAL,NumSides);
    // translate([0,0,Plate[LENGTH] – KnifeBody[LENGTH]]) // flange, snug fit
    // PolyCyl(KnifeBody[OD],KnifeBody[LENGTH] + Protrusion,NumSides);
    translate([0,0,Plate[LENGTH] – Spring[LENGTH]]) // spring retainer
    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);
    }
    }
    //—–
    // Build it
    if (Layout == "Puck")
    DW660Puck();
    if (Layout == "Plate")
    SpringPlate();
    if (Layout == "Mount")
    MountBase();
    if (Layout == "Show") {
    MountBase();
    translate([0,0,1.5*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();
    }

  • Garden Soaker Hose Connector Repair

    Two of Mary’s garden soaker hoses failed their pre-installation checks with leaks from around their connectors. The problem seemed to be a break in the hose inside the connector, with water spewing out of the connector around the hose. Having previously fixed a gash in another hose, I figured I might have some success at fixing these leaks.

    The general idea is to squish enough silicone rubber inside the connector to seal around the hose, then clamp the hose and connector snugly enough to hold the rubber in place:

    Soaker Hose Connector Clamp - Show view
    Soaker Hose Connector Clamp – Show view

    The enlarged recess fits around the brass connector shell, which is squashed loosely around the hose and from which the leaking water emerges. Of course, because this is a different hose, the previous model didn’t quite fit and I had to doodle up new geometry:

    Soaker Hose Connector repair - Dimension doodle
    Soaker Hose Connector repair – Dimension doodle

    As before, I bandsawed aluminum backing plates to ensure the plastic didn’t get all bendy in the middle:

    Soaker hose connector leak clamps
    Soaker hose connector leak clamps

    The hose clamp (!) around the connector on the far right ensures a split in the brass shell doesn’t get any larger.

    They’ll spend the rest of their lives under the garden mulch, where nobody will ever see those bulky lumps. Life is good!

    The OpenSCAD source code as a GitHub Gist:

    // Rubber Soaker Hose End Connector Clamp
    // Helps hold silicone rubber in connector
    // Ed Nisley KE4ZNU June 2019
    Layout = "Build"; // [Hose,Connector,Block,Show,Build]
    //- 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);
    //———-
    // Dimensions
    // Hose lies along X axis
    Hose = [200,26.5,11.6]; // X=very long, Y=width, Z=overall height
    RimThick = 10.3; // outer sections
    RimOD = RimThick;
    RimFlatRecess = 1.0; // recess to front flat surface
    OuterOC = Hose.y – RimOD; // outer tube centers
    RecessM = 0.8; // back recess chord
    RecessC = OuterOC;
    RecessR = (pow(RecessM,2) + pow(RecessC,2)/4) / (2*RecessM);
    RidgeM = 1.6; // front ridge chord
    RidgeC = 7.5;
    RidgeR = (pow(RidgeM,2) + pow(RidgeC,2)/4) / (2*RidgeM);
    HoseSides = 12*4;
    Connector = [5.0,33.0,13.0]; // oval brass: X=snout Y=width Z=dia
    Block = [20.0,50.0,4.0 + Hose.z]; // overall splice block size
    echo(str("Block: ",Block));
    Kerf = 0.5; // cut through middle to apply compression
    ID = 0;
    OD = 1;
    LENGTH = 2;
    // 8-32 stainless screws
    Screw = [4.1,8.0,3.0]; // OD = head LENGTH = head thickness
    Washer = [4.4,9.5,1.0];
    Nut = [4.1,9.7,6.0];
    CornerRadius = Washer[OD]/2;
    ScrewOC = Block.y – 2*CornerRadius;
    echo(str("Screw OC: x=",ScrewOC.x," y=",ScrewOC.y));
    //———————-
    // 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(d=(FixDia + HoleWindage),h=Height,$fn=Sides);
    }
    // Hose shape
    // This includes magic numbers measured from reality
    module HoseProfile() {
    rotate([0,-90,0])
    translate([0,0,-Hose.x/2])
    linear_extrude(height=Hose.x,convexity=4)
    difference() {
    union() {
    for (j=[-1,1]) // outer channels
    translate([0,j*OuterOC/2])
    circle(d=RimOD,$fn=HoseSides);
    translate([-RimOD/4,0]) // rear flat fill
    square([RimOD/2,OuterOC],center=true);
    translate([(RimOD/4 – RimFlatRecess),0]) // front flat fill
    square([RimOD/2,OuterOC],center=true);
    intersection() {
    translate([Hose.z/2,0])
    square([Hose.z,OuterOC],center=true);
    translate([-RidgeR + RimOD/2 – RimFlatRecess + RidgeM,0])
    circle(r=RidgeR,$fn=HoseSides);
    }
    }
    translate([-(RecessR + RimOD/2 – RecessM),0])
    circle(r=RecessR,$fn=2*HoseSides);
    }
    }
    // Outside shape of splice Block
    // Z centered on hose rim circles, not overall thickness through center ridge
    module SpliceBlock() {
    difference() {
    hull()
    for (i=[-1,1], j=[-1,1]) // rounded block
    translate([i*(Block.x/2 – CornerRadius),j*(Block.y/2 – CornerRadius),-Block.z/2])
    cylinder(r=CornerRadius,h=Block.z,$fn=4*8);
    for (j=[-1,1]) // screw holes
    translate([0,
    j*ScrewOC/2,
    -(Block.z/2 + Protrusion)])
    PolyCyl(Screw[ID],Block.z + 2*Protrusion,6);
    cube([2*Block.x,2*Block.y,Kerf],center=true); // slice through center
    }
    }
    // Splice block less hose
    module ShapedBlock() {
    difference() {
    SpliceBlock();
    HoseProfile();
    Connector();
    }
    }
    // Brass connector end
    module Connector() {
    translate([-(Block.x/2 + Protrusion),0,0])
    rotate([0,90,0])
    linear_extrude(height=Connector.x + Protrusion)
    hull()
    for (i = [-1,1])
    translate([0,i*(Connector.y – Connector.z)/2])
    circle(d=Connector.z);
    }
    //———-
    // Build them
    if (Layout == "Hose")
    HoseProfile();
    if (Layout == "Block")
    SpliceBlock();
    if (Layout == "Connector")
    Connector();
    if (Layout == "Show") {
    ShapedBlock();
    color("Green",0.25)
    HoseProfile();
    }
    if (Layout == "Build") {
    SliceOffset = 0;
    intersection() {
    translate([SliceOffset,0,Block.z/4])
    cube([4*Block.x,4*Block.y,Block.z/2],center=true);
    union() {
    translate([0,0.6*Block.y,Block.z/2])
    ShapedBlock();
    translate([0,-0.6*Block.y,Block.z/2])
    rotate([0,180,0])
    ShapedBlock();
    }
    }
    }

  • Ooma Telo 2: Speaker FAIL

    The tiny voice inside our Ooma Telo 2 box died, although the VOIP phone service continued to work fine. A bit of searching showed the speaker seems to be the weak link.

    Well, I can fix that.

    Start by prying the recessed top panel off the case:

    Ooma Telo 2 - upper case latches
    Ooma Telo 2 – upper case latches

    Remove the circuit board to expose the tiny speaker, taking care not to rip the tiny wires out of the tiny connector:

    Ooma Telo 2 - OEM speaker to PCB
    Ooma Telo 2 – OEM speaker to PCB

    You can’t measure a dead speaker, but it seems to be an 8 Ω unit.

    The speaker sits in a rubber surround, with a foam rubber cushion against the PCB, tucked into a walled garden stiffening the case:

    Ooma Telo 2 - speaker port
    Ooma Telo 2 – speaker port

    I don’t happen to have a tiny 8 Ω speaker, but I do have a bunch of small speakers (Update: 28 mm OD), so I bulldozed those walls with a flush cutting pliers and a bit of cussing to make room:

    Ooma Telo 2 - modified speaker port
    Ooma Telo 2 – modified speaker port

    Nibble an adapter ring to match the rim of the new speaker, thereby routing the sound out those little holes, and hot-melt glue it in place:

    Ooma Telo 2 - speaker adapter
    Ooma Telo 2 – speaker adapter

    Hot-melt glue the new speaker in place atop the adapter, taking care to fill all the edges / cracks / crevices below it with an impenetrable wall of glop:

    Ooma Telo 2 - replacement speaker installed
    Ooma Telo 2 – replacement speaker installed

    The sealing part turns out to be critical with these little speakers, because a leak from front to back will pretty much cancel all the sound from the cone.

    Cut the wires off the old speaker, affix to the new one, replace the PCB, snap the case lid in place, and it sounds better than new.

    Millions of transistors in those ICs, but Ooma can’t spec a good speaker? Maybe they should have used a bigger speaker to begin with; ya never know.

  • Primitive Screwheads

    Painting the patio railing required removing the short section on the garage, which stalled with a thoroughly galled / corroded nut on the 2 inch bolt going through the wall. Deploying a Dremel slitting wheel and bashing the slit open with a cold chisel saved the day, as shown in this staged reenactment:

    Patio railing - square head bolt - extraction
    Patio railing – square head bolt – extraction

    It seems square head bolts have gone out of fashion, at least in the 3/8-16 size seen here, over the last half century:

    Patio railing - square head bolts
    Patio railing – square head bolts

    I reused the lag screw with no qualms at all.

    The local fastener emporium had square bolts ranging upward from 3/4-10, which wasn’t much help. Amazon has ’em, if you spend enough time rummaging around in the debris from its search engine, at a buck apiece in lots of ten. Fortunately, a local big-box home repair store had 3/8-16 hex head steel bolts and square nuts, so I needn’t start from scratch.

    Start by turning off the hex head:

    Patio railing - square head bolt - removing hex head
    Patio railing – square head bolt – removing hex head

    Thread the end, starting in the lathe and ending with a die turned just barely enough to accept the nut:

    Patio railing - square head bolt - threading
    Patio railing – square head bolt – threading

    Epoxy the nut in place and sand it to rough up the surface finish enough to hold the primer:

    Patio railing - square head bolt - lineup
    Patio railing – square head bolt – lineup

    Yeah, that’s a nasty little zit. Fortunately, nobody will ever notice.

    Prime & paint the railing, affix it to the garage wall, then prime & paint the bolt:

    Patio railing - square head bolt - installed
    Patio railing – square head bolt – installed

    Thing looks like it grew there; tell nobody about the zit.

    The yellow blotches decorating the shiny black paint come from the pine trees across the driveway. The first day of pine pollen season corresponded to the second day I intended to paint; the dust clouds were a wonder to behold.

    Bonus Quality Shop Time!

    The far end of the railing around the patio has a bracket against the house siding with a hole intended for a 1/4 inch bolt they never installed, perhaps because there’s no way to maneuver a bolt into the space available.

    The threads on the 3/8-16 bolt may be wrecked, but turning the shank down to 1/4 inch isn’t any big deal:

    Patio railing - fake bolt - thinning shank
    Patio railing – fake bolt – thinning shank

    Part off the head with a stub just long enough to fit into the bracket, epoxy that sucker into the hole, and paint it black:

    Patio railing - fake bolt - installed
    Patio railing – fake bolt – installed

    The square post on the left goes down to an anchor in the concrete patio, the railing is welded to a 4 inch column a foot away, and the end of the railing isn’t going anywhere; the fake bolt is purely for show.

    And, yes, the dust atop the railing is more pollen from the pine trees responsible for the weird green-yellow reflections on the vertical surfaces.

    No boomstick required!

  • Micromark Bandsaw Table Angle Gauge Tweak

    Mostly, the Tiny Bandsaw™ cuts thin sheets, where having the blade at a slight angle off perpendicular doesn’t make much difference. I recently started to cut a thicker block and thought the blade looked a bit slanted, so I deployed the Tiny Square™ to set it properly:

    MicroLux Bandsaw - blade perpendicular
    MicroLux Bandsaw – blade perpendicular

    Which produced this result on the blade angle gauge under the table:

    MicroLux Bandsaw - table angle offset
    MicroLux Bandsaw – table angle offset

    Huh.

    The scale pointer is printed on what’s basically a sticker. The QC regime for the bandsaw apparently doesn’t ensure the pointer appears at the proper place on the sticker, nor does it verify the overall alignment.

    I peeled the sticker off off, trimmed the near edge, and re-stuck it with the pointer aimed properly:

    MicroLux Bandsaw - tweaked table angle scale
    MicroLux Bandsaw – tweaked table angle scale

    It makes me feel better, anyway …

    Now, as why they put the scale pointer behind the table clamp knob, where it can’t be seen directly, that remains a mystery.