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.

Tag: Improvements

Making the world a better place, one piece at a time

  • Dutchess Rail Trail: Brush Trimming & Pruner Repair

    Dutchess Rail Trail: Brush Trimming & Pruner Repair

    The bushes & trees along the Dutchess Rail Trail were reaching out to touch us again, so I took some slow rides with many stops.

    Maple Oak trees along Page Park Drive:

    DCRT Brush Trimming - oak - 2025-07
    DCRT Brush Trimming – oak – 2025-07

    Blackthorn encroaching through the fence at Overocker:

    DCRT Brush Trimming - blackthorn - 2025-07
    DCRT Brush Trimming – blackthorn – 2025-07

    A tree somebody tossed down the trail bank near Morgan Lake:

    DCRT Brush Trimming - discarded tree - 2025-07
    DCRT Brush Trimming – discarded tree – 2025-07

    The slide lock on my trusty rehabilitated Fiskars bypass pruner worked loose and began sliding into the LOCK position when held overhead, then fell apart during disassembly:

    Fiskars pruner - lock rebuild
    Fiskars pruner – lock rebuild

    The lock now consists of:

    • An M4 × 12 mm nut from a Chicago Screw that exactly matched the 5 mm OD cylinder passing through the pruner body
    • A laser-cut fluorescent acrylic disk for thumb grippiness
    • A washer just because
    • An M4 hex-head screw
    • A dab of Loctite bonding screw to nut

    Clean the blades with alcohol and it’s ready for the rest of the season.

    I should have put a wave washer in the stack for some springiness, but it works surprisingly well for what it is.

    Now: discover how long acrylic lasts out there in the wild.

    Update: Yeah, the lock needed a wave washer for more friction, which became apparent after the first overhead branch.

  • CNC-3018XL Setup: Table Riser Blocks

    CNC-3018XL Setup: Table Riser Blocks

    After fixing the X axis drive, the CNC-3018XL table moved properly again, so I measured its overall alignment:

    3018CNC - table height measurement
    3018CNC – table height measurement

    The +Y side (on the left in the photo, keeping in mind I’ve rotated the axes) turned out to be 0.7 mm too low, so I made a set of riser blocks to level the tabletop:

    Table Riser - solid model
    Table Riser – solid model

    The 10 mm height would ram the tip of a Pilot pen about 10 mm below the tabletop surface, were it not for the spring-loaded pen holder:

    Pilot V5RT holder - installed
    Pilot V5RT holder – installed

    The 0.7 mm difference in height levels the tabletop:

    CNC3018XL - table riser positions
    CNC3018XL – table riser positions

    The OpenSCAD code produces an SVG outline I intended to use for a foam pad, but then I found a quartet of springs that worked even better:

    CNC3018XL - table spring mount
    CNC3018XL – table spring mount

    So it’s now aligned within ±0.3-ish mm across the surface, with the unflatness of a slab cut from a 1955-era Formica kitchen countertop accounting for most of the difference in a swale from Quadrant III across the origin to Quadrant I.

    Which a check plot using an old file shows will be Flat Enough for my simple needs:

    CNC3018XL - test plot
    CNC3018XL – test plot

    Having the camera alignment remain exactly spot on came as a pleasant surprise:

    Camera Alignment check
    Camera Alignment check

    The faded cross to the left came from the table’s previous position; there’s no positive index between the countertop slab and the underlying T-slots.

    Part of the motivation for these blocks was to verify PrusaSlicer automagically handles filament / color changes between two objects, as long as OpenSCAD hasn’t unioned them as part of a common transformation. Not having to cut out the socket around the text simplifies the code from what I’d been doing with previous objects.

    The OpenSCAD source code as a GitHub Gist:

    // CNC 3018 table riser blocks
    // Ed Nisley – KE4ZNU
    // 2025-06-29
    include <BOSL2/std.scad>
    Layout = "Show"; // [Show,Build,Outlines]
    /* [Hidden] */
    HoleWindage = 0.2;
    Protrusion = 0.1;
    BlockOA = [40.0,30.0,10.0]; // riser block size
    SlotBlock = [8.0,BlockOA.y,3.0]; // alignment in slot
    BoltOD = 6.0 + HoleWindage; // central bolt
    LogoFont = "Fira Sans Condensed:style=SemiBold";
    LogoSize = 7.5;
    LogoColor = "Red";
    LogoThick = 0.4;
    //———-
    // Define Shapes
    module Riser(thick=1,matl="Block") {
    LogoText = format_fixed(thick,1);
    if (matl == "Text" || matl == "All")
    right(BlockOA.x/4) zrot(90)
    color(LogoColor)
    up(thick + SlotBlock.z + ((matl == "All") ? 0.01 : 0))
    text3d(LogoText,LogoThick + ((matl == "All") ? 0.01 : 0),LogoSize,LogoFont,
    anchor=TOP,atype="ycenter");
    if (matl == "Block" || matl == "All")
    difference() {
    cuboid(SlotBlock,$fn=8*3,anchor=BOTTOM,rounding=2.0,except=[BOTTOM,TOP]) position(TOP)
    cuboid(BlockOA,$fn=8*3,anchor=BOTTOM,rounding=2.0,except=[BOTTOM,TOP]);
    down(Protrusion)
    zrot(180/6)
    cyl(2*BlockOA.z,d=BoltOD,$fn=6,anchor=BOTTOM,circum=true);
    }
    }
    //———-
    // Build things
    if (Layout == "Show")
    down(SlotBlock.z)
    Riser(BlockOA.z,matl="All");
    if (Layout == "Outlines") {
    projection(cut=false)
    Riser(BlockOA.z,matl="Block");
    }
    if (Layout == "Build") {
    up(BlockOA.z + SlotBlock.z) xrot(180)
    Riser(BlockOA.z,matl="Block");
    up(BlockOA.z + SlotBlock.z) xrot(180)
    Riser(BlockOA.z,matl="Text");
    }

  • Newmowa NP-BX1: 2025 Batteries

    Newmowa NP-BX1: 2025 Batteries

    A new sextet of NP-BX1 batteries for the Sony AS-30V helmet camera arrived:

    Newmowa NP-BX1 - 2022 vs 2025
    Newmowa NP-BX1 – 2022 vs 2025

    The traces:

    • Blue = 2025 batteries
    • Red = 2022 batteries when new

    I don’t know what the bump in the middle of the new battery discharge curve means. Something weird in the chemistry, I suppose. Getting good batteries from Amazon surely remains a crapshoot and I now have four chargers.

    Recharging all six batteries required 5488 mA·hr, just over 900 mA·hr apiece. Running the camera on a one-hour bike ride burns 600-ish mA·hr, so that’s comforting.

    Comparing the new results with the 2022 batteries tested last month:

    NP-BX1 - Newmowa 2022 in 2025-06
    NP-BX1 – Newmowa 2022 in 2025-06

    The upper traces appear in red in the first plot, the lower curves come from three years of use.

    I’ll deploy the two best 2022 batteries (D and F) in the SJCAM M20 keeping watch from the Forester’s dashboard.

  • PolyDryer Humidity: Meter vs. Indicator Cards vs. Adsorption

    PolyDryer Humidity: Meter vs. Indicator Cards vs. Adsorption

    A week after installing 25 g of fresh silica gel, without any outside influence other than using some of the filaments to build things, I recorded the humidity meter reading, the indicator card colors, and the weight gain.

    Click on any picture for more dots and to get rid of the captions and their stylin’ photo-blur.

    White PETG, gain 0.6 g:

    Black PETG, gain 0.8 g:

    Orange PETG, gain 1.0 g:

    Blue PETG, gain 0.4 g:

    Blue PETG-CF, gain 1.3 g:

    Black PETG-CF, gain 2.1 g:

    Gray PETG-CF, gain 2.1 g:

    The (newer) indicator cards with the smaller dots / larger black borders seem less acute than the (older) large-dot cards. The two 28 %RH cards look about right, but the 20 and 21 %RH cards seem more different than the similar humidity would suggest.

    Under 20 %RH, all the spots look pretty much the same, but AFAICT any humidity below 20 %RH is Good Enough for 3D printing.

    The Blue PETG-CF went directly from its sealed bag into the PolyDryer box, unlike the Black and Gray PETG-CF spools that sat in the 50% RH basement long enough to soak up the ambience. The Blue has outgassed enough water to suggest spools do not arrive “bone dry” from the factory, although the Black and Gray prove the Basement Shop is wetter than the factory.

    All of the silica gel together weighed 184.2 on the same scale I originally measured the 25 g quantities that should have totalled 175 g, but the individual measurements total 183.3 g. I don’t trust the scale to be better than ±0.1 g on any measurement, so half a percent is likely as good as it gets.

    The silica gel weighed 187 g on the kitchen scale, sweated down to 179 g after 7 minutes in the microwave being defrosted like 1.5 pounds of fish, and, depending on which numbers you believe, released 8 to 10 g of water in the process.

    Microwaving something containing so little water means the silica gel absorbs very little of the energy: the dish, glass turntable, and metal walls got absurdly hot. I think using the induction cooktop and cast iron pan makes more sense, even if it takes longer.

    With fresh silica gel in place, perhaps waiting two weeks will produce interesting numbers.

  • Activated Alumina Regeneration

    Activated Alumina Regeneration

    Having accumulated a bunch of used activated alumina desiccant, I figured now was a good time to try regenerating it. Industrial applications use dry gas and very high temperatures, but perhaps holding it over 100 °C for a few hours will suffice for my purposes.

    I pressed our daily driver cast iron skillet and induction cooktop into service:

    Alumina regeneration - induction cooktop
    Alumina regeneration – induction cooktop

    After an hour the surface temperature was around 150 °F, so I covered the pan with a water-cooled lid to see if any vapor condensed on it:

    Alumina regeneration - lid cooling
    Alumina regeneration – lid cooling

    It did, indeed, so I alternated covering and exposing the pan, which was likely a waste of my time, until the alumina dried enough that the lid didn’t collect any condensation. The whole process took just under four hours with the cooktop set to its maximum of 460 °F for most of the time.

    The beads then cooled to room temperature in a covered dish:

    Alumina regeneration - final cooling
    Alumina regeneration – final cooling

    The beads weighed 626 g at the start of the adventure and sweated down to 593 g, parting with 33 g = 1.2 oz of water in the process for a loss of 5.6%. I have no idea how dry they are now, but they’re an ounce drier than before.

  • Rolling Bed Stop

    Rolling Bed Stop

    The upstairs Sewing Room came with a couch-like bed incorporating a roll-out trundle bed. It doesn’t get a lot of use, but it lacks wheel locks and tends to scoot away unless you get into it rather more carefully than seems reasonable.

    So I made a pair of stops to capture the wheels:

    Rolling Bed Stops - installed
    Rolling Bed Stops – installed

    The solid model shows they’re just plastic blocks minus a model of the roller wheel:

    Rolling Bed Stops - solid model - show view
    Rolling Bed Stops – solid model – show view

    I like the wood-grain effect of the doubly curved recess on printed plastic layers, even if nobody will ever see it:

    Rolling Bed Stops - PrusaSlicer
    Rolling Bed Stops – PrusaSlicer

    The OpenSCAD code also exports a projection of the block as an SVG file to laser-cut the cork pad.

    Roll the trundle bed into position, push the stops against the wheels, lift and pull forward an inch, let it down, and the wheels snap into those recesses.

    These are considerably fancier than some of the other wheel stops / feet around the house, if only because I got to use the Chord Equation to solve for the radius of the circle parallel to the axle for a snug socket.

    The OpenSCAD source code as a GitHub Gist:

    // Rolling Bed roller stops
    // Ed Nisley – KE4ZNU
    // 2025-06-16
    include <BOSL2/std.scad>
    Layout = "Show"; // [Show,Build,Roller,Plan]
    /* [Hidden] */
    HoleWindage = 0.2;
    Protrusion = 0.1;
    ID = 0;
    OD = 1;
    LENGTH = 2;
    WallThick = 10.0; // default width for things
    BaseThick = 3.0; // bottom thickness
    RollerOA = [47.2,49.8,40.0]; // min & max dia, length
    FrameClearance = 11.0; // max height under bed frame at roller
    PadOA = [RollerOA[LENGTH] + 2*WallThick,RollerOA[OD],FrameClearance – 1.0];
    //———-
    // Define Shapes
    module Roller() {
    m = (RollerOA[OD] – RollerOA[ID])/2;
    RollerR = (m^2 + (RollerOA[LENGTH]^2)/4) / (2*m);
    up(RollerOA[OD]/2)
    yrot(90)
    rotate_extrude($fa=1)
    intersection() {
    left(RollerR – RollerOA[OD]/2)
    circle(r=RollerR,$fa=1);
    rect([RollerOA[OD]/2,RollerOA[LENGTH] + 2.0],anchor=LEFT);
    }
    }
    module RollerStop() {
    difference() {
    cuboid(PadOA,anchor=BOTTOM,rounding=WallThick/2,except=BOTTOM);
    up(BaseThick)
    Roller();
    }
    }
    //———-
    // Build things
    if (Layout == "Plan") {
    projection(cut=true)
    RollerStop();
    }
    if (Layout == "Roller") {
    Roller();
    }
    if (Layout == "Show") {
    RollerStop();
    color("Green",0.5)
    up(BaseThick)
    Roller();
    }
    if (Layout == "Build") {
    RollerStop();
    }
  • HQ Sixteen: Under-arm Lights

    HQ Sixteen: Under-arm Lights

    With the nose ring lights in place, I soldered up eight more 24 V LED strips to light the quilt under the HQ Sixteen’s arm:

    HQ Sixteen - under-arm lights - bottom view
    HQ Sixteen – under-arm lights – bottom view

    A simple fixture aligned the strips for soldering:

    HQ Sixteen - under-arm lights - soldering fixture
    HQ Sixteen – under-arm lights – soldering fixture

    I intended to peel the masking tape off the glossy cardboard, then use it to keep the strips aligned while I pressed the PSA adhesive on the back of the strips to the machine. The silicone molded over the LEDS turned out to be supremely un-stick-able to the tape and the strips got far more handling than I planned, but I think the adhesive will work.

    The cable from the power supply now has a pair of JST SM connectors on the end. Although crimping two conductors into the same pin is not good practice, all 14 of the LED strips draw an aggregate of maybe 130 mA, so I think it’ll suffice.

    The JST connectors hide behind the ribbon cable going to the machine’s front panel, so there’s not a lot of basis for arguing they’re unsightly:

    HQ Sixteen - under-arm lights - side view
    HQ Sixteen – under-arm lights – side view

    The finished part of the quilt passes under the bottom bar on the left (the rear of the machine table) and forms an ever-increasing roll around the top bar; the white fabric leader attaches to the edge of the quilt. The LED strips illuminate the in-progress part of the quilt under the arm and should be far enough forward to not snag on the rolled-up finished part.

    I think there’s now enough light to work with:

    HQ Sixteen - under-arm lights - top view
    HQ Sixteen – under-arm lights – top view

    We recently decided the motor stall Heisenbug has vanished, perhaps due to my re-soldering the motor power supply components on the PCB. It’s hard to tell with Heisenbugs, but sometimes they decohere into a desirable state.

    After the better part of a year, Mary’s vintage HQ Sixteen runs better than new!

    A blog search unearths an extensive project in reverse chronologic order.