An outlet thread failed on yet another garden hose Y valve:

Out of an abundance of curiosity, I battered the remaining parts out of the carcass:

One of these days, we must buy an assortment of new fittings …
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.
If it used to work, it can work again
An outlet thread failed on yet another garden hose Y valve:

Out of an abundance of curiosity, I battered the remaining parts out of the carcass:

One of these days, we must buy an assortment of new fittings …
Ceramic-tip plotter pens draw wonderfully crisp lines:

Eventually, though, the fiber tip wears flush with the ceramic shell, becomes slightly indented, and ceases to make its mark in the world:

As the lady says, “Starting from zero, got nothing to lose”, so I applied a fine diamond file around the tip:

Well, all I can say is it seemed like a good idea at the time.
Alas, even the newly exposed fiber didn’t make much of a mark on the paper and, as you’d expect, the ragged ceramic tip dragged painfully across the paper. I assume the fiber had filled with fossilized dry ink.
A New Old Stock bag of fiber-tip pens emerged from the Big Box o’ Pens while I was flailing around:

I think the “812” in the lower right corner is a date code, most likely early in 1988, so the pens started their lifetime countdown at least three decades ago. They still work, though:

The plotter appeared at HV Open’s Mad Science Fair, because everybody loves a plotter!
The battery pack on my ancient Dell E1405 laptop finally died, so I tore it apart to see what horrors might lurk within:
The case snaps apart without too much effort, although the delicate single-use latches won’t survive the operation. These certainly didn’t, which didn’t bother me at all, as I already had a replacement battery on order.
One of the cells (in the front) seems to have leaked ever so slightly inside its wrapper:
The three cells in that 3P section seem to have failed open: they pass no current at all.
The other pair of 3P slices, charged at 4.2 V with a 700 mA current limit until the current dropped under 10 mA, still have some life:
Perhaps recycling individual cells into LED glowies would be nice, as they have enough capacity remaining to run an Arduino for quite a while, and a 1S USB charger would make for a self-contained package.
Apparently all mini-lathe cut–off tool holders suffer from the same problem:
The clamp tightening screw is made from butter-soft Chinese steel with a swaged hex socket. As you’d expect, the hex wrench eventually (as in, after a few dozen adjustments, tops) rips the guts right out of the socket.
The screw has a M6×1.0 mm threads, but the thread around the hex recess is left-handed. While I could, in principle, print a 127 tooth change gear, rebuild the lathe’s banjo to accommodate it, then single-point a backassward M6 thread, it’s easier to just use a standard socket head cap screw:
The clamp screw passes through the block at an angle:
Fortunately, the screw is perpendicular to the angled side over on the left, making it easy to clamp in the Sherline’s vise:
Using the laser aligner seemed like a good idea at the time, but the top of the screw wasn’t particularly well-centered on the hole’s axis. I couldn’t screw the left-hand part (with the socket) in from the bottom and center the block near its surface, because then I couldn’t extract the screw before proceeding.
I used a diamond burr to grind out a flat for the screw head:
The flat came from about twenty manual G2 I-2.5 full-circle passes, stepping down through the hard steel block 0.1 mm per pass, at a too-slow 4000 RPM and a too-fast 30 mm/min feed, with plenty of water squirted from one side into a shop vac snout on the other. The doodle in the background of the first picture shows a first pass at the layout, with the burr centered at X=-2.5; I actually did the grinding from X=+2.5 so most of the passes started in thin air.
The screw head started just shy of 10 mm OD and the burr just over 5.2 mm, so the ensuing 5 mm circles created a flat barely large enough. If the flat were perfectly centered on the screw axis, I wouldn’t have had to grind out another millimeter on the left side (toward the bottom of the tool holder body), but it worked out OK:
The trial fitting also showed the head stuck out ever so slightly beyond the far side of the block, where it would interfere with the blade, so I turned off 0.4 mm off its OD.
If I had a 50 mm SHCS in hand, I’d have used it. Instead, I extended the threads of a 75 mm screw, then lopped off the end to the proper length. I’ll spare you the ordeal, including the moment when I reached for the cutoff tool to shorten the screw. A bag of such screws will arrive shortly, in preparation for future need.
Now the [deleted] cut-off holder works the way it should have from the beginning.
For reasons not relevant here, the lawn mower suffered some Foreign Object Damage:
I’m sure the hard stop loosened the tolerances along the shaft, but the mower fired right up (with that new blade!) and has no more vibration than usual, despite the seriously bent blade mount.
I no longer have a deep emotional attachment to lawn mowers, which is apparently common, as the label advises me there’s no need to change the oil:
Drive it ’til it drops …
The ancient utility pole on the north side of our property fell over a few hours after a thunderstorm rolled through:
Fortunately, the wire clamps were upward and it just lay there without sparks or excitement. It feeds the vacant house out back, so restoring power wasn’t urgent.
Unfortunately, the lines neatly bisected Mary’s garden:
The utility crew arrived a few hours later, disconnected the triplex at the fallen pole, rolled it up, secured it to the source pole out front, and promised a different crew would replace the pole in a while:
We agreed restoring service to other folks who needed it should take priority.
Mary’s been ducking the various cable TV / phone / FiOS cables ever since.
The pole has been God’s own toothpick for quite some time, as shown by this picture from 2001:
Fortunately for us, its pole tag hadn’t fallen off in all those years:
That little tag may save us ten large during this exquisite little inconvenience …

