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

  • HQ Sixteen: Front Horizontal Spool Adapter

    HQ Sixteen: Front Horizontal Spool Adapter

    Mary wanted a horizontal spool adapter mounted closer to the front of her HQ Sixteen, in the M5 threaded hole where the Official Horizontal Adapter would go:

    HQ Sixteen - front spool adapter - installed
    HQ Sixteen – front spool adapter – installed

    Yes, the pin through the spool is fluorescent edge-lit orange acrylic that looks wonderful in sunlight and is much more amusing than the black rod in the adapter atop the power supply pod.

    The top of the machine case is not flat, level, or easy to model, so I deployed the contour gauge again, with some attention to keeping the edge pins parallel & snug along the machine sides:

    HQ Sixteen - machine profile measurement
    HQ Sixteen – machine profile measurement

    Tracing the edge of the pins onto paper, scanning, and feeding it into Inkscape let me lay a few curves:

    HQ Sixteen - top profile curve - Inkscape fitting
    HQ Sixteen – top profile curve – Inkscape fitting

    The laser-cut chipboard test pieces show the iterations producing closer and closer fits to the machine.

    Importing the final SVG image into OpenSCAD and extruding it produced a suitable solid model of the machine’s case:

    HQ Sixteen - machine solid model
    HQ Sixteen – machine solid model

    Subtract that shape from the bottom of the adapter to get a perfect fit atop the machine:

    HQ Sixteen - horizontal thread spool adapter - front pin - solid model - show
    HQ Sixteen – horizontal thread spool adapter – front pin – solid model – show

    Early results are encouraging, although the cheap polyester thread Mary got from a friend’s pile and is using for practice untwists itself after passing through the tension disks on its way to the needle. She’ll load much better thread for the real quilt.

    The OpenSCAD source code and SVG of the HQ Sixteen’s top profile as a GitHub Gist:

    // HQ Sixteen – horizontal thread spool adapter for front pin
    // Ed Nisley – KE4ZNU
    // 2025-04-07
    include <BOSL2/std.scad>
    Layout = "Show"; // [Show,Build,Base,Wall,Frame]
    /* [Hidden] */
    Protrusion = 0.1;
    HoleWindage = 0.2;
    ID = 0;
    OD = 1;
    LENGTH = 2;
    WallThick = 8.0;
    BaseThick = 12.0;
    Washer = [5.0,10.0,1.0]; // M5 washer
    Spool = [0.25*INCH,50.0,55.0]; // maximum thread spool
    SpoolClearance = [2.0,5.0,5.0]; // spool pin pointed to +X axis
    SpoolPin = [Spool[ID],Spool[ID],Spool[LENGTH] + WallThick + SpoolClearance.x];
    BasePlate = [WallThick + SpoolClearance.x + 13.0, // X flush with side of machine
    Spool[OD]/2 + 2*SpoolClearance.y,
    BaseThick];
    BaseOffset = [-(BasePlate.x – Washer[OD]),-Washer[OD],0.0]; // left front corner w.r.t. pin
    SpoolOC = [0, // relative to left front top of Base
    BasePlate.y/2,
    SpoolClearance.z + Spool[OD]/2 + BaseThick/2];
    //———-
    // Construct the pieces
    // HQ Sixteen top frame profile
    // Aligned with hole somewhere along X=0, front edge at Y=0
    // Lengthened slightly to cut cleanly
    module MachineFrame(Length=BasePlate.y + 2*Protrusion) {
    back(BasePlate.y + Protrusion) xrot(90)
    linear_extrude(height=Length,convexity=5,center=false)
    import("HQ Sixteen – top profile curve.svg",layer="Top Profile");
    }
    // Baseplate
    // Aligned with hole one washer diameter in from corner
    module Base() {
    $fn=18;
    difference() {
    fwd(Washer[OD])
    difference() {
    right(Washer[OD])
    cuboid(BasePlate,anchor=RIGHT+FRONT+CENTER,rounding=BaseThick/2,edges=RIGHT);
    MachineFrame();
    }
    down(BasePlate.z)
    cylinder(d=SpoolPin[OD] + HoleWindage,h=2*BasePlate.z);
    up(BasePlate.z/2 – Washer[LENGTH])
    cylinder(d=Washer[OD] + HoleWindage,h=2*Washer[LENGTH]);
    }
    }
    // Wall holding spool pin
    module Wall() {
    $fn=36;
    translate(BaseOffset) {
    difference() {
    union() {
    translate(SpoolOC)
    right(WallThick)
    cylinder(SpoolClearance.x,d=Spool[OD]/2,orient=RIGHT);
    hull() {
    translate(SpoolOC)
    cylinder(WallThick,d=Spool[OD]/2,orient=RIGHT);
    up(BasePlate.z/2 – 1)
    cube([WallThick,BasePlate.y,1],center=false);
    }
    }
    translate(SpoolOC) left(Protrusion)
    cylinder(SpoolPin[LENGTH],d=SpoolPin[OD],orient=RIGHT);
    }
    }
    }
    module Adapter() {
    Base();
    Wall();
    }
    //———-
    // Show & build the results
    if (Layout == "Base")
    Base();
    if (Layout == "Wall")
    Wall();
    if (Layout == "Frame")
    MachineFrame();
    if (Layout == "Show") {
    Adapter();
    color("Gray",0.5)
    MachineFrame(60);
    color("Green",0.75)
    translate(BaseOffset)
    translate(SpoolOC)
    cylinder(SpoolPin[LENGTH],d=SpoolPin[OD],orient=RIGHT,$fn=18);
    }
    if (Layout == "Build")
    up(-BaseOffset.x)
    yrot(-90)
    Adapter();
    Loading
    Sorry, something went wrong. Reload?
    Sorry, we cannot display this file.
    Sorry, this file is invalid so it cannot be displayed.

  • HQ Sixteen: Padded Table Shims

    HQ Sixteen: Padded Table Shims

    The HQ Sixteen has been running at higher speeds as Mary practices using its stitch regulator and the vibrations shook several of the table shims (blocks, whatever) onto the floor. I hope a layer of EVA foam provides enough compliance to keep them in place:

    HQ Sixteen - padded table shim - installed
    HQ Sixteen – padded table shim – installed

    The foam is 2 mm thick, so subtracting that from the nominal thickness makes the new blocks come out right.

    A short module extracts the footprint for export as an SVG image to laser-cut both the foam and the adhesive sheet required to stick it in place:

    module ShimPad(Thickness = PadThick) {
    
        if (Thickness)
            linear_extrude(height=Thickness)
                projection(cut=true)
                    ShimBlock();
        else
            projection(cut=true)
                ShimBlock();
    
    }
    

    It turns out linear_extrude() chokes on a zero height.

    When handed a nonzero Thickness, the code generates a simulated foam sheet:

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

    The footprint looks about like you’d expect:

    HQ Sixteen - table shims - solid model - pad outline
    HQ Sixteen – padded table shim – installed

    Import into LightBurn, duplicate it sufficiently, set the speed & power & kerf for EVA foam, then cut ’em out:

    HQ Sixteen - table shims - padding cuts
    HQ Sixteen – table shims – padding cuts

    Ditto for the adhesive, stick together, and upgrade the fleet.

    If these shake loose, snippets of adhesive film will stick them firmly to the underside of the table panels.

    Update: Yeah, they needed sticky snippets. Whole lotta shakin’ goin’ on with that machine!

  • HQ Sixteen: Stitch Regulator

    HQ Sixteen: Stitch Regulator

    The stitch regulator on our Handi-Quilter HQ Sixteen uses a pair of encoder wheels running along the tracks supporting the machine:

    HQ Sixteen - stitch regulator sensor - rear
    HQ Sixteen – stitch regulator sensor – rear

    This must be HandiQuilter’s very first encoder version, because a ribbon cable connects the encoders to the control pod:

    HQ Sixteen - stitch regulator sensor - front
    HQ Sixteen – stitch regulator sensor – rear

    I stuck an adhesive cable clamp under the machine to rein in some of the slack, but the jank is strong with that arrangement and I must figure out a better arrangement with supple cable and better support. We’ll run this lashup for a while.

    Anyhow …

    The stitch regulator uses signals from the wheels to measure the distance the machine travels across the fabric and controls the motor speed to produce a fixed number of stitches per inch at that travel speed, as set in the control panel:

    HQ Sixteen - display - stitch mode
    HQ Sixteen – display – stitch mode

    Close inspection shows the LCD module came from an early 2000s mobile phone, but there’s no shame in repurposing cheap & readily available hardware.

    When the stitch regulator is not active, the machine runs at a fixed speed set on the control panel:

    HQ Sixteen - display - speed mode
    HQ Sixteen – display – speed mode

    The controller can set the speed between 100% to 10% of the motor’s 1500 stitch/min full speed, with 1% steps that seem too large on the low end and too small for the high end. Aiming my laser tachometer at a retroreflective tape snippet on the handwheel shows the machine runs at the correct fractions of its actual 1492 stitch/min = RPM.

    The stitch regulator uses the same motor speed range, which sets corresponding limits on the maximum and minimum speeds across the fabric, with the ratio set by the stitch/inch value.

    At the 10 stitch/inch setting Mary has been using, the travel speed range is:

    • 15 inch/min = (150 stitch/min) / (10 stitch/inch)
    • 150 inch/min = (1500 stitch/min) / (10 stitch/inch)

    When you stop moving the machine, the controller will shut off the motor after a few stitches in the same place, which turns out to be convenient for tying off the end of a stitched line on a quilt. When you move too fast, the machine will top out at 1500 stitch/min while producing too-long stitches until the travel speed drops below 150 inch/min.

    What’s not obvious is how slow those speeds are:

    • 0.25 inch/s = 15 inch/min
    • 2.5 inch/s = 150 inch/min

    As an exercise, fire up the metronome app on your phone at one tick per second, then try drawing intricate patterns within those speed limits. You will inevitably move too fast, even without the soundtrack of a frantically accelerating motor topping out at 1500 RPM.

    We think the surprisingly low upper speed limit accounts for much of the trouble Mary’s compadres report while using the stitch regulator.

    After laying down a few square yards of practice quilt patterns while measuring the results and becoming accustomed to the sound and feel of the machine running at high speeds, Mary’s producing good results:

    HQ Sixteen - stitch regulator - counting stitches
    HQ Sixteen – stitch regulator – counting stitches

    I definitely hit the knees in gratitude when the stitch regulator Just Worked™ after plugging it in, because that ribbon cable did not inspire any confidence whatsoever.

  • Vole Trap Boxes: Deluxe Edition

    Vole Trap Boxes: Deluxe Edition

    The larger vole trap boxes didn’t survive the early spring rainfall, so we decided to upgrade the fleet with more durable boxes:

    Vole Box - finished
    Vole Box – finished

    I obviously need a larger light box.

    The trap boxes come in 7 quart and 3.5 quart sizes, although we expect either will comfortably accommodate a single vole.

    They’re made of polypropylene plastic eminently suited for laser cuttery, so I borrowed the holes from the cardboard box setup:

    Vole Box - hole cutting
    Vole Box – hole cutting

    The clamps on the knife bars held the angle block and boxes in pretty much the same position, so I didn’t realign anything after figuring out a pair of magnets would hold the lid to the angle:

    Vole Box - lid fixture magnets
    Vole Box – lid fixture magnets

    The box side is slightly sloped, so I probably should have angled the block to tilt the lid, but this isn’t a precision job:

    Vole Box - lid fixture
    Vole Box – lid fixture

    The white smudges on the lid come from vaporized polypropylene:

    Vole Box - fume deposits
    Vole Box – fume deposits

    The body count thus far is just one field mouse, but the season is yet young.

  • Floor Lamp Remote Control Holder

    Floor Lamp Remote Control Holder

    The remote control for the floor lamp across the Reading Room will never again wander away into the clutter:

    Floor lamp remote holder - in use
    Floor lamp remote holder – in use

    The magnet in its back snuggles against a steel disk embedded in the holder:

    Floor lamp remote holder - installed
    Floor lamp remote holder – installed

    A magnetic field visualization sheet revealed the magnet:

    Floor lamp remote holder - magnet field visualization
    Floor lamp remote holder – magnet field visualization

    Extract the remote’s profiles with a contour gauge:

    Floor lamp remote holder - pin contour gauge
    Floor lamp remote holder – pin contour gauge

    Trace the outlines and lay smooth curves around them with Inkscape:

    Remote profiles - Inkscape curves
    Remote profiles – Inkscape curves

    They needed a slight lengthening to account for the gauge pin diameter & deflection, but this isn’t a precision project.

    Do the same with a scan of the front face, import the curves into OpenSCAD, extrude them, create a solid model of the remote from their mutual intersection, then add a cylinder to punch the depression for the steel plate:

    Floor Lamp Remote Holder - solid model - bottom
    Floor Lamp Remote Holder – solid model – bottom

    The chonky model corners stick out too far compared to the stylin’ curves on the real remote, but I made the holder shorter than the remote specifically to avoid fussing with such details.

    Subtract the remote from a nicely rounded cuboid and knock out a cylinder for the pipe it’ll mount on to produce the holder:

    Floor Lamp Remote Holder - solid model - Show view
    Floor Lamp Remote Holder – solid model – Show view

    I briefly considered a circumferential clamp around the pipe before coming to my senses and making the pipe diameter 2 mm larger to accommodate a strip of double-sided foam tape.

    The magnet gets a ferocious grip on the plate and I defined the result to be All Good™.

    The OpenSCAD source code and SVG paths as a GitHub Gist:

    Loading
    Sorry, something went wrong. Reload?
    Sorry, we cannot display this file.
    Sorry, this file is invalid so it cannot be displayed.
    // Floor Lamp Remote Holder
    // Ed Nisley – KE4ZNU
    // 2025-03-29
    include <BOSL2/std.scad>
    Layout = "Holder"; // [Show,Build,Remote,Holder]
    BaseAngle = 30; // [0:50]
    /* [Hidden] */
    RemoteOA = [92.0,40.0,14.5];
    PoleOD = 16.0; // lamp pole
    MagnetOD = 20.0; // steel plate under magnet
    MagnetOffset = [11.0,0,-2.0];
    TapeThick = 1.2;
    HolderOA = [60.0,35.0,PoleOD/3 + 4.0 + RemoteOA.z/2];
    HolderRadius = 5.0;
    Gap = 10.0;
    //———-
    // Define shapes
    module RemoteBody() {
    union() {
    intersection() {
    fwd(RemoteOA.y/2) up(RemoteOA.z/2)
    linear_extrude(h=RemoteOA.z,center=true)
    import("Floor Lamp Remote – outlines.svg",layer="Top Outline");
    zrot(90) xrot(90)
    linear_extrude(h=RemoteOA.x,center=true)
    import("Floor Lamp Remote – outlines.svg",layer="End Outline");
    xrot(90)
    linear_extrude(h=RemoteOA.y,center=true)
    import("Floor Lamp Remote – outlines.svg",layer="Side Outline");
    }
    translate(MagnetOffset)
    cylinder(d=MagnetOD,h=RemoteOA.z,$fn=4*3*4);
    }
    }
    module Holder() {
    difference() {
    cuboid(HolderOA,anchor=BOTTOM,rounding=HolderRadius,except=TOP);
    down((PoleOD + 2*TapeThick)*(1/2 – 1/3))
    yrot(90)
    cylinder(d=PoleOD + 2*TapeThick,h=2*HolderOA.x,center=true);
    up(HolderOA.z – RemoteOA.z/2)
    RemoteBody();
    }
    }
    //———-
    // Build things
    if (Layout == "Remote")
    RemoteBody();
    if (Layout == "Holder")
    Holder();
    if (Layout == "Show") {
    color("White")
    Holder();
    color("Gray",0.75)
    up(HolderOA.z – RemoteOA.z/2 + Gap)
    RemoteBody();
    color("Green",0.5)
    down((PoleOD + 2*TapeThick)*(1/2 – 1/3))
    yrot(90)
    cylinder(d=PoleOD + 2*TapeThick,h=2*HolderOA.x,center=true);
    }
    if (Layout == "Build") {
    Holder();
    }

  • Laser Cutter: Letter Paper Storage Trays

    Laser Cutter: Letter Paper Storage Trays

    Paper sheets must lay flat in storage, but it’s impossible to extract a single sheet from a tall pile. So I converted some moving boxes into stackable trays, each holding about a ream of paper:

    Letter Paper Tray - installed
    Letter Paper Tray – installed

    The starting point is a stackable Universal Box from boxes.py, with one end reshaped to become a tray. One Home Depot Large moving box provides enough 4.0 mm cardboard to make four trays, with one side of the box left over for future projects:

    Letter Paper Storage Racks - LightBurn screenshot
    Letter Paper Storage Racks – LightBurn screenshot

    The gray rectangle in the middle is the LightBurn workspace grid representing the 700×500 mm laser platform:

    Letter Paper Tray - laser cutting
    Letter Paper Tray – laser cutting

    Contrary to the screenshot, I move all the layouts off to the side leaving the platform grid clear. The blue rectangles around the layouts represent the various box flaps / sides, so I can:

    • Click a layout (which is grouped with the surrounding rectangle)
    • Click Ctrl-D to duplicate it
    • Hit P to put the duplicate at the middle of the platform grid
    • Lay the corresponding cardboard sheet from that box part on the platform
    • Align the layout with the cardboard using the camera
    • Fire The Laser

    Copious application of hot melt glue gloms all the pieces together.

    I added support beams under the cardboard bottom plate:

    Letter Paper Tray - bottom
    Letter Paper Tray – bottom

    A 2 mm arch in the top of those strips puts a camber into the sheet to counteract the natural sag from carrying five pounds of paper. The four trays at the far left lack that camber and cry out for a Mulligan.

    Some day the Basement Shop™ won’t smell like a campfire.

    The LightBurn SVG layout as a GitHub Gist:

    Loading
    Sorry, something went wrong. Reload?
    Sorry, we cannot display this file.
    Sorry, this file is invalid so it cannot be displayed.

  • Laser Cutter: Letter Page Fixture

    Laser Cutter: Letter Page Fixture

    Making 200×200 mm layered paper “pictures” involved cutting the square blanks from 8½×11 Letter sheets, putting those blanks in a fixture to hold them flat, then cutting the layer patterns:

    Layered Paper cutting fixture - in use
    Layered Paper cutting fixture – in use

    That worked well enough, but it occurred to me that I should cut the patterns directly into the Letter sheet, with a couple of tabs on each edge holding the square to the sheet so it didn’t fall free.

    A cardboard prototype showed this would actually work, at least after I fixed the tab width to keep them from just evaporating:

    Pyrotechnics - metallized paper fixture
    Pyrotechnics – metallized paper fixture

    The top and bottom strips of tape hold cardboard bars that flatten the slightly curled metallic paper. The tape on the sides holds the cardboard flat to the knife bars across the laser platform.

    A few adjustments later, I had an MDF version:

    Letter paper fixture - cardboard vs MDF
    Letter paper fixture – cardboard vs MDF

    Which fits atop the bars even better:

    Letter paper fixture - on knife bars
    Letter paper fixture – on knife bars

    Cutting colored paper definitely makes for cheerful chaff!

    The two bar magnets hold the fixture in place on the steel platform rim. The aluminum knife bars stand slightly proud of the steel, so there’s a 1.4 mm chipboard shim glued under the fixture to put it flat on the bars.

    The opening is 10 mm smaller than the Letter sheet to support it all around. The recess is 1 mm larger than the sheet to allow for slight size variations, with an MDF ring flattening the sheet:

    Letter paper fixture - sheet in place
    Letter paper fixture – sheet in place

    The four targets in the corners correspond to targets in the LightBurn template suitable for Print and Cut alignment:

    Letter sheet template - LightBurn layout
    Letter sheet template – LightBurn layout

    The alert reader will note the fixture targets on the MDF fixture sit juuuust slightly to the right of where they are in the template. It turns out the targets cannot be grouped with anything else (or even each other), because when you select a target on the template for Print and Cut the center of the selection must match the location of the physical target on the fixture.

    However, it’s convenient to have the rest of the template grouped into a single lump, so it’s painfully easy to select and move only the template while leaving the targets behind. It seems while setting up to mark & cut the template, I managed to click-n-drag the group a few millimeters to the left.

    I eventually used Print and Cut to align the template and target with the corners of that MDF frame, re-engrave the targets at the correct locations, and scribble over the misplaced targets. If I don’t tell anybody, they’ll never know.

    The LightBurn SVG layout as a GitHub Gist:

    Loading
    Sorry, something went wrong. Reload?
    Sorry, we cannot display this file.
    Sorry, this file is invalid so it cannot be displayed.