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: Home Ec

Things around the home & hearth

  • Backyard Utility Pole: Anchor Clamp Hardware

    Backyard Utility Pole: Anchor Clamp Hardware

    This also appeared while clearing the forsythia:

    Pole anchor - abandoned in place
    Pole anchor – abandoned in place

    It’s the guy line anchor for the fallen utility pole, abandoned in place when the crew installed the new pole.

    The rod turned freely in its underground anchor, but the nut is apparently frozen to the rod. I deployed the bolt cutter on the cable and hauled the carcass into the Basement Shop:

    Pole anchor - nut loosening
    Pole anchor – nut loosening

    Steeping the nuts with Kroil for a few hours relaxed them enough to submit to gentle suasion, whereupon the cable sproinged as the last nut released the clamping force:

    Pole anchor - hardware
    Pole anchor – hardware

    As far as I can tell, the clamp hardware dates back to the pole’s original installation in 1940 and is in fine, if not pristine, shape.

    The bolt shanks have an oval section matching the holes in the plate, so the bolts don’t turn and the crew needs only one wrench. They don’t make ’em like they used to!

    I have no idea what I’ll do with these things, but they’re entirely too nice for the steel recycling bucket.

  • Clearing the Overgrowth

    Clearing the Overgrowth

    Our morning task on clear days has been clearing a forsythia overgrowth along the north lot line; the branches tip-root as our neighbor’s bushes creep southward toward the sunlight. The process involves ramming a six-foot octagonal high-carbon / tempered / tougher than nails / rings like a bell steel bar (measuring a generous 1-1/8 across the flats) deep into the dirt under the plant, kicking a 4×4 inch block against the bar, pushing downward with all my weight to pry the plant upward until something deep underground rips, then repeating from all directions until enough big roots break and the mass tears out:

    Forsythia root removal
    Forsythia root removal

    Then it’s on to the next plant.

    The turmoil exposed a run of black PVC pipe along the lot line, although one end seemed firmly anchored. More excavation revealed a giant grape vine root growing around the pipe:

    Grape root around PVC pipe - top
    Grape root around PVC pipe – top

    I had to sever the pipe with an axe on both sides to free the root:

    Grape root around PVC pipe - side
    Grape root around PVC pipe – side

    The pipe originally carried water from the Mighty Wappinger Creek along the east lot line, 500 feet away and 70-ish feet down, presumably to water the previous owner’s plants. As far as I’m concerned, the remains of that pump will remain on the bottomlands forevermore, but at least we’ve cleared the remains of the plumbing.

    Mornings like that make writing CNC code look downright attractive, but I’m developing the cutest little biceps …

  • Cheese Slicer Re-wiring

    Cheese Slicer Re-wiring

    This happens occasionally:

    Cheese slicer - snapped wire
    Cheese slicer – snapped wire

    Repairing it with a length of 20 mil = 0.5 mm music wire didn’t take long:

    Cheese slicer - new wire
    Cheese slicer – new wire

    What did take a while was removing one of the screws, turning off another millimeter of thread, and sticking it back in again. The new wire is slightly thinner, stacks up just slightly less under the screw head (maybe I used two turns instead of three?), and let the thread stick into the Delrin bushing I put inside the aluminum roller.

    Imagine the middle screw with a slightly longer smooth end and you’ve got the idea:

    Cheese slicer - screw shafts
    Cheese slicer – screw shafts

    That was easy …

    It’s worth noting the JB Weld epoxy coating remains in as-applied condition after well over a year.

  • Hose Fitting vs. Lawn Mower

    Hose Fitting vs. Lawn Mower

    This appeared while we uprooted a row of forsythia along the north border:

    Brass hose fitting vs lawnmower
    Brass hose fitting vs lawnmower

    Although FOD has killed a good share of my lawn mowers and blades over the decades, this happened long before my administration and I can’t take credit for the precision targeting.

  • Upconverting Baby Wipes

    Upconverting Baby Wipes

    As other folks have discovered, it’s straightforward to convert soft, soothing baby wipes into toxic sanitizing wipes by pouring harsh chemicals down the hatch:

    AmazonBasics Baby Wipes
    AmazonBasics Baby Wipes

    Ending up with the proper dilution, though, requires knowing how much liquid the wipes already have, so you can account for it in whatever recipe you’re following.

    Stand back, I’m going to use arithmetic!

    Gut a new package of wipes: 552 g total weight, with 80 wet wipes weighing 536 g, so the packaging amounts to 15.5 g and each wet wipe weighs 6.7 g.

    Hang five wipes in the breeze for a few hours to find they weigh 9.2 g. They’re still slippery, because of all the aloe & Vitamin E & whatever else Amazon specifies for the mix, but they’re dry. One dry wipe weighs 1.8 g, so all 80 weigh 150 g.

    The block o’ wet wipes holds 536 – 150 = 390 g = 390 ml of water.

    Should you want a 70% (by volume) isopropyl alcohol solution, pour 0.7/0.3 × 390 ml = 910 ml of 99% alcohol into the package and let it settle for a while. Each wipe will emerge dripping wet, but that’s not entirely a Bad Thing. Perhaps it’d be a good idea to start by letting the block dry out for a while, re-weigh, then calculate the alcohol dose from the reduced amount of water.

    Bleach dilutions for sanitation seem wildly varied, but the jug of 8.25% sodium hypochlorite on the shelf says 1/2 cup to a gallon, a 1:32 volume ratio. Starting with 390 ml of water-like substance in the package, pour 12 ml of bleach into the hatch, let things settle, then squish it around for good measure.

    None of the dosages seem particularly critical, given the slapdash way everybody applies wipes.

    You should, of course, conspicuously mark the packages, so as not to apply toxic wipes to sensitive parts of you or your baby …

  • Round Soaker Hose Splint

    Round Soaker Hose Splint

    One of two new round rubber soaker hoses arrived with a slight crimp, enough to suggest it would crumble at an inopportune moment. Rather than return the hose for something that’s not an obvious failure, I clamped the crimp:

    Round Soaker Hose Splice - top
    Round Soaker Hose Splice – top

    Unlike the clamps for the punctured flat soaker hoses, this one doesn’t need to withstand much pressure and hold back a major leak, so I made the pieces a bit thicker and dispensed with the aluminum backing plates:

    Round Soaker Hose Splice - bottom
    Round Soaker Hose Splice – bottom

    The solid model is basically the same as for the flat hoses, with a slightly oval cylinder replacing the three channels:

    Round Soaker Hose Splice - OpenSCAD model
    Round Soaker Hose Splice – OpenSCAD model

    The OpenSCAD source code as a GitHub Gist:

    // Rubber Soaker Hose Splice
    // Ed Nisley KE4ZNU 2020-03
    Layout = "Build"; // [Hose,Block,Show,Build]
    TestFit = false; // true to build test fit slice from center
    //- 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;
    //———-
    // Dimensions
    // Hose lies along X axis
    Hose = [200,14.5,13.6]; // X = longer than anything else
    // 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];
    Block = [50.0,Hose.y + 2*Washer[OD],4.0 + 1.5*Hose.z]; // overall splice block size
    echo(str("Block: ",Block));
    Kerf = 1.0; // cut through middle to apply compression
    CornerRadius = Washer[OD]/2;
    NumScrews = 3; // screws along each side of cable
    ScrewOC = [(Block.x – 2*CornerRadius) / (NumScrews – 1),
    Block.y – 2*CornerRadius,
    2*Block.z // ensure complete holes
    ];
    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() {
    NumSides = 12*4;
    rotate([0,-90,0])
    translate([0,0,-Hose.x/2])
    resize([Hose.z,Hose.y,0])
    cylinder(d=Hose.z,h=Hose.x,$fn=NumSides);
    }
    // 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 (i = [0:NumScrews – 1], j=[-1,1]) // screw holes
    translate([-(Block.x/2 – CornerRadius) + i*ScrewOC.x,
    j*ScrewOC.y/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();
    }
    }
    //———-
    // Build them
    if (Layout == "Hose")
    HoseProfile();
    if (Layout == "Block")
    SpliceBlock();
    if (Layout == "Show") {
    difference() {
    SpliceBlock();
    HoseProfile();
    }
    color("Green",0.25)
    HoseProfile();
    }
    if (Layout == "Build") {
    SliceOffset = TestFit && !NumScrews%2 ? ScrewOC.x/2 : 0;
    intersection() {
    translate([SliceOffset,0,Block.z/4])
    if (TestFit)
    cube([ScrewOC.x/2,4*Block.y,Block.z/2],center=true);
    else
    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();
    }
    }
    }

  • CNC Kitchen Sink Strainer

    CNC Kitchen Sink Strainer

    Our Young Engineer recently rented a house, now knows why our sinks have CNC-machined strainers, and asked for something better than the disgusting stainless mesh strainer in the kitchen sink.

    Being a doting father, I turned out a pair to get a pretty one:

    CNC Sink Strainer - overview
    CNC Sink Strainer – overview

    They’re made from the same scrap smoked acrylic as the ones in our sinks:

    CNC Sink Strainer
    CNC Sink Strainer

    They’re definitely upscale from the (not watertight!) 3D printed version I built for a Digital Machinist column to explain OpenSCAD modeling:

    Strainer plate fill
    Strainer plate fill

    This time around, though, I rewrote the subtractive design in GCMC, with helical milling for all the holes to eliminate the need to change tools:

    Sink Strainer - tool path simulation - CAMotics
    Sink Strainer – tool path simulation – CAMotics

    They’re done on the Sherline, because it has real clamps:

    CNC Sink Strainer - on Sherline
    CNC Sink Strainer – on Sherline

    Four tabs eliminated the need to reclamp the stock before cutting the perimeter, but I should have ramped, not plunged, through the final cut between the tabs:

    CNC Sink Strainer - tab surface fracture
    CNC Sink Strainer – tab surface fracture

    The handles come from the same chunk of hex acrylic as before, eyeballed to length, tapped 8-32, and secured with acrylic adhesive.

    The GCMC source code as a GitHub Gist:

    // Drill & mill sink drain strainer
    // Ed Nisley KE4ZNU — Digital Machinist 15.2 Spring 2020
    // polycarbonate or acrylic sheet
    // External clamps at corners
    // Origin at center of sheet
    //—–
    // Dimensions
    DiskOD = 80.0mm; // usual kitchen drain = 3-1/4 inch
    DiskRad = DiskOD/2;
    PlateThick = 6.0mm; // stock thickness
    MillOD = 3.170mm; // measured end mill OD
    HoleDia = 4.75mm; // 3/16 inch drain holes
    ScrewOD = 0.18in; // knob screw clearance
    NumRings = 3; // rings of drain holes
    RingSpace = 1.5 * HoleDia; // .. between rings
    MaxZCut = 0.25 * MillOD; // max cut depth
    MillSpeed = 1000mm; // horizontal feedrate
    NumTabs = 4;
    TabTilt = 45deg;
    TabLength = 5.0mm;
    TabThick = 0.5mm;
    SafeZ = 10.0mm; // above all obstructions
    TravelZ = 1.0mm; // within engraving / milling area
    MillZ = -(PlateThick + 0.5mm); // through disk into spoil board
    TwoPi = 2*pi();
    //—–
    // Mill one hole
    function MillHole(ctr,radius,turns) {
    goto([-,-,TravelZ]);
    goto(head(ctr,2) + [radius,-,-]);
    goto([-,-,0]); // kiss surface
    circle_cw(ctr,turns); // helix downward
    circle_cw(head(ctr,2)); // remove last ramp
    goto(ctr); // get elbow room
    goto([-,-,TravelZ]);
    }
    //—–
    // Start cutting!
    goto([-,-,SafeZ]);
    goto([0,0,-]);
    goto([-,-,TravelZ]);
    feedrate(MillSpeed);
    // Mill center screw hole
    comment("– Center hole");
    ctr = [0,0,MillZ];
    MillHole(ctr,(ScrewOD – MillOD) / 2,ceil(abs(ctr.z) / MaxZCut));
    // Mill hole rings
    comment("– Drain hole rings");
    repeat (NumRings; ri) {
    comment("Ring: ",ri);
    rr = DiskRad – ri*RingSpace; // ring radius
    comment(" radius: ",rr);
    nh = to_int(floor(TwoPi*rr / (2*HoleDia))); // number of holes
    comment(" holes: ",nh);
    repeat(nh; h) {
    a = (h – 1) * TwoPi / nh; // angle of hole
    ctr = [rr*cos(a),rr*sin(a),MillZ]; // center point at ending Z
    MillHole(ctr,(HoleDia – MillOD)/2,ceil(abs(ctr.z) / MaxZCut));
    }
    }
    // Mill perimeter
    comment("– Perimeter");
    r = DiskRad + MillOD/2;
    goto([r,0,-]);
    goto([-,-,0]);
    ctr = [0,0,-(PlateThick – TabThick)];
    circle_ccw(ctr,ceil(abs(ctr.z) / MaxZCut)); // ramp downward
    circle_ccw(ctr,1); // remove last ramp
    goto([-,-,TravelZ]);
    comment("– Tabs");
    ta = 360deg / NumTabs; // between tabs
    tsa = to_rad(TwoPi*((TabLength + MillOD) / (TwoPi * r))); // subtended tab angle
    repeat (NumTabs; i) {
    comment(" # ",i);
    a = TabTilt + (i – 1)*ta; // tab center angle
    p0 = [r*cos(a + tsa/2),r*sin(a + tsa/2),MillZ]; // entry on ccw side
    p1 = [r*cos(a + ta – tsa/2),r*sin(a + ta – tsa/2),MillZ]; // exit at next tab
    if (0) {
    comment(" angle: ",a);
    comment(" entry: ",p0);
    comment(" exit: ",p1);
    }
    goto(head(p0,2)); // to entry point
    move(p0); // plunge through
    arc_ccw(p1,r);
    goto([-,-,TravelZ]);
    }
    goto([-,-,SafeZ]);
    goto([0,0,-]);

    All in all, a pleasant diversion from contemporary events …