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

  • Dripworks Mainline Leak: Repair Under Field Conditions

    Dripworks Mainline Leak: Repair Under Field Conditions

    A large gooey puddle helped isolate a leak in the Dripworks main line pipe running the length of Mary’s Vassar Farms plot:

    Dripworks Mainline clamp - injured hose joint
    Dripworks Mainline clamp – injured hose joint

    Much of the tubing between the transfer barb in the buried pipe and the cross coupling lies on the surface, where it’s subject to missteps. This being just a few feet inside the garden gate, it’s no surprise enough missteps caused the barb to no longer seal properly.

    So I pulled the barb out of the pipe and deployed the backup pipe clamp I made after fixing a previous mishap:

    Dripworks Mainline clamp - installed
    Dripworks Mainline clamp – installed

    You’re supposed to wrap silicone tape while keeping its surface clean, which is obviously impossible in a hole rapidly filling with water draining from the plumbing but the clamp presses the tape firmly against the pipe and seals the leak.

    There is, I regret to say, an 8-32 stainless steel washer lost somewhere deep in the muck.

    I punched a new barb into the pipe with slightly longer tubing to the cross fitting, in the hope it’ll be more resilient.

    Another clamp with its silicone tape snippet stands ready for duty:

    Dripworks Mainline Pipe Clamp - assembled
    Dripworks Mainline Pipe Clamp – assembled

    For the record, the Micromark Cutoff Saw has a 3 mm offset between the side of the vise and the left edge of the blade:

    Micromark abrasive cutoff - work offset
    Micromark abrasive cutoff – work offset

    I still lack a Round Tuit for improving that vise.

  • BOB Yak Trailer: Fender Front Mount

    BOB Yak Trailer: Fender Front Mount

    I eventually tracked a distressingly loud rattle from the BOB Yak trailer to a fender mount failure:

    BOB Yak Trailer fender front mount - aluminum fatigue
    BOB Yak Trailer fender front mount – aluminum fatigue

    The screw clamped the round aluminum fender between two flat washers (the other of which has been touring the workbench). The hole in the aluminum started as a screw slot and eventually fretted away around the edge of the washers, leaving a trapped fragment to fall out as I loosened the screw.

    Well, this mount lasted a decade longer than the wire mount at the top of the fender, so there’s that.

    As before, a bit of math conjures a chunky mount from the vasty digital deep:

    Fender front mount - solid model - Show view
    Fender front mount – solid model – Show view

    The first iteration didn’t have the hole for the threaded insert angled downward at 10°, but it’s easier to make better measurements with a “pretty close” prototype. I’m reasonably sure the angle is a glitch due to hand-brazing the frame tubes, but we’ll never know.

    The inner plate angles to match the insert, thus keeping the screw & washer perpendicular to the surface:

    Fender front mount - solid model - Mounts view
    Fender front mount – solid model – Mounts view

    A brim around that chip of plastic ensures a good grip on the platform:

    BOB Yak Trailer - fender front mount - PrusaSlicer preview
    BOB Yak Trailer – fender front mount – PrusaSlicer preview

    I suppose rounding the corners would make it prettier:

    BOB Yak Trailer fender front mount - inner plate
    BOB Yak Trailer fender front mount – inner plate

    The original screw was slightly too short, so that’s a shiny replacement from the Drawer o’ Random M5 Screws. If I ever have occasion to go in there again, I’ll use a button head screw, although there’s certainly enough clearance:

    BOB Yak Trailer fender front mount - tire clearance
    BOB Yak Trailer fender front mount – tire clearance

    From the top, the gray PETG-CF looks like it grew there:

    BOB Yak Trailer fender front mount - installed
    BOB Yak Trailer fender front mount – installed

    I figured the mount’s radius by feeding measurements into the chord equation and assuming the overall curve is circular; the radius came out slightly too large, which likely won’t make much difference.

    The OpenSCAD source code as a GitHub Gist:

    // BOB Yak Trailer – fender front mount
    // Ed Nisley – KE4ZNU
    // 2026-06-15
    include <BOSL2/std.scad>
    Layout = "Show"; // [Build,Show,Frame,Fender,OuterMount,InnerMount,Mounts]
    /* [Hidden] */
    ID = 0;
    OD = 1;
    LENGTH = 2;
    HoleWindage = 0.2;
    Protrusion = 0.01;
    NumSides = 4*3*2*4;
    Gap = 5.0/2;
    $fn=NumSides;
    WallThick = 5.0;
    Washer = [6.0,16.0,1.5]; // M5 fender washer
    Rivnut = [5.0,10.3,1.5]; // M5 rivnut in frame
    FrameOD = 16.1; // trailer frame tubing
    FrameAngle = 10;
    FenderOA = [52,440,1.5]; // minor major thickness
    BlockOA = [0,40.0,1.25*Washer[OD]];
    //—–
    // Define things
    // Relevant part of the trailer frame
    // origin at center of rivnut
    module Frame() {
    yrot(FrameAngle)
    union() {
    left(Rivnut[LENGTH])
    ycyl(2*BlockOA.y,d=FrameOD,anchor=RIGHT);
    xcyl(FrameOD/2,d=Rivnut[OD],anchor=RIGHT);
    left(Protrusion)
    xcyl(10,d=Rivnut[OD],anchor=LEFT);
    }
    }
    module OuterFender() {
    torus(od=FenderOA[OD],d_min=FenderOA[ID],orient=FRONT,anchor=LEFT);
    }
    module FullFender() {
    difference() {
    OuterFender();
    right(FenderOA[LENGTH]) // make it a cup
    torus(od=FenderOA[OD] – 2*FenderOA[LENGTH],d_min=FenderOA[ID] – 2*FenderOA[LENGTH],
    orient=FRONT,anchor=LEFT);
    right(FenderOA[ID]/2) // remove inner half
    ycyl(2*BlockOA.y,d=FenderOA[OD] – FenderOA[ID],anchor=LEFT);
    down(2*Washer[OD]) // remove bottom part
    cuboid(2*[FenderOA[OD],FenderOA[OD],FenderOA[OD]],anchor=TOP+LEFT);
    }
    }
    module OuterMount() {
    difference() {
    right(FenderOA[ID]/2)
    cuboid([FrameOD/3 + Washer[LENGTH] + FenderOA[ID]/2,BlockOA.y,BlockOA.z],
    rounding=1.0,anchor=RIGHT);
    Frame();
    OuterFender();
    }
    }
    module InnerMount() {
    difference() {
    render()
    intersection() {
    yrot(FrameAngle)
    cuboid([WallThick + FenderOA[LENGTH],BlockOA.y,BlockOA.z],anchor=LEFT);
    right(FenderOA[LENGTH])
    OuterFender();
    }
    yrot(FrameAngle)
    xcyl(FenderOA[ID],d=Washer[ID],anchor=LEFT);
    }
    }
    //—–
    // Build it
    if (Layout == "Frame") {
    Frame();
    }
    if (Layout == "Fender") {
    FullFender();
    }
    if (Layout == "OuterMount") {
    OuterMount();
    }
    if (Layout == "InnerMount") {
    InnerMount();
    }
    if (Layout == "Mounts") {
    OuterMount();
    InnerMount();
    }
    if (Layout == "Show") {
    OuterMount();
    InnerMount();
    color("Gray",0.6) {
    Frame();
    FullFender();
    }
    }
    if (Layout == "Build") {
    up(BlockOA.z/2) left(FenderOA[ID]/4)
    OuterMount();
    up(BlockOA.z/2)
    xrot(180)
    yrot(-FrameAngle)
    InnerMount();
    }
  • Keychron C3 Pro Keyboard: Taming

    Keychron C3 Pro Keyboard: Taming

    Having set the Moonlander to use Auto Shift, I’ve come to depend on it, so I got a Keychron C3 Pro keyboard for one of the Basement Shop’s PCs because it glows in the dark and can be configured with QMK:

    Keychron C3 Pro - tamed
    Keychron C3 Pro – tamed

    The default setup has rainbow hues cycling across the keyboard, which I find entirely too distracting. Although you can manually select the solid-color variant from the myriad possibilities using the keyboard, I forced a solid color with this config.h file:

    #define RGB_MATRIX_DEFAULT_ON true // Sets the default enabled state, if none has been set
    #define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_SOLID_COLOR // Sets the default mode, if none has been set
    #define RGB_MATRIX_DEFAULT_HUE 36  // Sets the default hue value, if none has been set
    #define RGB_MATRIX_DEFAULT_SAT 255 // Sets the default saturation value, if none has been set
    #define RGB_MATRIX_DEFAULT_VAL 255 // Sets the default brightness value, if none has been set
    
    

    Enabling Auto Shift requires this rules.mk file:

    AUTO_SHIFT_ENABLE = yes
    

    Both of those go in the keymap directory defining the keyboard mapping for my custom setup:

    qmk_firmware/keyboards/keychron/c3_pro/ansi/rgb/keymaps/ednisley
    

    The keymap.c file remains unchanged, although I’m mildly tempted to toss the Mac layouts overboard.

    For the record, setting QMK to compile that keyboard configuration goes like this:

    qmk setup -H /base_directory/…/qmk_firmware
    <snippage>
    qmk new-keymap -kb keychron/c3_pro/ansi/rgb -km ednisley
    qmk config user.keyboard=keychron/c3_pro/ansi/rgb user.keymap=ednisley
    qmk compile
    qmk flash
    

    Flashing the keyboard firmware goes like this:

    • Run qmk flash
    • Unplug the USB cable
    • Hold down the Esc key
    • Plug in the USB cable
    • Release the Esc key

    I should boot the Atreus configuration into the current decade, but that’s for later.

  • Earplug Case

    Earplug Case

    A no-assembly-needed earplug case from Printables will be more easily found in Mary’s purse than the previous small bag:

    Earplug case
    Earplug case

    That’s the “grippy bits” version of the model, which really is easier to open than the straight-sided version.

    I printed a few more, loaded them with earplugs, and put them where they may come in handy. In retrospect, I should have used clear PETG to show off the retina-burn plugs.

    Living in the future is great!

  • Amazon Unit Pricing: Go Ask Alexa

    Amazon Unit Pricing: Go Ask Alexa

    I long ago learned to never trust Amazon’s unit pricing (or, for that matter, their recommendations), so this came as no surprise:

    Amazon unit pricing - hose per ounce
    Amazon unit pricing – hose per ounce

    OK, you generally don’t buy hoses “by the ounce”, but “per fluid ounce” may not mean what you think it means:

    Amazon unit pricing - cups per ounce
    Amazon unit pricing – cups per ounce

    Pricing items individually should be simple, if you know what a single item is:

    Amazon unit pricing - batteries per each
    Amazon unit pricing – batteries per each

    Even knowing the number of items and the overall price isn’t enough for Amazon to get it right:

    Amazon unit pricing - just plain wrong
    Amazon unit pricing – just plain wrong

    Amazon now has a “shopping assistant”, so I asked Alexa why the unit prices were incorrect. After some back-and-forth providing details Alexa should have known from the context, this seemingly plausible sequence of words emerged:

    Amazon unit pricing - ask Alexa
    Amazon unit pricing – ask Alexa

    Amazon apparently stopped commingling knockoff crap with brand-name products under the same SKU earlier this year, a change driven by major brands refusing to have anything to do with Amazon’s “supply chain”, but the probability of my one-by-one reports producing any discernible improvement seems low.

  • Samsung Dishwasher Drying Fan Replacement

    Samsung Dishwasher Drying Fan Replacement

    The Samsung dishwasher (model DW80K7050US/AA 03) that Came With The House fails immediately after entering the Dry part of the cycle: a relay in the control PCB under the door goes doink, all the LEDS go off then on again, the countdown timer stops changing, and that repeats as long as you like.

    After considerable listening & pondering, I decided one event early in the Dry cycle involved starting a fan to vent the steam out of the interior. The wiring diagram shows the fan has a Fault wire: perhaps the fan has failed.

    The maintenance manual shows different fans in three different places, although the control board has a connector for only one. By process of elimination, I found the fan atop the cabinet:

    Samsung dishwasher - top view
    Samsung dishwasher – top view

    The cable from the fan in the vented compartment on the left burrows under the gray duct, around its back side, and plugs into the small white connector on the right. You must ease the cable from a row of hooks guiding it around the back of the duct, which requires slightly lifting the duct.

    Unhook the two metal straps, remove four screws from the black vent, and lift it off the top to reveal the duct outlet pores:

    Samsung dishwasher - fan duct - overview
    Samsung dishwasher – fan duct – overview

    Remove four more screws, lift the fan duct assembly just a little bit, and pry open three latches around the fan compartment with a consumer electronics case-cracking tool:

    Samsung dishwasher - fan housing
    Samsung dishwasher – fan housing

    The new fan (on the right) looks very much like the OEM fan (on the left), even though it’s the $15 version rather than the $150 version you might buy from similar randomly named sellers if you were so inclined:

    Samsung dishwasher - OEM vs new fan
    Samsung dishwasher – OEM vs new fan

    Detach the old fan & its cable, drop the new fan in place, snake its cable, plug its plug, and install All The Things in reverse order.

    Unfortunately, after shoving the dishwasher back into its cubby, the new fan didn’t change the failure at all.

    I hitched the old fan up to the bench supply and it spun just like it should. Wiring the Fault wire to a 5 V supply through a resistor shows it’s the usual tachometer signal pulsing as the rotor spins.

    Which means the next step requires more pondering and PCB probing. The failure is too consistent to be a Heisenbug, but maybe something shook loose in there.

  • Credit Union App: User Tracking

    Credit Union App: User Tracking

    Two years ago I installed the DuckDuckGo browser on my phone and activated its app tracker blocking, which is basically a fake VPN swatting known tracker destinations out of the bitstream.

    Somewhat to my surprise, the credit union’s app attempted to send my personally identifiable bits to a destination seemingly unrelated to any banking needs:

    HVCU App Tracking - 20240525
    HVCU App Tracking – 20240525

    So I called up the credit union and asked:

    • Why was their app sending that information to a third party?
    • How do I disable that tracking, because I do not want those companies to know every time I use the app?
    • Why did they think this was a good idea?

    Over the course of the next few weeks and many follow-up calls, I was told:

    • I must be mistaken, there is no tracking
    • My information is correct, but the credit union doesn’t have a relationship with that company
    • They do have a relationship, but the app doesn’t send any of my information to that company
    • They only send the information if I am responding to a survey
    • The app does send my information even without my responding to a survey, but in accord with their privacy policy
    • OK, the credit union’s privacy policy doesn’t specifically describe their app, but the companies behind the app have privacy policies at various links
    • Even though the documents at those links describe the general sharing arrangement between each company and the credit union, I am not authorized to see the specific agreements related to my information
    • I can opt out of the tracking by setting an option in my account profile
    • OK, that option doesn’t exist, but when I disable the app’s access to my location, the tracking will cease

    The intensity of the tracking attempts continued, even after disabling location sharing and not opening the app on any given day:

    HVCU App Tracking - 20240605 - A
    HVCU App Tracking – 20240605 – A
    HVCU App Tracking - 20240605 - B
    HVCU App Tracking – 20240605 – B

    Eventually, I was told, in no uncertain terms:

    • If I don’t want to be tracked, I should not use the app
    • This will be their final discussion of the subject

    They never did answer any of my original questions.

    As I get very few checks in the mail, I have had little occasion to fire up the app since then.

    The tracking continues apace, albeit with a different cast of characters:

    HVCU App Tracking - 20260609 - A
    HVCU App Tracking – 20260609 – A
    HVCU App Tracking - 20260609 - B
    HVCU App Tracking – 20260609 – B

    You might think “The Trade Desk” has something to do with financial trading. You would be wrong.

    I expect commercial banks to be even worse, so there’s nothing to be done.

    Apart, of course, from blocking app tracking attempts with DuckDuckGo, using Firefox (with uBlock Origin) rather than Chrome, and running Pi-Hole on a Raspberry Pi for the home network. I admit my faith is touching.