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

  • Monthly Science: Burnett Signal Timing

    Monthly Science: Burnett Signal Timing

    The NYS DOT has been improving the pedestrian crossings at the Burnett – Rt 55 intersection. I expect this will be a bullet item in their Complete Streets compliance document, with favorable job reviews for all parties. The situation for bicyclists using the intersection, which provides the only access from Poughkeepsie to the Dutchess Rail Trail, hasn’t changed in the slightest. No signal timing adjustments, no bike-capable sensor loops, no lane markings, no shoulders, no nothing.

    Here’s what NYS DOT’s Complete Streets program looks like from our perspective, with the four-digit frame numbers ticking along at 60 frame/sec.

    We’re waiting on Overocker Rd for Burnett traffic to clear enough to cross three lanes from a cold start:

    Burnett Signal - 2020-09-25 - front 0006
    Burnett Signal – 2020-09-25 – front 0006

    That building over there across Burnett is the NYS DOT Region 8 Headquarters, so we’re not in the hinterlands where nobody ever goes.

    We’re rolling:

    Burnett Signal - 2020-09-25 - front 0258
    Burnett Signal – 2020-09-25 – front 0258

    The Burnett signals just turned green, although the cars haven’t started moving yet, and we’re accelerating out of Overocker:

    Burnett Signal - 2020-09-25 - front 0463
    Burnett Signal – 2020-09-25 – front 0463

    About 1.5 seconds later, the vehicles have started moving and we’re lining up for the left side of the right-hand lane:

    Burnett Signal - 2020-09-25 - front 0752
    Burnett Signal – 2020-09-25 – front 0752

    There’s no traffic behind us, so we can ride a little more to the right than we usually do, in the hopes of triggering the signal’s unmarked sensor loop:

    Burnett Signal - 2020-09-25 - front 1178
    Burnett Signal – 2020-09-25 – front 1178

    We didn’t expect anything different:

    Burnett Signal - 2020-09-25 - front 1333
    Burnett Signal – 2020-09-25 – front 1333

    We’re rolling at about 12 mph and it’s unreasonable to expect us to jam to a stop whenever the signal turns yellow. Oh, did you notice the truck parked in the sidewalk over on the left?

    As usual, 4.3 seconds later, the Burnett signals turn red, so we’re now riding in the “intersection clearing” delay:

    Burnett Signal - 2020-09-25 - front 1593
    Burnett Signal – 2020-09-25 – front 1593

    Two seconds later, the Rt 55 signals turn green:

    Burnett Signal - 2020-09-25 - front 1711
    Burnett Signal – 2020-09-25 – front 1711

    Did you notice all three eastbound lanes of Rt 55 (on our right) were occupied? That means a driver can’t come zipping through without stopping at the green light in their direction.

    One second later, we’re still proceeding through the intersection, clearing the lethally smooth manhole cover by a few inches, and approaching the far side:

    Burnett Signal - 2020-09-25 - front 1771
    Burnett Signal – 2020-09-25 – front 1771

    Here’s what the intersection looks like behind me:

    Burnett Signal - 2020-09-25 - rear 1
    Burnett Signal – 2020-09-25 – rear 1

    Another second goes by and we’re pretty much into the far right lane , with the westbound traffic beginning to move:

    Burnett Signal - 2020-09-25 - front 1831
    Burnett Signal – 2020-09-25 – front 1831

    The pedestrian crossing ladder has fresh new paint. They milled off the old paint while reconstructing the crossing, so the scarred asphalt will deteriorate into potholes after a few freeze-thaw cycles. Not their problem, it seems.

    Although it’s been three seconds since Rt 55 got a green signal, the eastbound drivers remain stunned by our presence:

    Burnett Signal - 2020-09-25 - rear 2
    Burnett Signal – 2020-09-25 – rear 2

    After another second, we’re almost where we need to be:

    Burnett Signal - 2020-09-25 - front 1891
    Burnett Signal – 2020-09-25 – front 1891

    There’s a new concrete sidewalk on the right, with a wheelchair-accessible signal button I can now hit with my elbow when we’re headed in the other direction. It’s worth noting there is no way to reach Overocker by bicycle, other than riding the sidewalk; there’s only one “complete” direction for vehicular cyclists.

    One second later puts us as far to the right as we can get, given all the gravel / debris / deteriorated asphalt along the fog line near the curb:

    Burnett Signal - 2020-09-25 - front 1957
    Burnett Signal – 2020-09-25 – front 1957

    Which is good, because four seconds after the green signal for Rt 55, the pack has overtaken us:

    Burnett Signal - 2020-09-25 - rear 3
    Burnett Signal – 2020-09-25 – rear 3

    If you were the driver of the grayish car in the middle lane, directly behind the black one giving us plenty of room, you might be surprised at the abrupt lane change in front of you. Maybe not, because you had a front-row seat while we went through the intersection.

    Elapsed time from the green signal on Burnett: 25 seconds. My point is that another few seconds of all-red intersection clearing time wouldn’t materially affect anybody’s day and would go a long way toward improving bicycle safety.

    Unlike the pedestrian crossing upgrade, NYS DOT could fix this with zero capital expenditure: one engineer with keys to the control box, a screwdriver or keyboard (depending on the age of the controls), and the ability to do the right thing could fix it before lunch tomorrow.

    But it’s just a typical bike ride on NYS DOT’s Complete Streets, where their planners & designers claim to “promote pedestrian and bicycle travel for all persons.” Maybe that’s true somewhere in NYS DOT’s fantasies, but you’ll find far more evidence from our rides, with plenty of numbers, showing that’s not the case around here.

  • Bike Helmet Mirror: Brasswork Clamp

    Bike Helmet Mirror: Brasswork Clamp

    A bit of Quality Shop Time produced a slight improvement to the clamp holding the mirror to the stalk:

    Helmet Mirror Ball Mount - mirror joint brasswork
    Helmet Mirror Ball Mount – mirror joint brasswork

    The general idea is to hold the wave washer (it’s mashed under the flat washer, honest) above those bumps on the plate holding the mirror and stalk balls. It’s a few millimeters from the end of a ¼ inch brass rod, drilled for the M3 screw, and reduced to 4.5 mm with a parting tool to clear the bumps.

    While I was at it, I made two spare mirrors, just to have ’em around:

    Helmet Mirror Ball Mount - new vs old
    Helmet Mirror Ball Mount – new vs old

    The new ball mount looks downright svelte compared to the old Az-El mount, doesn’t it?

    I should replace the steel clamp plates with a stainless-steel doodad of some sort to eliminate the unsightly rust, but that’s definitely in the nature of fine tuning.

  • Bike Helmet Mirror: Ball Mount

    Bike Helmet Mirror: Ball Mount

    Nine years ago, I didn’t know how enough to design a bike helmet mirror with a ball mount, but even an old dog can learn a new trick:

    Helmet Mirror Ball Mount - on helmet
    Helmet Mirror Ball Mount – on helmet

    However, it’s worth noting my original, butt-ugly Az-El mounts lasted for all of those nine years, admittedly with adjustments along the way, which is far more than the commercial mounts making me unhappy enough to scratch my itch.

    The mount adapts the split spherical clamp from the daytime running light:

    Helmet Mirror Mount - Ball
    Helmet Mirror Mount – Ball

    Scaling it down for a 10 mm polypropylene ball around the base of the 30 mm inspection mirror’s shaft simplified everything:

    Helmet Mirror Ball Mount - drilled ball test
    Helmet Mirror Ball Mount – drilled ball test

    I’m reasonably sure I couldn’t have bought 100 polypro balls for eight bucks a decade ago, but we’ll never know. Drilling the hole was a complete botch job, about which more later. The shaft came from a spare mirror mount I made up a while ago; a new shaft appears below.

    The solid model, like Gaul, is in three parts divided:

    Helmet Mirror Ball Mount - Slic3r
    Helmet Mirror Ball Mount – Slic3r

    The helmet plate (on the right) has a slight indent more-or-less matching the helmet curvature and gets a layer of good double-stick foam tape. The clamp base (on the left) has a pair of brass inserts epoxied into matching recesses below the M3 clearance holes:

    Helmet Mirror Ball Mount - inserts
    Helmet Mirror Ball Mount – inserts

    A layer of epoxy then sticks the helmet plate in place, with the inserts providing positive alignment:

    Helmet Mirror Ball Mount - plates
    Helmet Mirror Ball Mount – plates

    The clamp screws pull the inserts against the plastic in the clamp base, so they can’t pull out or through, and the plates give the epoxy enough bonding surface that (I’m pretty sure) they won’t ever come apart.

    I turned down a 2 mm brass insert to fit inside the butt end of the mirror shaft and topped it off with a random screw harvested from a dead hard drive:

    Helmet Mirror Ball Mount - assembled - rear view
    Helmet Mirror Ball Mount – assembled – rear view

    At the start, it wasn’t obvious the shaft would stay stuck in the ball, so I figured making it impossible to pull out would eliminate the need to find it by the side of the road. As things turned out, the clamp exerts enough force to ensure the shaft ain’t goin’ nowhere, so I’ll plug future shafts with epoxy.

    The front side of the clamp looks downright sleek:

    Helmet Mirror Ball Mount - assembled - front view
    Helmet Mirror Ball Mount – assembled – front view

    Well, how about “chunky”?

    The weird gray-black highlights are optical effects from clear / natural PETG, rather than embedded grunge; it looks better in person. I should have used retina-burn orange or stylin’ black.

    This mount is much smaller than the old one and should, in the event of a crash, not cause much injury. Based on how the running light clamp fractures, I expect the clamp will simply tear out of the base on impact. In the last decade, neither of us has crashed, so I don’t know what the old mount would do.

    The clamp is 7 mm thick (front-to-back), set by the M3 washer diameter, with 1.5 mm of ball sticking out on each side. The model has a kerf one thread high (0.25 mm) between the pieces to add clamping force and, with the screws tightened down, moving the ball requires a disturbingly large effort. I added a touch of rosin and that ball straight-up won’t move, which probably means the shaft will bend upon droppage; I have several spare mirrors in stock.

    On the other paw, the ball turns smoothly in the clamp and it’s easy to position the shaft as needed: much better than the old Az-El mount!

    The inspection mirror hangs from a double ball joint which arrives with a crappy screw + nut. I epoxied the old mirror mount nut in place, but this time around I drilled the plates for a 3 mm stainless SHCS, used a wave washer for a bit of flexible force, and topped it off with a nyloc nut:

    Helmet Mirror Ball Mount - mirror joint
    Helmet Mirror Ball Mount – mirror joint

    I’m unhappy with how it looks and don’t like how the washer hangs in free space between those bumps, so I may eventually turn little brass fittings to even things out. It’s either that or more epoxy.

    So far, though, it’s working pretty well and both units meet customer requirements.

    The OpenSCAD source code as a GitHub Gist:

    // Bike helmet mirror mount – ball joint
    // Ed Nisley KE4ZNU 2020-09
    /* [Layout options] */
    Layout = "Build"; // [Build, Show, Plate, Base, Clamp]
    //– Extrusion parameters
    // Extrusion parameters
    /* [Hidden] */
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    HoleWindage = 0.2;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    function IntegerLessMultiple(Size,Unit) = Unit * floor(Size / Unit);
    Protrusion = 0.1; // make holes end cleanly
    inch = 25.4;
    ID = 0;
    OD = 1;
    LENGTH = 2;
    //- Basic dimensions
    MountDia = 30.0; // footprint on helmet
    BallDia = 10.0;
    BallRad = BallDia / 2;
    WallThick = IntegerMultiple(2.0,ThreadWidth);
    FloorThick = IntegerMultiple(2.0,ThreadThick);
    CornerRound = 2.0;
    Insert = [3.0,4.0,4.0]; // threaded brass insert
    Screw = [3.0,5.5,25.0]; // clamp screw
    Washer = [3.7,7.0,0.7]; // washer
    ShowGap = 2.0;
    BuildGap = 5.0;
    //– Helmet Interface Plate
    ScrewOC = BallDia + 2*WallThick + Screw[ID];
    echo(str("Screw OC: ",ScrewOC));
    Clamp = [ceil(Washer[OD]), // barely holds washer under screw
    ScrewOC + Washer[OD], // minimal clearance for washer
    BallDia +2*FloorThick // screw fits through insert
    ];
    Kerf = ThreadThick;
    echo(str("Clamp: ",Clamp));
    HelmetCX = 60.0; // empirical helmet side curve
    HelmetMX = 3.0;
    HelmetRX = (pow(HelmetMX,2) + pow(HelmetCX,2)/4)/(2*HelmetMX);
    HelmetPlateC = MountDia;
    HelmetPlateTheta = atan(HelmetPlateC/HelmetRX);
    HelmetPlateM = 2*HelmetRX*pow(sin(HelmetPlateTheta/4),2);
    echo(str("Plate indent: ",HelmetPlateM));
    HelmetPlateThick = max(FloorThick,0.6*Insert[LENGTH]) + HelmetPlateM;
    echo(str("Screw length: ",Clamp.z + Insert[LENGTH]));
    MountSides = 2*3*4;
    //———————-
    // 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);
    }
    //———————-
    // Clamp frame around ball
    module ClampFrame() {
    difference() {
    union() {
    hull()
    for (i=[-1,1], j=[-1,1]) {
    translate([i*(Clamp.x/2 – CornerRound),j*(Clamp.y/2 – CornerRound),Clamp.z/2 – CornerRound])
    sphere(r=CornerRound,$fn=24);
    translate([i*(Clamp.x/2 – CornerRound),j*(Clamp.y/2 – CornerRound),-Clamp.z/2])
    cylinder(r=CornerRound,$fn=24);
    }
    for (j=[-1,1])
    translate([0,j*ScrewOC/2,0])
    rotate(180/12)
    cylinder(d=Washer[OD],h=Clamp.z/2,$fn=12);
    }
    sphere(d=BallDia + HoleWindage,$fn=48);
    cube([2*MountDia,2*MountDia,Kerf],center=true);
    for (j=[-1,1])
    translate([0,j*ScrewOC/2,-Screw[LENGTH]])
    rotate(180/6)
    PolyCyl(Screw[ID],2*Screw[LENGTH],6);
    }
    }
    module ClampSelect(Section) {
    XlateZ = (Section == "Top") ? Clamp.z/2 :
    (Section == "Bottom") ? -Clamp.z/2 :
    0;
    intersection(convexity=5) {
    ClampFrame();
    translate([0,0,XlateZ])
    cube([2*Clamp.x,2*Clamp.y,Clamp.z + 2*Protrusion],center=true);
    }
    }
    //———————-
    // Concave plate fitting helmet shell
    module HelmetPlate() {
    render()
    difference() {
    cylinder(d=MountDia,h=HelmetPlateThick,$fn=MountSides);
    translate([0,0,HelmetPlateThick – HelmetPlateM + HelmetRX])
    sphere(r=HelmetRX,$fn=128);
    for (j=[-1,1])
    translate([0,j*ScrewOC/2,-Protrusion]) {
    PolyCyl(Insert[OD],0.6*Insert[LENGTH] + Protrusion,6);
    PolyCyl(Screw[ID],2*HelmetPlateThick,6);
    }
    }
    }
    //———————-
    // Base of clamp ring
    module MountBase() {
    difference() {
    union() {
    cylinder(d=MountDia,h=FloorThick,$fn=MountSides);
    translate([0,0,FloorThick + Clamp.z/2])
    ClampSelect("Bottom");
    }
    for (j=[-1,1])
    translate([0,j*ScrewOC/2,-Protrusion])
    rotate(180/6)
    PolyCyl(Insert[OD],0.6*Insert[LENGTH] + Protrusion,6);
    }
    }
    //———————-
    // Lash it together
    if (Layout == "Plate") {
    HelmetPlate();
    }
    if (Layout == "Base") {
    MountBase();
    }
    if (Layout == "Clamp") {
    ClampFrame();
    }
    if (Layout == "Show") {
    rotate([180,0,0])
    HelmetPlate();
    translate([0,0,ShowGap]) {
    MountBase();
    color("Ivory",0.3)
    translate([0,0,Clamp.z/2 + FloorThick + ShowGap/2])
    sphere(d=BallDia);
    translate([0,0,Clamp.z/2 + FloorThick + ShowGap])
    ClampSelect("Top");
    }
    }
    if (Layout == "Build") {
    translate([MountDia/2 + BuildGap,0,0])
    HelmetPlate();
    translate([-(MountDia/2 + BuildGap),0,0])
    MountBase();
    translate([0,MountDia/2 + BuildGap,Clamp.z/2])
    rotate([0,180,0])
    rotate(90)
    ClampSelect("Top");
    }

    The original doodles include a bit of dress-up fairing that didn’t make the cut:

    Helmet Mirror Ball Mount - doodles
    Helmet Mirror Ball Mount – doodles
  • Tour Easy Daytime Running Light: Second Fracture

    Tour Easy Daytime Running Light: Second Fracture

    While clearing some overhanging brush along the rail trail, I probably wedged a branch between the LC40 flashlight and the fairing:

    Fairing Flashlight Mount - brush clearing
    Fairing Flashlight Mount – brush clearing

    Aaaand twisted it enough to fracture the mount:

    Fairing Flashlight Mount - another fracture
    Fairing Flashlight Mount – another fracture

    A closer look shows the infill just ripped apart:

    Fairing Flashlight Mount - another failure - detail
    Fairing Flashlight Mount – another failure – detail

    I can’t be sure that’s what happened, because the mount actually failed several miles later, after I hit one of the potholes along Raymond Avenue. Fortunately, I saw it swinging away from the fairing, hanging by its last few threads, and managed to grab it before it vanished.

    Fairing Flashlight Mount - Catch a Falling Mount
    Fairing Flashlight Mount – Catch a Falling Mount

    I set Slic3r for 30% infill on the replacement, but the running light been riding my fairing for three years and seems strong enough under normal use.

  • Rt 376 at Zach’s Way: Near Right Hook

    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.

  • Harvesting 18650 Lithium Cells

    Harvesting 18650 Lithium Cells

    With a Dutchess County Household Hazardous Waste Collection Day coming up, I’ve been harvesting usable lithium cells from a variety of old batteries:

    Harvested 18650 3P lithium batteries
    Harvested 18650 3P lithium batteries

    The pile of 18650 3P blocks over on the right are some obviously corroded deaders and the lowest performers from these tests:

    Harvested 3P 18650 Packs
    Harvested 3P 18650 Packs

    I doubt they’ll get recycled, as there’s entirely too much overhead involved in dismantling boxes full of cells like these, but I hope they’ll get a decent burial somewhere.

  • Rt 376 at Red Oaks Mill: Semitrailer Squeeze Play

    Rt 376 at Red Oaks Mill: Semitrailer Squeeze Play

    We’re southbound on NYS Rt 376, approaching the Wappinger Creek bridge at mile marker 1102, avoiding the overgrowth coming through the guide rail:

    Rt 376 SB Marker 1102 - Royal Semi Squeeze - 2020-07-15 - 01
    Rt 376 SB Marker 1102 – Royal Semi Squeeze – 2020-07-15 – 01

    Avoiding the pothole growing across the right wheel track:

    Rt 376 SB Marker 1102 - Royal Semi Squeeze - 2020-07-15 - 02
    Rt 376 SB Marker 1102 – Royal Semi Squeeze – 2020-07-15 – 02

    Normally, I ride to the left of that pothole, down the middle of the lane, so it’s easier to avoid the next section of overgrowth through the guide rail:

    Rt 376 SB Marker 1102 - Royal Semi Squeeze - 2020-07-15 - 03
    Rt 376 SB Marker 1102 – Royal Semi Squeeze – 2020-07-15 – 03

    This time, we’re as far to the right as we can get, because we’re being overtaken by a semitrailer trash hauler:

    Rt 376 SB Marker 1102 - Royal Semi Squeeze - 2020-07-15 - 04
    Rt 376 SB Marker 1102 – Royal Semi Squeeze – 2020-07-15 – 04

    Which is proceeding as far to the left as the driver can possibly squeeze it:

    Rt 376 SB Marker 1102 - Royal Semi Squeeze - 2020-07-15 - 05
    Rt 376 SB Marker 1102 – Royal Semi Squeeze – 2020-07-15 – 05

    Half a lane is more than we sometimes get:

    Rt 376 SB Marker 1102 - Royal Semi Squeeze - 2020-07-15 - 06
    Rt 376 SB Marker 1102 – Royal Semi Squeeze – 2020-07-15 – 06

    Away he goes:

    Rt 376 SB Marker 1102 - Royal Semi Squeeze - 2020-07-15 - 07
    Rt 376 SB Marker 1102 – Royal Semi Squeeze – 2020-07-15 – 07

    We always try to be friendly, because we’re sure to meet again some day:

    Rt 376 SB Marker 1102 - Royal Semi Squeeze - 2020-07-15 - 08
    Rt 376 SB Marker 1102 – Royal Semi Squeeze – 2020-07-15 – 08

    Mary says he waved back, so it’s all good.

    Elapsed time: about twelve seconds.

    For whatever it’s worth, eight years ago, NYS DOT Region 8 South Dutchess Residency did a much better job of clearing the overgrowth along Rt 376:

    Rt 376 SB Marker 1102 - Royal Semi Squeeze - Google StreetView 2012-04
    Rt 376 SB Marker 1102 – Royal Semi Squeeze – Google StreetView 2012-04

    That was then, this is now.