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.

The New Hotness

  • 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.