The reel of cool-white LEDs finally arrived from halfway around the planet and, based on the ahem customer feedback concerning the earlier prototype warm white LED strip lights for Mary’s sewing machine, I went with two parallel strips on each mount:

Natural PLA provides a nice, crystalline appearance:

Cool white LEDs have somewhat higher lumen/watt efficiency, but the real gain came from doubling the number of LEDs:

I overvolted the warm white LEDs to 14 V to get closer to 20 mA/segment, but the cool white ones run pretty close to 20 mA at 12 V, so I didn’t bother.
That black Gorilla Tape remains butt-ugly:

Obviously, I must find some white duct tape…
Commercial versions of this hack secure the wiring with little white clips and foam tape, so I should conjure up something like that. Mary specifically did not want the lights affixed under the arm, though, so those things weren’t even in the running.
The OpenSCAD source code widens the mount and moves the wiring conduit a little bit, to simplify the connections to both strips, but is otherwise identical to the earlier version:
// LED Strip Lighting Brackets for Kenmore Model 158 Sewing Machine // Ed Nisley - KE4ZNU - March 2014 Layout = "Build"; // Build Show Channels Strip //- Extrusion parameters must match reality! // Print with 2 shells and 3 solid layers ThreadThick = 0.20; ThreadWidth = 0.40; HoleWindage = 0.2; // extra clearance Protrusion = 0.1; // make holes end cleanly AlignPinOD = 1.70; // assembly alignment pins: filament dia inch = 25.4; function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); //---------------------- // Dimensions Segment = [25.0,10.0,3.0]; // size of each LED segment SEGLENGTH = 0; SEGWIDTH = 1; SEGHEIGHT = 2; WireChannel = 3.0; // wire routing channel StripHeight = 12.0; // sticky tape width StripSides = 8*4; DefaultLayout = [1,2,"Wire","NoWire"]; NUMSEGS = 0; NUMSTRIPS = 1; WIRELEFT = 2; WIRERIGHT = 3; EndCapSides = StripSides; CapSpace = 2.0; // build spacing for endcaps BuildSpace = 3.0; // spacing between objects on platform //---------------------- // Useful routines module PolyCyl(Dia,Height,ForceSides=0) { // based on nophead's polyholes Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2); FixDia = Dia / cos(180/Sides); cylinder(r=(FixDia + HoleWindage)/2, h=Height, $fn=Sides); } module ShowPegGrid(Space = 10.0,Size = 1.0) { RangeX = floor(100 / Space); RangeY = floor(125 / Space); for (x=[-RangeX:RangeX]) for (y=[-RangeY:RangeY]) translate([x*Space,y*Space,Size/2]) %cube(Size,center=true); } //-- The negative space used to thread wires into the endcap module MakeWireChannel(Layout = DefaultLayout,Which = "Left") { EndCap = [(2*WireChannel + 1.0),Layout[NUMSTRIPS]*Segment[SEGWIDTH],StripHeight]; // radii of end cap spheroid HalfSpace = EndCap[0] * ((Which == "Left") ? 1 : -1); render(convexity=2) translate([0,Segment[SEGWIDTH]/2,0]) intersection() { union() { cube([2*WireChannel,WireChannel,EndCap[2]],center=true); translate([-2*EndCap[0],0,EndCap[2]/2]) rotate([0,90,0]) rotate(180/6) PolyCyl(WireChannel,4*EndCap[0],6); } translate([HalfSpace,0,(EndCap[2] - Protrusion)]) { cube(2*EndCap,center=true); } } } //-- The whole strip, minus wiring channels module MakeStrip(Layout = DefaultLayout) { EndCap = [(2*WireChannel + 1.0),Layout[NUMSTRIPS]*Segment[SEGWIDTH],StripHeight]; // radii of end cap spheroid BarLength = Layout[NUMSEGS] * Segment[SEGLENGTH]; // central bar length hull() difference() { for (x = [-1,1]) // endcaps as spheroids translate([x*BarLength/2,0,0]) resize(2*EndCap) rotate([0,90,0]) sphere(1.0,$fn=EndCapSides); translate([0,0,-EndCap[2]]) cube([2*BarLength,3*EndCap[1],2*EndCap[2]],center=true); translate([0,-EndCap[1],0]) cube([2*BarLength,2*EndCap[1],3*EndCap[2]],center=true); } } //-- Cut wiring channels out of strip module MakeMount(Layout = DefaultLayout) { BarLength = Layout[NUMSEGS] * Segment[SEGLENGTH]; difference() { MakeStrip(Layout); if (Layout[WIRELEFT] == "Wire") translate([BarLength/2,0,0]) MakeWireChannel(Layout,"Left"); if (Layout[WIRERIGHT] == "Wire") translate([-BarLength/2,0,0]) MakeWireChannel(Layout,"Right"); } } //- Build it ShowPegGrid(); if (Layout == "Channels") { translate([ (2*WireChannel + 1.0),0,0]) MakeWireChannel(DefaultLayout,"Left"); translate([-(2*WireChannel + 1.0),0,0]) MakeWireChannel(DefaultLayout,"Right"); } if (Layout == "Strip") { MakeStrip(DefaultLayout); } if (Layout == "Show") { MakeMount(DefaultLayout); } if (Layout == "Build") { translate([0,(3*Segment[SEGWIDTH]),0]) MakeMount([1,2,"Wire","Wire"]); // rear left side, vertical translate([0,0,0]) MakeMount([5,2,"Wire","NoWire"]); // rear top, across arm translate([0,-(3*Segment[SEGWIDTH]),0]) MakeMount([6,2,"NoWire","Wire"]); // front top, across arm }
Not sure if it’s still in white, but the tape for Tyvek house wrap might do the trick…
I made a quilting frame for Julie (adapted from a design on the interwebs), but she hasn’t tried it yet. She’s nervous about using the Elna with the frame and the Brother is a pretty lightweight machine. Alas, I gave up on the mutant ’50s Singer when we moved. (Early style Singer machine, with a spiffy paint job and case from a Japanese outfit, called a Sew Best.) If the needle could take it, the beast would sew it. I did do stands so she can use the frame for hand methods…
I keep telling her she needs one of those gasoline-powered chain-drive Husqvarnas, but …
Thats bright enough for my mom with glaucoma. Remember “what you sew, shall you rip”!
It’s not quite as bright as the pictures show, but we’re getting closer to having enough light: she works to tighter tolerances in cloth than I do in metal…