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: 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.
  • 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();
    }