More WS2812 Failures

Even though I’m using what seem to be good-quality parts, one of the WS2812 RGB LEDs in a Glass Tile frame died:

Glass Tile - 2x2 - first WS2812B failure
Glass Tile – 2×2 – first WS2812B failure

It passed the Josh Sharpie Test:

Glass Tile - WS2812 failure - PCB unknown
Glass Tile – WS2812 failure – PCB unknown

After building the third Glass Tile unit, one of the LEDs didn’t light up due to an easily diagnosed problem:

Glass Tile - WS2812 failure - PCB cold solder - as found
Glass Tile – WS2812 failure – PCB cold solder – as found

A closer look:

Glass Tile - WS2812 failure - PCB cold solder
Glass Tile – WS2812 failure – PCB cold solder

Shortly thereafter, the Nissan Fog Lamp developed an obvious beam problem:

Nissan Fog Lamp - failed WS2812 effect
Nissan Fog Lamp – failed WS2812 effect

The WS2812 had the proper voltages / signals at all its pins and was still firmly stuck to the central “heatsink”:

Nissan Fog Lamp - failed WS2812 detail
Nissan Fog Lamp – failed WS2812 detail

It also passed the Josh Sharpie Test:

Glass Tile - WS2812 failure - tape - unknown
Glass Tile – WS2812 failure – tape – unknown

I’m particularly surprised by this one, because eleven of the twelve flex-PCB WS2812s in the Hard Drive Platter light have been running continuously for years with no additional failures.

The alert reader will note the common factor: no matter what substrate the LED is (supposed to be) soldered to, no matter when I bought it, no matter what it’s wired into, a WS2812 will fail.

They’re all back in operation:

Glowing Algorithmic Art
Glowing Algorithmic Art

Although nobody knows for how long …

Obviously, it’s time to refresh my programmable RGB LED stockpile!

Garden Hose Valve Wrench: Reinforced

After five gardening seasons, my simple 3D printed wrench broke:

Hose Valve Knob - fractured
Hose Valve Knob – fractured

Although Jason’s comment suggesting carbon-fiber reinforcing rods didn’t prompt me to lay in a stock, ordinary music wire should serve the same purpose:

Hose Valve Knob - cut pins
Hose Valve Knob – cut pins

The pins are 1.6 mm diameter and 20 mm long, chopped off with hardened diagonal cutters. Next time, I must (remember to) grind the ends flat.

The solid model needs holes in appropriate spots:

Hose Valve Knob - Reinforced - Slic3r
Hose Valve Knob – Reinforced – Slic3r

Yes, I’m going to put round pins in square holes, without drilling the holes to the proper diameter: no epoxy, no adhesive, just 20 mm of pure friction.

The drill press aligns the pins:

Hose Valve Knob - pin ready
Hose Valve Knob – pin ready

And rams them about halfway down:

Hose Valve Knob - pin midway
Hose Valve Knob – pin midway

Close the chuck jaws and shove them flush with the surface:

Hose Valve Knob - pins installed
Hose Valve Knob – pins installed

You can see the pins and their solid plastic shells through the wrench stem:

Hose Valve Knob - assembled
Hose Valve Knob – assembled

Early testing shows the reinforced wrench works just as well as the previous version, even on some new valves sporting different handles, with an equally sloppy fit for all. No surprise: I just poked holes in the existing model and left all the other dimensions alone.

The OpenSCAD source code as a GitHub Gist:

