Step2 Garden Seat: Replacement Seat2

As expected, the plywood seat I put on the Step2 Garden Seat for Mary’s Vassar Farms plot lasted about a year before the wood rotted away around the screws. In the meantime, we’d acquired a stack of SiLite cafeteria trays, so we applied one to the cause of better seating:

Step2 Seat - tray variant
Step2 Seat – tray variant

Various eBay listings value that slab of Bakelite Melamine up to $20, which is far more than Mary paid for the entire stack at a local tag sale. They also call that color “rich brown”, which is certainly better than what immediately came to mind when I saw them.

The stylin’ asymmetric design happened when I realized the squared-off handle end of the cart didn’t demand a rounded-off end of the seat. I cut off the raised tray rim before sketching the rounded outline using the rotted seat as a template; some of the sketch remains over on the right-front corner. A session with Mr Belt Sander put the remaining rim edges flush with the surface, no matter what the picture suggests.

The tray being 2 mm thinner than the plywood, I tried printing the hinges in a different orientation with different built-in support:

Rolling Cart Hinges - solid model - build
Rolling Cart Hinges – solid model – build

The perimeter threads pulled up far too much and, although fiddling with cooling would likely help, I think the original orientation was better:

Rolling Cart Hinges - solid model - bottom
Rolling Cart Hinges – solid model – bottom

Given that the post-apocalypse breakfast will be served on similar trays, the seat should survive for quite a while in the garden. We think the sun will convert the brown surface into a bun warmer; a coat of white paint may be in its future.

The original OpenSCAD code is still out there as a GitHub Gist.

Monthly Science: Inchworms

A Rudbeckia Black-eyed-susan coneflower from the garden carried a passenger to our patio table:

Inchworm - linear
Inchworm – linear

Even linearized, the inchworm was barely 20 mm long; it’s the thought that counts.

The stamens mature in concentric rings, each stamen topped by a pollen grain. Apparently, those grains are just about the most wonderful food ever, as the inchworm made its way around the ring eating each grain in succession:

Inchworm - feeding
Inchworm – feeding

Of course, what goes in must come out:

Inchworm - excreting
Inchworm – excreting

I had to brush off the table before washing it; the pellets are dry, but smear when you get them wet.

Another flower in the vase held a 10 mm inchworm with plenty of upside potential:

Inchworm - junior edition
Inchworm – junior edition

After nearly a week, the flowers were done and the inchworms had moved on. We wish them well, although we likely won’t recognize them in the future.

Round Soaker Hose Clamp

An aging round soaker hose sprang a leak large enough to gouge a crater under a tomato plant, so I conjured a short clamp from the longer round hose splints:

Soaker Hose Clamp - round - installed
Soaker Hose Clamp – round – installed

The shiny stuff is the plastic backing on strips of silicone tape intended to prevent the high-pressure water from squirting through the porous 3D printed plastic. The fat drop hanging from the hose shows some leakage around the tape; an occasional drop is perfectly OK.

The leak faces the round side of the bottom half of the clamp, which probably doesn’t make any difference.

I hope the washers occupy enough of the minimal surface to render aluminum backing plates superfluous:

Soaker Hose Clamp - round - kitted
Soaker Hose Clamp – round – kitted

Creating the 3D model required nothing more than shortening the original splint to 30 mm with two screws along each side. While I was at it, I had Slic3r make three clamps to put two in the Garden Dedicated Hydraulic Repair Kit for later use:

Round Soaker Hose Splice - 30mm - Slic3r
Round Soaker Hose Splice – 30mm – Slic3r

Change two lines in the OpenSCAD code and it’s done.

Also: clamps for flat soaker hoses.

Rt 376 at Zach’s Way: Near Right Hook

We exchanged waves as he rode by Vassar Farms:

Rt 376 SB Marker 1124 Zachs Way - Near Right Hook - 2020-07-19 - 0
Rt 376 SB Marker 1124 Zachs Way – Near Right Hook – 2020-07-19 – 0

Although I can rarely hang with real roadies, I can put the fear in ’em for a while, so the chase is on.

