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.

Author: Ed

  • NYS DOT Motivation: Death

    NYS DOT Motivation: Death

    We have just started rolling from Overocker Road and the traffic signal on Burnett Blvd at Rt 55 (on the far left) has just turned green for the single car on the sensor loop:

    Burnett Blvd Rt 55 - 2021-05-23 - 0 s
    Burnett Blvd Rt 55 – 2021-05-23 – 0 s

    Much to our surprise, 17 s later the signal is still green:

    Burnett Blvd Rt 55 - 2021-05-23 - 17 s
    Burnett Blvd Rt 55 – 2021-05-23 – 17 s

    As usual, the unmarked sensor loop doesn’t detect bicycles and the control doesn’t take our clearing time into account, so the signal turns yellow 5 s later (after 22 s from turning green) while we’re still in the intersection:

    Burnett Blvd Rt 55 - 2021-05-23 - 22 s
    Burnett Blvd Rt 55 – 2021-05-23 – 22 sBurnett Blvd Rt 55 – 2021-05-23 – 22 s

    After another 6 s, though, we’re through the intersection and lined up on the right side of Rt 55, just as the Rt 55 signal turns green:

    Burnett Blvd Rt 55 - 2021-05-23 - 28 s
    Burnett Blvd Rt 55 – 2021-05-23 – 28 s

    Note that the Burnett Blvd signal remained green for 22 s, much longer than in bygone years, and the green-to-green time is now 28 s. We got through the intersection without any difficulty, although the green-to-red clearance time remains scanty.

    Those of long memory may recall my writeup of the timing in early November last year. That was with many cars triggering the sensor loops, so the timings from a trip last July with a single truck-and-trailer tripping the sensor may be more relevant. Or take your pick from other timings done during the last six years; there’s plenty of data to show something’s new and different.

    Mary recently discovered a reason why NYS DOT may have suddenly changed the signal timing at the Burnett intersection after all those years:

    During the incident, a black Nissan Titan, driven by a 51-year-old male resident of Lagrangeville, collided with a bicycle, ridden by a 58-year-old male resident of Poughkeepsie, in the area of the crosswalk on the southeast portion of the intersection, said the Town of Poughkeepsie Police.

    The bicyclist sustained serious injuries and was transported to MidHudson Regional Hospital.

    https://dailyvoice.com/new-york/putnam/police-fire/bicyclist-seriously-injured-after-crash-with-vehicle-in-area/798453/

    The crosswalk mentioned in the article appears in the last picture.

    The cyclist died of his injuries shortly after that article went live.

    Mary knew him. He was one of the gardeners near her plot in the Vassar Community Garden who lived in the apartments a few hundred yards from that intersection, didn’t own a car, and, for years, rode through that intersection to the grocery store at the far end of Burnett Blvd (across another of DOT’s intersections). Everyone knew him as a nice, considerate guy.

    When DOT tells you “Clearance times are determined based on speed, intersection dimensions, grade, and reaction time and cannot be adjusted” they don’t add “Because not enough people have died to get our attention.”

    Death is the only thing that will convince NYS DOT’s engineers to change the signal timing at an intersection.

    As far as I can tell, all of the other intersections along our usual routes still have the same inadequate clearance times. Evidently, the bicyclist death toll isn’t high enough to get their attention and evidence here doesn’t matter there, because motor vehicle traffic cannot be delayed, even for a few seconds, merely to protect the most vulnerable “users” of their facilities.

    We’ve been bicycling all our adult lives and haven’t been killed yet, despite NYS DOT’s complete lack of attention. Our experiences justify my cynicism and bitterness.

    I eventually figured out why no NYS DOT staffer will accompany me on bike trips along their “safe for all users” roads. If they did, they’d be unable to deny knowing how hazardous their engineering designs & maintenance practices are in real life, should the question come up in a court of law.

    If you think that’s not the case, then let’s go riding together …

    Road design, build quality, and attention to details matter, even though drivers and, yes, cyclists share some of the blame.

  • House Flipping

    Sometimes I get text messages:

    House Hunting Chat
    House Hunting Chat

    BzzzzclickNO CARRIER

    I’m reasonably sure “Caroline” is really a property flipper, so we’re not in “her” target market.

    Should you be interested in moving into the Hudson Valley, we can probably make a mutually beneficial deal. Protip: use email.

    If only Android allowed whitelisting SMS message sources.

  • Nuthatch Threat Display

    Nuthatch Threat Display

    Mary spotted a White-breasted Nuthatch facing off against a red squirrel on the patio near the birdfeeder, wherein the nuthatch spread its wings to look as fearsome as possible. The squirrel seemed unfazed, perhaps because a bird the size of my thumb simply doesn’t pose much of a threat.

    A few minutes later, the nuthatch repeated the display from the feeder, starting with a hostile side-eye:

    Nuthatch threat side-eye
    Nuthatch threat side-eye

    Then he (we’re pretty sure) went into full-on threat mode:

    Nuthatch threat display
    Nuthatch threat display

    Nuthatches are perfectly happy hanging upside-down from any convenient perch, so it’s not quite as ungainly as it may seem. However, the threat bounced off the squirrel, which continued stuffing itself from seeds scattered by none other than the nuthatch.

    The nuthatch threat display seems identical to the nuthatch courtship display, so we may have been witnessing an offer for rishathra.

    Ya never know!

    Taken through two layers of 1955 window glass with the Pixel 3a zoomed all the way, then ruthlessly cropped.

  • Nuheara IQbuds² MAX vs. Bose Hearphones

    Nuheara IQbuds² MAX vs. Bose Hearphones

    [Update: I pointed to this post in a comment on the Bose Community forum, wherein I mentioned the lack of Bluetooth in their Sound Control hearing aids. It seems “Posts on any board, including Hearphones, on the Bose Community regarding the Bose SoundControl Hearing Aids will be removed by our moderators”, so they edited out those paragraphs. Fair enough: it’s their playground, so they set the rules’]

    Having recently bought a set of Nuheara IQbuds² MAX hearing assistance buds, I get “So, what do you think?” invitations to leave a review. As expected, the third-party company handling the reviews will strip-mine my personal bits for their own ends; I see plenty of upside for them and none for me.

    So these brief notes, compiled before I read the Okendo TOS, should serve the same purpose as an actual review, minus the nonsense of providing even more of my sensitive bits.

    Bose discontinued their Hearphones last year. While I’m reasonably happy with how mine work, they seem to last about a year before something fails. Bose replaced the first unit after its covering delaminated, replaced the second unit when a wire failed in the left microphone, and the third unit is now approaching one year of steady use.

    The Hearphone necklace curled around the IQbuds charging case:

    Bose Hearphones - Nuheara IQbuds2 MAX
    Bose Hearphones – Nuheara IQbuds2 MAX

    Comparing the IQBuds² MAX to the Bose Hearphones:

    • Heavier in the ears, but without the necklace
    • Poor battery runtime, both have non-replaceable batteries
    • Poor ear seal with silicone tips, OK with Nuheara’s foam tips
    • Immediate access to “World off” mode!
    • “World off” mode seems noisier, even with ANC on
    • Better dynamic noise control / filtering

    The tradeoff for not having the Bose necklace is, of course, carrying a smaller battery in each ear. Everybody’s claimed run times are optimistic, but after a year the Hearphones still last the better part of a day, while new IQbuds generate range anxiety after a morning and must then spend a while recharging in their case.

    The stock IQbud silicone tips exert entirely too much pressure on my ear canals. The foam tips produce a much better seal and were easier to wear for more than a few hours. The Bose “Stayhear” shaped silicone tips fit much better and suppress external sound just as well as the IQbud foam tips.

    Replacing the stock IQbuds foam tips (described as “Comply memory foam”) with actual Comply memory foam tips directly from Comply was a definite step up that should not be necessary; they are similar, but visibly different. According to Comply’s online fit selector, you need their Isolation T-167 Sennheiser-specific tips, even though Nuheara hardware appears in Comply’s selector.

    The IQbuds tap controls, except for the simplest single tap, barely work. I cannot perform a double-tap, because the bud registers the first tap as a single tap and either discards the second tap or registers it as another single tap. Long taps generally work, except when they don’t, having nothing to do with tap duration or force. Tech support tells me the buds use the audio signal to determine when a finger taps the bud, but AFAICT tap sensitivity is much too high and the discrimination entirely too unfussy.

    Amusingly, nibbling dark chocolate can produce exactly the correct audio signal to trigger the “World off” tap in the right bud and, occasionally, the “Play / Pause” tap in the left bud. I rest my case.

    For someone requiring far more audio gain than a typical hipster, firmly tapping an ear bud is an … uncomfortable … user interface.

    Fortunately, a single correctly executed tap on the right bud mutes the microphones and turns on Active Noise Cancellation; the Hearphones bury that vital function on a tiny icon inside the Bose app, requiring many seconds to start and activate.

    The IQbuds app (and, presumably, the bud firmware) does not allow assigning any tap function to any bud + tap pattern. For example, there’s no way to access both “change location” and “change focus” by tapping, because both those functions can be activated only by the right bud’s long tap: you may select one or the other. Weirdly, volume and media controls appear nearly everywhere and, if double taps worked, they’d be useful.

    The Hearphones are much better at muting relatively quiet ambient sound, to the extent that I thought the IQbud “World off” function didn’t work. It does, even though it seems tuned to suppress much higher noise levels. Both do a surprisingly good job suppressing loud yard tools, perhaps due to my inability to hear frequencies over a few kHz.

    The IQbud noise suppression exhibits horrible gain pumping in noisy environments and windy conditions. It rolls off the overall gain and filters the higher frequencies as the ambient noise increases, then restores them in a rush as the noise subsides: repeating the cycle as the noise level changes. This is very unpleasant and, AFAICT, there is no way to forcibly set a specific gain / bandwidth other than turning the suppression completely off, which misses the point.

    Bottom line: I use the IQbuds and they definitely help my hearing, but I don’t particularly like them.

    To be fair, I don’t like the Hearphones necklace very much, either, even though, overall, Bose did a better job with the actual earpieces.

  • Sticky Trap Screen Frames

    Sticky Trap Screen Frames

    The objective being to reduce the number of onion maggots in Mary’s Vassar Farm plot without chemical agents, I conjured sticky trap screen frames from the vasty digital deep:

    Sticky Trap - first production run
    Sticky Trap – first production run

    Each one contains half a sheet of yellow sticky plastic, which is easy enough to cut before peeling off the protective covering sheets. The cage is half-inch galvanized hardware cloth snipped with hardened diagonal cutters. A bead of acrylic adhesive around the base holds the cage in place

    Although you can deploy sticky sheets without cages, they tend to attract and affix beneficial critters: butterflies, small birds, furry critters, toads, gardeners, and the like. We don’t know how effective the cages will be, but they seemed better than nothing.

    They mount on ski poles cut in half:

    Sticky Trap - ski pole installed
    Sticky Trap – ski pole installed

    And on fence posts around the perimeter:

    Sticky Trap - angle bracket installed
    Sticky Trap – angle bracket installed

    To my untrained eye, some of those doomed critters are, indeed, onion maggot flies. The rest seem to be gnats and other nuisances, so IMO we’re applying population pressure in the right direction.

    Each base-and-cap frame takes about three hours to print, so I did them one at a time over the course of a few days while applying continuous product improvement.

    The sheets rest on small V blocks intended to keep them centered within the cage:

    Sticky Sheet Cage - angle bracket - solid model
    Sticky Sheet Cage – angle bracket – solid model

    The ski pole attachment must build with the cap on top, but it bridges well enough for the purpose:

    Sticky Sheet Cage - ski pole - solid model
    Sticky Sheet Cage – ski pole – solid model

    The overhanging hooks on the blocks (just barely) engage the grid to keep the lid in place, while remaining short enough to not droop too badly. You could probably delete the hooks from the bottom plate, but they align the cage while the adhesive cures.

    The sheets tend to bend in the middle, so I’ll stick a thin slat or two vertically to keep them straight.

    The OpenSCAD source code as a GitHub Gist:

    // Sticky Sheet Cage
    // Ed Nisley KE4ZNU May 2021
    Layout = "Build"; // [Build, Show, Cap, Attachment]
    Bracket = "Ski"; // [Angle, Ski, Post]
    //- 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;
    ID = 0;
    OD = 1;
    LENGTH = 2;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    //———————-
    // Dimensions
    Sheet = [1,100,150]; // sticky sheet
    Grid = 0.5*inch;
    Cage = [2*Grid + 5.0, 8*Grid + 5.0, 12*Grid + 2.0]; // grid wire cage bent around sheet
    CageRad = 2.5; // wire bending radius
    CageThick = 2.0; // grid thickness
    WallThick = 3.0; // min wall and bottom thickness
    Recess = 5.0; // inset to capture cage edge
    Plate = [Cage.x,Cage.y,Recess] + [2*WallThick,2*WallThick,WallThick];
    PlateRad = 5.0;
    SkiPole = [20.0,20.0 + 2*WallThick,50];
    AnglePlate = [30,30,50];
    ScrewClear = 5.0;
    BuildGap = 5.0;
    //———————-
    // 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);
    }
    //———————-
    // Pieces
    module Cap() {
    union() {
    difference() {
    hull()
    for (i=[-1,1], j=[-1,1])
    translate([i*(Plate.x/2 – PlateRad),j*(Plate.y/2 – PlateRad),0])
    cylinder(r=PlateRad,h=Plate.z,$fn=12);
    translate([0,0,Plate.z – Recess])
    hull()
    for (i=[-1,1], j=[-1,1])
    translate([i*(Cage.x/2 – CageRad),j*(Cage.y/2 – CageRad),0])
    cylinder(r=CageRad,h=Plate.z,$fn=12);
    }
    difference() {
    Strut = Cage.x – 2*CageThick;
    Latch = [Cage.x,WallThick,0.75*Plate.z];
    union() {
    for (j=[-1,1])
    translate([0,j*2.5*Grid,Plate.z])
    cube([Strut,WallThick,2*Plate.z],center=true);
    for (j=[-1,1])
    translate([0,j*2.5*Grid,2*Plate.z – Latch.z/2])
    cube(Latch,center=true);
    }
    translate([0,0,2*Plate.z + (Cage.z – Sheet.z)/4])
    rotate([0,45,0])
    cube([Strut/sqrt(2),Plate.y,Strut/sqrt(2)],center=true);
    }
    }
    }
    module Attachment() {
    if (Bracket == "Angle") {
    translate([0,Plate.y/2,0])
    rotate(45)
    difference() {
    union() {
    cube(AnglePlate,center=false);
    rotate(-45)
    translate([0,WallThick,Plate.z/2])
    cube([Plate.x – 2*PlateRad,4*WallThick,Plate.z],center=true);
    }
    translate([WallThick,WallThick,-Protrusion])
    cube(AnglePlate + [0,0,2*Protrusion],center=false);
    translate([AnglePlate.x/2,-Protrusion,2*AnglePlate.z/3])
    rotate([-90,0,0])
    PolyCyl(ScrewClear,2*AnglePlate.x,6);
    translate([-Protrusion,AnglePlate.x/2,1*AnglePlate.z/3])
    rotate([90,0,90])
    PolyCyl(ScrewClear,2*AnglePlate.x,6);
    }
    }
    else if (Bracket == "Ski") {
    translate([0,Plate.y/2 + SkiPole[OD]/2,0])
    difference() {
    union() {
    PolyCyl(SkiPole[OD],SkiPole[LENGTH],24);
    translate([0,-3*WallThick,Plate.z/2])
    cube([Plate.x – 2*PlateRad,4*WallThick,Plate.z],center=true);
    }
    translate([0,0,-2*WallThick])
    PolyCyl(SkiPole[ID],SkiPole[LENGTH],24);
    }
    }
    }
    //———————-
    // Build it
    if (Layout == "Cap")
    Cap();
    if (Layout == "Attachment") {
    Attachment();
    }
    if (Layout == "Show") {
    translate([0,0,Sheet.z/2 + Plate.z])
    color("Yellow")
    cube(Sheet,center=true);
    Cap();
    Attachment();
    translate([0,0,Sheet.z + 2*Plate.z])
    rotate([180,0,0])
    Cap();
    }
    if (Layout == "Build") {
    translate([-(Plate.x/2 + BuildGap),0,0]) {
    Cap();
    Attachment();
    }
    translate([(Plate.x/2 + BuildGap),0,0])
    Cap();
    }

  • Deer Fence Hangers

    Deer Fence Hangers

    For what should be obvious reasons, we armored Mary’s “kitchen garden” with buried concrete blocks and deer fence. I secured the fence to 7 foot plastic-coated steel-core posts strapped to shorter stakes supporting the lower wire fence, using cable ties we both knew wouldn’t survive exposure to the sun.

    As part of the spring garden prep, I summoned proper supports from the vasty digital deep:

    Deer Fence Hanger - Build view
    Deer Fence Hanger – Build view

    The general idea is to plunk one atop each post and tangle wrap the netting through the hooks, thusly:

    Deer Fence Hanger - installed
    Deer Fence Hanger – installed

    The garden looks like we killed an entire chess set and impaled their carcasses as a warning to others of their kind, but the fence now hangs neatly from the top of the posts rather than drooping sadly.

    Each one of those things takes nigh onto two hours to emerge from the M2, so I printed them one by one over the course of a few days while making continuous product improvements.

    The “natural” PETG isn’t UV stabilized, either, but it ought to last longer than those little bitty nylon cable ties. We shall see.

    The OpenSCAD source code as a GitHub Gist:

    // Deer Fence Hangers
    // Ed Nisley KE4ZNU May 2021
    Layout = "Show"; // [Build, Show, Cap, Hook]
    // net grid spacing
    NetOC = 55.0; // [40.0:5.0:70.0]
    // stake OD
    PoleDia = 23.0; // [20.0:30.0]
    //- 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;
    ID = 0;
    OD = 1;
    LENGTH = 2;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    //———————-
    // Dimensions
    Notch = 5.0; // hook engagement
    WallThick = 3.0; // min wall and end thickness
    Shell = [PoleDia,PoleDia + 2*WallThick,NetOC + 2*Notch];
    HookBlock = [10.0,Shell.y/4,2*Notch]; // hanger inside length
    LegendBlock = [0.7*Shell.z,Shell.y/2,2*ThreadThick]; // legend size
    //———————-
    // 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);
    }
    //———————-
    // Pieces
    module Hook() {
    //%Cap();
    translate([Shell[OD]/2 – Protrusion,HookBlock.y/2,0])
    rotate([90,0,0])
    linear_extrude(height=HookBlock.y)
    difference() {
    scale([1,2])
    intersection() {
    circle(r=HookBlock.x);
    square(HookBlock.x,center=false);
    }
    square(Notch,center=false);
    }
    }
    module Cap() {
    difference() {
    rotate(180/6)
    PolyCyl(Shell[OD],Shell[LENGTH],6);
    translate([0,0,-WallThick])
    rotate(180/24)
    PolyCyl(Shell[ID],Shell[LENGTH],24);
    translate([-Shell[OD]/2,0,Shell[LENGTH]/2])
    rotate([0,90,0])
    cube(LegendBlock,center=true);
    }
    translate([-(Shell[OD]/2 – LegendBlock.z/2),0,Shell[LENGTH]/2])
    rotate([0,-90,0])
    resize(0.8*LegendBlock,auto=[true,true,false])
    linear_extrude(height=LegendBlock.z)
    text(text=str(NetOC," ",PoleDia),
    size=6,spacing=1.00,font="Bitstream Vera Sans:style=Bold",
    halign="center",valign="center");
    }
    module Hanger() {
    Cap();
    for (k=[0,1])
    translate([0,0,k*Shell.z])
    for (a=[-1:1])
    rotate([k*180,0,a*60])
    Hook();
    }
    //———————-
    // Build it
    if (Layout == "Cap")
    Cap();
    if (Layout == "Hook")
    Hook();
    if (Layout == "Show")
    Hanger();
    if (Layout == "Build")
    translate([0,0,Shell[LENGTH]])
    rotate([180,0,0])
    Hanger();

  • Another Nice Doggy

    Another Nice Doggy

    We’re riding southbound on the recently opened section of the Empire State Trail, just south of Hopewell Junction, and are approaching a dog walker totally face-sucked by her phone in the middle of the path:

    Empire State Trail - Dog Lunge - 2021-05-12 - 0
    Empire State Trail – Dog Lunge – 2021-05-12 – 0

    Mary has been dinging her bike bell for the last few seconds and finally manages to break through:

    Empire State Trail - Dog Lunge - 2021-05-12 - 1
    Empire State Trail – Dog Lunge – 2021-05-12 – 1

    The dog walker leans against the fence while pulling on the leash as hard as she can, as if she knows the dog poses a threat:

    Empire State Trail - Dog Lunge - 2021-05-12 - 2
    Empire State Trail – Dog Lunge – 2021-05-12 – 2

    Which it does:

    Empire State Trail - Dog Lunge - 2021-05-12 - 3
    Empire State Trail – Dog Lunge – 2021-05-12 – 3

    The leash is too long for close-quarters work:

    Empire State Trail - Dog Lunge - 2021-05-12 - 4
    Empire State Trail – Dog Lunge – 2021-05-12 – 4

    Nice teeth, doggie:

    Empire State Trail - Dog Lunge - 2021-05-12 - 5
    Empire State Trail – Dog Lunge – 2021-05-12 – 5

    Surely, the dog just wants to lick me to death:

    Empire State Trail - Dog Lunge - 2021-05-12 - 6
    Empire State Trail – Dog Lunge – 2021-05-12 – 6

    Tell me again how well-trained this dog is:

    Empire State Trail - Dog Lunge - 2021-05-12 - 7
    Empire State Trail – Dog Lunge – 2021-05-12 – 7

    Seven seconds after the first picture:

    Empire State Trail - Dog Lunge - 2021-05-12 - 8
    Empire State Trail – Dog Lunge – 2021-05-12 – 8

    The dog also lunged at the pair of bicyclists following us, so perhaps this is how she makes sure it get its exercise during the walk.

    I hate dogs.