// Hose connector knob
// Ed Nisley KE4ZNU - June 2015
// 2020-05 add reinforcing rods
Layout = "Build"; // [Knob, Stem, Show, Build]
RodHoles = true;
//- Extrusion parameters - must match reality!
/* [Hidden] */
ThreadThick = 0.25;
ThreadWidth = 0.40;
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
Protrusion = 0.1;
HoleWindage = 0.2;
//------
// Dimensions
/* [Dimensions] */
RodOD = 1.6;
RodAngle = 35;
/* [Hidden] */
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;
Align = 0*180/StemSides; // 1* produces thinner jaw ends
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);
RodBCD = (StemOD + BossOD)/2;
//- 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(Align)
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);
if (RodHoles)
for (i=[-1:1])
rotate(i*RodAngle + 90)
for (j=[-1,1])
translate([j*RodBCD/2,0,-Protrusion])
rotate(180/4)
PolyCyl(RodOD,2*SlotHeight,4);
}
}
//-- Hand-friendly knob
module KnobCap() {
difference() {
scale([1.0,0.75,1.0])
rotate(180/KnobSides)
intersection() {
translate([0,0,(KnobHeight-DomeArcRad)])
sphere(r=DomeArcRad,$fa=180/KnobSides);
cylinder(r1=KnobOD1/2,r2=KnobOD2/2,h=KnobHeight,$fn=KnobSides);
cylinder(r1=KnobOD2/2,r2=KnobOD1/2,h=KnobHeight,$fn=KnobSides);
}
translate([0,0,-Protrusion])
rotate(Align)
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();
}

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.

American Standard Kitchen Faucet: Yet Another Replacement

These cartridges seem to wear out after two years, at most:

American Standard faucet cartridge
American Standard faucet cartridge

The handle becomes difficult to move, both left-to-right and up-and-down, with lubrication of the (obviously metal-on-plastic) shaft being unavailing.

Having devoted considerable time & attention to keeping this thing alive, there really aren’t any user-serviceable parts inside:

American Standard Ceramic Faucet Valve Cores - old vs new
American Standard Ceramic Faucet Valve Cores – old vs new

I think the sliding fit between the two ceramic blocks laps itself into a more perfect joint, to the extent it’s wrung together and can’t be moved. Even after filtering, our town-supplied water apperently has enough micro-fine grit for the purpose.

So I have another valve core for the collection …

On the upside, the improved spout bearing rings continue to work fine, although it’s only been five months.

Mini-Lathe: Threading Dial Alignment

As received, the mini-lathe’s threading dial was misaligned by about 1/4 division, which is nearly halfway to the next engagement point midway between the divisions:

Mini-Lathe Threading Dial - as received - colorized
Mini-Lathe Threading Dial – as received – colorized

I added the red lacquer crayon while contemplating what to do, because I thought the dial was swaged onto the shaft. It turns out to be threaded, so I marked where the dial should be, grabbed the shaft in the (soft-jawed) bench vise, and twisted the dial with a Vise-Grip until it lined up:

Mini-Lathe Threading Dial - aligned
Mini-Lathe Threading Dial – aligned

Well, it’s closer than it was, OK?

There’s about that much slop on either side of the index line coming from the loose gear engaging the leadscrew, so that’s as good as it gets.

Garden Rake Cross Bolt

Mary’s long-suffering garden rake pulled apart while we were flattening a section of what will become something like a lawn next to the garden:

Garden rake - shank and ferrule
Garden rake – shank and ferrule

For whatever reason, there’s no cross bolt holding the shank into the ferrule, like there should be on any tool subject to pulling force.

After marking the wide spot on the shank, a couple of good shots with a two pound hammer flattened the ferrule around it well enough to start a hole with a 3/16 step drill:

Garden rake - cross drilling
Garden rake – cross drilling

Go through the far side with a 13/16 inch drill for a generous 5 mm fit, drop a bolt into the hole while it can’t get away, tighten the nyloc nut, and it’s all good:

Garden rake - cross bolt
Garden rake – cross bolt

In fact, it’s better than it ever was, because now the shank can’t pull out until the ferrule falls off the handle. Which could happen, but I’m not averse to another bolt.

Admittedly, it’s not a stainless steel socket head cap screw, because that’d just about double the value of the rake. The handle is in such bad shape that the bolt will probably outlast the wood …

Done!

Update: The consensus says I totally missed the Ritual Invocation of the Epoxy, so:

Garden rake - epoxy fill
Garden rake – epoxy fill

Now all is right with the world …

Reversible Belt Buckle: Setscrew

The post in my reversible belt buckle popped out again, a year after punching it back in place, so it’s time to do a better job.

Grab the buckle in the Sherline vise, center on the post hole, and drill a #38 = 2.58 mm hole:

Reversible Belt Buckle - cross drilling
Reversible Belt Buckle – cross drilling

Tap it M3×0.5, clean out the hole, tap the post + spring back in place, dab threadlocker on the shortest M3 setscrew from the assortment, snug down on the post, and reinstall the belt:

Reversible Belt Buckle - M3 setscrew installed
Reversible Belt Buckle – M3 setscrew installed

Looks like it grew there, doesn’t it?

Now, as my buddy dBm will remind me, the real problem is too much weight in the saddle, but this fix should move the symptoms elsewhere …