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: Sewing

Fabric arts and machines

  • HQ Sixteen: Handlebar Control Button Caps

    HQ Sixteen: Handlebar Control Button Caps

    Each of the HQ Sixteen’s handlebars has a cap with control buttons:

    HQ Sixteen control caps - side view
    HQ Sixteen control caps – side view

    The left cap:

    HQ Sixteen control caps - left
    HQ Sixteen control caps – left

    The right cap:

    HQ Sixteen control caps - OEM right
    HQ Sixteen control caps – OEM right

    The membrane switch overlay has textured bumps, although both of us have trouble finding them.

    The Start / Stop switch gets the most use and, as you’d expect, has become intermittent after two decades of use.

    Mary thinks a Start / Stop switch on both caps would be an improvement, letting her position quilting rulers with her right hand and run the machine with her left hand & thumb. I don’t know how the switches are wired, but the wiring suggests either simple single-bit inputs or a small matrix.

    She also finds membrane switches difficult to press, so I’m in the process of replacing the control caps with something more to her liking.

    The current concept goes a little something like this:

    HQ Sixteen control caps - new caps
    HQ Sixteen control caps – new caps

    Stipulated: my art hand is weak.

    Those are little bitty SMD switches:

    HQ Sixteen control caps - new caps overview
    HQ Sixteen control caps – new caps overview

    They’re easy to locate by touch, with a stem length chosen to “feel right” when pushed.

    They have been grievously misapplied:

    HQ Sixteen control caps - switches
    HQ Sixteen control caps – switches

    The solid model has three main pieces and a lock for the ribbon cable:

    Control Button Caps - solid model - build view
    Control Button Caps – solid model – build view

    Those pockets keep the switches oriented while the glue cures.

    Two screws through the handlebar secure each cap. Handi-Quilter drove sheet metal screws into their OEM caps, distorting them enough to jam solidly into the handlebars. I’ve been reluctant to apply enough force to loosen them, so they remain frozen in place until the current quilt is done.

    The new plugs have recesses for M3 square nuts to make them easily removable. As with the handlebar angle adapters, I’ll glue the plugs into the caps.

    A slightly exploded view shows how the pieces fit together:

    Control Button Caps - solid model - show view gapped
    Control Button Caps – solid model – show view gapped

    The switch plate sits recessed into the cap to allow room for the label (about which, more later):

    Control Button Caps - solid model - show view assembled
    Control Button Caps – solid model – show view assembled

    The OpenSCAD source code as a GitHub Gist:

    // Handiquilter HQ Sixteen handlebar control button caps
    // Ed Nisley – KE4ZNU
    // 2025-04-05
    include <BOSL2/std.scad>
    Layout = "Show"; // [Show,Build,Grip,Body,Face,FaceBack,Plug,CableLock]
    // Angle w.r.t. handlebar
    FaceAngle = 30; // [10:45]
    // Separation in Show display
    Gap = 5; // [0:20]
    /* [Hidden] */
    HoleWindage = 0.2;
    Protrusion = 0.1;
    NumSides = 2*3*4;
    WallThick = 3.0;
    ID = 0;
    OD = 1;
    LENGTH = 2;
    Grip = [19.7,22.4,15.0]; // (7/8)*INCH = 22.2 mm + roughness, LENGTH=OEM insertion depth
    GripRadius = Grip[OD]/2;
    FoamOD = 34.0; // handlebar foam
    FoamRadius = FoamOD/2;
    SwitchBody = [6.3,6.3,4.0]; // does not include SMD leads
    SwitchStemOD = 3.5 + 2*HoleWindage;
    SwitchOC = 10.0; // center-to-center switch spacing
    LabelThick = 0.5; // laminated overlay
    FaceRim = 2.0; // rim around faceplate
    FaceThick = 2.0; // … plate thickness
    FaceDepth = FaceThick + LabelThick; // inset allowing for faceplate label
    CapOD = 38.0; // overall cap diameter
    CapTrim = FoamRadius; // flat trim on front
    CapBase = 5.0; // bottom thickness
    Cap = [FoamOD – FaceRim,CapOD,CapBase + CapOD*tan(FaceAngle)];
    echo(Cap=Cap);
    TargetSize = 4.0; // laser alignment targets
    TargetsOC = [40.0,40.0];
    Cable = [10.0,2.0,WallThick]; // aperture for cable lock
    ScrewAngles = [-45,45]; // mounting screws
    Screw = [2.0,3.0,7.0]; // OEM = sheet metal screw
    ScrewOffset = 6.0; // from top of grip tube
    SquareNut = [3.0,5.5,2.3 + 0.4]; // M3 square nut OD = side, LENGTH + inset allowance
    NutInset = GripRadius – sqrt(pow(GripRadius,2) – pow(SquareNut[OD],2)/4);
    PlugOA = [(Grip[ID] – 2*WallThick),(Grip[ID] – 1.0),(CapBase + ScrewOffset + 10.0)];
    echo(PlugOA=PlugOA);
    //———-
    // Define objects
    //—–
    // Handlebar tube
    module GripTube() {
    difference() {
    tube(3*Grip[LENGTH],GripRadius,Grip[ID]/2,anchor=TOP);
    for (a = ScrewAngles) {
    down(ScrewOffset) zrot(a-90)
    right(GripRadius)
    yrot(90) cylinder(d=Screw[OD],h=Screw[LENGTH],center=true,$fn=6);
    }
    }
    }
    //—–
    // SVG outline of faceplate for laser cuttery
    module FaceShape(Holes=true,Targets=false) {
    difference() {
    scale([1,1/cos(FaceAngle)])
    difference() {
    circle(d=(Cap[OD] – 2*FaceRim),$fn=144);
    fwd(CapTrim – FaceRim)
    square(Cap[OD],anchor=BACK);
    }
    if (Holes)
    for (i=[-1:1]) // arrange switch stem holes
    right(i*SwitchOC)
    zrot(180/8) circle(d=SwitchStemOD,$fn=32);
    }
    if (Targets)
    for (i = [-1,1], j = [-1,1])
    translate([i*TargetsOC.x/2,j*TargetsOC.y/2])
    square(2.0,center=true);
    }
    //—–
    // Faceplate backing sheet
    // Switch bodies indented into bottom, so flip to build
    module FacePlate(Thick=FaceThick,Holes=true) {
    difference() {
    linear_extrude(height=Thick,convexity=5)
    FaceShape(Holes);
    up(SwitchBody.z/4)
    for (i = [-1:1])
    right(i*SwitchOC)
    cube(SwitchBody,anchor=TOP);
    }
    }
    //—–
    // Cap body
    module CapBody() {
    $fn=48;
    up(CapBase + (Cap[OD]/2)*tan(FaceAngle)) xrot(FaceAngle)
    difference() {
    xrot(-FaceAngle)
    down(CapBase + (Cap[OD]/2)*tan(FaceAngle))
    difference() {
    cylinder(d=Cap[OD],h=Cap[LENGTH]);
    fwd(CapTrim) down(Protrusion)
    cube(2*Cap[LENGTH],anchor=BACK+BOTTOM);
    up(CapBase)
    difference() {
    cylinder(d=Cap[ID],h=Cap[LENGTH]);
    fwd(CapTrim – 2*FaceRim)
    cube(2*Cap[LENGTH],anchor=BACK+BOTTOM);
    }
    down(Protrusion)
    cylinder(d=Grip[ID],h=Cap[LENGTH]);
    }
    cube(2*Cap[OD],anchor=BOTTOM);
    down(FaceDepth)
    FacePlate(FaceDepth + Protrusion,Holes=false);
    }
    }
    //—–
    // Plug going into grip handlebar
    module CapPlug() {
    $fn=48;
    difference() {
    tube(PlugOA[LENGTH],id=PlugOA[ID],od=PlugOA[OD],anchor=BOTTOM)
    position(TOP)
    tube(CapBase,id=PlugOA[ID],od=Grip[ID],anchor=TOP);
    for (a = ScrewAngles)
    up(PlugOA.z – CapBase – ScrewOffset) zrot(a-90)
    right(PlugOA[ID]/2)
    yrot(90) {
    cube([SquareNut[OD],SquareNut[OD],SquareNut[LENGTH] + NutInset],center=true);
    zrot(180/6)
    cylinder(d=(SquareNut[ID] + 2*HoleWindage),h=PlugOA[ID],center=true,$fn=6);
    }
    }
    }
    //—–
    // Lock plate for ribbon cable
    module CableLock() {
    difference() {
    cuboid([2*Cable.x,PlugOA[ID],WallThick],rounding=WallThick/2,anchor=BOTTOM);
    for (j = [-1,1])
    back(j*Cable.y) down(Protrusion)
    cube(Cable + [0,0,2*Protrusion],anchor=BOTTOM);
    }
    }
    //———-
    // Build things
    if (Layout == "Grip") {
    color("Silver",0.5)
    GripTube();
    }
    if (Layout == "Face")
    FaceShape(Targets=true);
    if (Layout == "FaceBack")
    FacePlate();
    if (Layout == "Body")
    CapBody();
    if (Layout == "Plug")
    CapPlug();
    if (Layout == "CableLock")
    CableLock();
    if (Layout == "Show") {
    color("Green")
    up(CapBase)
    CableLock();
    color("Orange")
    down(Gap)
    down(PlugOA[LENGTH] – CapBase)
    CapPlug();
    color("Cyan",(Gap > 4)? 1.0 : 0.2)
    CapBody();
    color("White",(Gap > 4)? 1.0 : 0.5)
    up(Gap*cos(FaceAngle)) fwd(Gap*sin(FaceAngle))
    up(CapBase + (Cap[OD]/2)*tan(FaceAngle) – FaceDepth)
    back(FaceDepth*sin(FaceAngle)) xrot(FaceAngle)
    FacePlate();
    down(3*Gap) {
    color("Silver",0.5)
    GripTube();
    down(Gap)
    color("Gray",0.5)
    tube(3*Grip[LENGTH],FoamRadius,Grip[OD]/2,anchor=TOP);
    }
    }
    if (Layout == "Build") {
    right((Gap + Cap[OD])/2)
    CapBody();
    left((Gap + Cap[OD])/2)
    zrot(180) up(FaceThick) xrot(180)
    FacePlate();
    fwd(Gap + Cap[OD])
    up(PlugOA[LENGTH]) xrot(180) zrot(180)
    CapPlug();
    fwd(Cap[OD]/2)
    zrot(90)
    CableLock();
    }

  • HQ Sixteen: Bobbin Winder Split Shaft Tweak

    HQ Sixteen: Bobbin Winder Split Shaft Tweak

    The HQ Sixteen has much larger bobbins than Mary’s Kenmore and Juki sewing machines. It also came with a dedicated bobbin winder:

    HQ Sixteen bobbin winder - overview
    HQ Sixteen bobbin winder – overview

    That thing has a distinct Industrial Revolution aspect compared to the BarbieCore bobbin winder I laid hands on a while ago.

    Out of the photo on the right:

    • The thread cone and guide tower
    • The thread tension disks

    Mary had been having trouble winding the bobbins, as the tension seemed entirely too low and the thread did not lay smoothly across the bobbin, so she asked me to take a look.

    The motor shaft has an O-ring for friction drive against the large wheel driving the shaft with the bobbin on the other end. The small silver lever over on the left flips an over-center lock pressing the wheel against the O-ring and tripping the microswitch in the aluminum housing, thus turning the motor on. The bobbin fills until a small finger monitoring the thread level flips the lock back over center, the wheel disengages, the switch turns the motor off, and a spring drives the wheel against the rubber rod in the upper left.

    Which worked well, but all the bobbins had a loose-to-sloppy fit on the shaft, to the extent that the shaft really couldn’t drive them against any thread tension.

    Loosening the screw holding the drive wheel on the shaft lets it slip off and the shaft slides out to the front:

    HQ Sixteen bobbin winder - split shaft
    HQ Sixteen bobbin winder – split shaft

    The sides of the split shaft should press firmly against the bobbin core, but that just wasn’t happening.

    Measuring a dozen bobbins showed most had an ID of 6.04 mm, with a few around 6.01 mm; unsurprisingly, the latter had the best, albeit still loose, fit. Conversely, the split shaft had two isolated points 6.01 mm apart across a diameter, with the remainder around 5.95 mm. Those are not large differences, but it was obvious why the bobbins didn’t wind correctly.

    I filed some graunch off the split edges, then gently pushed the Designated Prydriver into the end of the split to spread the sides juuuust a little bit, until all the bobbins pushed on firmly and fit snugly:

    HQ Sixteen bobbin winder - split shaft test fit
    HQ Sixteen bobbin winder – split shaft test fit

    It reassembled in reverse order and we’ll see how it behaves during the next marathon bobbin-filling session.

  • 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.

  • Wrights SideWinder Bobbin Winder: Laying On Of Hands

    Wrights SideWinder Bobbin Winder: Laying On Of Hands

    Mary attempted to wind a bobbin using the Wrights SideWinder Bobbin Winder she got from a friend:

    Sidewinder bobbin winder - top
    Sidewinder bobbin winder – top

    The URL in the instructions is dead, but the Sidewinder lives on as the Simplicity SideWinder Portable Bobbin Winder:

    Simplicity Sidewinder Bobbin Winder
    Simplicity Sidewinder Bobbin Winder

    Looks kinda pallid to me, too, although hardcore BarbieCore is also most definitely not our thing.

    Anyhow, the motor didn’t even twitch when pressing the button, so after I verified the two AA alkaline cells were Just Fine, I laid it on the Electronics Bench and popped the top to see what was the matter:

    Sidewinder bobbin winder - interior wiring
    Sidewinder bobbin winder – interior wiring

    For the record, the red and black wires at the battery compartment are exactly reversed from what you might expect based on, say, the colors of your multimeter probes. I know better, but it comes as a surprise every time.

    The pushbutton switch pulls in the relay (red block in the middle), which latches on until the bobbin fills and the accumulated thread lifts the finger riding on the bobbin to rotate the white cam (under the motor), thus opening the switch (black block), releasing the relay, and shutting off the motor.

    Which, of course, worked perfectly after I stuck the alkalines back in place on the bench and poked the button to watch the proceedings.

    It’s all back together again and continues to run, so I’ll declare victory until the next time she fills a bobbin and, predictably, it doesn’t start.

  • Juki TL-2010Q Bottom Cover

    Juki TL-2010Q Bottom Cover

    Mary gave her Juki TL-2010Q sewing machine a deep cleaning & oiling, deputizing me to remove & replace the covers.

    For the record, standing the machine on its left end is the least-awful way to get the bottom cover off and on:

    Juki TL2010Q - bottom cover on end
    Juki TL2010Q – bottom cover on end

    You must remove all six of those husky screws; the black feet remain firmly stuck in their recesses. It’s not particularly stable in that orientation, so keep a firm hand on the top to prevent an expensive fall.

    I laid it down for the rest of the session:

    Juki TL2010Q - interior cleaning
    Juki TL2010Q – interior cleaning

    She was unenthusiastic about wearing my headband light. Maybe next time.

    It reassembled in reverse order and, after a brief tussle with the bobbin winder finger in the upper covers, runs smoothly.