About 25 seconds later, I’m southbound on Rt 376, accelerating past 20 mph = 30 feet/s. The overtaking pickup, which I haven’t noticed yet, is signaling a right turn at Zach’s Way, 350 feet ahead:

Rt 376 SB Marker 1124 Zachs Way - Near Right Hook - 2020-07-19 - 1
Rt 376 SB Marker 1124 Zachs Way – Near Right Hook – 2020-07-19 – 1

The pickup enters my field of view, but I can’t see the turn signals:

Rt 376 SB Marker 1124 Zachs Way - Near Right Hook - 2020-07-19 - 2
Rt 376 SB Marker 1124 Zachs Way – Near Right Hook – 2020-07-19 – 2

Two seconds later, the driver is braking:

Rt 376 SB Marker 1124 Zachs Way - Near Right Hook - 2020-07-19 - 3
Rt 376 SB Marker 1124 Zachs Way – Near Right Hook – 2020-07-19 – 3

During the next three seconds, the driver realizes I’m going much much faster than your usual cyclist and is braking hard:

Rt 376 SB Marker 1124 Zachs Way - Near Right Hook - 2020-07-19 - 4
Rt 376 SB Marker 1124 Zachs Way – Near Right Hook – 2020-07-19 – 4

My startled shout (“Don’t even think about it!“) may be misinterpreted, but I try to be friendly,

Rt 376 SB Marker 1124 Zachs Way - Near Right Hook - 2020-07-19 - 5
Rt 376 SB Marker 1124 Zachs Way – Near Right Hook – 2020-07-19 – 5

Alas, the cyclist turned into Boardman Road and all that adrenaline went to waste.

Elapsed time since the fender appeared: six seconds.

Seedling Shelter Frame

Plant seedlings started in pots require some hardening off time outdoors before being transplanted. Veggie seedlings also require protection from critters regarding them as a buffet, so Mary covers them with a sheet of floating row cover, which must be both suspended over the plants to give them growing room and tucked under the tray to keep the bugs out. She asked for a frame to simplify the process:

Mesh Shelter Frame - assembled
Mesh Shelter Frame – assembled

The solid model shows the structure with no regard for proportion:

Mesh Shelter Frame - show view
Mesh Shelter Frame – show view

The 5 mm fiberglass rods come from our decommissioned six-passenger umbrella, cut to length in the Tiny Lathe™ by applying a Swiss Pattern knife file around the perimeter, over the ShopVac’s snout to catch the glass dust. I started with a pull saw (also over the vacuum) during the weekly Squidwrench v-meeting, whereupon Amber recommended either a Dremel slitting wheel or a file, so I mashed everything together and it worked wonderfully well, without producing any errant glass-fiber shards to impale my fingers.

The corners consist of three tubes stuck together at the origin:

Mesh Shelter Frame - non-hulled corner model
Mesh Shelter Frame – non-hulled corner model

Shrink-wrapping them with a hull() adds plenty of strength where it’s needed:

Mesh Shelter Frame - hulled corner model
Mesh Shelter Frame – hulled corner model

I decided putting the belly side (facing you in the picture) downward on the platform and the peak upward would distribute the distortion equally among the tubes and produce a nicely rounded outer surface for the mesh fabric:

Mesh Shelter Frame - build layout
Mesh Shelter Frame – build layout

Which led to some Wikipedia trawling to disturb the silt over my long-buried analytic geometry, plus some calculator work to help recall the process; back in the day I would have used a slipstick, but I was unwilling to go there. Although I could special-case this particular layout, the general method uses Euler’s Rotation Theorem, simplified because I need only one rotation.

Should you need concatenated rotations, you probably need quaternions, but, at this point, I don’t even remember forgetting quaternions.

Anyhow, the Euler rotation axis is the cross product of the [1,1,1] vector aimed through the middle of the corner’s belly with the [0,0,-1] target vector pointing downward toward the platform. The rotation amount is the acos() of the dot product of those two vectors divided by the product of their norms. With vector and angle in hand, dropping them into OpenSCAD’s rotate() transformation does exactly what’s needed:

