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.

Month: September 2021

  • Tour Easy Rear Running Light: LED Lens Assembly

    Tour Easy Rear Running Light: LED Lens Assembly

    Having discovered the need for careful alignment of the LED PCB with the lens, I paid more attention to detail this time around.

    The LEDs arrive soldered to PCBs atop aluminum star heat spreaders, but the one I picked out of the bag looked slightly misaligned. Unsoldering it showed a smear of solder paste had melted across the central pad:

    1 W LED PCB - errant solder
    1 W LED PCB – errant solder

    The LED has a die contact slug on the bottom which, I suppose, could be directly soldered to the spreader. For my simple needs, removing the errant solder, plunking the LED atop a layer of heatsink compound, and resoldering the leads should suffice:

    1 W LED PCB - wire layout
    1 W LED PCB – wire layout

    The LED holder has a pair of slots aligning it with the LED leads on the PCB. The base of the holder sits flush against the PCB, so the wires must attach directly to the LED pads.

    I ran the wires for the amber light through holes close to the pads:

    1 W LED Running Light - heatsink fit
    1 W LED Running Light – heatsink fit

    Which required chewing two passages in the base of the holder:

    1 W LED Running Light - wiring
    1 W LED Running Light – wiring

    It turns out the 5° and 10° lenses are strongly conical and leave plenty of room around the LED to run a wire around the inside of the holder, so I drilled a pair of holes to put both wires on the same side of the circuit plate:

    Tour Easy Rear Running Light - circuit plate attachment
    Tour Easy Rear Running Light – circuit plate attachment

    The holder required minor surgery to let the wire double back on itself over the LED pad:

    1 W LED Holder - wire passage
    1 W LED Holder – wire passage

    The wires thread through two holes drilled in the plastic holder:

    Tour Easy Rear Running Light - clamped LED assembly
    Tour Easy Rear Running Light – clamped LED assembly

    More urethane adhesive glues the PCB to the LED holder, with the clamp applying pressure to the lens to ensure the lens seats properly around the LED. It turned out that worked well and the light has a nicely rounded beam.

    With the optics bonded together, metal-filled JB Weld epoxy attaches the heat spreader to the heatsink with good thermal conductivity:

    Tour Easy Rear Running Light - clamped LED heatsink
    Tour Easy Rear Running Light – clamped LED heatsink

    The LED holder is a slide fit in the heatsink, so the clamps can keep the PCB flat on the bottom of the recess while the epoxy gets a good grip on all parts.

    Now it’s just a matter of wiring everything up!

  • Tour Easy Rear Running Light: LED Heatsink

    Tour Easy Rear Running Light: LED Heatsink

    Because the rear running light will have a higher duty cycle than the front light, I made the (admittedly too small) heatsink slightly longer, with a deeper recess to protect the lens from cargo on the rear rack:

    Tour Easy Rear Running Light - boring LED recess
    Tour Easy Rear Running Light – boring LED recess

    Boring that nice flat bottom is tedious; I must lay in a stock of aluminum tubing to simplify the process.

    Drilling the holes went smoothly:

    Tour Easy Rear Running Light - drilling LED heatsink
    Tour Easy Rear Running Light – drilling LED heatsink

    Those two holes fit a pair of pins aligning the circuit plate, with a screw and brass insert holding it to the heatsink. Scuffing a strip across the aluminum might give the urethane adhesive (you can see uncured globs on the pins) a better grip:

    Tour Easy Rear Running Light - circuit plate attachment
    Tour Easy Rear Running Light – circuit plate attachment

    The screw / insert /pins are glued into the plate to permanently bond it to the heatsink. The screw occupies only half of the insert, with the longer screw from the end cap pulling the whole affair together.

    The two holes on the left pass both LED leads to one side of the circuit plate, where they connect to the current regulator and its sense resistor.

  • Rear Running Light: Too-aggressive Turning

    Rear Running Light: Too-aggressive Turning

    The same lathe fixture and double-sided duct tape trick I used for the amber running light’s end cap should have worked for this one, but only after I re-learned the lesson about taking sissy cuts:

    Tour Easy Rear Running Light - end cap fixture - swirled adhesive
    Tour Easy Rear Running Light – end cap fixture – swirled adhesive

    Yet another snippet of tape and sissy cuts produced a better result:

    Tour Easy Rear Running Light - end cap
    Tour Easy Rear Running Light – end cap

    Protip: when you affix an aluminum disk bandsawed from a scrap of nonstick griddle to a lathe fixture, the adhesive will grip the disk in only one orientation.

  • Rear Running Light: Tour Easy Seat Clamp

    Rear Running Light: Tour Easy Seat Clamp

    With the amber front running light blinking away, it’s time to replace the decade-old Planet Bike Superflash behind the seat:

    Superflash on Tour Easy
    Superflash on Tour Easy

    The new mount descends directly from the clamps holding the fairing strut on the handlebars and various hose clamps:

    Rear Running Light Seat Clamp - solid model
    Rear Running Light Seat Clamp – solid model

    The central block has two quartets of brass inserts epoxied inside:

    Rear Running Light Seat Clamp - sectioned - solid model
    Rear Running Light Seat Clamp – sectioned – solid model

    That means I can install the light, then mount the whole affair on the bike, without holding everything together while fiddling with overly long screws.

    A trial fit with the not-yet-cut-to-length 25.3 (-ish) PVC pipe body tube:

    Rear Running Light - Tour Easy seat clamp trial fit
    Rear Running Light – Tour Easy seat clamp trial fit

    The aluminum plates have the standard used-car finish: nice polish over deep scratches.

    Although I’ve been thinking of mounting the light below the seat rail, as shown, it can also sit above the rail.

    Mary hauls seedlings and suchlike to the garden in a plastic drawer bungied to the rack, with the SuperFlash serving as an anchor point; this light may need fine tuning for that purpose.

    The OpenSCAD source code as a GitHub Gist:

    // Rear running light clamp for Tour Easy seat strut
    // Ed Nisley – KE4ZNU – 2021-09
    Layout = "Show"; // [Show,Build,Block]
    Section = true;
    /* [Hidden] */
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    HoleWindage = 0.2;
    Protrusion = 0.1; // make holes end cleanly
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    ID = 0;
    OD = 1;
    LENGTH = 2;
    inch = 25.4;
    //———————-
    // Dimensions
    // Light case along X axis, seat strut along Y, Z=0 at strut centerline
    LightOD = 25.4 + HoleWindage;
    StrutOD = 5/8 * inch + HoleWindage;
    PlateThick = 1/16 * inch;
    WallThick = 2.0;
    Kerf = ThreadThick;
    Screw = [3.0,6.8,4.0]; // M3 OD=washer, length=nut + washers
    Insert = [3.0,5.4,8.0 + 1.0]; // splined brass insert
    RoundRadius = IntegerMultiple(Screw[OD]/2,0.5); // corner rounding
    ScrewOC = [IntegerMultiple(StrutOD + 2*WallThick + Screw[ID],1.0),
    IntegerMultiple(LightOD + 2*WallThick + Screw[ID],1.0)];
    echo(str("Screw OC: ",ScrewOC));
    BlockSize = [ScrewOC.x + Insert[OD] + 2*WallThick,
    ScrewOC.y + Insert[OD] + 2*WallThick,
    LightOD + StrutOD + 3*WallThick];
    echo(str("Block: ",BlockSize));
    BaseOffset = -(WallThick + LightOD/2); // block bottom to centerline
    StrutOffset = LightOD/2 + WallThick + StrutOD/2; // light centerline to strut centerline
    echo(str("Strut screw min: ",IntegerMultiple(PlateThick + WallThick + StrutOD/2 + Insert[LENGTH]/2,1.0)));
    echo(str("Light screw min: ",IntegerMultiple(PlateThick + WallThick + LightOD/2 + Insert[LENGTH]/2,1.0)));
    NumSides = 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);
    }
    // Block with light along X axis
    module Block() {
    difference() {
    hull()
    for (i=[-1,1], j=[-1,1])
    translate([i*(BlockSize.x/2 – RoundRadius),j*(BlockSize.y/2 – RoundRadius),BaseOffset])
    cylinder(r=RoundRadius,h=BlockSize.z,$fn=NumSides);
    for (i=[-1,1], j=[-1,1])
    translate([i*ScrewOC.x/2,j*ScrewOC.y/2,BaseOffset – Protrusion])
    rotate(180/8)
    PolyCyl(Screw[ID],BlockSize.z + 2*Protrusion,8);
    for (i=[-1,1], j=[-1,1])
    translate([i*ScrewOC.x/2,j*ScrewOC.y/2,0]) {
    translate([0,0,-Protrusion])
    rotate(180/8)
    PolyCyl(Insert[OD],Insert[LENGTH] + 1*Protrusion,8);
    translate([0,0,(StrutOffset – Insert[LENGTH] – Kerf/2 + Protrusion)])
    rotate(180/8)
    PolyCyl(Insert[OD],Insert[LENGTH] + 1*Protrusion,8);
    }
    translate([-BlockSize.x,0,0])
    rotate([0,90,0])
    cylinder(d=LightOD,h=2*BlockSize.x,$fn=NumSides);
    translate([0,BlockSize.y,StrutOffset])
    rotate([90,0,0])
    cylinder(d=StrutOD,h=2*BlockSize.y,$fn=NumSides);
    translate([0,0,StrutOffset])
    cube([2*BlockSize.x,2*BlockSize.y,Kerf],center=true);
    cube([2*BlockSize.x,2*BlockSize.y,Kerf],center=true);
    }
    }
    //- Build it
    if (Layout == "Block")
    if (Section)
    difference() {
    Block();
    rotate(atan(ScrewOC.y/ScrewOC.x))
    translate([0,BlockSize.y,0])
    cube(2*BlockSize,center=true);
    }
    else
    Block();
    if (Layout == "Show") {
    Block();
    color("Green",0.25)
    translate([-BlockSize.x,0,0])
    rotate([0,90,0])
    cylinder(d=LightOD,h=2*BlockSize.x,$fn=NumSides);
    color("Green",0.25)
    translate([0,BlockSize.y,StrutOffset])
    rotate([90,0,0])
    cylinder(d=StrutOD,h=2*BlockSize.y,$fn=NumSides);
    }
    if (Layout == "Build") {
    translate([-1.2*BlockSize.x,0,-BaseOffset])
    difference() {
    Block();
    translate([0,0,BlockSize.z])
    cube(2*BlockSize,center=true);
    }
    translate([1.2*BlockSize.x,0,StrutOD/2 + WallThick])
    difference() {
    rotate([180,0,0])
    translate([0,0,-StrutOffset])
    Block();
    translate([0,0,BlockSize.z])
    cube(2*BlockSize,center=true);
    }
    translate([0,0,StrutOffset – Kerf/2])
    rotate([180,0,0])
    intersection() {
    Block();
    translate([0,0,StrutOffset/2])
    cube([2*BlockSize.x,2*BlockSize.y,StrutOffset],center=true);
    }
    }

  • Too Many Deer: Another One Bites the Dust

    Too Many Deer: Another One Bites the Dust

    I passed another dead deer on New Hackensack Rd while hauling groceries home:

    Deer Collision - roadkill - New Hackensack Rd - 2021-09-08
    Deer Collision – roadkill – New Hackensack Rd – 2021-09-08

    The next day I walked past the other side of the collision at the corner gas station’s dead car collection:

    Deer Collision - front end damage
    Deer Collision – front end damage

    A closer look at that nice rounded dent links the two contestants:

    Deer Collision - front end damage - deer hair detail
    Deer Collision – front end damage – deer hair detail

    The impact didn’t blow the airbags, so maybe the car isn’t a total loss, despite extensive front end damage and some scrap metal inside the engine compartment.

    As far as I can tell, Vassar College has been holding a deer cull every January, but taking out a few dozen deer definitely hasn’t eliminated the road hazard. If the folks objecting to the cull set up a fund to help drivers damaged by the objects of their affection, it’d demonstrate their understanding of the problem.

  • Beverage Faucet Replacement

    Beverage Faucet Replacement

    The lesser kitchen faucet began dribbling and required replacement, as there are no user serviceable parts within. One of the 3D printed adapters I built during the previous iteration had disintegrated:

    Beverage faucet base plate adapter disintegration
    Beverage faucet base plate adapter disintegration

    The new faucet came with a somewhat different baseplate and I managed to conjure a firm, sealed mount from the various parts without further construction.

    The nicely curved brass snout is the third in my collection. Surely they’ll come in handy for something!

    While I was in a plumbing state of mind, I again replaced the spout O-rings in the never-sufficiently-to-be-damned American Standard Elite (hah!) faucet, as it was also dribbling.

    This time, I used oxalic acid to remove the assorted scale and crud inside the spout. It seemed to be more effective than the usual white vinegar, although nothing seems to preserve the O-rings.

  • Rail Trail: Fallen Tree Clearing

    Rail Trail: Fallen Tree Clearing

    We rolled up to a pair of walkers who had just watched a long-dead tree fall across the Dutchess Rail Trail ahead of them:

    Rail Trail - fallen tree - 2021-09-15
    Rail Trail – fallen tree – 2021-09-15

    Which is why I now carry a fold-out pruning saw in my tool kit:

    Rail Trail - fallen tree - cleared - 2021-09-15
    Rail Trail – fallen tree – cleared – 2021-09-15

    The mowing crew we encountered half a mile ahead had a chainsaw and cleared the remainder.

    Stay alert out there!

    Although I don’t have a picture, there was a freshly dead bat lying underneath the main trunk. I think it rode the tree down, only to get slapped hard against the gravel beside the trail. I’m sure bats power up faster than I do, but not quite fast enough.