Kitchen Sink Faucet: Base Rejuvenation

The kitchen sink has a small faucet that used to connect directly to the well out back, but now delivers town water from a line bypassing the water softener. The large steel washer below the sink deck has been shedding rust for a while and finally disintegrated:

Kitchen faucet - rusted washer assembly

Kitchen faucet – rusted washer assembly

Well, this is a perfect application for plastic, not steel, so I conjured up a pair of disks:

Sink Base - Build

Sink Base – Build

The large flat one goes below the sink deck in place of the steel washer and the smaller part of the stepped disk fits inside the deck opening to stabilize the faucet:

Sink Base - Show

Sink Base – Show

The two dark rings bracketing the deck between the orange plastic disks represent a pair of gaskets / washers / seals cut from 1 mm rubber sheet with a straight razor toting compass:

Kitchen faucet - plastic disks and rubber deck washers

Kitchen faucet – plastic disks and rubber deck washers

Just for fun, I used Slic3r’s Hilbert Curve top and bottom fill pattern. It produces a nice, grainy texture that feels appropriate for anything needing a non-slip grip (at least on the top, as the bottom surface is glass-smooth).

Everything stacks up thusly, with the top dark ring representing a rubber seal that came with the faucet:

Sink Base - Assemble

Sink Base – Assemble

It looks about the same in real life, albeit minus all the colors:

Kitchen faucet - fitting stack

Kitchen faucet – fitting stack

The black plastic and black rubber blend together and vanish amid all the chrome:

Kitchen faucet - assembled

Kitchen faucet – assembled

Alas, when I turned the water on, Mary said “That doesn’t sound right…” at about the same time I discovered a fine mist under the sink. See if you can spot the problem:

Kitchen faucet - corroded copper tube

Kitchen faucet – corroded copper tube

A shined-up view should make it obvious:

Kitchen faucet - corroded copper tube - pinhole

Kitchen faucet – corroded copper tube – pinhole

A trip to the precious metals aisle of the Big Box Home Repair Store produced a roll of 3/8 inch copper tubing, although I should have the stub end of that original roll somewhere in the heap. The fitting at the bottom of the faucet turned out to be completely non-standard and I had to re-use it with the new tubing, but it still sealed perfectly.

I hate plumbing jobs. That fix better last for another decade…

The OpenSCAD source code:

// Sink faucet bottom seal
// Ed Nisley KE4ZNU - Oct 2013

Layout = "Assemble";				// Build Show Upper Lower Gasket

Plastic = "Orange";
Rubber = "DarkSlateGray";

//- 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;

Gap = 10.0;

//- Dimensions

FaucetOD = 32.0;

UpperOD = 44.5;
UpperThick = IntegerMultiple(1.0,ThreadThick);

DeckHoleOD = 37.5;
DeckThick = IntegerMultiple(1.0,ThreadThick);

LowerOD = 50.0;
LowerThick = IntegerMultiple(5.0,ThreadThick);

PipeOD = 11.0;
PipeLength = 50;			// for Show layout

GasketThick = 1.0;
TopGasket = [FaucetOD,PipeOD,GasketThick];
MidGasket = [UpperOD,DeckHoleOD,GasketThick];
BotGasket = [LowerOD,PipeOD,GasketThick];

NumSides = 4*12;

//- 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);
}

//- Put peg grid on build surface

module ShowPegGrid(Space = 10.0,Size = 1.0) {

  RangeX = floor(100 / Space);
  RangeY = floor(125 / Space);

	for (x=[-RangeX:RangeX])
	  for (y=[-RangeY:RangeY])
		translate([x*Space,y*Space,Size/2])
		  %cube(Size,center=true);

}

module UpperDisk() {
	difference() {
		union() {
			cylinder(r=UpperOD/2,h=UpperThick,$fn=NumSides);
			cylinder(r=DeckHoleOD/2,h=(DeckThick + UpperThick + GasketThick),$fn=NumSides);
		}
		translate([0,0,-Protrusion])
			PolyCyl(PipeOD,(DeckThick + UpperThick + GasketThick + 2*Protrusion));
	}
}