rotate(acos((BaseVector*Nadir)/(norm(BaseVector)*norm(Nadir))),
       v=cross(BaseVector,Nadir))   // aim belly side downward
  Corner();

Dang, I was so happy when that worked!

Because the corner model rotates around the origin where all three tube centerlines meet, the result puts the belly below the platform, pointed downward. The next step applies a translation to haul the belly upward:

translate([ArmOAL,0,    // raise base to just below platform level
           ArmOC/sqrt(3) + (ArmRadius/cos(180/SocketSides))*cos(atan(sqrt(3)/2)) + Finagle])

This happens in a loop positioning the four corners for printing, so the first ArmOAL as the X axis parameter translates the shape far enough to let four of them coexist around the origin, as shown above.

The mess in the Z axis parameter has three terms:

  • Raise the centerline of the ends of the tubes to Z=0
  • Raise the rim of the tube to Z=0
  • Add a wee bit to make the answer come out right

The 0.18 mm Finagle constant fixes things having to do with the hull() applied to miscellaneous leftover angled-circles-as-polygons approximations and leaves just a skin below the platform to be sheared off by a huge cube below Z=0, matching the corner bellies with the bottoms of the feet.

Because the corners have awful overhangs, the results look a bit raggedy:

Mesh Shelter Frame - corner underside
Mesh Shelter Frame – corner underside

That’s after knocking off the high spots with a grubby sanding sponge and making a trial fit. They look somewhat less grotendous in person.

If we need another iteration, I’ll think hard about eliminating the overhangs by splitting the corner parallel to the belly, flipping the belly upward, and joining the pieces with a screw. What we have seems serviceable, though.

The OpenSCAD source code as a GitHub Gist:

