-
Garden Hose Valve Knobs: One Wrench To Rule Them
A sampling of the various Y connectors and manifolds that water Mary’s gardens:
Those little handles don’t turn nearly as easily as they should and some require far more finger pressure than Mary can exert. Lubrication being unavailing, the solution is to apply torque through a wrench, rather than fingertips, but fiddling around to match the proper wrench with the valve in hand isn’t acceptable.
The first pass at a Universal Wrench:

Hose Valve Knob – with measurements The embossed sheet (the back of my Geek Scratch Paper) carried the knob shapes & dimensions from the garden to the desk, where I measured & laid out the wrench:

Hose Connector Knob – Build layout I filched the knob design from the OXO Can Opener Handle, made it somewhat taller, and applied a
scale()operation to mash it into an ellipse aligned with the wrench slot. That huge hexagonal socket in the middle bridged just fine, even though the threads came out as distinct cylinders:
Hose Connector Knob – bridge layer – Slic3r preview Adding one thread width of clearance around the stem to form the socket produced a slip fit, with a dollop of fast-cure epoxy holding the pieces together.
The wrench fits the largest valve knob with enough clearance to eliminate fiddling. A cylinder punched into the middle of the slot accommodates those teardrop handles:

Hose Connector Knob – Show layout – bottom view It’s oversized for the smallest “knob”, a vicious triangular stalk that’s murder on the fingers (and not shown here), but fits well enough that, should we deploy any of those, she’ll be ready.
The stem diameter can’t be any larger, because the knobs on Valve 1 don’t allow any clearance. It could be more circular, but I doubt that buys anything. The open ends of the slot won’t let mulch pack into the recesses.
I expect a wrench jaw will eventually snap off as the layers delaminate. In that case I’ll either sink a pair of steel pins into each jaw or, more likely, combine the handle & stem into one object, split the whole affair across the jaws, print the two halves, and glue them together so that the threads run in the proper direction to meet the stress.
Be that as it may, as of right now this is The Best Thing I’ve Ever Built…
The OpenSCAD source code:
// Hose connector knob // Ed Nisley KE4ZNU - June 2015 Layout = "Build"; // Show Build Knob Stem //- Extrusion parameters - must match reality! ThreadThick = 0.25; ThreadWidth = 0.40; function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); Protrusion = 0.1; HoleWindage = 0.2; //------ // Dimensions 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; 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); //- 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(0*180/StemSides) 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); } } //-- Hand-friendly knob module KnobCap() { difference() { scale([1.0,0.75,1.0]) intersection() { translate([0,0,(KnobHeight-DomeArcRad)]) rotate(180/KnobSides) sphere(r=DomeArcRad,$fa=180/KnobSides); rotate(180/KnobSides) cylinder(r1=KnobOD1/2,r2=KnobOD2/2,h=KnobHeight,$fn=KnobSides); rotate(180/KnobSides) cylinder(r1=KnobOD2/2,r2=KnobOD1/2,h=KnobHeight,$fn=KnobSides); } translate([0,0,-Protrusion]) rotate(0*180/StemSides) 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(); }