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

  • Gas Furnace Zone Drain Valve Refurbishment

    Gas Furnace Zone Drain Valve Refurbishment

    One of the zone valves on the gas furnace developed a slow leak around its actuator stem, so (now that the heating season is definitely over) I’ve been refurbishing all the long-neglected rubbery bits and pieces.

    The four zone drain valves showed signs of having leaked in the past, so I took them apart to replace the washers:

    Furnace zone drain valve - washers
    Furnace zone drain valve – washers

    As you’d expect, the two most-deteriorated washers were on the valves with the most corrosion.

    As I expected, the faucet washer assortment on the shelf didn’t have that size. Figuring the size based on the outside diameter produced a description of faucet washer size labels that confirmed my suspicion: it makes no sense whatsoever. In the event of link rot, a lightly reformatted version of his table:

    Faucet Washer Sizes
    Faucet Washer Sizes

    Careful measurement suggested they were 3/8L, which fit perfectly:

    Furnace zone drain valve - gaskets
    Furnace zone drain valve – gaskets

    I added the spares and a copy of that table to the washer kit, although I’m certain the next project will involve a washer with yet another nonstandard standard size.

    Replacing the washers required dismantling the valves and the first valve produced a gasket that fell out in brittle fragments. Although the remaining three gaskets emerged intact, I picked up some gasket material and laser-cut four new gaskets from the 0.8 mm sheet.

    The OD fits into the valve body rebate:

    Furnace zone drain valve - gasket installed
    Furnace zone drain valve – gasket installed

    Because these valves are closed in operation and even when open won’t operate under any significant pressure, the gaskets aren’t particularly critical, but I dabbed joint compound into the body threads just to be sure.

    And, while I was ordering things, I got a set of knobs to replace the sad bent wreckage on their stems.

  • Dripworks Mainline Leak: Repair Under Field Conditions

    Dripworks Mainline Leak: Repair Under Field Conditions

    A large gooey puddle helped isolate a leak in the Dripworks main line pipe running the length of Mary’s Vassar Farms plot:

    Dripworks Mainline clamp - injured hose joint
    Dripworks Mainline clamp – injured hose joint

    Much of the tubing between the transfer barb in the buried pipe and the cross coupling lies on the surface, where it’s subject to missteps. This being just a few feet inside the garden gate, it’s no surprise enough missteps caused the barb to no longer seal properly.

    So I pulled the barb out of the pipe and deployed the backup pipe clamp I made after fixing a previous mishap:

    Dripworks Mainline clamp - installed
    Dripworks Mainline clamp – installed

    You’re supposed to wrap silicone tape while keeping its surface clean, which is obviously impossible in a hole rapidly filling with water draining from the plumbing but the clamp presses the tape firmly against the pipe and seals the leak.

    There is, I regret to say, an 8-32 stainless steel washer lost somewhere deep in the muck.

    I punched a new barb into the pipe with slightly longer tubing to the cross fitting, in the hope it’ll be more resilient.

    Another clamp with its silicone tape snippet stands ready for duty:

    Dripworks Mainline Pipe Clamp - assembled
    Dripworks Mainline Pipe Clamp – assembled

    For the record, the Micromark Cutoff Saw has a 3 mm offset between the side of the vise and the left edge of the blade:

    Micromark abrasive cutoff - work offset
    Micromark abrasive cutoff – work offset

    I still lack a Round Tuit for improving that vise.

  • BOB Yak Trailer: Fender Front Mount

    BOB Yak Trailer: Fender Front Mount

    I eventually tracked a distressingly loud rattle from the BOB Yak trailer to a fender mount failure:

    BOB Yak Trailer fender front mount - aluminum fatigue
    BOB Yak Trailer fender front mount – aluminum fatigue

    The screw clamped the round aluminum fender between two flat washers (the other of which has been touring the workbench). The hole in the aluminum started as a screw slot and eventually fretted away around the edge of the washers, leaving a trapped fragment to fall out as I loosened the screw.

    Well, this mount lasted a decade longer than the wire mount at the top of the fender, so there’s that.

    As before, a bit of math conjures a chunky mount from the vasty digital deep:

    Fender front mount - solid model - Show view
    Fender front mount – solid model – Show view

    The first iteration didn’t have the hole for the threaded insert angled downward at 10°, but it’s easier to make better measurements with a “pretty close” prototype. I’m reasonably sure the angle is a glitch due to hand-brazing the frame tubes, but we’ll never know.

    The inner plate angles to match the insert, thus keeping the screw & washer perpendicular to the surface:

    Fender front mount - solid model - Mounts view
    Fender front mount – solid model – Mounts view

    A brim around that chip of plastic ensures a good grip on the platform:

    BOB Yak Trailer - fender front mount - PrusaSlicer preview
    BOB Yak Trailer – fender front mount – PrusaSlicer preview

    I suppose rounding the corners would make it prettier:

    BOB Yak Trailer fender front mount - inner plate
    BOB Yak Trailer fender front mount – inner plate

    The original screw was slightly too short, so that’s a shiny replacement from the Drawer o’ Random M5 Screws. If I ever have occasion to go in there again, I’ll use a button head screw, although there’s certainly enough clearance:

    BOB Yak Trailer fender front mount - tire clearance
    BOB Yak Trailer fender front mount – tire clearance

    From the top, the gray PETG-CF looks like it grew there:

    BOB Yak Trailer fender front mount - installed
    BOB Yak Trailer fender front mount – installed

    I figured the mount’s radius by feeding measurements into the chord equation and assuming the overall curve is circular; the radius came out slightly too large, which likely won’t make much difference.

    The OpenSCAD source code as a GitHub Gist:

    // BOB Yak Trailer – fender front mount
    // Ed Nisley – KE4ZNU
    // 2026-06-15
    include <BOSL2/std.scad>
    Layout = "Show"; // [Build,Show,Frame,Fender,OuterMount,InnerMount,Mounts]
    /* [Hidden] */
    ID = 0;
    OD = 1;
    LENGTH = 2;
    HoleWindage = 0.2;
    Protrusion = 0.01;
    NumSides = 4*3*2*4;
    Gap = 5.0/2;
    $fn=NumSides;
    WallThick = 5.0;
    Washer = [6.0,16.0,1.5]; // M5 fender washer
    Rivnut = [5.0,10.3,1.5]; // M5 rivnut in frame
    FrameOD = 16.1; // trailer frame tubing
    FrameAngle = 10;
    FenderOA = [52,440,1.5]; // minor major thickness
    BlockOA = [0,40.0,1.25*Washer[OD]];
    //—–
    // Define things
    // Relevant part of the trailer frame
    // origin at center of rivnut
    module Frame() {
    yrot(FrameAngle)
    union() {
    left(Rivnut[LENGTH])
    ycyl(2*BlockOA.y,d=FrameOD,anchor=RIGHT);
    xcyl(FrameOD/2,d=Rivnut[OD],anchor=RIGHT);
    left(Protrusion)
    xcyl(10,d=Rivnut[OD],anchor=LEFT);
    }
    }
    module OuterFender() {
    torus(od=FenderOA[OD],d_min=FenderOA[ID],orient=FRONT,anchor=LEFT);
    }
    module FullFender() {
    difference() {
    OuterFender();
    right(FenderOA[LENGTH]) // make it a cup
    torus(od=FenderOA[OD] – 2*FenderOA[LENGTH],d_min=FenderOA[ID] – 2*FenderOA[LENGTH],
    orient=FRONT,anchor=LEFT);
    right(FenderOA[ID]/2) // remove inner half
    ycyl(2*BlockOA.y,d=FenderOA[OD] – FenderOA[ID],anchor=LEFT);
    down(2*Washer[OD]) // remove bottom part
    cuboid(2*[FenderOA[OD],FenderOA[OD],FenderOA[OD]],anchor=TOP+LEFT);
    }
    }
    module OuterMount() {
    difference() {
    right(FenderOA[ID]/2)
    cuboid([FrameOD/3 + Washer[LENGTH] + FenderOA[ID]/2,BlockOA.y,BlockOA.z],
    rounding=1.0,anchor=RIGHT);
    Frame();
    OuterFender();
    }
    }
    module InnerMount() {
    difference() {
    render()
    intersection() {
    yrot(FrameAngle)
    cuboid([WallThick + FenderOA[LENGTH],BlockOA.y,BlockOA.z],anchor=LEFT);
    right(FenderOA[LENGTH])
    OuterFender();
    }
    yrot(FrameAngle)
    xcyl(FenderOA[ID],d=Washer[ID],anchor=LEFT);
    }
    }
    //—–
    // Build it
    if (Layout == "Frame") {
    Frame();
    }
    if (Layout == "Fender") {
    FullFender();
    }
    if (Layout == "OuterMount") {
    OuterMount();
    }
    if (Layout == "InnerMount") {
    InnerMount();
    }
    if (Layout == "Mounts") {
    OuterMount();
    InnerMount();
    }
    if (Layout == "Show") {
    OuterMount();
    InnerMount();
    color("Gray",0.6) {
    Frame();
    FullFender();
    }
    }
    if (Layout == "Build") {
    up(BlockOA.z/2) left(FenderOA[ID]/4)
    OuterMount();
    up(BlockOA.z/2)
    xrot(180)
    yrot(-FrameAngle)
    InnerMount();
    }
  • Samsung Dishwasher Drying Fan Replacement

    Samsung Dishwasher Drying Fan Replacement

    The Samsung dishwasher (model DW80K7050US/AA 03) that Came With The House fails immediately after entering the Dry part of the cycle: a relay in the control PCB under the door goes doink, all the LEDS go off then on again, the countdown timer stops changing, and that repeats as long as you like.

    After considerable listening & pondering, I decided one event early in the Dry cycle involved starting a fan to vent the steam out of the interior. The wiring diagram shows the fan has a Fault wire: perhaps the fan has failed.

    The maintenance manual shows different fans in three different places, although the control board has a connector for only one. By process of elimination, I found the fan atop the cabinet:

    Samsung dishwasher - top view
    Samsung dishwasher – top view

    The cable from the fan in the vented compartment on the left burrows under the gray duct, around its back side, and plugs into the small white connector on the right. You must ease the cable from a row of hooks guiding it around the back of the duct, which requires slightly lifting the duct.

    Unhook the two metal straps, remove four screws from the black vent, and lift it off the top to reveal the duct outlet pores:

    Samsung dishwasher - fan duct - overview
    Samsung dishwasher – fan duct – overview

    Remove four more screws, lift the fan duct assembly just a little bit, and pry open three latches around the fan compartment with a consumer electronics case-cracking tool:

    Samsung dishwasher - fan housing
    Samsung dishwasher – fan housing

    The new fan (on the right) looks very much like the OEM fan (on the left), even though it’s the $15 version rather than the $150 version you might buy from similar randomly named sellers if you were so inclined:

    Samsung dishwasher - OEM vs new fan
    Samsung dishwasher – OEM vs new fan

    Detach the old fan & its cable, drop the new fan in place, snake its cable, plug its plug, and install All The Things in reverse order.

    Unfortunately, after shoving the dishwasher back into its cubby, the new fan didn’t change the failure at all.

    I hitched the old fan up to the bench supply and it spun just like it should. Wiring the Fault wire to a 5 V supply through a resistor shows it’s the usual tachometer signal pulsing as the rotor spins.

    Which means the next step requires more pondering and PCB probing. The failure is too consistent to be a Heisenbug, but maybe something shook loose in there.

  • Square Patio Table Feet

    Square Patio Table Feet

    For a square patio table (with one missing foot), of course:

    Patio Table Feet - installed
    Patio Table Feet – installed

    These are chunky enough to demonstrate they’re made of clear-ish TPU, at least when backlit:

    Patio Table Feet - installed - backlit
    Patio Table Feet – installed – backlit

    The interior of the leg determines what fits into it:

    Patio Table Feet - leg interior
    Patio Table Feet – leg interior

    I pried out another foot, scanned it, and blew out the contrast:

    Patio Table Foot - scan
    Patio Table Foot – scan

    Importing that into LightBurn let me draw a rectangle matching the measured size, then node-edit the corners to approximate the shape:

    Patio Table Foot - LightBurn layout
    Patio Table Foot – LightBurn layout

    Export that shape as an SVG, import into OpenSCAD, and turn it into a solid model:

    Patio Table Foot - solid model - show view
    Patio Table Foot – solid model – show view

    That’s the Show view simulating the actual positions, which demonstrates why the pair of legs at each corner wear mirror-imaged feet. The Build view arranges the pair more sensibly for 3D printing:

    Patio Table Foot - solid model - build view
    Patio Table Foot – solid model – build view

    The protrusions and their bumps went through several iterations on the way to being functional, with the black TPU prototype on the left being entirely too bendy and the first clear version requiring utility knife editing to fit the end posts inside the leg:

    Patio Table Feet - prototypes
    Patio Table Feet – prototypes

    The original feet seem to be injection-molded ABS with a flat bottom intended to erode one corner against whatever the table stands on. However, the legs splay out at 5° from the vertical, which makes the flat bottom I used for the first few iterations obviously wrong:

    Patio Table Feet - flat foot
    Patio Table Feet – flat foot

    Somebody who can math harder than I would resolve the two angles and all the measurements into a single transformation matrix, but I rotated the foot separately around the X and Y axes, trigged the lowest corner to the proper height, then chopped off everything below Z=0. Works for me.

    The OpenSCAD source code as a GitHub Gist:

    // Patio Table Foot – rectangular legs
    // Ed Nisley – KE4ZNU
    // 2026-05-26
    include <BOSL2/std.scad>
    Layout = "Show"; // [Show,Build]
    /* [Hidden] */
    HoleWindage = 0.2;
    Protrusion = 0.01;
    NumSides = 4*3*2*4;
    Gap = 5.0/2;
    $fn=NumSides;
    PadOA = [50,23.5,4.5];
    LegAngles = [5,5];
    EndStrut = [2.5 + 2.5,13.3 – 1.0,23.0];
    SideStrut = [12.0,5.5 – 1.0,13.0];
    Clearance = 0.5;
    StrutsOC = [44.0 – EndStrut.x,18.0 – SideStrut.y];
    //—–
    // Define it
    module Foot(angles = LegAngles) {
    difference() {
    up((PadOA.x/2)*abs(sin(angles.x)) + (PadOA.y/2)*abs(sin(angles.y)))
    xrot(angles.x) yrot(angles.y)
    union() {
    down(3*PadOA.z)
    linear_extrude(4*PadOA.z)
    left(PadOA.x/2) fwd(PadOA.y/2)
    import("Patio Table Foot – pad outline.svg",center=true);
    up(PadOA.z)
    for (i = [-1,1])
    right(i*StrutsOC.x/2)
    cuboid(EndStrut,anchor=BOTTOM) position(TOP)
    down(EndStrut.y/2) left(i*Clearance)
    pie_slice(r=(PadOA.x – StrutsOC.x)/2,ang=180,l=EndStrut.y,anchor=CENTER,spin=-i*90,orient=FRONT);
    up(PadOA.z)
    for (j = [-1,1])
    fwd(j*StrutsOC.y/2)
    cuboid(SideStrut,anchor=BOTTOM) position(TOP)
    down(SideStrut.x/2) zrot(90) right(j*Clearance)
    pie_slice(r=(PadOA.y – StrutsOC.y)/2,ang=180,l=SideStrut.x,anchor=CENTER,spin=j*90,orient=FRONT);
    }
    cuboid(4*PadOA,anchor=TOP);
    }
    }
    //—–
    // Build it
    if (Layout == "Show") {
    back(PadOA.y/2 + Gap)
    Foot();
    left(0.8*PadOA.x) fwd(PadOA.y) zrot(-90)
    yflip() Foot();
    }
    if (Layout == "Build") {
    union() {
    fwd(PadOA.y/2 + Gap)
    Foot();
    back(PadOA.y/2 + Gap)
    yflip() Foot();
    }
    }

  • Round Patio Table Feet

    Round Patio Table Feet

    For a round patio table, although you can’t tell from the picture:

    Round patio table feet - installed
    Round patio table feet – installed

    Also despite appearances, that’s 3D printed from clear-ish TPU, with its black appearance due to internal reflections from the leg’s dark interior.

    The original hard-white-plastic feet had eroded enough to let the aluminum legs scrape the deck paint:

    Round patio table feet - old vs new
    Round patio table feet – old vs new

    The only way to extract each old foot was to hack out a segment with a razor knife, after which it slid out easily.

    The ring around the top of the sections provides enough griptivity inside the leg to hold the foot in place:

    Round Patio Table Foot - solid model
    Round Patio Table Foot – solid model

    As with the TPU chains on the bike rack tray holder, I expect the compressed / bent segments will gradually relax inside the legs, but the feet ought not fall out in normal use.

    The OpenSCAD source code isn’t quite a one-liner, but it’s close:

    // Patio Table Foot - round legs
    // Ed Nisley - KE4ZNU
    // 2026-05-29
    
    include <BOSL2/std.scad>
    
    /* [Hidden] */
    
    ID = 0;
    OD = 1;
    LENGTH = 2;
    
    HoleWindage = 0.2;
    Protrusion = 0.01;
    NumSides = 4*3*2*4;
    Gap = 5.0;
    
    $fn=NumSides;
    
    PadOA = [8.0,1*INCH,3.0];
    
    SleeveOA = [13.0,21.7 - HoleWindage,12.0];
    
    Kerf = 2.5;
    
    
    //-----
    // Build it
    
    difference() {
      union() {
        tube(PadOA[LENGTH],od=PadOA[OD],id=PadOA[ID],anchor=BOTTOM) position(TOP)
          tube(SleeveOA[LENGTH],od=SleeveOA[OD],id=SleeveOA[ID],anchor=BOTTOM);
        up(PadOA[LENGTH] + SleeveOA[LENGTH] - 1.0)
          torus(d_maj=SleeveOA[OD],r_min=(PadOA[OD] - SleeveOA[OD])/2,anchor=TOP);
      }
      up(PadOA[LENGTH])
        for (a = [0,60,120])
          zrot(a)
            cuboid([PadOA[OD],Kerf,2*SleeveOA[LENGTH]],anchor=BOTTOM);
    }
    
    
  • Aneng AN8009 Resistance Offset

    Aneng AN8009 Resistance Offset

    Before measuring a wire resistance in the laser cutter, I checked the resistance of the two test leads on the Aneng AN8009 meter (“Check your zero!”) to show an unsteady reading around dozen ohms.

    Poking around inside showed the internal fuse apparently making poor contact with its holder, as poking it changed the random values:

    Aneng 8009 low-current fuse
    Aneng 8009 low-current fuse

    Two tiny drops of Caig DeoxIT stabilized the reading around 1 Ω across several different combinations of test probes, so I declared victory. There is surely an offset calibration buried in the firmware, but it’s no longer a trimpot available to service technicians.

    The ceramic fuse has an internal resistance of about an ohm, but swapping it for a replacement fuse with 0.2 Ω resistance didn’t materially change the results. It’s worth noting those glass fuses are slightly longer than they should be, surely due to their leads, and required slightly bending the fuseholder clips.