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

  • Screw Cutting Fixture vs. Lathe Ways

    A length of aluminum hex bar became a nice 10-32 screw trimmer:

    Screw cutting fixture - 10-32 - first cut
    Screw cutting fixture – 10-32 – first cut

    The hex neatly fits a 5/8 inch wrench, so I can tighten the jam nuts enough to run the lathe forward, part off the screw, and clean up the end just fine.

    Unfortunately, the second test cut didn’t work nearly so well:

    Screw cutting fixture - 10-32 - wrecked
    Screw cutting fixture – 10-32 – wrecked

    With the cross-slide gib adjusted to the snug side of easy, the cut put enough pressure on the parting tool to lift the way on the tailstock side about 4 mil = 0.1 mm. The parting tool submarined under the cut, dislodged the fixture, and didn’t quite stall the motor while the chuck jaws ate into the aluminum.

    Well, that was a learning experience.

    After tightening the cross-slide gib to the far side of hard-to-turn:

    • Put a longer screw in the fixture
    • Grab it in the tailstock drill chuck
    • Crunch the hex end of the fixture in the spindle chuck
    • Remove the screw through the spindle (*)
    • Put a slight taper on the end of the fixture threads with a center drill
    • Deploy the live center to support the fixture

    Like this:

    Screw cutting fixture - 10-32 - rechucked
    Screw cutting fixture – 10-32 – rechucked

    Turns out that angling the bit by 10° dramatically reduces chatter. If I had BR and BL turning tools, I’d be using them with the QCTP set to 0°, but they weren’t included in the set that came with the lathe.

    It’s a good thing I’m not fussy about the diameter of that cylindrical section:

    Screw cutting fixture - 10-32 - reshaped
    Screw cutting fixture – 10-32 – reshaped

    I knew the craptastic lathe ways needed, mmmm, improvement and it’s about time to do something.

    (*) By concatenating all my ¼ inch socket extension bars into an absurd noodle capped with square-to-hex adapter holding a Philips bit.

  • Improved Cable Clips

    Those ugly square cable clips cried out for a cylindrical version:

    LED Cable Clips - round - solid model
    LED Cable Clips – round – solid model

    Which prompted a nice button:

    LED Cable Clips - button - solid model
    LED Cable Clips – button – solid model

    Which suggested the square version needed some softening:

    LED Cable Clips - square - solid model
    LED Cable Clips – square – solid model

    Apart from the base plate thickness, all the dimensions scale from the cable OD; I’ll be unsurprised to discover small cables don’t produce enough base area for good long-term foam tape adhesion. Maybe the base must have a minimum size or area?

    I won’t replace the ones already on the saw, but these will look better on the next project…

    The OpenSCAD source code as a GitHub Gist:

    // Cable Clips
    // Ed Nisley – KE4ZNU – October 2014
    // February 2017 – adapted for USB cables
    Layout = "Show"; // Show Build
    Style = "Button"; // Square Round Button
    //- Extrusion parameters must match reality!
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    HoleWindage = 0.2; // extra clearance
    Protrusion = 0.1; // make holes end cleanly
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    //———————-
    // Dimensions
    CableOD = 3.8; // cable jacket
    Base = [4*CableOD,4*CableOD,3*ThreadThick]; // overall base and slab thickness
    CornerRadius = CableOD/2; // radius of square corners
    CornerSides = 4*4; // total sides on square corner cylinders
    NumSides = 6*3; // total sides for cylindrical base
    //– Oval clip with central passage
    module CableClip() {
    intersection() {
    if (Style == "Square")
    hull()
    for (i=[-1,1], j=[-1,1])
    translate([i*(Base[0]/2 – CornerRadius),j*(Base[1]/2 – CornerRadius),0])
    rotate(180/CornerSides) {
    cylinder(r=CornerRadius,h=Base[2] + CableOD/2,$fn=CornerSides,center=false);
    translate([0,0,Base[2] + CableOD/2])
    sphere(d=CableOD,$fn=CornerSides);
    }
    else if (Style == "Round")
    cylinder(d=Base[0],h=Base[2] + 1.00*CableOD,$fn=NumSides);
    else if (Style == "Button")
    resize(Base + [0,0,2*(Base[2] + CableOD)])
    sphere(d=Base[0],$fn=NumSides);
    union() {
    translate([0,0,Base[2]/2]) // base defines slab thickness
    cube(Base,center=true);
    for (j=[-1,1]) // retaining ovals
    translate([0,j*(Base[1]/2 – 0.125*(Base[1] – CableOD)/2),(Base[2] – Protrusion)])
    resize([Base[0]/0.75,0,0])
    cylinder(d1=0.75*(Base[1]-CableOD),
    d2=(Base[1]-CableOD)/cos(0*180/NumSides),
    h=(CableOD + Protrusion),
    center=false,$fn=NumSides);
    }
    }
    if (Layout == "Show")
    color("Green",0.2)
    translate([0,0,Base[2] + CableOD/2])
    rotate([0,90,0])
    cylinder(d=CableOD,h=2*Base[0],center=true,$fn=48);
    }
    //———————-
    // Build it
    CableClip();

     

  • Screw Cutting Fixture: Full-thread Aluminum

    By and large, when you follow the recipe, you get the expected result:

    Screw cutting fixture - M3x0.5 aluminum - side view
    Screw cutting fixture – M3x0.5 aluminum – side view

    That’s another length of the same aluminum rod, this time with a full-length M3x0.5 thread down the middle, and a screw with a neatly trimmed end.

    Running the lathe spindle in reverse prevents the screw from loosening the jam nuts on the left:

    Screw cutting fixture - M3x0.5 aluminum - in lathe chuck
    Screw cutting fixture – M3x0.5 aluminum – in lathe chuck

    Running the spindle forward does move the screw enough to loosen the nuts. Perhaps I should put wrench flats on the big end of the fixture so I can really torque the nuts.

    That front nut was mostly decorative, rather than tight, because I didn’t expect the first attempt to work nearly as well as it did. A bit of filing to taper the end of the thread and it was all good.

    That was easy…

     

  • Blog Backup: Incremental Media

    The recipe for incrementally copying media files since the previous blog backup works like this:

    grep attachment_url *xml > attach.txt
    sed 's/^.*http/http/' attach.txt | sed 's/<\/wp.*//' > download.txt
    wget -nc -w 2 --no-verbose --random-wait --force-directories --directory-prefix=Media/ -i download.txt
    

    The -nc sets the “no clobber” option, which (paradoxically) simply avoids downloading a duplicate of an existing file. Otherwise, it’d download the file and glue on a *.1 suffix, which isn’t a desirable outcome. The myriad (thus far, 0.6 myriad) already-copied files generate a massive stream of messages along the lines of File ‘mumble’ already there; not retrieving.

    Adding --no-verbose will cut the clutter and emit some comfort messages.

    There seems no way to recursively fetch only newer media files directly from the WordPress file URL with -r -N; the site redirects the http:// requests to the base URL, which doesn’t know about bare media files and coughs up a “not found” error.

  • MicroMark Bandsaw: Blackened Table

    The really bright LED worklights I added to the MicroMark bandsaw produced plenty of glare from the raw aluminum table top:

    USB Gooseneck Mount - on bandsaw
    USB Gooseneck Mount – on bandsaw

    No good deed goes unpunished, I suppose.

    While rooting around for something else, I rediscovered my bottle of Birchwood Casey Aluminum Black (basically selenium dioxide) that’s intended for touchup work on small parts, not blackening an entire aluminum plate. Well, having had that bottle forever, it’s not like I’ll miss a few milliliters.

    If this didn’t work, I could always sand the table down to the original aluminum finish.

    So I applied a sanding block in hopes of smoothing the tooling marks:

    MicroMark Bandsaw - sanded table
    MicroMark Bandsaw – sanded table

    Looked pretty good, I thought, so:

    • Wipe it down with alcohol (per the bottle instructions)
    • Slather on a generous dose of Aluminum Black
    • Let that chew on the table for a minute
    • Rinse off with water, wipe dry
    • Perch atop the furnace for thorough drying
    • Spray with Topsaver oil, wipe down
    • Put it back on the bandsaw

    Aaaaand it looks great:

    MicroMark Bandsaw - blackened table
    MicroMark Bandsaw – blackened table

    Well, in terms of metal finishing, that blackening job looks downright crappy. Aluminium Black is intended for decorative work and will surely wear quickly on the bandsaw table, but it’s entirely good enough for my simple needs: the glare from those lights is gone.

    After I took the picture, I blackened the brass screw in the slot. Came out a weird mottled green-bronze, might look antique in a different context, suits me just fine.

    Done!

  • Bandsaw Worklight: LED Cable Clips

    Adapting the sewing machine cable clips for larger USB cables:

    LED Cable Clips - solid model
    LED Cable Clips – solid model

    The calculation positioning the posts wasn’t quite right; they now touch the cable OD at their midline and converge slightly overhead to retain it.

    They’re great candidates for sequential printing:

    LED Cable Clips - Slic3r - sequential print
    LED Cable Clips – Slic3r – sequential print

    With the basement at 14 °C, any cooling is too much: the platform heater can’t keep the bed above the thermal cutout temperature, the firmware concludes the thermistor has failed, and shuts the printer off. So I popped the four finished clips off the platform, removed the skirt, unplugged the fan, rebooted that sucker, and restarted the print.

    One clip in the front keeps the cable away from the power switch and speed control directly below the gooseneck mount:

    USB Gooseneck Mount - cable clip
    USB Gooseneck Mount – cable clip

    A few clips in the back route the cable from the COB LED epoxied directly onto the bandsaw frame away from the motor enclosure:

    Bandsaw platform COB LED - cable clips
    Bandsaw platform COB LED – cable clips

    They’re mounted on double-sided foam tape. The COB LED on the frame isn’t anything to write home about, but you can see the foam tape peeking out around the clip base:

    Bandsaw platform COB LED
    Bandsaw platform COB LED

    Unlike those LED filaments, it seems you can gently bend the aluminum substrate under a COB LED.

    The bandsaw platform now has plenty of light: a fine upgrade!

    Yeah, you can buy stick-on cable anchors, but what’s the fun in that? These fit exactly, hold securely, and work just fine.

    The OpenSCAD source code as a GitHub Gist:

    // LED Cable Clips
    // Ed Nisley – KE4ZNU – October 2014
    // February 2017 – adapted for USB cables
    Layout = "Show"; // Show Build
    //- Extrusion parameters must match reality!
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    HoleWindage = 0.2; // extra clearance
    Protrusion = 0.1; // make holes end cleanly
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    //———————-
    // Dimensions
    Base = [15.0,15.0,6*ThreadThick]; // base over sticky square
    CableOD = 3.8;
    BendRadius = 5.0;
    CornerRadius = Base[0]/5;
    CornerSides = 4*4;
    NumSides = 6*3;
    //– Oval clip with central passage
    module OvalPass() {
    intersection() {
    hull()
    for (i=[-1,1], j=[-1,1])
    translate([i*(Base[0]/2 – CornerRadius),j*(Base[1]/2 – CornerRadius),0])
    rotate(180/CornerSides)
    cylinder(r=CornerRadius,h=Base[2] + 1.00*CableOD,$fn=CornerSides,center=false);
    union() {
    translate([0,0,Base[2]/2]) // oversize mount base
    scale([2,2,1])
    cube(Base,center=true);
    for (j=[-1,1]) // bending ovals
    translate([0,j*(Base[1]/2 – 0.125*(Base[1] – CableOD)/2),(Base[2] – Protrusion)])
    resize([Base[0]/0.75,0,0])
    cylinder(d1=0.75*(Base[1]-CableOD),
    d2=(Base[1]-CableOD)/cos(0*180/NumSides),
    h=(CableOD + Protrusion),
    center=false,$fn=NumSides);
    }
    }
    if (Layout == "Show")
    color("Red",0.3)
    translate([0,0,Base[2] + CableOD/2])
    rotate([0,90,0])
    cylinder(d=CableOD,h=2*Base[0],center=true,$fn=48);
    }
    //———————-
    // Build it
    OvalPass();
  • Bandsaw Worklight: USB Gooseneck Mount

    The bandsaw now sports a chunky mount for its gooseneck light:

    USB Gooseneck Mount - on bandsaw
    USB Gooseneck Mount – on bandsaw

    The gooseneck ends in a USB Type-A plug, so an ordinary USB extension cable can connect it to the hacked hub supplying 9 VDC:

    USB Gooseneck Mount - interior
    USB Gooseneck Mount – interior

    The plastic came from a slightly earlier version of the solid model, with one foam pad under the gooseneck’s USB plug to soak up the clearance. The four smaller holes, with M3 brass inserts visible in the bottom half (on the right), clamp the gooseneck connector in place against the foam; you could push it out if you were really determined, but you’d have to be really determined.

    If I ever build another one, it’ll sandwich the plug between opposing pads:

    USB Gooseneck Connector Mount - Slic3r preview
    USB Gooseneck Connector Mount – Slic3r preview

    The lettering on the block stands out much better in the solid model:

    USB Gooseneck Connector Mount - solid model - overview
    USB Gooseneck Connector Mount – solid model – overview

    Obviously, I need help with the stylin’ thing. This looks better, but with terrible overhangs for printing in the obvious no-support orientation:

    USB Gooseneck Connector Mount - solid model - rounded top
    USB Gooseneck Connector Mount – solid model – rounded top

    Anyhow, the USB extension cable (on the left) has plenty of clearance and pulls straight out of the housing, so I can remove the bandsaw cover without unwiring:

    USB Gooseneck Mount - assembled
    USB Gooseneck Mount – assembled

    The LED ticks along at 40 °C in a 14 °C basement, suggesting a thermal coefficient around 14 °C/W. Even in the summer months, with the basement around 25 °C, there’s no risk of PETG softening at 50 °C.

    I’ll epoxy a similar 1.8 W COB LED onto the curve of the bandsaw frame where it can shine on the left and rear part of the table; it doesn’t even need a case.

    The OpenSCAD source code as a GitHub Gist:

    // Gooseneck lamp for MicroMark bandsaw
    // Ed Nisley KE4ZNU
    // February 2017
    Layout = "Mount"; // Mount Show Build
    Gap = 5; // distance between halves for Show
    //- Extrusion parameters must match reality!
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    HoleWindage = 0.2;
    Protrusion = 0.1; // make holes end cleanly
    inch = 25.4;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    //———————-
    // Dimensions
    Tap10_32 = 0.159 * inch;
    Clear10_32 = 0.190 * inch;
    Head10_32 = 0.373 * inch;
    Head10_32Thick = 0.110 * inch;
    Nut10_32Dia = 0.433 * inch;
    Nut10_32Thick = 0.130 * inch;
    Washer10_32OD = 0.381 * inch;
    Washer10_32ID = 0.204 * inch;
    ID = 0; // for round things
    OD = 1;
    LENGTH = 2;
    Insert = [3.0,4.9,2*ThreadThick + IntegerMultiple(4.2,ThreadThick)]; // M3 short brass insert
    CornerRadius = 5.0; // rounded mount block corners for pretty
    CornerSides = 4*4;
    RoundedTop = true; // true for fancy smooth top edges
    USBPlug = [39.0,16.0,8.3]; // plug, X from base of plug
    USBSocket = [28.0,20.0,11.5]; // USB extension, X from tip of socket
    USBMating = [-12.0,0,0]; // offset of plug base relative to block center
    Foam = [35.0,10.0,2.0 – 1.0]; // foam pad to secure USB plug (Z = thickness – compression)
    GooseneckOD = 5.0; // flexy gooseneck diameter
    MountScrewOC = 35.0; // make simple screw hole spacing for bandsaw case
    MountBlock = [10*round((USBPlug[0] + USBSocket[0] + 5.0)/10),
    10*round((MountScrewOC + Washer10_32OD + 5.0)/10),
    // 2*6*ThreadThick + IntegerMultiple(max(USBPlug[2],USBSocket[2]),ThreadThick)];
    16.0]; // thickness = 16 mm M3x0.5 button head screw
    echo(str("Block size: ",MountBlock));
    LegendDepth = 2*ThreadThick; // lettering depth
    //———————-
    // 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);
    }
    //– Mount
    module Mount() {
    difference() {
    hull()
    if (RoundedTop) {
    for (i=[-1,1], j=[-1,1])
    translate([i*(MountBlock[0]/2 – CornerRadius),j*(MountBlock[1]/2 – CornerRadius),0]) {
    translate([0,0,-MountBlock[2]/2])
    rotate(180/CornerSides)
    cylinder(r=CornerRadius,h=MountBlock[2]/2,$fn=CornerSides,center=false);
    translate([0,0,MountBlock[2]/2 – CornerRadius])
    rotate(180/CornerSides)
    sphere(r=CornerRadius,$fn=CornerSides,center=true);
    }
    }
    else {
    for (i=[-1,1], j=[-1,1])
    translate([i*(MountBlock[0]/2 – CornerRadius),j*(MountBlock[1]/2 – CornerRadius),0])
    rotate(180/CornerSides)
    cylinder(r=CornerRadius,h=MountBlock[2],$fn=CornerSides,center=true);
    }
    for (j=[-1,1]) // screws into bandsaw case
    translate([0,j*MountScrewOC/2,-(MountBlock[2]/2 + Protrusion)])
    rotate(180/8)
    PolyCyl(Clear10_32,(MountBlock[2] + 2*Protrusion),8);
    for (i=[-1,1], j=[-1,1]) { // clamp screws
    translate([i*MountBlock[0]/4,j*MountScrewOC/2,-MountBlock[2]])
    PolyCyl(Insert[ID],2*MountBlock[2],6); // clearance
    translate([i*MountBlock[0]/4,j*MountScrewOC/2,-(MountBlock[2]/2 + Protrusion)])
    PolyCyl(Insert[OD],Insert[LENGTH] + Protrusion,6); // inserts
    }
    rotate([0,90,0]) // gooseneck flexy cable
    rotate(180/6)
    PolyCyl(GooseneckOD,MountBlock[0],6);
    translate([USBPlug[0]/2,0,0] + USBMating – [Protrusion/2,0,0]) // USB plug outline
    cube(USBPlug + [Protrusion,0,0],center=true);
    translate([-USBSocket[0]/2,0,0] + USBMating) // USB socket outline
    cube(USBSocket,center=true);
    translate([(Foam[0]/2 + 5*ThreadWidth),0,-(Foam[2]/2 + USBPlug[2]/2)] + USBMating – [Protrusion,0,-Protrusion]/2) // foam padding recess
    cube(Foam + [Protrusion,0,Protrusion],center=true); // foam packing
    translate([(Foam[0]/2 + 5*ThreadWidth),0, (Foam[2]/2 + USBPlug[2]/2)] + USBMating – [Protrusion,0, Protrusion]/2) // foam padding recess
    cube(Foam + [Protrusion,0,Protrusion],center=true);
    render(convexity=5)
    translate([0,0,MountBlock[2]/2 – LegendDepth])
    linear_extrude(height=LegendDepth + Protrusion) {
    translate([0,5,0])
    text(text="KE4ZNU",size=8,spacing=1.10,font="Bitstream Vera Sans:style=Bold",valign="center",halign="center");
    translate([0,-5,0])
    text(text="4 Feb 2017",size=6,spacing=1.05,font="Bitstream Vera Sans:style=Bold",valign="center",halign="center");
    }
    }
    }
    //———————-
    // Build it
    if (Layout == "Mount") {
    Mount();
    }
    if (Layout == "Show") {
    translate([0,0,-Gap/2])
    difference() {
    Mount();
    translate([0,0,MountBlock[2]])
    cube(2*MountBlock,center=true);
    }
    translate([0,0,Gap/2])
    difference() {
    Mount();
    translate([0,0,-MountBlock[2]])
    cube(2*MountBlock,center=true);
    }
    }
    if (Layout == "Build") {
    translate([0,0.6*MountBlock[1],MountBlock[2]/2])
    difference() {
    Mount();
    translate([0,0,MountBlock[2]])
    cube(2*MountBlock,center=true);
    }
    translate([0,-0.6*MountBlock[1],MountBlock[2]/2])
    rotate([180,0,0])
    difference() {
    Mount();
    translate([0,0,-MountBlock[2]])
    cube(2*MountBlock,center=true);
    }
    }