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

  • Laser-Cut Vole Trap Boxes

    Laser-Cut Vole Trap Boxes

    We deployed low-effort vole trap boxes a few weeks ago, only to discover no voles checked in, most likely due to wintertime gardens consisting of bare earth. I had weighted the boxes with convenient rocks that pretty much crushed them flat during rainstorms.

    So I converted a few dozen square feet of cardboard into better-looking boxes and transferred the traps:

    Vole Finger Box - large
    Vole Finger Box – large

    That one has a rat trap inside.

    Smaller boxes hold mouse traps:

    Vole Finger Box - small
    Vole Finger Box – small

    Two pairs of 4 mm holes on the bottom flanges fit some spare irrigation pipe holddowns to, yes, hold them down, with those rotten planks keeping their lids in place.

    They’re lightly customized “Electronics Boxes” held together by hot-melt glue. The jawbreaker URLs will get you started:

    Cardboard remains the wrong material, but my stockpile remains well-stocked.

  • LED Strip Lights: Window Moulding Mounts

    LED Strip Lights: Window Moulding Mounts

    The object of the game being to tilt the LED strip lights at (maybe) 30° to put more light higher on the wall and further out on the ceiling, with the overriding constraint of no visible holes. Given their eventual home atop the window moulding along the front wall of the Living Sewing Room, these seemed adequate:

    LED Bar Lamp Mount - solid model
    LED Bar Lamp Mount – solid model

    The hole on the angled part fits an M4 brass insert and the recessed holes capture the washer-like head of a sharp-point lath screw.

    Two pairs applied to the lights sitting atop the Fabric Cabinets served to verify the fit:

    LED strip light - moulding mount - on cabinet
    LED strip light – moulding mount – on cabinet

    They’re held firmly by the aluminum extrusion and don’t need a bigger footprint to remain stable.

    So I made another six, stuck on ⅞ inch strips of aluminized Mylar (cut from a bag in much better condition), and drilled holes where they can’t be seen:

    LED strip light - moulding mount - installed
    LED strip light – moulding mount – installed

    It’s almost too bright in there with 3 × 40 W of LED lights washing the wall and ceiling:

    LED strip light - moulding mount - lit
    LED strip light – moulding mount – lit

    I don’t like the cold 6000 K color temperature, but Mary doesn’t mind it. They fill the Sewing Table with shadowless / glareless light, although that kind of light makes the place look like a store.

    I think moving the strip lower and away from the wall could hide the entire mount from view.

    Contrary to what I expected, the Mylar reflectors must be at least an inch tall to avoid Baily’s Beads seen from across the room:

    LED strip light - short reflector
    LED strip light – short reflector

    With all that in mind, we’ll run these for a while to shake out any other improvements.

    The OpenSCAD source code as a GitHub Gist:

    // LED light bar mounts
    // Ed Nisley – KE4ZNU
    // 2025-03-16
    include <BOSL2/std.scad>
    Layout = "Show"; // [Show,Build,ScrewMount,BarMount]
    BaseAngle = 30; // [0:50]
    /* [Hidden] */
    ID = 0;
    OD = 1;
    LENGTH = 2;
    Protusion = 0.1;
    NumSides = 3*4;
    Radius = 1.5;
    $fn = NumSides;
    MouldWidth = 18.0; // nominal (3/4) * INCH, but lots of paint slop
    MouldScrew = [4.7,12.0,2.6]; // clearance, head OD, head thick
    Insert = [4.0,5.5,6.0 + 3.0]; // heat-set brass without pilot end
    BarClip = [33.0,15.0,11.0]; // snaps around led base
    ScrewBlockOA = [MouldWidth,MouldScrew[OD] + 2*Radius + 2.0,10.0];
    BarBlockOA = [BarClip.x*cos(BaseAngle),15.0,BarClip.x*sin(BaseAngle) + 2*ScrewBlockOA.z];
    Gap = 2.0 + max(ScrewBlockOA.y,BarBlockOA.y);
    //———-
    // Define shapes
    module ScrewMount() {
    difference(){
    cuboid(ScrewBlockOA,anchor=BOTTOM,rounding=Radius,except=[FRONT,BOTTOM,LEFT]);
    up(ScrewBlockOA.z – MouldScrew[LENGTH])
    zrot(180/NumSides)
    cylinder(d=MouldScrew[OD],h=MouldScrew[LENGTH] + Protusion);
    down(Protusion)
    cylinder(d=MouldScrew[ID],h=2*ScrewBlockOA.z);
    }
    }
    module BarMount() {
    difference() {
    cuboid(BarBlockOA,anchor=CENTER,rounding=Radius,edges=RIGHT);
    yrot(BaseAngle)
    cube([3*BarBlockOA.x,2*BarBlockOA.y,BarBlockOA.z],anchor=BOTTOM);
    yrot(BaseAngle)
    cylinder(d=Insert[OD],h=2*Insert[LENGTH],anchor=CENTER);
    }
    }
    module Mount() {
    union() {
    right(ScrewBlockOA.x/2) back(ScrewBlockOA.y/2)
    ScrewMount();
    right(BarBlockOA.x/2) fwd(BarBlockOA.y/2) up(BarBlockOA.z/2)
    BarMount();
    }
    }
    //———-
    // Build things
    if (Layout == "ScrewMount")
    ScrewMount();
    if (Layout == "BarMount")
    BarMount();
    if (Layout == "Show")
    Mount();
    if (Layout == "Build") {
    yflip_copy(Gap) Mount();
    }

  • LED Strip Lights: Shade Adhesive

    LED Strip Lights: Shade Adhesive

    This is a quick-and-ugly test to see how well aluminized Mylar will work as a reflective shade for some LED light bars eventually washing the Living / Sewing room ceiling with enough light to brighten the Sewing Table:

    LED strip light - Mylar reflector - ugly fit
    LED strip light – Mylar reflector – ugly fit

    The key question: how well adhesive adheres Mylar to the pleasantly warm aluminum extrusion serving as the heatsink for 40 W of LEDs:

    LED strip light - Mylar reflector - adhesive strips
    LED strip light – Mylar reflector – adhesive strips

    Perhaps surprisingly, those ½ inch strips come from an A4 sheet by way of a paper cutter.

    As with the Mylar shades over the COB LED strips in the laser, the LEDs remain through the aluminized layer:

    LED strip light - Mylar reflector - overexposed
    LED strip light – Mylar reflector – overexposed

    The LED bars will be directly visible, so bouncing the direct light against the wall reduces glare and puts it to good use.

    The Mylar strips are 1 inch wide, cut with a utility knife against a straightedge, although ⅞ inch seems adequate. The last LED over on the right sits at the endcap, so I will (try to) tuck the Mylar ends under the caps for a cleaner fit.

    The bars have two 4 foot strips of LEDs in series, with a lump of circuitry buried in the aluminum extrusion that seems be a bridge rectifier and a small electrolytic capacitor. There’s not nearly enough capacitance to knock down the 120 Hz flicker and I have an uneasy expectation of stroboscopic effects on the sewing machines.

    This is a test. […] This is only a test.

    Now, to model angle brackets fitting the strips to the window moulding.

  • Wire Shelf Shims

    Wire Shelf Shims

    Another trivial laser cutter project:

    Wire Shelf Shim - top view
    Wire Shelf Shim – top view

    I’m finally assembling the shelves for the last of the boxes cluttering the basement floor. Because the top of the wire shelf grid sits 4 mm below the top of the shelf rails, surely for some good reason, that pale strip is a 6 mm shim raising the grid just enough to let the boxes slide easily off without having to lift them over the rail.

    It’s a pair of 3 mm thick MDF strips stuck together with tapeless sticky (a thin adhesive layer on backing paper), with the same adhesive holding the shim to the rail while I lay them down and plunk the shelf grid on top:

    Wire Shelf Shim - side view
    Wire Shelf Shim – side view

    I made two sets of shims to fit the support rod spacing, with lengths carefully chosen to match two stacks from my Big Box o’ MDF Cutoffs, all 10 mm wide to fit the shelf rails:

    Wire Shelf Shim - laser cutting
    Wire Shelf Shim – laser cutting

    Admittedly, not all of the neatly rounded corners came through, due to slight variations in MDF sizing / Print-and-Cut alignment / whatever, but it’s a nearly zero waste way to turn stock into strips.

    Each shelf needs 14 shims = 28 strips and I’m here to tell you if I had to bandsaw 140 little strips for each of three sets of shelves, well, I:

    • Probably wouldn’t ever get around to making them
    • Definitely would grumble about lifting those boxes, forever

    Watching that thing never gets old …

  • Human Lumbar Vertebrae

    Human Lumbar Vertebrae

    Having once again reawakened a back injury from long ago, I figured these were good for some comic relief:

    L4 L5 vertebrae - assembled
    L4 L5 vertebrae – assembled

    The full-scale L4-L5 vertebrae are from Printables and the ¾ scale L5 is from somewhere I cannot recall. A mother lode of anatomical models is on Thingiverse if you want some 3D printing challenges.

    The L4-L5 pair are part of an extensive human anatomic model locating all the pieces at their proper coordinates, so these two hovered about 800 mm above the XY plane. I ran them through the Grid:Tool mesh editor to center them at the XY origin, then put the bottom-most point at Z=0.

    Rotating them individually in PrusaSlicer and painting only the most essential support got them to this state:

    L4 L5 vertebrae - PrusaSlicer
    L4 L5 vertebrae – PrusaSlicer

    Each one take about three hours, so I ran them individually to reduce surface blemishes and maximize the likelihood of happy outcomes. Worked like a champ.

    The retina-burn orange disk is not anatomically correct, because the InterWebz apparently does not have a model for spinal cartilage:

    L4 L5 vertebrae - assembled - disk detail
    L4 L5 vertebrae – assembled – disk detail

    Instead, it’s a rounded cylinder resized into an oval, with its top and bottom surfaces formed by subtracting the vertebrae:

    L4 L5 vertebrae disk - solid model
    L4 L5 vertebrae disk – solid model

    The OpenSCAD code doing the heavy lifting:

    // Disk between L4 and L5 vertebrae
    // Ed Nisley - KE4ZNU
    // 2025-03-07
    
    Layout = "Show";    // [Show,Build]
    
    include <BOSL2/std.scad>
    
    module Disk() {
      color("Red")
        difference() {
          translate([9,-18,36])
            rotate(110)
            resize([33,45])
            cyl(d=50,h=14,$fn=48,rounding=7,anchor=BOTTOM);
          import("../Spine/human-spinal-column-including-cervical-thoracic-and-lumbar-vertebra-model_files/L4 L5 vertebrae stacked.stl",
            convexity=10);
        }
    }
    
    if (Layout == "Show") {
      Disk();
    
      color("White",0.3)
          import("../Spine/human-spinal-column-including-cervical-thoracic-and-lumbar-vertebra-model_files/L4 L5 vertebrae stacked.stl",
            convexity=10);
    
    }
    
    if (Layout == "Build") {
      Disk();
    
    }
    

    All of the magic numbers come from eyeballometric measurement & successive approximation.

    The Build layout left the disk floating in space, whereupon I used PrusaSlicer to reorient it edge-downward on the platform with painted-on support for minimal distortion:

    L4 L5 vertebrae disk - PrusaSlicer
    L4 L5 vertebrae disk – PrusaSlicer

    Two dots of E6000+ adhesive hold everything together.

    All in all, it was a useful distraction. I’ve been vertically polarized for the last five days and it’s good to be … back.

  • Trivial Laser Projects

    Trivial Laser Projects

    A nubbly knob on the M4 screws securing the honeycomb to the laser’s platform:

    Honeycomb screw knob
    Honeycomb screw knob

    Leveling feet for the HQ Sixteen long-arm machine’s table for the high side of the floor:

    HQ Sixteen - table leg leveler - short
    HQ Sixteen – table leg leveler – short

    And 12 mm taller on the low side:

    HQ Sixteen - table leg leveler - tall
    HQ Sixteen – table leg leveler – tall

    Both of those “projects”, which may be too grand a term, went from “I need a thing” to having one in hand over the course of a few minutes yesterday. Neither required a great deal of thought, having previously worked out the proper speed / power settings to cut 3 mm MDF and 1 mm cork.

    Other folks may lead you to believe lasers are all about fancy artwork and elaborate finished products. Being the type of guy who mostly fixes things, I’d say lasers are all about making small and generally simple parts, when and where they’re needed, to solve a problem nobody else has.

    Perhaps I should devote more attention to using fancy wood with a hand-rubbed wax finish, but MDF fills my simple needs.

    With a laser and a 3D printer, shop tools have definitely improved since the Bad Old Days!

  • HQ Sixteen: Table Leveling Blocks

    HQ Sixteen: Table Leveling Blocks

    The Handi-Quilter HQ Sixteen rides on two tracks along the 11 foot length of the table, with an unsupported 8 foot span between the legs on each end:

    HQ Sixteen - remounted handlebars in use
    HQ Sixteen – remounted handlebars in use

    Contemporary versions of the table have support struts in the middle that our OG version lacks and, as a result, our table had a distinct sag in the middle. During the course of aligning the table top into a plane surface with tapered wood shims, I discovered the floor was half an inch out of level between the table legs.

    Now that the whole thing has settled into place, I measured the shim thicknesses and made tidy blocks to replace them:

    HQ Sixteen - table shims - finished
    HQ Sixteen – table shims – finished

    The OpenSCAD code has an array with the thickness and the number of blocks:

    SHIM_THICK = 0;
    SHIM_COUNT = 1;
    
    Shims = [
        [3.5,1],
        [5.0,3],
        [6.0,2],
        [6.5,1],
        [7.0,1]
    ];
    

    Yes, I call them “blocks” here and wrote “shims” in the code. A foolish consistency, etc.

    The model is a chamfered block with a chunk removed to leave a tongue of the appropriate thickness:

    HQ Sixteen - table shims - solid model - single
    HQ Sixteen – table shims – solid model

    Building them with the label against the platform produces a nice nubbly surface:

    HQ Sixteen - table shims - solid model
    HQ Sixteen – table shims – PrusaSlicer – bottom

    The labels print first and look lonely out there by themselves:

    HQ Sixteen - table shims - legends
    HQ Sixteen – table shims – legends

    The rest of the first layer fills in around the labels:

    HQ Sixteen - table shims - first layer
    HQ Sixteen – table shims – first layer

    Putting the labels on the bottom makes the wipe tower only two layers tall and eliminates filament changes above those layers. Those eight blocks still took a little over three hours, because there’s a lot of perimeter wrapped around not much interior.

    Having had the foresight to draw a sketch showing where each block would go, I slid one next to its wood shim, yanked the shim out, and declared victory:

    HQ Sixteen - table shims - installed
    HQ Sixteen – table shims – installed

    The tension rod welded under the table rail prevents even more sag, but the struts under the new version of the table show other folks were unhappy with the sag of this one. Another leg or two seems appropriate.

    With the table leveled and the surface aligned, the HQ Sixteen glides easily in all directions. The result isn’t perfect and Mary keeps the anchor block at hand, but the machine now displays much less enthusiasm for rolling toward the middle of the table.

    The OpenSCAD source code as a GitHub Gist:

    // HQ Sixteen – table shims
    // Ed Nisley – KE4ZNU
    // 2025-02-27
    include <BOSL2/std.scad>
    Layout = "Show"; // [Show,Build]
    /* [Hidden] */
    SHIM_THICK = 0;
    SHIM_COUNT = 1;
    Shims = [
    [3.5,1],
    [5.0,3],
    [6.0,2],
    [6.5,1],
    [7.0,1]
    ];
    Block = [40.0,20.0,15.0]; // overall shim size
    Grip = 10.0; // … handle length
    BlockRadius = 1.0; // corner rounding / chamfer
    LabelThick = 0.4;
    LabelSize = 5.5;
    LabelFont = "Arial:style:Bold";
    LabelColor = "Red";
    Protrusion = 0.1;
    Gap = 5.0;
    //———-
    // Define shim shape
    module ShimBlock(Height = Shims[0][SHIM_THICK],Part="All") {
    if (Part == "Block" || Part == "All")
    difference() {
    left(Grip)
    cuboid(Block,anchor=BOTTOM + LEFT,chamfer=BlockRadius);
    up(Height)
    cube(Block + 2*[Protrusion,Protrusion,0],anchor=BOTTOM + LEFT);
    left(Grip/2 – BlockRadius/2) fwd(Block.y/2 – LabelThick) up(Block.z/2)
    xrot(90) zrot(-90)
    linear_extrude(height=LabelThick + Protrusion,convexity=20)
    text(text=format_fixed(Height,1),size=LabelSize,spacing=1.00,
    font=LabelFont,halign="center",valign="center");
    }
    if (Part == "Text" || Part == "All")
    color(LabelColor)
    left(Grip/2 – BlockRadius/2) fwd(Block.y/2 – LabelThick) up(Block.z/2)
    xrot(90) zrot(-90)
    linear_extrude(height=LabelThick,convexity=20)
    text(text=format_fixed(Height,1),size=LabelSize,spacing=1.00,
    font=LabelFont,halign="center",valign="center");
    }
    //———-
    // Build them all
    if (Layout == "Show")
    ShimBlock();
    if (Layout == "Build") {
    for (j=[0:len(Shims)-1])
    back(j*(Block.z + Gap))
    for (i=[0:(Shims[j][SHIM_COUNT] – 1)])
    right(i*(Block.x + Gap))
    up(Block.y/2) xrot(90)
    ShimBlock(Shims[j][SHIM_THICK],Part="Block");
    for (j=[0:len(Shims)-1])
    back(j*(Block.z + Gap))
    for (i=[0:(Shims[j][SHIM_COUNT] – 1)])
    right(i*(Block.x + Gap))
    up(Block.y/2) xrot(90)
    ShimBlock(Shims[j][SHIM_THICK],Part="Text");
    }