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.

Category: Machine Shop

Mechanical widgetry

  • Epoxy Joint: Test to Destruction

    Some years ago, I put the LED power supply for one of the Kenmore 158 machines atop a plastic project box with an adjustable boost supply inside:

    Needle LEDs power supply - exterior
    Needle LEDs power supply – exterior

    The LEDs connected through a coaxial power jack on the far side of the box, held in place with a generous blob of epoxy:

    Needle LEDs power supply - interior
    Needle LEDs power supply – interior

    A closer look:

    Kenmore 158 COB LED - power supply jack
    Kenmore 158 COB LED – power supply jack

    I’m adding a light bar, similar to the one now going onto the Juki TL-2010Q, which needs a direct connection to the 12 VDC supply. Rather than add another coaxial jack, I ripped out the existing jack and installed a DE-9 connector (serial ports being a fading memory by now), giving me an opportunity to test the epoxy joint:

    Kenmore 158 COB LED - power supply jack - epoxy bond
    Kenmore 158 COB LED – power supply jack – epoxy bond

    Which required grabbing the connector with a pair of pliers and twisting / bending / abusing until it popped free. I don’t know how much grip the scored lines added to the joint, but the connector definitely didn’t give up without a fight; it wasn’t going to fall off on its own.

    To be fair, the epoxy had a better grip on the coaxial jack than on the plastic plate, perhaps because the bottom of the jack had all manner of nooks and pins intended for PCB mounting. Ya use what ya got, sez I.

    The new connector looks exactly like it should and, because it’s held in place by a pair of screws, should last forever, too:

    Kenmore 158 COB LED - power supply
    Kenmore 158 COB LED – power supply

    More about all that, later …

  • Juki TL-2010Q: COB LED Light Bar

    Mary needed more light under the arm of her Juki TL-2010Q sewing machine, so I proposed a 12 V 6 W COB LED module instead of the high-density LED strips I used on her Kenmore 158s:

    Kenmore 158 Sewing Machine - Cool white LEDs - rear no flash
    Kenmore 158 Sewing Machine – Cool white LEDs – rear no flash

    Because the COB LEDs dissipate 6W, far more power than I’m comfortable dumping into a 3D printed structure, I redefined a length of aluminum shelf bracket extrusion to be a heatsink and epoxied the module’s aluminum back plate thereto:

    Juki TL-2010Q COB LED - test lighting
    Juki TL-2010Q COB LED – test lighting

    Unlike the flexible LED strips, the COB LED modules have no internal ballast resistors and expect to run from a constant-current supply. Some preliminary testing showed we’d want less than the maximum possible light output, so a constant-voltage supply and a few ohms of ballast would suffice:

    Juki TL-2010Q COB LED - ballast resistor test
    Juki TL-2010Q COB LED – ballast resistor test

    With all that in hand, the heatsink extrusion cried out for smooth endcaps to control the wires and prevent snagging:

    TL-2010Q COB LED Light Bars - end caps - Show layout
    TL-2010Q COB LED Light Bars – end caps – Show layout

    The central hole in the left cap passes 24 AWG silicone wires from the power supply, with 28 AWG silicone wires snaking down through the L-shaped rectangular cutouts along the extrusion to the LED module’s solder pads.

    The model includes built-in support:

    TL-2010Q COB LED Light Bars - end caps - Build layout
    TL-2010Q COB LED Light Bars – end caps – Build layout

    Assuming the curved ends didn’t need support / anchors holding them down turned out to be completely incorrect:

    Juki TL-2010Q COB LED - curled endcaps
    Juki TL-2010Q COB LED – curled endcaps

    Fortunately, those delicate potato chips lived to tell the tale and, after a few design iterations, everything came out right:

    Juki TL-2010Q COB LED - heatsink endcap - internal connections
    Juki TL-2010Q COB LED – heatsink endcap – internal connections

    The “connector”, such as it is, serves to make the light bar testable / removable and the ballast resistor tweakable, without going nuts over the details. The left side is an ordinary pin header strip held in place with hot melt glue atop the obligatory Kapton tape, because the heatsink doesn’t get hot enough to bother the glue. The right side is a pair of two-pin header sockets, also intended for PCB use. The incoming power connects to one set and the ballast resistor to the other, thusly:

    Juki TL-2010Q COB LED - light bar connector diagram
    Juki TL-2010Q COB LED – light bar connector diagram

    The diagram is flipped top-to-bottom from the picture, but you get the idea. Quick, easy, durable, and butt-ugly, I’d say.

    The next step was to mount it on the sewing machine and steal some power, but that’s a story for another day.

    The relevant dimensions for the aluminum extrusion:

    Aluminum shelf bracket extrusion - dimensions
    Aluminum shelf bracket extrusion – dimensions

    The OpenSCAD source code as a GitHub Gist:

    // Juki TL-2010Q Sewing Machine – COB LED Light Bars
    // Ed Nisley – KE4ZNU
    // 2019-01
    /* [Layout Options] */
    Layout = "Build"; // [Bracket,Endcap,Show,Build]
    Wiring = [1,0]; // left and right wire holes
    BuildSupport = true;
    /* [Extrusion Parameters] */
    ThreadWidth = 0.40;
    ThreadThick = 0.20;
    HoleWindage = 0.2;
    Protrusion = 0.1;
    //—–
    // Shelf bracket used as LED heatsink
    /* [Hidden] */
    LEDPlate = [15.0,2.4]; // 2D coords from end of LED
    BktOuter = [15.9,12.6 + LEDPlate.y]; // 2D coords as seen from end of extrusion
    BktWalls = [1.3,2.2 + LEDPlate.y]; // … extend base to cover LED
    BktCap = [2.5,3.0];
    BracketPoints = [
    [0,0],
    [BktOuter.x,0],
    [BktOuter.x,BktOuter.y],
    [(BktOuter.x – BktCap.x),BktOuter.y],
    [(BktOuter.x – BktCap.x),(BktOuter.y – BktCap.y)],
    [(BktOuter.x – BktWalls.x),(BktOuter.y – BktCap.y)],
    [(BktOuter.x – BktWalls.x),BktWalls.y],
    [BktWalls.x,BktWalls.y],
    [BktWalls.x,(BktOuter.y – BktCap.y)],
    [BktCap.x,(BktOuter.y – BktCap.y)],
    [BktCap.x,BktOuter.y],
    [0,BktOuter.y],
    [0,0]
    ];
    BracketPlugInsert = 10.0; // distance into bracket end
    WireOD = 1.6; // COB LED jumpers – 24 AWG silicone
    WireOC = BktOuter.x – 2*BktWalls.x – WireOD;
    echo(str("Wire OC: ",WireOC));
    CableOD = 4.0; // power entry cable
    CapSides = 2*3*4;
    //—–
    // 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);
    }
    //—–
    // Endcap with smooth rounding
    // Wires = true to punch holes for LED wires
    module Endcap(Wires = true) {
    // arc length to flatten inside of cap
    // not needed to build in normal orientation
    m = BktOuter.x/2 – sqrt(pow(BktOuter.x/2,2) – pow(BktOuter.x – 2*BktCap.x,2)/4);
    difference() {
    translate([0,0,BktOuter.y/2]) // basic endcap shape
    intersection() {
    cylinder(d=BktOuter.x,h=BktOuter.y,$fn=CapSides,center=true);
    rotate([90,0,0])
    rotate(180/CapSides)
    cylinder(d=BktOuter.y,h=BktOuter.x,$fn=CapSides,center=true);
    }
    translate([-BracketPlugInsert,0,0]) // extrusion + LED plate
    Bracket(BracketPlugInsert);
    if (false) // flatten inner end
    translate([-BktOuter.y + m,0,BktOuter.y/2])
    cube([BktOuter.y,BktOuter.x,BktOuter.y],center=true);
    if (Wires) {
    for (j=[-1,1]) // COB LED connections
    translate([WireOD – BktOuter.x/2,j*WireOC/2,(BktWalls.y + WireOD – Protrusion)/2])
    rotate([0,00,0])
    cube([BktOuter.x,WireOD + Protrusion,BktWalls.y + WireOD + Protrusion],center=true);
    translate([0,0,BktOuter.y/2]) // power entry / exit
    rotate([0,90,0])
    translate([0,0,-BktOuter.x])
    rotate(180/6)
    PolyCyl(CableOD,2*BktOuter.x,6);
    }
    }
    }
    // Totally ad-hoc support structures
    module Support(Wiring = false) {
    Spacing = 4*ThreadWidth;
    NumBars = floor((BktOuter.y/2) / Spacing);
    echo(str("Support bars: ",NumBars));
    color("Yellow") {
    render() difference() {
    union() {
    for (i=[1:NumBars]) // inside extrusion
    translate([-i*Spacing,0,(BktWalls.y + WireOD)/2])
    cube([2*ThreadWidth,BktOuter.x – 0*BktWalls.x,BktWalls.y + WireOD],center=true);
    if (true)
    for (j=[-1:1]) // reduce outside curve uplift
    translate([0.3*BktOuter.y,j*BktOuter.x/3,BktOuter.y/10])
    cube([BktOuter.y/3,2*ThreadWidth,BktOuter.y/5],center=true);
    }
    minkowski() { // all-around clearance
    Endcap(Wiring);
    cube(2.0*ThreadThick,center=true);
    }
    if (Wiring) {
    translate([0,0,BktOuter.y/2]) // remove rubble from wire bore
    rotate([0,90,0])
    translate([0,0,-BktOuter.x])
    rotate(180/6)
    PolyCyl(CableOD,2*BktOuter.x,6);
    }
    }
    if (false)
    translate([-(BktOuter.x/4 + ThreadWidth),0,ThreadThick/2]) // adhesion pad
    cube([BktOuter.x/2,BktOuter.x – BktWalls.x,ThreadThick],center=true);
    // translate([BktOuter.x/3,0,ThreadThick/2]) // adhesion pad
    // cube([0.3*BktOuter.x,0.7*BktOuter.x,ThreadThick],center=true);
    if (false)
    for (j = [-1:1]) // tie pad to bottom of cap
    translate([-(4*ThreadWidth)/2,j*(BktOuter.x – 2*ThreadWidth)/2,ThreadThick/2])
    cube([4*ThreadWidth,2*ThreadWidth,ThreadThick],center=true);
    }
    }
    //—–
    // Heatsink extrusion + LED plate
    // Centered on Y with Length extending in +X
    module Bracket(Length = 10)
    translate([0,-BktOuter.x/2,0])
    rotate([90,0,90])
    linear_extrude(height = Length,convexity=3)
    polygon(points=BracketPoints);
    //—–
    // Build things
    if (Layout == "Bracket")
    Bracket();
    if (Layout == "Endcap")
    Endcap();
    if (Layout == "Show") {
    translate([BktOuter.x,0,0])
    Endcap(Wiring[1]);
    translate([-BktOuter.x,0,0])
    rotate(180)
    Endcap(Wiring[0]);
    color("Yellow",0.35)
    translate([-BktOuter.x/2,0,0])
    Bracket(BktOuter.x);
    }
    if (Layout == "Build") {
    translate([BktOuter.y,0,0]) {
    Endcap(Wiring[0]);
    if (BuildSupport)
    Support(Wiring[0]);
    }
    translate([-BktOuter.y,0,0]) {
    Endcap(Wiring[1]);
    if (BuildSupport)
    Support(Wiring[1]);
    }
    }

  • DSO150: USB Battery Charger

    Continuing the process of silk-purse-izing the DSO150, a batch of USB 1S lithium battery charger modules arrived from halfway around the planet. I drilled & filed a suitable hole / slot / aperture in one of the few remaining spots in the case, then stuck the PCB to the bottom with good foam tape:

    DSO150 - USB charger - internal layout
    DSO150 – USB charger – internal layout

    Because the charger includes cell protection circuitry, I replaced the original protected 18650 cell with a bare cell sporting solder tabs. The cell should go directly to the charger board, but the switch disconnects the + wire; I’m unwilling to believe the charger won’t slowly and inexorably discharge the cell if I don’t use the DSO150 for a few months. It could happen.

    A label makes the hole look almost professional:

    DSO150 - USB charger - Micro-B jack
    DSO150 – USB charger – Micro-B jack

    Well, makes it look Good Enough™, I suppose.

    The power switch gets a label, too:

    DSO150 - USB charger - battery switch
    DSO150 – USB charger – battery switch

    Flipping the switch ON lights up the scope from the battery.

    The charger (sensibly) will not route power from the USB port to the scope without a battery, so you must plug in a USB source with the switch ON, then flip the switch OFF. I don’t know why you’d want to do that, but there you go.

    Now it’s a real portable instrument, with all the inconvenience of managing a built-in lithium cell.

  • Vacuum Tube LEDs: Radome Prototype

    Definitely not a vacuum tube:

    Arduino Pro Mini - NP-BX1 cell - SK6812 - blue phase
    Arduino Pro Mini – NP-BX1 cell – SK6812 – blue phase

    It’s running the same firmware, though, with the Arduino Pro Mini and the LEDs drawing power from the (mostly) defunct lithium battery.

    The LED holder is identical to the Pirhana holder, with a 10 mm diameter recess punched into it for the SK6812 PCB:

    Astable Multivibrator Battery Holder - Neopixel PCB - Slic3r
    Astable Multivibrator Battery Holder – Neopixel PCB – Slic3r

    Those embossed legends sit in debossed rectangles for improved legibility. If I repeat it often enough, I’m sure I’ll remember which is which.

    The 3.6 V (and declining) power supply may not produce as much light from the SK6812 LEDs, but it’s entirely adequate for anything other than a well-lit room. The 28 AWG silicone wires require a bit of careful dressing to emerge from the holes in the radome holder:

    SK6812 LED PCB - Pirhana holder wiring
    SK6812 LED PCB – Pirhana holder wiring

    The firmware cycles through all the usual colors:

    Arduino Pro Mini - NP-BX1 cell - SK6812 - orange phase
    Arduino Pro Mini – NP-BX1 cell – SK6812 – orange phase

    A pair of tensilized 22 AWG copper wires support the Pro Mini between the rear struts. The whole affair looks a bit heavier than I expected, though, so I should reduce the spider to a single pair of legs with a third hole in the bottom of the LED recess for the data wire.

    The OpenSCAD source code needs some refactoring and tweaking, but the Pirhana LED solid model version of the battery holder should give you the general idea.

  • Sony HDR-AS30V Helmet Camera: MicroSD Card Spacer

    Sony tried, they really tried, to make their proprietary Memory Stick flash memory cards catch on, but the slot in their HDR-AS30V Action / Helmet camera accepts both Memory Stick Micro and MicroSD cards. The two cards have slightly different sizes, the AS30V’s dual-purpose slot allows MicroSD cards to sit misaligned with the contacts, and the camera frequently kvetches about having no card.

    The only solution seemed to be starting the camera while watching the display to ensure the card worked, but it would sometimes joggle out of position during a ride.

    I cut out a tiny polypropylene rectangle(-ish) spacer to fill the Memory Stick side of the slot, sized to fit between the spring fingers holding the MicroSD card against its contacts:

    Sony HDR-AS30V Camera - MicroSD card and spacer
    Sony HDR-AS30V Camera – MicroSD card and spacer

    Not the best cutting job I’ve ever done, but it was an iterative process and that’s where I stopped. If this works and I have need for another / better spacer, I promise to do better.

    The spacer’s somewhat mottled appearance comes from tapeless sticky (an adhesive layer on a peel-off backing: inverse tape!) applied to the top side, which will affix it to the slot. I’d rather glue the spacer to the MicroSD card, but then the card wouldn’t fit in the USB 3.0 adapter I use to transfer the files.

    The chips along the left edge of silkscreen come from my fingernail, because pressing exactly there seems to be the best way to force the damn thing into the proper alignment.

    So the slot + spacer looks like this:

    Sony HDR-AS30V Camera - dual-card slot with spacer
    Sony HDR-AS30V Camera – dual-card slot with spacer

    The MicroSD card fits in the far side of the slot, facing toward you with contacts downward, thusly:

    Sony HDR-AS30V Camera - MicroSD card with spacer
    Sony HDR-AS30V Camera – MicroSD card with spacer

    And then It Just Works™, at least on the very few rides we’ve gotten in during December and early January.

    Incidentally, the blue and exceedingly thin latch finger holding the battery in place will snap, should you drop the camera on its non-lens end from any height. Conversely, should you drop it on the lens end, you can kiss the optics goodbye. Your choice.

  • Tensilizing Copper Wire

    The “bus bars” on the battery holders are 14 AWG copper wire:

    Astable - NP-BX1 base - detail
    Astable – NP-BX1 base – detail

    Slightly stretching the wire straightens and work-hardens it, which I’d been doing by clamping one end in the bench vise, grabbing the other in a Vise-Grip, and whacking the Vise-Grip with a hammer. The results tended to be, mmm, hit-or-miss, with the wires often acquiring a slight bend due to an errant whack.

    I finally fished out the slide hammer Mary made when we took a BOCES adult-ed machine shop class many many years ago:

    Slide Hammer
    Slide Hammer

    The snout captured the head of a sheet metal screw you’d previously driven into a dented automobile fender. For my simple purposes, jamming the wire into the snout and tightening it firmly provides a Good Enough™ grip:

    Slide Hammer Snout
    Slide Hammer Snout

    Clamp the other end of the wire into the bench vise, pull gently on the hammer to take the slack out of the wire, and slap the weight until one end of the wire breaks.

    With a bit of attention to detail, the wires come out perfectly straight and ready to become Art:

    Straightened 14 AWG Copper Wires
    Straightened 14 AWG Copper Wires

    The wires start out at 1.60 mm diameter (14 AWG should be 1.628, but you know how this stuff goes) and break around 1.55 mm. In principle, when the diameter drops 3%, the area will decrease by 6% and the length should increase by 6%, but in reality the 150 mm length stretches by only 1 mm = 1%, not 3 mm. My measurement-fu seems weak.

    Highly recommended, particularly when your Favorite Wife made the tool.

    The Harbor Freight version comes with a bunch of snouts suitable for car repair and is utterly unromantic.

  • Minilathe MT3 Spindle Collet Fitting

    I’ve used the LMS set of inch-size MT3 spindle collets on occasion, but releasing them required an unseemly amount of drawbar battering. It recently occurred to me to check their fit in the spindle taper:

    Minilathe - MT3 collet - taper test
    Minilathe – MT3 collet – taper test

    Huh.

    The only place they touch the spindle is right around the base, so it’s no wonder they clamp poorly and release grudgingly. I tried several others with the same result.

    Cross-checking shows a much closer fit along the entire length of the dead center, so it’s not the spindle’s fault:

    Minilathe - Dead Center - MT3 taper check
    Minilathe – Dead Center – MT3 taper check

    Stipulated: we’re not talking toolroom precision here

    I set the collets on centers:

    Minilathe - MT3 collet - drive setup
    Minilathe – MT3 collet – drive setup

    And proceeded to file away the offending section to move the clamping force closer to the business end of the collet:

    Minilathe - MT3 collet - filed result
    Minilathe – MT3 collet – filed result

    I did the small collets, the ones I’m most likely to need, and left the big ones for another rainy day.

    They don’t have much clamping range and seem good only for exact-inch-size rods.

    I should lay in a stock of ER16 and maybe ER32 collets for small stuff.