module LowerDisk() {
	difference() {
		cylinder(r=LowerOD/2,h=LowerThick,$fn=NumSides);
		translate([0,0,-Protrusion])
			PolyCyl(PipeOD,(LowerThick + 2*Protrusion));
	}
}

module MakeGasket(Gasket=[10,5,1],Color=Rubber) {
	color(Color)
		difference() {
			cylinder(r=Gasket[0]/2,h=Gasket[2]);
			translate([0,0,-Protrusion])
				PolyCyl(Gasket[1],(Gasket[2] + 2*Protrusion));
		}

}

module SinkDeck() {
	color("LightSlateGray")
		difference() {
			translate([-LowerOD,-LowerOD,0])
				cube([2*LowerOD,2*LowerOD,DeckThick]);
			translate([0,0,-DeckThick])
				cylinder(r=DeckHoleOD/2,h=3*DeckThick);
		}

}

//- Build it

ShowPegGrid();

if (Layout == "Upper")
	UpperDisk();

if (Layout == "Lower")
	LowerDisk();

if (Layout == "Gasket")
	MakeGasket(MidGasket);

if (Layout == "Show") {
	color(Plastic)
	translate([0,0,(UpperThick + DeckThick + Gap)])
		rotate([180,0,0])
			UpperDisk();

	color(Plastic)
	translate([0,0,-(Gap + LowerThick)])
		LowerDisk();

	color("Yellow",0.25)
		translate([0,0,-PipeLength/2])
			PolyCyl(0.9*PipeOD,PipeLength,NumSides);

	color("DarkSlateGray")
		difference() {
			translate([0,0,3*Gap/2])
				cylinder(r=FaucetOD/2,h=GasketThick);
			translate([0,0,-25])
				cylinder(r=PipeOD/2,h=50);
		}

	translate([0,0,3*Gap/2])
		MakeGasket(TopGasket);

	translate([0,0,-DeckThick])
		SinkDeck();

	translate([0,0,Gap/2])
		MakeGasket(MidGasket);

	translate([0,0,-Gap/2])
		MakeGasket(BotGasket);

}

if (Layout == "Assemble") {
	color(Plastic)
	translate([0,0,(UpperThick + GasketThick)])
		rotate([180,0,0])
			UpperDisk();

	color(Plastic)
	translate([0,0,-(LowerThick + DeckThick + GasketThick)])
		LowerDisk();

	color("Yellow",0.25)
		translate([0,0,-PipeLength/2])
			PolyCyl(PipeOD,PipeLength,NumSides);

	translate([0,0,-DeckThick])
		SinkDeck();

	color("DarkSlateGray")
		difference() {
			translate([0,0,3*Gap/2])
				cylinder(r=FaucetOD/2,h=GasketThick);
			translate([0,0,-25])
				cylinder(r=PipeOD/2,h=50);
		}

	translate([0,0,3*Gap/2])
		MakeGasket(TopGasket);

	MakeGasket(MidGasket);

	translate([0,0,-(DeckThick + GasketThick)])
		MakeGasket(BotGasket);

}

if (Layout == "Build") {
	translate(0.75*[UpperOD,UpperOD,0]/2)
		UpperDisk();
	translate(0.75*[-LowerOD,-LowerOD,0]/2)
		LowerDisk();
}

As a reward for being the type of person who reads all the way to the end, yes, that’s a riff on Poke Salad Annie.

, ,

  1. #1 by Jason Doege on 2013-10-16 - 11:56

    If you were an auto-mechanic, and if that were a radiator hose, I’d suggest that you generated some extra paying work…

    • #2 by Ed on 2013-10-16 - 20:07

      generated some extra paying work

      Yeah, like I enjoyed taking that mess apart again, just so I could go out and buy a roll of tubing. Not to mention, I was lying under the sink when the spray cut loose. [grin]