Archive for June 4th, 2015

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

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

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

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

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() {
		translate([0,0,SlotHeight/2 - Protrusion/2])
			cube([2*StemOD,SlotWidth,(SlotHeight + Protrusion)],center=true);


//-- Hand-friendly knob

module KnobCap() {
	difference() {
		intersection() {
				cylinder(d=(StemOD + 2*ThreadWidth),h=(StemInset + Protrusion),$fn=StemSides);

//- Build it

if (Layout == "Knob")

if (Layout == "Stem")

if (Layout == "Build") {

if (Layout == "Show") {
	translate([0,0,StemLength - StemInset])