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: Home Ec

Things around the home & hearth

  • OXO Pepper Mill: Fine Grind Adjustment

    OXO Pepper Mill: Fine Grind Adjustment

    The OXO pepper mill replacing our worn-out pepper mill arrived filled with peppercorns and, during the ensuing nine months, we established its finest grind setting produced bigger pepper flakes than we prefer. I figured there had to be a way to get the ceramic stones just a little bit closer, even though it has no user-serviceable components inside.

    So, we begin.

    After rinsing out most of the pepper flakes (the remainder appearing in the pictures below) and determining the two obvious screws didn’t release the housing, the Jesus clip on the shaft extending through the peppercorn compartment came under consideration:

    OXO Pepper Mill - E-clip on shaft
    OXO Pepper Mill – E-clip on shaft

    The washer beyond the clip bears on the black plastic spider. It turns out the thickness of that washer determines the distance between the grind stones at the minimum setting: making it thicker reduces the stone gap and produces a finer grind.

    Knowing full well it would be impossible to get the clip back on the shaft in that position, I pried it off.

    Spoiler: Don’t do that!

    The grind adjustment lever turns the chunky black ring inside the gray housing:

    OXO Pepper Mill - grind adjustment rings
    OXO Pepper Mill – grind adjustment rings

    Three protrusions on that ring step along notched ramps around the perimeter of the black spider in the clear housing on the right.

    The shaft slides out to reveal the spring under the inner stone, with a second washer bearing against the bore of the gray plastic housing:

    OXO Pepper Mill - upper shaft parts layout
    OXO Pepper Mill – upper shaft parts layout

    As a result, the spring tries to push the shaft and inner stone out of the housing (toward the left). The protrusions on the grind adjustment control how far the shaft can move, with the washer + clip locking the shaft to the spider.

    Gentle persuasion extracts the chunky black ring:

    OXO Pepper Mill - grind adjust slider
    OXO Pepper Mill – grind adjust slider

    The outer stone fits into a recess in the gray housing:

    OXO Pepper Mill - outer stone
    OXO Pepper Mill – outer stone

    One might 3D print a washer fitting under that stone to close the gap between it and the inner stone, but the two screw holes interrupt the ledge enough to suggest the washer would be in two parts divided. If I didn’t have a mini-lathe, that’d be the best way to go.

    But I have a mini-lathe, so I made a steel washer slightly thicker than the OEM washer under the clip:

    OXO Pepper Mill - turning new washer
    OXO Pepper Mill – turning new washer

    The OEM washer:

    • ID 6.7 mm
    • OD 10.2 mm
    • Thick 0.6 mm

    Not knowing the right answer, I made a 1 mm washer, which is visibly thicker:

    OXO Pepper Mill - 1mm vs OEM washer
    OXO Pepper Mill – 1mm vs OEM washer

    Which let me reassemble the pepper mill in reverse order, only to establish reinstalling the Jesus clip deep down inside the housing is, in fact, impossible.

    Taking everything apart again let me contemplate the inner stone on the shaft, leading to the discovery it could slide very slightly on the shaft. More pondering revealed a slight seam in what I had taken as a monolithic black cap:

    OXO Pepper Mill - inner stone assembled
    OXO Pepper Mill – inner stone assembled

    Applying gentle suasion between the stone and the cap with a plastic razor blade enlarged the seam into a gap. Much to my surprise, further prying popped the top off the cap:

    OXO Pepper Mill - inner stone cap
    OXO Pepper Mill – inner stone cap

    Happy dance in full effect!

    Removing the screw let everything slide off the top of the shaft:

    OXO Pepper Mill - inner stone parts
    OXO Pepper Mill – inner stone parts

    Freeing that end of the shaft meant I could install the clip on the bench, add various parts while sliding the shaft through the housing, then tighten the screw to snug everything down.

    As with most activities, it’s trivially easy when you know the trick.

    Whereupon I discovered the new 1 mm washer jammed the two stones firmly together at the finest grind setting, so the correct washer will be somewhere between 0.6 and 1.0 mm thick:

    • Back to the lathe for a 0.8 mm thick washer
    • Dismantle pepper mill
    • Swap washers
    • Reassemble
    • Verify smooth turning at finest setting
    • Fill with peppercorns
    • Give it a twist

    A shower of pepper flakes in a cup:

    OXO Pepper Mill - finer grind
    OXO Pepper Mill – finer grind

    The mill undergoes a full qualification test tomorrow morning, but those flakes look much better.

    Fun fact: the OXO pepper mill holds 2.0 oz of peppercorns, so we use 0.033 oz = 940 mg of pepper every day.

  • LED Garage Light: FAIL

    LED Garage Light: FAIL

    A three-wing garage light Came With The House in the basement, where it served to light up the foot of the stairs. One of the 48 LEDs in one of the three LED panels began flickering brightly and, over the course of a few days, that panel went dark. The next time I turned on the basement lights, all three panels were dark.

    Removing the screw-in lamp base:

    LED Garage Light - overview
    LED Garage Light – overview

    A closer look inside:

    LED Garage Light - detail
    LED Garage Light – detail

    The middle of the PCB is darker than the perimeter, with the darkest area around the black inductor standing up near the green filter cap. A blackened lump on the solder side that may have once been an SMD resistor evidently served as a fuse.

    All three panels are in wired parallel, so the failed panel reduced the load on the supply, thus increasing the voltage on the remaining two panels enough to kill them off, too.

    Worth noting: the black wire goes to the positive side of the LED panel. You can just see the + mark near the two connectors on the left side.

    I wired each panel to a lashed-up bridge rectifier with a widowmaker extension cord from a variable transformer controlling the voltage, but none of them responded to the 150 VDC peaks: they’ve suffered Real Death.

    The electronics landed in the recycling box and the three heatsinks are now in the Big Box o’ Heatsinkery, where they will surely come in handy for something.

    The surprisingly readable 09/21 date code on the case says it’s just over four years old. Similar garage lights now run around ten bucks each and I wouldn’t expect them to last more than a couple of years.

  • Unbending Furnace Zone Drain Valve Knobs

    Unbending Furnace Zone Drain Valve Knobs

    For reasons long lost in our house’s history, two of the zone drain valves on the furnace apparently had something heavy fall on them from a great height:

    Furnace zone drain valve - bashed knob
    Furnace zone drain valve – bashed knob

    I was certain those knobs were made of brittle pot metal and would snap when I tried to un-bend them.

    My weight bench being next to the furnace, I had plenty of opportunities to contemplate conjuring a 3D printed knob similar to the dumbbell nuts, but with the undamaged central part of the metal knob engaging the valve stem to avoid thermoplastic shapes around hot metal.

    One can, of course, buy replacement knobs, but where’s the fun in that?

    Expecting to cut most of the knob away, I applied needle-nose pliers to the rim and, mirabile dictu, not only did it not immediately snap, I managed to un-bend it into a reasonable facsimile of its original shape.

    It wasn’t just beginner’s luck, because I did it again:

    Furnace zone drain valve - unbent knobs
    Furnace zone drain valve – unbent knobs

    Both of those knobs have obvious fractures and aren’t the prettiest things you’ll ever see, but they don’t get a lot of use. I can say, without fear of contradiction, they’re in fine shape.

    However, I’m certain those valves will need new washers if I ever turn those knobs …

  • Grocery Store Self-Checkout Printer Boot Message

    Grocery Store Self-Checkout Printer Boot Message

    Apparently we were the first people through a self-checkout lane one morning, because a present emerged before our receipt:

    Grocery NCR K5xx printer - boot report
    Grocery NCR K5xx printer – boot report

    I don’t know whether a K5xx printer runs a descendant of PC-DOS or NCR’s firmware just uses the DOS code page numbers, but it’s been a long time since I had to know any of them.

    As Sun Tzu said, “If you wait by the river long enough, the bodies of your enemies will float by.”

  • Blackout

    Blackout

    Some weeks ago Mary heard a loud bang just as the lights went out. Central Hudson crews arrived shortly thereafter and began examining the transformer serving the group of houses around us. I wandered over to ask questions and learned the bang came from a high-voltage fuse atop a pole 800 feet from our house.

    With all the power cables underground, the crews were locating the transformer just upstream of the problem, with the intent of disconnecting it and restoring power to everybody else. That took a few hours for our service, but folks up the hill remained in the dark maybe six more hours.

    The paint on the transformer enclosures has been weathering for many decades, but I spotted this one up the hill that looks different from all the rest:

    Scorched utility transformer housing
    Scorched utility transformer housing

    The scorched half of the enclosure pivots upward to reveal the high-voltage disconnect switch, fuses, and low-voltage connections. This one is across the street from our house:

    Neighborhood distribution transformer
    Neighborhood distribution transformer

    I think something went badly wrong in there and the transformer overheated to the point of insulation failure, whereupon the short circuit blew the HV fuse half a mile away down the hill.

    I hope it’s not the beginning of a trend …

  • Crosman BB Bottle Cap

    Crosman BB Bottle Cap

    Mary made a frame weight to maintain tension on the fabric in the HQ Sixteen longarm:

    Longarm fabric frame weight
    Longarm fabric frame weight

    It’s a sturdy cloth tube filled with BBs, somewhat like a grossly overweight door snake (a.k.a. draft stopper).

    The bottle of 6000 copper-plated steel BBs arrived in an overwrap bag of the sort Amazon applies to all bottled products. This was a Good Thing, because the scrap of packing paper did nothing to cushion the bottle in an otherwise empty box. The bag contained most of the shattered cap and a few BBs, with escapees rattling around inside the box and surely a few left along the way.

    So I conjured a replacement cap from TPU:

    Crosman BB bottle cap - solid model - build view
    Crosman BB bottle cap – solid model – build view

    It fits around the bottle neck and snaps onto the spout just like the original:

    Crosman BB bottle cap
    Crosman BB bottle cap

    Except this one is unbreakable.

    The strapless TPU cap was a quick test to verify the fiddly shoulder snapping onto the bottle snout:

    Crosman BB bottle cap - solid model - section view
    Crosman BB bottle cap – solid model – section view

    As it turned out, we poured all 6000 BBs (minus those few lost-in-transit strays) into the cloth tube, but the bottle will come in handy for something someday.

    The OpenSCAD source code as a GitHub Gist:

    // Crosman BB bottle cap
    // Ed Nisley – KE4ZNU
    // 2026-02-22
    include <BOSL2/std.scad>
    Layout = "Show"; // [Show,Build,Section]
    /* [Hidden] */
    ID = 0;
    OD = 1;
    LENGTH = 2;
    HoleWindage = 0.2;
    Protrusion = 0.1;
    NumSides = 6*3*4;
    $fn=NumSides;
    WallThick = 1.0;
    Heights = [1.2,2.0,13.0,WallThick]; // for easy tweaking
    Ring = [34.5,39,WallThick];
    Strap = [70.0,5.0,Ring[LENGTH]];
    CapOAL = sum(Heights);
    //—–
    // Conjure it with magic numbers
    module Cap() {
    tube(Heights[0],id=16.8,wall=WallThick+0.6/2,anchor=BOTTOM) position(TOP)
    tube(Heights[1],id=17.4,wall=WallThick,anchor=BOTTOM) position(TOP)
    tube(Heights[2],id1=17.4,id2=14.0,wall=WallThick,anchor=BOTTOM) position(TOP)
    cyl(Heights[3],d=14.0+2*WallThick,rounding2=WallThick/2,anchor=BOTTOM) position(BOTTOM)
    cuboid(Strap,anchor=BOTTOM+LEFT) position(BOTTOM+RIGHT)
    left(1.0)
    tube(Ring[LENGTH],id=Ring[ID],od=Ring[OD],anchor=BOTTOM+LEFT);
    }
    //—–
    // Build things
    if (Layout == "Show") {
    Cap();
    }
    if (Layout == "Section") {
    difference() {
    Cap();
    down(Protrusion)
    cuboid(2*Strap.x,anchor=BOTTOM+LEFT+FRONT);
    }
    }
    if (Layout == "Build") {
    back(Strap.x/2)
    zrot(90)
    up(CapOAL)
    yrot(180)
    Cap();
    }
  • HQ Sixteen: Fabric Rod Bearings

    HQ Sixteen: Fabric Rod Bearings

    The rods (a.k.a. tubes or poles) holding & guiding the quilt top / batting / backing fabric on Mary’s HQ Sixteen longarm quilting machine span the eleven feet of the table:

    HQ Sixteen - table overview
    HQ Sixteen – table overview

    The two end plates are 1/4 inch steel plate with four punched holes for the rods / tubes, which look remarkably like EMT. The machine is two decades old and Mary is (at least) the third owner, so it’s no surprise the rods long ago wore through the white powder-coat paint on the plates and, during the course of a long quilting project, now deposit black dust on the table.

    Black dust not being tolerable near a quilt-in-progress, Mary asked for an improvement.

    The tube OD is 28.7 mm (so it’s probably 1 inch EMT) and the plate hole ID is 31.2 mm (likely a scant 1-¼ inch punch), leaving barely a millimeter of clearance all around. I wanted to make a bearing from suitably slippery Delrin / acetal, but figured 3D printed PETG would suffice for at least while.

    The proper term is “bushing“, because it has no moving parts:

    Rod Bearing Sleeve - solid model - show view
    Rod Bearing Sleeve – solid model – show view

    On the right side, the bushing rim must fit between the sprockets and the plate:

    HQ Sixteen rod - right front
    HQ Sixteen rod – right front

    The spring-loaded pin holding the tube in place (visible on the inside bottom) sets the maximum length:

    HQ Sixteen rod - right outer
    HQ Sixteen rod – right outer

    The left side has none of that, so I made the bushings a little longer:

    HQ Sixteen rod - left inner
    HQ Sixteen rod – left inner

    The left-side bushings will need a better design should normal back-and-forth sliding push them out of place.

    A touch of silicone grease around the plate holes makes those bushings / bearings turn sooo smooth.

    The OpenSCAD source code as a GitHub Gist:

    // Bearing sleeve for HQ Sixteen table rods
    // Ed Nisley – KE4ZNU
    // 2026-02-20
    include <BOSL2/std.scad>
    Layout = "Show"; // [Show,Build]
    /* [Hidden] */
    ID = 0;
    OD = 1;
    LENGTH = 2;
    HoleWindage = 0.2;
    Protrusion = 0.1;
    NumSides = 8*3*2*4;
    $fn=NumSides;
    Rod = [25.0,28.7,100.0]; // very short rod
    Sleeve = [Rod[OD] + 0.3,31.2 – 0.2,9.0]; // LENGTH = overall
    Rim = [Sleeve[ID],Sleeve[OD] + 6.0,0.6];
    IdlerLength = 15.0;
    NumSlots = 2*4;
    Kerf = 1.0;
    Gap = 5.0;
    module Bearing(oal) {
    difference() {
    union() {
    tube(oal,id=Sleeve[ID],od=Sleeve[OD],anchor=BOTTOM);
    tube(Rim[LENGTH],id=Rim[ID],od=Rim[OD],anchor=BOTTOM);
    }
    for (a=[0:NumSlots-1])
    zrot(a*360/NumSlots)
    up(oal/4 + Rim[LENGTH])
    right(Sleeve[ID]/2)
    cuboid([Sleeve[OD],Kerf,oal],anchor=BOTTOM);
    }
    }
    //—–
    // Build things
    if (Layout == "Show") {
    color("Gray",0.5)
    xcyl(Rod[LENGTH],d=Rod[OD]);
    right(Rod[LENGTH]/3)
    yrot(90)
    Bearing(Sleeve[LENGTH]);
    left(Rod[LENGTH]/3)
    yrot(90)
    Bearing(IdlerLength);
    }
    if (Layout == "Build") {
    right(Rim[OD]/2 + Gap/2)
    Bearing(Sleeve[LENGTH]);
    left(Rim[OD]/2 + Gap/2)
    Bearing(IdlerLength);
    }