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.

Category: Recumbent Bicycling

Cruisin’ the streets

  • Bike Rack Tray Holder: Stretchy Tiedown Straps

    Bike Rack Tray Holder: Stretchy Tiedown Straps

    The tray holder on Mary’s bike worked well:

    Bike Rack Tray Holder - in use
    Bike Rack Tray Holder – in use

    Except for having the bungee cord run across the middle of the tray where it blocks access for larger trays and tends to bend the taller leaves.

    Well, I can fix that:

    Bike Rack Tray Holder - straps - rear
    Bike Rack Tray Holder – straps – rear

    The front tiedown is similar:

    Bike Rack Tray Holder - straps - front
    Bike Rack Tray Holder – straps – front

    They’re printed from TPU: rectangular blocks and chains, ending in wire hooks bashed from a coat hanger. The M4 button-head screws thread into (uncrushed) rivnuts, which seemed easier to manage than square nuts in this situation.

    The chains are just thick circles, with half of the top links sunk into the blocks:

    Stretchy Straps - build layout
    Stretchy Straps – build layout

    You’d (well, I’d) want to build them one at a time, because sometimes this happens:

    Bike Rack Tray Holder - bad platform adhesion
    Bike Rack Tray Holder – bad platform adhesion

    Based on those measurements, I raised the extruder by 0.1 mm, but apparently did a poor job of cleaning / flattening the cold TPU on the nozzle and got it wrong. As a result, the first layer didn’t get squooshed properly onto the BuildTak, came unstuck, and produced art . The track down the middle of the photo shows traces of a previous, badly over-squooshed test chain.

    The stretched TPU relaxes enough to leave very little tension after a day, as shown by the unhooked right chain:

    Bike Rack Tray Holder - straps - relaxing
    Bike Rack Tray Holder – straps – relaxing

    However, that make the chains exactly the right length, so they require even more force to get the hooks off the rack. After relaxing for another day, the stretched chains return to roughly their original lengths, so it’s all good.

    The OpenSCAD source code as a GitHub Gist:

    // TPU Tiedown Straps for bike rack tray holder
    // Ed Nisley – KE4ZNU
    // 2026-05-14
    include <BOSL2/std.scad>
    Layout = "Build"; // [Show,Build,Chain,Blocks,Front,Rear]
    /* [Hidden] */
    HoleWindage = 0.2;
    Protrusion = 0.01;
    NumSides = 4*3*2*4;
    Gap = 5.0;
    $fn=NumSides;
    LinkID = 7.0;
    LinkOD = 10.0;
    LinkOC = 14.0;
    LinkHeight = 4.0;
    JointWidth = 2.0;
    FrontChainAngle = 30; // from vertical
    FrontChainLength = 80.0; // nominal length
    RearChainAngle = 20; // from vertical
    RearChainLength = 100.0; // nominal length
    BlockOA = [80.0,12.0,15.0];
    InsertOC = 30.0;
    //—–
    // Define things
    module Chain(n=2) {
    render()
    difference() {
    union() {
    hull() {
    cyl(LinkHeight,d=JointWidth,anchor=BOTTOM,rounding=0.0);
    back((n – 1)*LinkOC)
    cyl(LinkHeight,d=JointWidth,anchor=BOTTOM,rounding=0.0);
    }
    for (i = [0:n-1])
    back(i*LinkOC)
    cyl(LinkHeight,d=LinkOD,anchor=BOTTOM,rounding=0.0);
    }
    for (i = [0:n-1])
    back(i*LinkOC)
    down(Protrusion)
    cyl(LinkHeight + 2*Protrusion,d=(LinkID + HoleWindage),anchor=BOTTOM,rounding=-1.0);
    }
    }
    module FrontBlock() {
    difference() {
    cuboid(BlockOA,anchor=BOTTOM,chamfer=1.0,except=BACK);
    for (i = [-1:1])
    right(i*InsertOC) down(Protrusion) {
    cyl(BlockOA.z + 2*Protrusion,d=4.0 + HoleWindage,anchor=BOTTOM); // screw clearance
    cyl(1.5,d=9.0,anchor=BOTTOM); // insert head
    cyl(11.0,d=6.0,anchor=BOTTOM); // insert body
    }
    }
    }
    module RearBlock() {
    up(BlockOA.z/2) fwd(BlockOA.y/2)
    difference() {
    cuboid(BlockOA,anchor=FRONT,chamfer=1.0,except=BACK);
    for (i = [-1:1])
    right(i*InsertOC) fwd(Protrusion) {
    ycyl(BlockOA.z + 2*Protrusion,d=4.0 + HoleWindage,anchor=FRONT); // screw clearance
    ycyl(1.5,d=9.0,anchor=FRONT); // insert head
    ycyl(11.0,d=6.0,anchor=FRONT); // insert body
    }
    }
    }
    module FrontAssembly(cl=FrontChainLength,ca=FrontChainAngle) {
    Links = ceil(cl / LinkOC);
    union() {
    up(cl*cos(ca)) {
    FrontBlock();
    back(BlockOA.y/2)
    xrot(90)
    for (i = [-1,1])
    left(i*InsertOC/2)
    zrot(-i*ca + 180)
    Chain(Links);
    }
    }
    }
    module RearAssembly(cl=RearChainLength,ca=RearChainAngle) {
    Links = ceil(cl / LinkOC);
    union() {
    up(cl*cos(ca)) {
    RearBlock();
    back(BlockOA.y/2)
    xrot(90)
    for (i = [-1,1])
    left(i*InsertOC/2)
    zrot(-i*ca + 180)
    Chain(Links);
    }
    }
    }
    //—–
    // Build things
    if (Layout == "Chain")
    Chain();
    if (Layout == "Blocks") {
    fwd(BlockOA.y)
    FrontBlock();
    back(BlockOA.y)
    RearBlock();
    }
    if (Layout == "Front")
    FrontAssembly();
    if (Layout == "Rear")
    RearAssembly();
    if (Layout == "Show") {
    fwd(BlockOA.y)
    FrontAssembly();
    back(BlockOA.y)
    zrot(180)
    RearAssembly();
    }
    if (Layout == "Build") {
    fwd(BlockOA.z + Gap/2)
    up(BlockOA.y/2)
    xrot(-90)
    down(FrontChainLength*cos(FrontChainAngle))
    FrontAssembly();
    back(BlockOA.z + Gap/2)
    zrot(180)
    up(BlockOA.y/2)
    xrot(-90)
    down(RearChainLength*cos(RearChainAngle))
    RearAssembly();
    }
  • Raymond Avenue: Bikes In Lane

    Raymond Avenue: Bikes In Lane

    The sign makes it fairly clear what NYS DOT intended, even if they don’t dogfood their designs:

    Raymond Avenue vs pickup - bikes in lane sign
    Raymond Avenue vs pickup – bikes in lane sign

    We ride to the left of the fog line for good reason:

    Raymond Avenue vs pickup - drain grate
    Raymond Avenue vs pickup – drain grate

    Those are nominally “bike safe” drain grates, but some of the joints between the catch box and the grate can snag a bike tire, so they’re best avoided. Bonus: not all the drain grates are bike safe, so making a mistake will be costly.

    The lane has enough clearance for passing cars, presuming you don’t flinch at the wrong moment:

    Raymond Avenue vs pickup - lane clearance
    Raymond Avenue vs pickup – lane clearance

    That same DOT engineer told me the correct way for cars to pass is to drive up on the sloped curb onto the median. Some drivers do that, but further down Raymond they would collide with various obstructions.

    Not flinching is difficult to do when there’s a horn blaring immediately behind you:

    Raymond Avenue vs pickup - overhanging load
    Raymond Avenue vs pickup – overhanging load

    I wonder if the mattress was on its way to the dump.

    We’ve begun exiting at Chapel Gate and riding through campus:

    Raymond Avenue vs pickup - Chapel Gate
    Raymond Avenue vs pickup – Chapel Gate

    Which is exactly what the DOT engineer who designed Raymond suggested we do. Why a state agency can recommend riding on private property to get off a nominally standards-compliant state road remains a puzzle, but, hey, I’m no longer a Registered Professional Engineer.

    IMO, the man needs a bigger pickup:

    Raymond Avenue vs pickup - not enough truck
    Raymond Avenue vs pickup – not enough truck

    Just another day riding on NYS DOT roads, where bicycling is always an uninterrupted delight.

    Searching for Raymond will produce more examples of NYS DOT’s design prowess.

  • Tour Easy: Bike Rack Tray Holder

    Tour Easy: Bike Rack Tray Holder

    Mary starts her garden plants at home, then hauls the trays to the garden in a plastic drawer strapped to the rack on her Tour Easy to avoid crushing the plants in the packs. I finally learned enough to make an adapter mating the drawer to the rack:

    Bike Rack Tray Holder - in use
    Bike Rack Tray Holder – in use

    It’s made from four layers of laser-cut cardboard glued together with crossed corrugations for stiffness. I intended make a final version from glued-up plywood sheets, but it works surprisingly well as-is and I may just make another when this one wears out.

    The rear view:

    Bike Rack Tray Holder - rear view
    Bike Rack Tray Holder – rear view

    The front has a cutout for the battery powering the rear camera, with the base height allowing enough meat above the battery:

    Bike Rack Tray Holder - overview
    Bike Rack Tray Holder – overview

    The upright posts cradling the drawer may be too skinny for durability, which is why this is a prototype. The inner edges of the posts angle outward by a few millimeters to match the drawer’s mold draft.

    Four feet locate the holder on the rack rails just ahead of the Ortlieb pack clips:

    Bike Rack Tray Holder - rail detail
    Bike Rack Tray Holder – rail detail

    The rails are 8 mm ⌀ and the cutouts are 9 mm, because a little tolerance goes a long way. Similarly the tab widths just fit the available spaces beside the rail.

    The two flat plates support the drawer and space the uprights to match the Ortlieb clips. I intended to mortise the plates into the uprights, but hot melt glue is wonderful stuff and the joint may outlast the cardboard. In retrospect, the outer edges of the plates should align with the inner sides of the uprights for maximum tidiness.

    You don’t have that drawer and likely not the racks, so a picture of the LightBurn layout will give you the general idea for your hardware:

    Bike Rack Tray Holder - LightBurn layout
    Bike Rack Tray Holder – LightBurn layout

    Cut four copies of the uprights in two different orientations, glue them together, then do the obvious thing with the plates.

  • Corbin K436 Padlock: Shackle Reshaping

    Corbin K436 Padlock: Shackle Reshaping

    After approximately forever, the shackle on the Corbin K436 padlock securing the tandem-length cable we use for the Tour Easy ‘bents refused to push into the body. Lubrication being unavailing, I soaked it in acetone and shook it around for a day to get the inevitable crud out, then pondered the problem.

    Peering into the hole where the shackle enters the body showed the situation:

    Corbin padlock - cam damage
    Corbin padlock – cam damage

    Half a century (more or less: it didn’t accumulate those nicks & dings & tarnish last year) of pushing the shackle into the lock eroded the locking cam, to the extent that the cam no longer slides sideways to let the shackle slide the rest of the way into the body.

    So I introduced the shackle to Mr Bench Grinder and reshaped the end to hit the cam farther down on its angled side:

    Corbin padlock - reshaped shackle
    Corbin padlock – reshaped shackle

    While that certainly reduces the strength of the shackle, there’s a similar notch engaging a similar cam on the other end of the shackle, so it remains as secure as it must be for our simple needs.

    Spraying silicone lube into the body and applying a dab of silicone grease to the cam restored the lock to (nearly) new condition.

    The riding season approaches!

  • Bob Yak Trailer: Triple-New Grenade Pin Straps

    Bob Yak Trailer: Triple-New Grenade Pin Straps

    It turned out those window screen splines lasted a dozen years until this happened:

    Bob YAK trailer - splitting screen spline
    Bob YAK trailer – splitting screen spline

    Some rummaging in the Big Box o’ String produced the spool of 1000 pound test Kevlar cord most recently applied to the seat back on Mary’s bike, so this happened:

    Bob YAK trailer - Kevlar cords
    Bob YAK trailer – Kevlar cords

    Having re-confirmed that frayed Kevlar cannot be melted into a blob, another UV-stabilized cable tie at each end will control those tufts.

    Those cords should last forever

  • Tour Easy: Garage Door Remote Mount

    Tour Easy: Garage Door Remote Mount

    It turns out that keeping the garage door remote clipped to the starboard underseat pack on my Tour Easy attenuated its RF enough that even the directed receiver antenna couldn’t grab enough signal until I rolled onto the end of the driveway.

    While contemplating what’s involved in making a 3D model of the remote’s curved backside, I realized the bike already had a perfect spot:

    Tour Easy Zzipper Fairing - block mount
    Tour Easy Zzipper Fairing – block mount

    A few strips of good outdoor-rated foam tape later:

    Tour Easy - garage door opener mount
    Tour Easy – garage door opener mount

    Believe it or not, the camera is looking through the year-old and unwashed fairing on my bike.

    Stipulated: aligning the PCB antenna flat against a small aluminum plate atop a bunch of aluminum bars isn’t perfect. However, enough RF wriggles out to trigger our opener from four houses down the hill, giving it plenty of time to haul the door out of my way.

    That was trivial …

  • Hawk With Snake

    Hawk With Snake

    Do you see the Cooper’s Hawk?

    Hawk with snake 2025-11-04 - 082
    Hawk with snake 2025-11-04 – 082

    Neither did I!

    (The last three digits in the caption tick along at 60 frame/s. Opening each iamge in a new tab will let you embiggen the details, although the images aren’t all that great.)

    The second wingbeat, over on the left, is more visible as the hawk lifts off:

    Hawk with snake 2025-11-04 - 112
    Hawk with snake 2025-11-04 – 112

    This was about when I figured out what was going on:

    Hawk with snake 2025-11-04 - 151
    Hawk with snake 2025-11-04 – 151

    A hawk can easily outfly me!

    Hawk with snake 2025-11-04 - 207
    Hawk with snake 2025-11-04 – 207

    The snake dangling from the hawk’s talons didn’t see it coming, either:

    Hawk with snake 2025-11-04 - 213
    Hawk with snake 2025-11-04 – 213

    Up and away!

    Hawk with snake 2025-11-04 - 225
    Hawk with snake 2025-11-04 – 225

    About 2.3 s of elapsed time: plenty for a hawk and not nearly enough for me. Or the snake, for that matter.