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

  • Metric Micrometer: Percussive Adjustment

    Metric Micrometer: Percussive Adjustment

    This metric micrometer has resided in my tool chest just short of forever:

    Metric micrometer - detail
    Metric micrometer – detail

    During that entire time, it read 0.025 mm too high: when the spindle was on the anvil, as shown, the thimble sat 2-½ divisions above the index line. Not off by much, but an annoying bit of mental arithmetic every time.

    It doesn’t get a lot of use, because I rarely need more precision / accuracy than my digital calipers provide, but measuring those teeny USB wire strands finally forced me to adjust the poor thing.

    A cap unscrews from the end of the thimble, revealing the setscrew locking the thimble to the spindle:

    Metric micrometer - overview
    Metric micrometer – overview

    Unfortunately, loosening the setscrew (with a 2 mm hex wrench) didn’t release the thimble:

    Metric micrometer - thimble setscrew
    Metric micrometer – thimble setscrew

    After steeping the joint in Kroil penetrating oil for while, I stood the thimble on the bench block and gently tapped the spindle with a punch, just enough to break it free:

    Metric micrometer - spindle adjustment
    Metric micrometer – spindle adjustment

    Then it was a matter of screwing the thimble back onto the frame until the spindle contacted the anvil, continuing to screw the thimble until the 0 line matched the index line, and tightening the setscrew. There was some slippage as the Kroil worked its way further into the joint, but a firm grip on both got the job done.

    That should hold it for the rest of forever.

    Speaking of forever, the 3D printed repair part for my caliper is now fifteen years old:

    Caliper Part - Installed
    Caliper Part – Installed

    I’ve been doing this for quite a while …

  • USB Micro-B Connector: FAIL

    USB Micro-B Connector: FAIL

    While setting up a Raspberry Pi camera, I had occasion to pull out its USB power cable, whereupon grabbing the camera while unscrewing it from the tripod felt unusually sharp:

    Micro-B USB - RPi jack
    Micro-B USB – RPi jack

    It seems the wall wart’s USB Micro-B connector pulled apart:

    Micro-B USB connector - disembowled
    Micro-B USB connector – disembowled

    Somewhat to my surprise, it was a CanaKit 5 V 2.5 A wall wart, definitely not the cheapest piece of junk ever made by the hand of man. On the other paw, it’s been around for quite a while, so …

    Even I will agree that’s not a repairable failure, so I planned to splice in a Micro-B connector from a volunteer chosen from the Box o’ USB Micro-B Cables:

    Micro-B USB connector - tiny wires
    Micro-B USB connector – tiny wires

    Nice color code in there, eh?

    Each of those conductors appears to be made up of nine springy copper-colored 0.06 mm strands, somewhat smaller than 40 AWG: not what you want on the business end of a 2.5 A wall wart. I had previously measured the cable’s overall resistance with a surprisingly useful Treedix USB Cable Tester and it was on the very high end of the charge-only cable collection.

    So I soldered a female USB-A breakout from the Drawer o’ USB Breakouts to the wall wart’s wires, snapped a 3D printed case around it, got a good (0.26 Ω) A-to-Micro-B cable from the Box o’ USB Adapters, and moved on.

    Ya gotta have stuff, but that was absurd.

  • Branson 200 Ultrasonic Cleaner: Wiring Fix

    Branson 200 Ultrasonic Cleaner: Wiring Fix

    Our ancient Branson 200 Ultrasonic Cleaner began behaving erratically due to water seeping under the rather casual seal from last year’s fix. Although drying the switches let it start up again, it would run for only a few seconds before shutting down again, which suggested a deeper problem than just the switches.

    Take a picture of the PCB’s component side:

    Branson 200 Ultrasonic Cleaner - PCB component side
    Branson 200 Ultrasonic Cleaner – PCB component side

    And of the solder side:

    Branson 200 Ultrasonic Cleaner - PCB solder side
    Branson 200 Ultrasonic Cleaner – PCB solder side

    Transform those pictures to be the nice real rectangles shown above, resize to a common pixel format, mirror the solder side, turn it into a layer atop the component side, then tweak its opacity to make both sides visible at once:

    Branson 200 Ultrasonic Cleaner - PCB overlay
    Branson 200 Ultrasonic Cleaner – PCB overlay

    Some pondering produces a partial schematic of the left half of the board:

    Branson 200 Ultrasonic Cleaner - partial schematic
    Branson 200 Ultrasonic Cleaner – partial schematic

    The 1:1 transformer is constantly powered, so the ON button connects the 120 V (!) half-wave rectified output to the +12V supply bus, with the 750 Ω resistor dropping most of the voltage while the switch is pressed.

    The hotwired +12V supply forces the relay closed, which (in some as-yet unidentified way) fires up a +12V power source to hold the relay closed, with the 555 timer driving an MC14060 14-bit divider to count down the time until it turns itself off.

    Reminder: this design dates back to the days when a pair of chips and a handful of through-hole components cost less than one of those fancy microcontroller thingies.

    Plug the cleaner into an isolation transformer and trace the half-wave rectified signal through ON button to find it got all the way to the contact on the end of the orange wire in the connector, but did not reach the pin header on the PCB.

    A closer look at the connector revealed a broken contact on the white wire, which I (rather crudely) soldered together while considering my choices:

    Branson 200 Ultrasonic Cleaner - soldered contact
    Branson 200 Ultrasonic Cleaner – soldered contact

    While plugging that wire back in place, this happened:

    Branson 200 Ultrasonic Cleaner - another broken contact
    Branson 200 Ultrasonic Cleaner – another broken contact

    Neither of those are the (presumably) similarly failed orange wire, but even I can get a clue from three similar failures.

    So I replaced the OEM connector with a JST-XHP 2.54 mm connector from an assortment I got for another project, replaced the chunky 22 AWG wires with flexy 26 AWG silicone wires in the same cheerful rainbow colors, and it began working perfectly again.

    The buttons needed another water seal, so I tweaked the previous layout to kiss-cut GITD tape and through-cut colorful vinyl sheets:

    Branson 200 Ultrasonic Cleaner - power button cutting
    Branson 200 Ultrasonic Cleaner – power button cutting

    Capped with a transparent cover sheet cut from a pack of PDA screen protectors (remember PDAs?):

    Branson 200 Ultrasonic Cleaner - power button cover
    Branson 200 Ultrasonic Cleaner – power button cover

    In truth, the GITD tape is too thick, so I’ll probably repeat this dance later this year.

    FWIW, I was totally ready to buy a new ultrasonic cleaner, but all of them have scathing one-star Amazon reviews, to the extent I decided fixing this cleaner would be much easier than fixing a new one that’s been cheapnified to the point of no return. A common complaint seems to be water leaking into their capacitive switches and killing the circuitry stone cold dead: not an improvement over this one.

  • Work Sharp Precision Sharpener: Clamp Support

    Work Sharp Precision Sharpener: Clamp Support

    Another Work Sharp Precision Adjust sharpener improvement from Printables:

    WorkSharp - clamp support
    WorkSharp – clamp support

    Although the blade clamp is a snug fit in its socket, it has enough stick-out cantilever to move slightly even under minimal force from the diamond tools.

    I added a thin cardboard shim, cut with a utility knife (!) and stuck on with a craft adhesive sheet, as the block was about half a millimeter upward with the clamp turned this-a-way and half a millimeter downward the other way. Your mileage / setup will certainly differ.

    I like the sharpener, but it’s much fiddlier than I expected.

  • Work Sharp Precision Sharpener: Turn Signals

    Work Sharp Precision Sharpener: Turn Signals

    The blade clamp on the Work Sharp Precision Sharpener fits into a socket that can rotate 180°:

    Work Sharp Precision Sharpener - Blade Clamp operation
    Work Sharp Precision Sharpener – Blade Clamp operation

    What’s not obvious is that the socket can rotate only 180°, which means you (well, I) must remember which way to turn it based on the presence or absence of the small white mark. I get it wrong somewhat more than half the time while sharpening a small symmetric blade, rather than a knife with a handle, so I added arrows to the socket.

    With the white mark upward, turn 180° counterclockwise:

    WorkSharp - turn CCW
    WorkSharp – turn CCW

    Then turn it 180° clockwise:

    WorkSharp - turn CW
    WorkSharp – turn CW

    As with the slug filling the uncomfortable button on the back side of the socket, this seems like it should be a standard feature.

  • Whirlpool Clothes Dryer: Heater Examination

    Whirlpool Clothes Dryer: Heater Examination

    A correspondent (you know who you are: thanks!) pointed out the Thermal Cutoff can trip should the 240 V heater coil sag enough to contact the grounded steel air duct surrounding it. Think of a connection from the heater in the lower right corner of the wiring diagram to the neutral wire:

    Whirlpool dryer - wiring diagram - detail
    Whirlpool dryer – wiring diagram – detail

    If the short is close to the middle of the heating element, the right half the heater will remain active even when all of the normal thermostats cut off the left half. The two half-elements will see about their usual 120 V and won’t burn out, but the right half will continue to heat the air until the Thermal Cutoff trips at 350 °F.

    A short near either end of the heating element will subject that section to a higher voltage than usual and promptly burn it out, in which case the dryer will fail to heat due to the much lower power dissipated in the remaining section.

    So I took the dryer apart after a (successful!) washing day to see if that had happened.

    A spring clip holds the top of the heater duct in place:

    Whirlpool Clothes Dryer - bulkhead parts - heater duct clip
    Whirlpool Clothes Dryer – bulkhead parts – heater duct clip

    AFAICT the clip cannot be disengaged from the duct in situ without removing the hex-head sheet metal screw holding it to the bulkhead, which requires inserting a 5/16 inch socket on the end of a 6 inch extension through a hole in the non-removable upper back cover. You (well, I) cannot see the screw from any position, so the process requires reaching up over the duct to position the socket by feel.

    This view looking up inside the dryer with the duct removed shows the clip on the bulkhead:

    Whirlpool Clothes Dryer - heater duct clip
    Whirlpool Clothes Dryer – heater duct clip

    The heating element looked to be in fine shape, with no sags or distortions:

    Whirlpool Clothes Dryer - heater top view
    Whirlpool Clothes Dryer – heater top view

    A side view:

    Whirlpool Clothes Dryer - heater side view
    Whirlpool Clothes Dryer – heater side view

    Taking a picture of the duct’s interior is impossible, but an eyeballometric inspection shows no burns / scorches / pits from contact with the coils:

    Whirlpool Clothes Dryer - heater duct interior
    Whirlpool Clothes Dryer – heater duct interior

    So AFAICT the Thermal Cutoff tripped due to Inherent Defect, rather than an overly high temperature.

    Reinstalling the duct requires fitting the spring clip into its slot in the duct, maneuvering the duct onto its lower bulkhead brackets without dropping the clip, persuading the top of the duct with the clip into position, getting the screw into the clip and the hole, then aligning the socket with the screw. If I were doing this for a living, I would definitely charge you extra; newer dryers have an easily removable heating element for well and good reason.

    So the dryer is, once again, back together again and, once again, works as well as it ever did, with another set of thermostats / cutoffs in the box of dryer and washer parts against future need.

    For reference, the heater seems to be a WP4391960.

  • Window Mount for Bamboo Bee Tunnel Nests

    Window Mount for Bamboo Bee Tunnel Nests

    Mary suggested converting wild bamboo up the hill into tunnel nests (per a xerces.org paper) for native bees buzzing around flowers in the yard, so:

    Bee Tunnel Nest - downspout installation
    Bee Tunnel Nest – downspout installation

    I hung bundles of larger tubes in trees out back, in hopes of attracting huge carpenter bees.

    3D printed mounts hold smaller bundles on the windows to let us keep an eye on the proceedings:

    Bee Tunnel Nest Mount - installed-]
    Bee Tunnel Nest Mount – installed

    Which look better when not seen though two layers of glass in desperate need of Spring Cleaning:

    Bee Tunnel Nest Mounts
    Bee Tunnel Nest Mounts

    The tabs provide a bit of pressure to hold the mounts in place, although I don’t know if they have enough springiness or will survive contact with the elements:

    Bee Tunnel Nest Mount - tab section - solid model
    Bee Tunnel Nest Mount – tab section – solid model

    The key advantage of not building bigger bee motels: these little bundles don’t need annual cleaning / maintenance and will eventually fall apart.

    If the bees find them suitable, more power to ’em!

    And I realized the cut-off ends fit in the rotary. Witticisms engraved on bamboo could become the New Hotness:

    Laser engraved bamboo
    Laser engraved bamboo

    Stipulated: I’m barely half-right about being a wit …

    The OpenSCAD source code as a GitHub Gist:

    // Bee Tunnel Nest Mount
    // Ed Nisley – KE4ZNU
    // 2026-04-26
    include <BOSL2/std.scad>
    Layout = "Show"; // [Build,Show,Window,Bundle,Tabs]
    BundleOD = 35.0;
    BundleOffset = 0.0;
    SlotDepth = 18.0;
    SlotGap = 1.2;
    /* [Hidden] */
    HoleWindage = 0.2;
    Protrusion = 0.01;
    NumSides = 3*2*4;
    Clearance = 0.3;
    //$fn=NumSides;
    WallThick = 2.0;
    MountHeight = 1.5*BundleOD;
    MountWidth = 1.5*BundleOD + BundleOffset;
    ClipOA = [SlotDepth + WallThick,SlotGap + 2*WallThick,MountHeight];
    BundleCtr = [-WallThick/2,ClipOA.y + MountWidth/2 + BundleOffset/2,MountHeight/2];
    TabOA = [0.7*SlotDepth,5.0,0.7*WallThick];
    TabOffset = 0.2*SlotDepth;
    TabOC = MountHeight/2;
    TabClearance = [4*Clearance,0,Clearance];
    //—–
    // Define things
    module BundleMount() {
    difference() {
    cuboid([WallThick,MountWidth + ClipOA.y,MountHeight],
    rounding=3.0,edges=[TOP+BACK,BOTTOM+BACK],anchor=FRONT+RIGHT);
    back(BundleCtr.y)
    xcyl(3*WallThick,d=BundleOD);
    for (j=[-1,1],k=[-1,1])
    translate([BundleCtr.x,j*BundleOD/2 + BundleCtr.y,k*BundleOD/2])
    xcyl(3*WallThick,d=3.0,$fn=6);
    }
    }
    module WindowMount() {
    difference() {
    cuboid(ClipOA,rounding=3.0,edges=[TOP+LEFT,BOTTOM+LEFT],
    anchor=FRONT+RIGHT);
    left(WallThick) back(WallThick)
    cuboid([2*SlotDepth,SlotGap,2*MountHeight],anchor=FRONT+RIGHT);
    for (k=[-1,1])
    translate([-(ClipOA.x – TabOffset),-Protrusion,k*TabOC/2])
    cuboid([TabOA.x + TabClearance.x,WallThick + 2*Protrusion,TabOA.y + 2*TabClearance.z],anchor=FRONT+LEFT);
    }
    }
    module Tabs() {
    for (j=[-1,1])
    fwd(j*TabOC/2)
    cuboid(TabOA,anchor=BOTTOM+LEFT) position(LEFT+TOP)
    prismoid(size1=[3*SlotGap,TabOA.y],size2=[0,TabOA.y/2],
    h=(WallThick – TabOA.z) + SlotGap/3,anchor=BOTTOM+LEFT);
    }
    module Assembly() {
    union() {
    BundleMount();
    WindowMount();
    left(ClipOA.x – TabOffset – TabClearance.x)
    xrot(-90)
    Tabs();
    }
    }
    //—–
    // Build things
    if (Layout == "Bundle") {
    BundleMount();
    }
    if (Layout == "Window") {
    WindowMount();
    }
    if (Layout == "Tabs") {
    Tabs();
    }
    if (Layout == "Show") {
    Assembly();
    }
    if (Layout == "Build") {
    yrot(90)
    Assembly();
    }