Homeostasis is a thing:
On the other paw, the eyeballometric trend line since mid-April slopes at -1 lb/month and arrives at just over 150 lb in December, so progress continues apace.
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.
Homeostasis is a thing:
On the other paw, the eyeballometric trend line since mid-April slopes at -1 lb/month and arrives at just over 150 lb in December, so progress continues apace.
The latest in a continuing series of annoyances from our American Standard kitchen faucet: it became increasingly hard to turn it on with the handle all the way to the left in the “hot” position. Bear in mind this valve is less than a year old and I replaced its predecessor two years before that, after maybe a decade of service from the OEM valve.
Pulling it apart revealed the problem, which requires a close inspection.
The view from the “cold” side:
And from the “hot” side:
See it?
The valve handle stem pivots on the 4 mm shaft passing through the black “engineering plastic” shape inside the red hot-limit ring. This top view shows the overall layout:
The shaft has worked its way leftward, toward the “hot” side, until it bumped into the limit ring. The right end of the shaft hasn’t come completely out of the inside of its pivot, but it’s apparently gone far enough to stop pivoting freely.
This may also explain how the previous hot-limit ring worked loose: the misplaced shaft applies torque to the limit ring as we move the lever to the “cold” side. I don’t know how the ring worked its way upward from its positioning notches. Overall, it seem plausible.
Installing a new valve isn’t going to get us a better design, so I must figure out how to keep the shaft in the middle of its travel. Perhaps replacing it with a slightly longer shaft will work around the problem, because it simply can’t slide in either direction.
Loosening the three screws holding the cartridge down (and applying pressure against the seals) reduces the force required to move the faucet, even with the shaft in the wrong position. This suggests the valve body distorts slightly, so I loosened all three and (roughly) equalized their torque; the valve isn’t leaking and we’ll see what happens next.
Although different rules apply to the Park staff, so they can drive back & forth across a crowded Walkway with impunity, it’d be courteous if they didn’t block the bike rack with their vehicles. After we parked our bikes in the rack, the woman riding the third bike couldn’t get out and two other riders simply leaned their bikes against the Welcome Center.
Privilege is one thing, flaunting it seems entirely unnecessary.
I’ve yet to understand why the staff must drive over the Walkway at any time, not just park on the pedestrian plaza, as there’s a perfectly serviceable bridge designed specifically for motor vehicles barely half a mile to the south. Heck, on a clear day, you can even see it from the Walkway. [grin]
Our bikes get us from one end to the other in under ten minutes, about as fast as the Park staff can drive, so using a car doesn’t provide any speed advantage. I can carry a week’s worth of groceries in my bike trailer and rarely see the staff carrying anything bigger in the car, so a “we must haul stuff” excuse seems self-serving.
Every “unintended acceleration” mass-casualty incident involves a vehicle, a bunch of pedestrians, and a driver who never thought it could happen. Proactively eliminating vehicle traffic from the Walkway seems much easier than explaining why you didn’t.
Parking vehicles in appropriate places doesn’t require any explanation.
Thanks …
Email to Walkway Over the Hudson
I should have sent it to the sprawling NYS Office of Parks, Recreation, and Historic Preservation, but I hoped the Walkway staff could forward it to the right person. Haven’t heard anything back; I should have saved the electrons.
Having a single spring and a fixed upper plate works much better than the first version:
The (lubricated!) nyloc nuts under the plate provide a little friction and stabilize the whole affair.
The solid model has the same stylin’ tapered snout as the LM12UU drag knife mount:
The spring seats in the plate recess, with the 3 mm shank passing through the hole as the tool holder presses the tip against the workpiece.
I diamond-filed a broken carbide end mill to make a slotting tool:
Lacking any better method (“a tiny clip spreader tool”), I rammed the Jesus clip the length of the shank with a (loose-fitting) chuck in the tailstock:
Even without nyloc nuts, the first test worked fine:
The 53 g/mm spring rate may be too low for serious engraving, but it suffices for subtle Guilloché patterns on scrap platters.
The OpenSCAD source code as a GitHub Gist:
| // Drag Knife Holder using LM12UU linear bearing | |
| // Ed Nisley KE4ZNU – 2019-04-26 | |
| // 2019-05-09 LM3UU for diamond scribe | |
| // 2019-05-28 taper end, single spring around shaft | |
| Layout = "Build"; // [Build, Show, Puck, Mount, Plate] | |
| /* [Extrusion] */ | |
| ThreadThick = 0.25; // [0.20, 0.25] | |
| ThreadWidth = 0.40; // [0.40, 0.40] | |
| /* [Hidden] */ | |
| Protrusion = 0.1; // [0.01, 0.1] | |
| HoleWindage = 0.2; | |
| inch = 25.4; | |
| function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); | |
| ID = 0; | |
| OD = 1; | |
| LENGTH = 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); | |
| } | |
| //- Dimensions | |
| // Knife holder & suchlike | |
| KnifeBody = [3.0,9.0,2.0]; // washer epoxied to diamond shaft, with epoxy fillet | |
| Spring = [9.5,10.0,3*ThreadThick]; // compression spring around shaft, LENGTH = socket depth | |
| WallThick = 4.0; // minimum thickness / width | |
| Screw = [4.0,8.5,8.0]; // holding it all together, OD = washer | |
| Insert = [4.0,6.0,10.0]; // brass insert | |
| Bearing = [3.0,7.0,2*10.0 + WallThick]; // linear bearing body (pair + small gap) | |
| // Basic shape of DW660 snout fitting into the holder | |
| // Lip goes upward to lock into MPCNC mount | |
| Snout = [44.6,50.0,9.6]; // LENGTH = ID height | |
| Lip = 4.0; // height of lip at end of snout | |
| Plate = [KnifeBody[ID],Snout[OD] – WallThick,WallThick]; // spring reaction plate | |
| PuckOAL = max(Bearing[LENGTH],(Snout[LENGTH] + Lip)); // total height of DW660 fitting | |
| echo(str("PuckOAL: ",PuckOAL)); | |
| Key = [Snout[ID],25.7,(Snout[LENGTH] + Lip)]; // rectangular key | |
| NumScrews = 3; | |
| ScrewBCD = 2.5*(Bearing[OD]/2 + Insert[OD]/2 + WallThick); | |
| NumSides = 9*4; // cylinder facets (multiple of 3 for lathe trimming) | |
| module DW660Puck() { | |
| translate([0,0,PuckOAL]) | |
| rotate([180,0,0]) { | |
| cylinder(d=Snout[OD],h=Lip/2,$fn=NumSides); | |
| translate([0,0,Lip/2]) | |
| cylinder(d1=Snout[OD],d2=Snout[ID],h=Lip/2,$fn=NumSides); | |
| cylinder(d=Snout[ID],h=(Snout[LENGTH] + Lip),$fn=NumSides); | |
| translate([0,0,(Snout[LENGTH] + Lip) – Protrusion]) | |
| cylinder(d1=Snout[ID],d2=2*WallThick + Bearing[OD],h=PuckOAL – (Snout[LENGTH] + Lip),$fn=NumSides); | |
| intersection() { | |
| translate([0,0,0*Lip + Key.z/2]) | |
| cube(Key,center=true); | |
| cylinder(d=Snout[OD],h=Lip + Key.z,$fn=NumSides); | |
| } | |
| } | |
| } | |
| module MountBase() { | |
| difference() { | |
| DW660Puck(); | |
| translate([0,0,-Protrusion]) // bearing | |
| PolyCyl(Bearing[OD],2*PuckOAL,NumSides); | |
| for (i=[0:NumScrews – 1]) // clamp screws | |
| rotate(i*360/NumScrews) | |
| translate([ScrewBCD/2,0,-Protrusion]) | |
| rotate(180/8) | |
| PolyCyl(Insert[OD],2*PuckOAL,8); | |
| } | |
| } | |
| module SpringPlate() { | |
| difference() { | |
| cylinder(d=Plate[OD],h=Plate[LENGTH],$fn=NumSides); | |
| translate([0,0,-Protrusion]) // ample shaft clearance | |
| PolyCyl(1.5*KnifeBody[ID],2*PuckOAL,NumSides); | |
| // translate([0,0,Plate[LENGTH] – KnifeBody[LENGTH]]) // flange, snug fit | |
| // PolyCyl(KnifeBody[OD],KnifeBody[LENGTH] + Protrusion,NumSides); | |
| translate([0,0,Plate[LENGTH] – Spring[LENGTH]]) // spring retainer | |
| PolyCyl(Spring[OD],Spring[LENGTH] + Protrusion,NumSides); | |
| for (i=[0:NumScrews – 1]) // clamp screws | |
| rotate(i*360/NumScrews) | |
| translate([ScrewBCD/2,0,-Protrusion]) | |
| rotate(180/8) | |
| PolyCyl(Screw[ID],2*PuckOAL,8); | |
| } | |
| } | |
| //—– | |
| // Build it | |
| if (Layout == "Puck") | |
| DW660Puck(); | |
| if (Layout == "Plate") | |
| SpringPlate(); | |
| if (Layout == "Mount") | |
| MountBase(); | |
| if (Layout == "Show") { | |
| MountBase(); | |
| translate([0,0,1.5*PuckOAL]) | |
| rotate([180,0,0]) | |
| SpringPlate(); | |
| } | |
| if (Layout == "Build") { | |
| translate([0,Snout[OD]/2,PuckOAL]) | |
| rotate([180,0,0]) | |
| MountBase(); | |
| translate([0,-Snout[OD]/2,0]) | |
| SpringPlate(); | |
| } |
Two of Mary’s garden soaker hoses failed their pre-installation checks with leaks from around their connectors. The problem seemed to be a break in the hose inside the connector, with water spewing out of the connector around the hose. Having previously fixed a gash in another hose, I figured I might have some success at fixing these leaks.
The general idea is to squish enough silicone rubber inside the connector to seal around the hose, then clamp the hose and connector snugly enough to hold the rubber in place:

