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.

Tag: Repairs

If it used to work, it can work again

  • More WS2812 Failures

    More WS2812 Failures

    Even though I’m using what seem to be good-quality parts, one of the WS2812 RGB LEDs in a Glass Tile frame died:

    Glass Tile - 2x2 - first WS2812B failure
    Glass Tile – 2×2 – first WS2812B failure

    It passed the Josh Sharpie Test:

    Glass Tile - WS2812 failure - PCB unknown
    Glass Tile – WS2812 failure – PCB unknown

    After building the third Glass Tile unit, one of the LEDs didn’t light up due to an easily diagnosed problem:

    Glass Tile - WS2812 failure - PCB cold solder - as found
    Glass Tile – WS2812 failure – PCB cold solder – as found

    A closer look:

    Glass Tile - WS2812 failure - PCB cold solder
    Glass Tile – WS2812 failure – PCB cold solder

    Shortly thereafter, the Nissan Fog Lamp developed an obvious beam problem:

    Nissan Fog Lamp - failed WS2812 effect
    Nissan Fog Lamp – failed WS2812 effect

    The WS2812 had the proper voltages / signals at all its pins and was still firmly stuck to the central “heatsink”:

    Nissan Fog Lamp - failed WS2812 detail
    Nissan Fog Lamp – failed WS2812 detail

    It also passed the Josh Sharpie Test:

    Glass Tile - WS2812 failure - tape - unknown
    Glass Tile – WS2812 failure – tape – unknown

    I’m particularly surprised by this one, because eleven of the twelve flex-PCB WS2812s in the Hard Drive Platter light have been running continuously for years with no additional failures.

    The alert reader will note the common factor: no matter what substrate the LED is (supposed to be) soldered to, no matter when I bought it, no matter what it’s wired into, a WS2812 will fail.

    They’re all back in operation:

    Glowing Algorithmic Art
    Glowing Algorithmic Art

    Although nobody knows for how long …

    Obviously, it’s time to refresh my programmable RGB LED stockpile!

  • Garden Hose Valve Wrench: Reinforced

    Garden Hose Valve Wrench: Reinforced

    After five gardening seasons, my simple 3D printed wrench broke:

    Hose Valve Knob - fractured
    Hose Valve Knob – fractured

    Although Jason’s comment suggesting carbon-fiber reinforcing rods didn’t prompt me to lay in a stock, ordinary music wire should serve the same purpose:

    Hose Valve Knob - cut pins
    Hose Valve Knob – cut pins

    The pins are 1.6 mm diameter and 20 mm long, chopped off with hardened diagonal cutters. Next time, I must (remember to) grind the ends flat.

    The solid model needs holes in appropriate spots:

    Hose Valve Knob - Reinforced - Slic3r
    Hose Valve Knob – Reinforced – Slic3r

    Yes, I’m going to put round pins in square holes, without drilling the holes to the proper diameter: no epoxy, no adhesive, just 20 mm of pure friction.

    The drill press aligns the pins:

    Hose Valve Knob - pin ready
    Hose Valve Knob – pin ready

    And rams them about halfway down:

    Hose Valve Knob - pin midway
    Hose Valve Knob – pin midway

    Close the chuck jaws and shove them flush with the surface:

    Hose Valve Knob - pins installed
    Hose Valve Knob – pins installed

    You can see the pins and their solid plastic shells through the wrench stem:

    Hose Valve Knob - assembled
    Hose Valve Knob – assembled

    Early testing shows the reinforced wrench works just as well as the previous version, even on some new valves sporting different handles, with an equally sloppy fit for all. No surprise: I just poked holes in the existing model and left all the other dimensions alone.

    The OpenSCAD source code as a GitHub Gist:

    // Hose connector knob
    // Ed Nisley KE4ZNU – June 2015
    // 2020-05 add reinforcing rods
    Layout = "Build"; // [Knob, Stem, Show, Build]
    RodHoles = true;
    //- Extrusion parameters – must match reality!
    /* [Hidden] */
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    Protrusion = 0.1;
    HoleWindage = 0.2;
    //——
    // Dimensions
    /* [Dimensions] */
    RodOD = 1.6;
    RodAngle = 35;
    /* [Hidden] */
    StemOD = 30.0; // max OD for valve-to-valve clearance
    BossOD = 16.0; // single-ended handle boss
    SlotWidth = 13.0;
    SlotHeight = 10.0;
    StemInset = 10.0;
    StemLength = StemInset + SlotHeight + 25.0;
    StemSides = 2*4;
    Align = 0*180/StemSides; // 1* produces thinner jaw ends
    KnobOD1 = 70; // maximum dia without chamfer
    KnobOD2 = 60; // top dia
    KnobSides = 4*4;
    DomeHeight = 12; // dome shape above lobes
    KnobHeight = DomeHeight + 2*SlotHeight;
    DomeOD = KnobOD2 + (KnobOD1 – KnobOD2)*(DomeHeight/KnobHeight);
    DomeArcRad = (pow(KnobHeight,2) + pow(DomeOD,2)/4) / (2*DomeHeight);
    RodBCD = (StemOD + BossOD)/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);
    }
    //– Stem for valve handles
    module Stem() {
    difference() {
    rotate(Align)
    cylinder(d=StemOD,h=StemLength,$fn=StemSides);
    translate([0,0,SlotHeight/2 – Protrusion/2])
    cube([2*StemOD,SlotWidth,(SlotHeight + Protrusion)],center=true);
    translate([0,0,-Protrusion])
    cylinder(d=BossOD,h=SlotHeight,$fn=2*StemSides);
    if (RodHoles)
    for (i=[-1:1])
    rotate(i*RodAngle + 90)
    for (j=[-1,1])
    translate([j*RodBCD/2,0,-Protrusion])
    rotate(180/4)
    PolyCyl(RodOD,2*SlotHeight,4);
    }
    }
    //– Hand-friendly knob
    module KnobCap() {
    difference() {
    scale([1.0,0.75,1.0])
    rotate(180/KnobSides)
    intersection() {
    translate([0,0,(KnobHeight-DomeArcRad)])
    sphere(r=DomeArcRad,$fa=180/KnobSides);
    cylinder(r1=KnobOD1/2,r2=KnobOD2/2,h=KnobHeight,$fn=KnobSides);
    cylinder(r1=KnobOD2/2,r2=KnobOD1/2,h=KnobHeight,$fn=KnobSides);
    }
    translate([0,0,-Protrusion])
    rotate(Align)
    cylinder(d=(StemOD + 2*ThreadWidth),h=(StemInset + Protrusion),$fn=StemSides);
    }
    }
    //- Build it
    if (Layout == "Knob")
    KnobCap();
    if (Layout == "Stem")
    Stem();
    if (Layout == "Build") {
    translate([-KnobOD1/2,0,0])
    KnobCap();
    translate([StemOD/2,0,StemLength])
    rotate([180,0,0])
    Stem();
    }
    if (Layout == "Show") {
    translate([0,0,0])
    Stem();
    translate([0,0,StemLength – StemInset])
    KnobCap();
    }

  • Soaker Hose End Plug

    Soaker Hose End Plug

    One of the soaker hoses in Mary’s Vassar Farms garden split lengthwise near one end:

    Soaker Hose Plug - hose split
    Soaker Hose Plug – hose split

    Although the hose is fully depreciated, I thought it’d be worthwhile to cut off the damaged end and conjure an end cap to see if a simple plug can withstand 100 psi water pressure.

    A pair of Delrin (because I have it) plugs with serrations fill the hose channels, with the outer clamp squishing the hose against them:

    Soaker Hose Plug - channel plugs - side view
    Soaker Hose Plug – channel plugs – side view

    In real life, they’ll be pushed completely into the hose, with a generous layer of silicone snot caulk improving their griptivity.

    I started with 8 mm plugs, but they didn’t quite fill the channels:

    Soaker Hose Plug - channel plugs - 8 mm test fit
    Soaker Hose Plug – channel plugs – 8 mm test fit

    Going to 8.5 mm worked better, although there’s really no way to force the granulated rubber shape into a snug fit around a cylinder:

    Soaker Hose Plug - channel plugs test fit
    Soaker Hose Plug – channel plugs test fit

    Fortunately, they need not be leakproof, because leaking is what the hose does for a living. Well, did for a living, back before it died.

    The clamps have a solid endstop, although it’s more to tidy the end than to hold the plugs in place:

    Soaker Hose End Plug - Slic3r
    Soaker Hose End Plug – Slic3r

    The clamps need aluminum backing plates to distribute the stress evenly across their flat sides:

    Soaker Hose Plug - installed
    Soaker Hose Plug – installed

    Those are 8-32 stainless steel screws. The standard 1 inch length worked out exactly right through no fault of my own.

    The OpenSCAD source code as a GitHub Gist:

    // Rubber Soaker Hose End Plug
    // Ed Nisley KE4ZNU June 2019
    // 2020-05 Two-channel hose end plug
    Layout = "Hose"; // [Hose,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
    HoseTubeOD = 12.0; // water tube diameter
    HoseTubeOC = 12.5; // .. spacing
    HoseWebThick = 7.8; // center joining tubes
    Hose = [100,25.0,HoseTubeOD]; // X=very long, Y=overall width, Z=thickness
    HoseSides = 12*4;
    PlugLength = 25.0; // plugs in hose channels
    PlateThick = 5.0; // end block thickness
    WallThick = 2.0; // overall minimum thickness
    Kerf = 0.75; // 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 = Hose.y + Washer[OD];
    echo(str("Screw OC: ",ScrewOC));
    BlockOAL = [PlugLength + PlateThick,ScrewOC + Washer[OD],2*WallThick + Hose.z]; // overall splice block size
    echo(str("Block: ",BlockOAL));
    //———————-
    // 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
    module HoseProfile() {
    rotate([0,-90,0])
    translate([0,0,-Hose.x/2])
    linear_extrude(height=Hose.x,convexity=4)
    union() {
    for (j=[-1,1]) // outer channels
    translate([0,j*HoseTubeOC/2])
    circle(d=HoseTubeOD,$fn=HoseSides);
    translate([0,0])
    square([HoseWebThick,HoseTubeOC],center=true);
    }
    }
    // 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*(BlockOAL.x/2 – CornerRadius),j*(BlockOAL.y/2 – CornerRadius),-BlockOAL.z/2])
    cylinder(r=CornerRadius,h=BlockOAL.z,$fn=4*8);
    for (j=[-1,1]) // screw holes
    translate([0,
    j*ScrewOC/2,
    -(BlockOAL.z/2 + Protrusion)])
    PolyCyl(Screw[ID],BlockOAL.z + 2*Protrusion,6);
    cube([2*BlockOAL.x,2*BlockOAL.y,Kerf],center=true); // slice through center
    }
    }
    // Splice block less hose
    module ShapedBlock() {
    difference() {
    SpliceBlock();
    translate([(-Hose.x/2) + (BlockOAL.x/2) – PlateThick,0,0])
    HoseProfile();
    }
    }
    //———-
    // Build them
    if (Layout == "Hose")
    HoseProfile();
    if (Layout == "Block")
    SpliceBlock();
    if (Layout == "Show") {
    ShapedBlock();
    translate([(-Hose.x/2) + (BlockOAL.x/2) – PlateThick,0,0])
    color("Green",0.25)
    HoseProfile();
    }
    if (Layout == "Build") {
    SliceOffset = 0;
    intersection() {
    translate([SliceOffset,0,BlockOAL.z/4])
    cube([4*BlockOAL.x,4*BlockOAL.y,BlockOAL.z/2],center=true);
    union() {
    translate([0,0.6*BlockOAL.y,BlockOAL.z/2])
    ShapedBlock();
    translate([0,-0.6*BlockOAL.y,BlockOAL.z/2])
    rotate([0,180,0])
    ShapedBlock();
    }
    }
    }

    The original doodle, with dimensions vaguely related to the final model:

    Soaker Hose End Plug - hose dimensions
    Soaker Hose End Plug – hose dimensions

    There is, as far as I can tell, no standardization of dimensions or shapes across manufacturers, apart from the threaded hose fittings.

  • American Standard Kitchen Faucet: Yet Another Replacement

    American Standard Kitchen Faucet: Yet Another Replacement

    These cartridges seem to wear out after two years, at most:

    American Standard faucet cartridge
    American Standard faucet cartridge

    The handle becomes difficult to move, both left-to-right and up-and-down, with lubrication of the (obviously metal-on-plastic) shaft being unavailing.

    Having devoted considerable time & attention to keeping this thing alive, there really aren’t any user-serviceable parts inside:

    American Standard Ceramic Faucet Valve Cores - old vs new
    American Standard Ceramic Faucet Valve Cores – old vs new

    I think the sliding fit between the two ceramic blocks laps itself into a more perfect joint, to the extent it’s wrung together and can’t be moved. Even after filtering, our town-supplied water apperently has enough micro-fine grit for the purpose.

    So I have another valve core for the collection …

    On the upside, the improved spout bearing rings continue to work fine, although it’s only been five months.

  • Mini-Lathe: Threading Dial Alignment

    Mini-Lathe: Threading Dial Alignment

    As received, the mini-lathe’s threading dial was misaligned by about 1/4 division, which is nearly halfway to the next engagement point midway between the divisions:

    Mini-Lathe Threading Dial - as received - colorized
    Mini-Lathe Threading Dial – as received – colorized

    I added the red lacquer crayon while contemplating what to do, because I thought the dial was swaged onto the shaft. It turns out to be threaded, so I marked where the dial should be, grabbed the shaft in the (soft-jawed) bench vise, and twisted the dial with a Vise-Grip until it lined up:

    Mini-Lathe Threading Dial - aligned
    Mini-Lathe Threading Dial – aligned

    Well, it’s closer than it was, OK?

    There’s about that much slop on either side of the index line coming from the loose gear engaging the leadscrew, so that’s as good as it gets.

  • Garden Rake Cross Bolt

    Garden Rake Cross Bolt

    Mary’s long-suffering garden rake pulled apart while we were flattening a section of what will become something like a lawn next to the garden:

    Garden rake - shank and ferrule
    Garden rake – shank and ferrule

    For whatever reason, there’s no cross bolt holding the shank into the ferrule, like there should be on any tool subject to pulling force.

    After marking the wide spot on the shank, a couple of good shots with a two pound hammer flattened the ferrule around it well enough to start a hole with a 3/16 step drill:

    Garden rake - cross drilling
    Garden rake – cross drilling

    Go through the far side with a 13/16 inch drill for a generous 5 mm fit, drop a bolt into the hole while it can’t get away, tighten the nyloc nut, and it’s all good:

    Garden rake - cross bolt
    Garden rake – cross bolt

    In fact, it’s better than it ever was, because now the shank can’t pull out until the ferrule falls off the handle. Which could happen, but I’m not averse to another bolt.

    Admittedly, it’s not a stainless steel socket head cap screw, because that’d just about double the value of the rake. The handle is in such bad shape that the bolt will probably outlast the wood …

    Done!

    Update: The consensus says I totally missed the Ritual Invocation of the Epoxy, so:

    Garden rake - epoxy fill
    Garden rake – epoxy fill

    Now all is right with the world …

  • Reversible Belt Buckle: Setscrew

    Reversible Belt Buckle: Setscrew

    The post in my reversible belt buckle popped out again, a year after punching it back in place, so it’s time to do a better job.

    Grab the buckle in the Sherline vise, center on the post hole, and drill a #38 = 2.58 mm hole:

    Reversible Belt Buckle - cross drilling
    Reversible Belt Buckle – cross drilling

    Tap it M3×0.5, clean out the hole, tap the post + spring back in place, dab threadlocker on the shortest M3 setscrew from the assortment, snug down on the post, and reinstall the belt:

    Reversible Belt Buckle - M3 setscrew installed
    Reversible Belt Buckle – M3 setscrew installed

    Looks like it grew there, doesn’t it?

    Now, as my buddy dBm will remind me, the real problem is too much weight in the saddle, but this fix should move the symptoms elsewhere …