A pair of Step2 rolling garden seats (they have a new version) served in Mary’s gardens long enough to give their seat panels precarious cracks:
The underside was giving way, too:
We agreed the new seat could be much simpler, although it must still hinge upward, so I conjured a pair of hinges from the vasty digital deep:
The woodpile disgorged a slab of 1/4 inch = 6 mm plywood (used in a defunct project) of just about the right size and we agreed a few holes wouldn’t be a problem for its projected ahem use case:
The screw holes on the hinge tops will let me run machine screws all the way through, should that be necessary. So far, a quartet of self-tapping sheet metal (!) screws are holding firm.
A closer look at the hinges in real life:
The solid model now caps the holes; I can drill them out should the need arise.
From the bottom:
Three coats of white exterior paint make it blindingly bright in the sun, although we expect a week or two in the garden will knock the shine right off:
After the first coat, I conjured a drying rack from a bamboo skewer, a cardboard flap, and some hot-melt glue:

Three small scars on the seat bottom were deemed acceptable.
The OpenSCAD source code as a GitHub Gist:
| // Hinge brackets for rolling garden stool | |
| // Ed Nisley – KE4ZNU – 2019-06 | |
| Layout = "Build"; // [Block,Build,Show] | |
| Support = true; | |
| /* [Hidden] */ | |
| ThreadThick = 0.20; | |
| ThreadWidth = 0.40; | |
| HoleWindage = 0.2; | |
| Protrusion = 0.1; // make holes end cleanly | |
| ID = 0; | |
| OD = 1; | |
| LENGTH = 2; | |
| //———————- | |
| // Dimensions | |
| SeatThick = 6.0; // seat panel above cart body | |
| HingePin = [11.5,12.0,7.0]; // ID = tip OD = base | |
| HingeOffset = 8.0; // hinge axis above cart body (larger than radius!) | |
| HingeBolster = [5.0,24.0,SeatThick]; // backing block below hinge | |
| Block = [25.0,HingeOffset + 30.0,23.0]; // Z = above cart body | |
| Screw = [3.8,11.0,2.5]; // self-tapping #8 OD=head LENGTH=head thickness | |
| ScrewOC = 15.0; // spacing > greater than head OD | |
| ScrewOffset = Block.y/2 – (ScrewOC/2 + Screw[OD]/2 + HingeOffset); // space for head behind hinge | |
| BlockRadius = 7.0; // corner rounding | |
| //———————- | |
| // 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(r=(FixDia + HoleWindage)/2, | |
| h=Height, | |
| $fn=Sides); | |
| } | |
| // Basic block shape | |
| // X axis collinear with hinge axes, hinge base at X=0 | |
| module HingeBlock() { | |
| PinSides = 3*4; | |
| PinSupport = [HingePin[LENGTH] – 2*ThreadWidth,0.6*HingeOffset,HingePin[OD]]; // pre-rotated | |
| union() { | |
| translate([Protrusion,Block.y/2 – HingeOffset,HingeOffset]) | |
| rotate([0,-90,0]) | |
| rotate(180/PinSides) | |
| cylinder(d=HingePin[OD],h=HingePin[LENGTH] + Protrusion,$fn=PinSides); | |
| difference() { | |
| hull() { | |
| translate([Block.x – BlockRadius,-(Block.y/2 – BlockRadius),Block.z – BlockRadius]) | |
| rotate(180/PinSides) | |
| sphere(r=BlockRadius/cos(180/PinSides),$fn=PinSides); | |
| translate([0,-(Block.y/2 – BlockRadius),Block.z – BlockRadius]) | |
| rotate([0,90,0]) rotate(180/PinSides) | |
| cylinder(r=BlockRadius/cos(180/PinSides),h=Block.x/2,$fn=PinSides); | |
| translate([Block.x – BlockRadius,(Block.y/2 – BlockRadius),Block.z – BlockRadius]) | |
| sphere(r=BlockRadius/cos(180/PinSides),$fn=PinSides); | |
| translate([0,(Block.y/2 – BlockRadius),Block.z – BlockRadius]) | |
| rotate([0,90,0]) rotate(180/PinSides) | |
| cylinder(r=BlockRadius/cos(180/PinSides),h=Block.x/2,$fn=PinSides); | |
| translate([0,-Block.y/2,0]) | |
| cube([Block.x,Block.y – HingeOffset,Block.z/2],center=false); | |
| translate([0,Block.y/2 – HingeOffset,HingeOffset]) | |
| rotate([0,90,0]) rotate(180/PinSides) | |
| cylinder(r=HingeOffset/cos(180/PinSides),h=Block.x,$fn=PinSides); | |
| } | |
| translate([Block.x/2 + HingeBolster.x,0,(SeatThick – Protrusion)/2]) | |
| cube([Block.x,2*Block.y,SeatThick + Protrusion],center=true); | |
| translate([0,-HingeBolster.y,(SeatThick – Protrusion)/2]) | |
| cube([3*Block.x,Block.y,SeatThick + Protrusion],center=true); | |
| for (j=[-1,1]) | |
| translate([Block.x/2,j*ScrewOC/2 + ScrewOffset,-4*ThreadThick]) | |
| rotate(180/8) | |
| PolyCyl(Screw[ID],Block.z,8); | |
| } | |
| } | |
| if (Support) { // totally ad-hoc | |
| color("Yellow") render(convexity=4) | |
| difference() { | |
| translate([-(PinSupport.x/2 + 2*ThreadWidth),Block.y/2 – PinSupport.y/2,HingeOffset]) | |
| cube(PinSupport,center=true); | |
| translate([Protrusion,Block.y/2 – HingeOffset,HingeOffset]) | |
| rotate([0,-90,0]) | |
| rotate(180/PinSides) | |
| cylinder(d=HingePin[OD] + 2*ThreadThick,h=2*HingePin[LENGTH],$fn=PinSides); | |
| for (i=[-1:1]) | |
| translate([i*4*ThreadWidth – HingePin[LENGTH]/2, | |
| Block.y/2 – (PinSupport.y + 1*ThreadThick), | |
| HingeOffset]) | |
| cube([2*ThreadWidth,2*PinSupport.y,2*PinSupport.z],center=true); | |
| } | |
| } | |
| } | |
| module Blocks(Hand = "Left") { | |
| if (Hand == "Left") | |
| HingeBlock(); | |
| else | |
| mirror([1,0,0]) | |
| HingeBlock(); | |
| } | |
| //- Build it | |
| if (Layout == "Block") | |
| HingeBlock(); | |
| if (Layout == "Show") { | |
| translate([1.5*HingePin[LENGTH],0,0]) | |
| Blocks("Left"); | |
| translate([-1.5*HingePin[LENGTH],0,0]) | |
| Blocks("Right"); | |
| } | |
| if (Layout == "Build") { | |
| translate([0,-Block.z/2,Block.y/2]) | |
| rotate([-90,0,0]) { | |
| translate([1.5*HingePin[LENGTH],0,0]) | |
| Blocks("Left"); | |
| translate([-1.5*HingePin[LENGTH],0,0]) | |
| Blocks("Right"); | |
| } | |
| } |
This original doodle gives the key dimensions, apart from the rounded rear edge required so the seat can pivot vertically upward:
The second seat looks just like this one, so life is good …