The enlarged recess fits around the brass connector shell, which is squashed loosely around the hose and from which the leaking water emerges. Of course, because this is a different hose, the previous model didn’t quite fit and I had to doodle up new geometry:
As before, I bandsawed aluminum backing plates to ensure the plastic didn’t get all bendy in the middle:
The hose clamp (!) around the connector on the far right ensures a split in the brass shell doesn’t get any larger.
They’ll spend the rest of their lives under the garden mulch, where nobody will ever see those bulky lumps. Life is good!
The OpenSCAD source code as a GitHub Gist:
| // Rubber Soaker Hose End Connector Clamp | |
| // Helps hold silicone rubber in connector | |
| // Ed Nisley KE4ZNU June 2019 | |
| Layout = "Build"; // [Hose,Connector,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 | |
| Hose = [200,26.5,11.6]; // X=very long, Y=width, Z=overall height | |
| RimThick = 10.3; // outer sections | |
| RimOD = RimThick; | |
| RimFlatRecess = 1.0; // recess to front flat surface | |
| OuterOC = Hose.y – RimOD; // outer tube centers | |
| RecessM = 0.8; // back recess chord | |
| RecessC = OuterOC; | |
| RecessR = (pow(RecessM,2) + pow(RecessC,2)/4) / (2*RecessM); | |
| RidgeM = 1.6; // front ridge chord | |
| RidgeC = 7.5; | |
| RidgeR = (pow(RidgeM,2) + pow(RidgeC,2)/4) / (2*RidgeM); | |
| HoseSides = 12*4; | |
| Connector = [5.0,33.0,13.0]; // oval brass: X=snout Y=width Z=dia | |
| Block = [20.0,50.0,4.0 + Hose.z]; // overall splice block size | |
| echo(str("Block: ",Block)); | |
| Kerf = 0.5; // 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 = Block.y – 2*CornerRadius; | |
| echo(str("Screw OC: x=",ScrewOC.x," y=",ScrewOC.y)); | |
| //———————- | |
| // 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 | |
| // This includes magic numbers measured from reality | |
| module HoseProfile() { | |
| rotate([0,-90,0]) | |
| translate([0,0,-Hose.x/2]) | |
| linear_extrude(height=Hose.x,convexity=4) | |
| difference() { | |
| union() { | |
| for (j=[-1,1]) // outer channels | |
| translate([0,j*OuterOC/2]) | |
| circle(d=RimOD,$fn=HoseSides); | |
| translate([-RimOD/4,0]) // rear flat fill | |
| square([RimOD/2,OuterOC],center=true); | |
| translate([(RimOD/4 – RimFlatRecess),0]) // front flat fill | |
| square([RimOD/2,OuterOC],center=true); | |
| intersection() { | |
| translate([Hose.z/2,0]) | |
| square([Hose.z,OuterOC],center=true); | |
| translate([-RidgeR + RimOD/2 – RimFlatRecess + RidgeM,0]) | |
| circle(r=RidgeR,$fn=HoseSides); | |
| } | |
| } | |
| translate([-(RecessR + RimOD/2 – RecessM),0]) | |
| circle(r=RecessR,$fn=2*HoseSides); | |
| } | |
| } | |
| // 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*(Block.x/2 – CornerRadius),j*(Block.y/2 – CornerRadius),-Block.z/2]) | |
| cylinder(r=CornerRadius,h=Block.z,$fn=4*8); | |
| for (j=[-1,1]) // screw holes | |
| translate([0, | |
| j*ScrewOC/2, | |
| -(Block.z/2 + Protrusion)]) | |
| PolyCyl(Screw[ID],Block.z + 2*Protrusion,6); | |
| cube([2*Block.x,2*Block.y,Kerf],center=true); // slice through center | |
| } | |
| } | |
| // Splice block less hose | |
| module ShapedBlock() { | |
| difference() { | |
| SpliceBlock(); | |
| HoseProfile(); | |
| Connector(); | |
| } | |
| } | |
| // Brass connector end | |
| module Connector() { | |
| translate([-(Block.x/2 + Protrusion),0,0]) | |
| rotate([0,90,0]) | |
| linear_extrude(height=Connector.x + Protrusion) | |
| hull() | |
| for (i = [-1,1]) | |
| translate([0,i*(Connector.y – Connector.z)/2]) | |
| circle(d=Connector.z); | |
| } | |
| //———- | |
| // Build them | |
| if (Layout == "Hose") | |
| HoseProfile(); | |
| if (Layout == "Block") | |
| SpliceBlock(); | |
| if (Layout == "Connector") | |
| Connector(); | |
| if (Layout == "Show") { | |
| ShapedBlock(); | |
| color("Green",0.25) | |
| HoseProfile(); | |
| } | |
| if (Layout == "Build") { | |
| SliceOffset = 0; | |
| intersection() { | |
| translate([SliceOffset,0,Block.z/4]) | |
| cube([4*Block.x,4*Block.y,Block.z/2],center=true); | |
| union() { | |
| translate([0,0.6*Block.y,Block.z/2]) | |
| ShapedBlock(); | |
| translate([0,-0.6*Block.y,Block.z/2]) | |
| rotate([0,180,0]) | |
| ShapedBlock(); | |
| } | |
| } | |
| } |
The tiny voice inside our Ooma Telo 2 box died, although the VOIP phone service continued to work fine. A bit of searching showed the speaker seems to be the weak link.
Well, I can fix that.
Start by prying the recessed top panel off the case:
Remove the circuit board to expose the tiny speaker, taking care not to rip the tiny wires out of the tiny connector:
You can’t measure a dead speaker, but it seems to be an 8 Ω unit.
The speaker sits in a rubber surround, with a foam rubber cushion against the PCB, tucked into a walled garden stiffening the case:
I don’t happen to have a tiny 8 Ω speaker, but I do have a bunch of small speakers (Update: 28 mm OD), so I bulldozed those walls with a flush cutting pliers and a bit of cussing to make room:
Nibble an adapter ring to match the rim of the new speaker, thereby routing the sound out those little holes, and hot-melt glue it in place:
Hot-melt glue the new speaker in place atop the adapter, taking care to fill all the edges / cracks / crevices below it with an impenetrable wall of glop:
The sealing part turns out to be critical with these little speakers, because a leak from front to back will pretty much cancel all the sound from the cone.
Cut the wires off the old speaker, affix to the new one, replace the PCB, snap the case lid in place, and it sounds better than new.
Millions of transistors in those ICs, but Ooma can’t spec a good speaker? Maybe they should have used a bigger speaker to begin with; ya never know.
My landscape monitor, a six-year-old Dell U2711, died after a few days of flickering and failure-to-start. As you’d expect with any old electronics, particularly from Dell, it’s the electrolytic caps:
All of the black-cased caps on the board had bulged cases:
They’re (allegedly) made by FOAI, for whatever that’s worth.
They’re not really capacitors any more:
I replaced all of them with cheap eBay caps to no avail. Spot-checking the other (“brown”) caps on the logic board showed they were still good, but the power supply board is firmly glued in place and I can’t get to the HV cap.
A new monitor arrived two days later and it’s all good again.