// Mesh Shelter Frame for outdoor sprouts
// Ed Nisley KE4ZNU - July 2020
/* [Layout Options] */
Layout = "Show"; // [Build, Show, Corner, CornerSet, Base, BaseSet]
//-------
//- Extrusion parameters must match reality!
// Print with 2 shells
/* [Hidden] */
ThreadThick = 0.25;
ThreadWidth = 0.40;
HoleFinagle = 0.2;
HoleFudge = 1.00;
function HoleAdjust(Diameter) = HoleFudge*Diameter + HoleFinagle;
Protrusion = 0.1; // make holes end cleanly
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
inch = 25.4;
//-------
// Dimensions
RodOD = 5.0;
SocketDepth = 3*RodOD;
WallThick = 3.0;
ArmOD = RodOD + 2*WallThick;
ArmRadius = ArmOD / 2;
SocketSides = 3*4;
ArmOC = SocketDepth + ArmOD; // rod entry to corner centerline
ArmOAL = ArmOC + ArmRadius; // total arm length to outer edge
echo(str("ArmOC: ",ArmOC));
echo(str("ArmOAL: ",ArmOAL));
Nadir = [0,0,-1]; // vector toward print platform
RodLength = 100; // just for show
//-------
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=HoleAdjust(FixDia)/2,h=Height,$fn=Sides);
}
//-------
BaseVector = [1,1,1]; // vector through middle of base surface
module Corner() {
difference() {
hull() {
scale([1/cos(180/SocketSides),1/cos(180/SocketSides),1])
rotate(180/SocketSides)
sphere(d=ArmOD,$fn=SocketSides);
rotate(180/SocketSides)
cylinder(d=ArmOD,h=ArmOC,$fn=SocketSides);
rotate([-90,0,0]) rotate(180/SocketSides)
cylinder(d=ArmOD,h=ArmOC,$fn=SocketSides);
rotate([0,90,0]) rotate(180/SocketSides)
cylinder(d=ArmOD,h=ArmOC,$fn=SocketSides);
}
rotate(180/SocketSides)
translate([0,0,ArmOD])
PolyCyl(RodOD,SocketDepth + Protrusion,SocketSides);
rotate([-90,0,0]) rotate(180/SocketSides)
translate([0,0,ArmOD])
PolyCyl(RodOD,SocketDepth + Protrusion,SocketSides);
rotate([0,90,0]) rotate(180/SocketSides)
translate([0,0,ArmOD])
PolyCyl(RodOD,SocketDepth + Protrusion,SocketSides);
}
}
module CornerSet(s=RodLength) {
translate([-s/2,-s/2,s])
mirror([0,0,1])
Corner();
translate([s/2,-s/2,s])
rotate([0,0,90]) mirror([0,0,1])
Corner();
translate([s/2,s/2,s])
rotate([0,0,180]) mirror([0,0,1])
Corner();
translate([-s/2,s/2,s])
rotate([0,0,-90]) mirror([0,0,1])
Corner();
}
module Base() {
difference() {
union() {
cylinder(d=ArmOD,h=ArmOAL/2,$fn=SocketSides);
resize([0,0,ArmOC/2])
sphere(d=ArmOC,$fn=2*SocketSides);
}
translate([0,0,3*ThreadThick])
PolyCyl(RodOD,ArmOAL,SocketSides);
translate([0,0,-SocketDepth]) // cut sphere below platform
cube(2*SocketDepth,center=true);
}
}
module BaseSet(s=RodLength) {
for (i=[-1,1], j=[-1,1])
translate([i*s/2,j*s/2,0])
Base();
}
//-------
// Build it!
if (Layout == "Corner")
Corner();
if (Layout == "CornerSet")
CornerSet();
if (Layout == "Base")
Base();
if (Layout == "BaseSet")
BaseSet();
if (Layout == "Show") {
CornerSet();
for (i=[-1,1])
translate([i*RodLength/2,RodLength/2,RodLength])
rotate([90,0,0])
color("Green",0.5)
cylinder(d=RodOD,h=RodLength,$fn=SocketSides);
for (j=[-1,1])
translate([RodLength/2,j*RodLength/2,RodLength])
rotate([0,-90,0])
color("Green",0.5)
cylinder(d=RodOD,h=RodLength,$fn=SocketSides);
BaseSet();
for (i=[-1,1], j=[-1,1])
translate([i*RodLength/2,j*RodLength/2,0])
color("Green",0.5)
cylinder(d=RodOD,h=RodLength,$fn=SocketSides);
}
if (Layout == "Build") {
Finagle = 0.18; // hack for hull's angled round-to-polygon approximations, I think
difference() { // slice sliver from base to sit flat on platform
union()
for (a=[45:90:360])
rotate(a) // distribute around origin
translate([ArmOAL,0, // raise base to just below platform level
ArmOC/sqrt(3) + (ArmRadius/cos(180/SocketSides))*cos(atan(sqrt(3)/2)) + Finagle])
rotate(17) // arbitrary rotation for tidy arrangement
rotate(acos((BaseVector*Nadir)/(norm(BaseVector)*norm(Nadir))),
v=cross(BaseVector,Nadir)) // aim belly side downward
Corner();
translate([0,0,-ArmOD/2]) // slicing block below platform
cube([6*ArmOAL,6*ArmOAL,ArmOD],center=true);
}
rotate(45)
for (i=[-1,1], j=[-1,1])
translate([i*1.5*ArmOC,j*1.5*ArmOC,0])
Base();
}

Garden Soaker Hose Repairs In Use

Just for completeness, here’s what the various soaker hose clamps look like in the garden, as solid models only let you visualize the ideal situation:

Soaker Hose Connector Clamp - Show view
Soaker Hose Connector Clamp – Show view

This one prevents a puddle in the path to the right:

Soaker hose repairs in situ - clamp
Soaker hose repairs in situ – clamp

Bending the hoses around the end of a bed puts them on edge, with this clamp suppressing a shin-soaking spray to the left:

Soaker hose repairs in situ - end-on clamp
Soaker hose repairs in situ – end-on clamp

The clamp at the connector closes a leak around the crimped brass fitting, with the other two preventing gouges from direct sprays into the path along the bottom of the picture:

Soaker hose repairs in situ - clamps and connector fix
Soaker hose repairs in situ – clamps and connector fix

All in all, a definite UI improvement!

As far as I can tell, we have the only soaker hose repairs & spritz stoppers in existence. Hooray for 3D printing!