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.

Author: Ed

  • X10 Transceiver Case Plastic: End Of Life, Redux

    Another X10 RF transciever, this one made for IBM (!) a long time ago, emerged from the heap with its case falling apart: the plastic bosses that should anchor the screws had broken off, then cracked radially. Given that I was probably going to toss it anyway, for reasons that will soon be obvious, I tried repairing the bosses just for practice.

    Stuffing the boss fragments into close-fitting brass tubes, with a dash of IPS #3 on the broken faces, put them back together reasonably well:

    HD501 X10 Transceiver - plastic boss gluing
    HD501 X10 Transceiver – plastic boss gluing

    More IPS #3 and a pair of clamps stuck the bosses back on the case:

    HD501 X10 Transceiver - plastic boss assembly
    HD501 X10 Transceiver – plastic boss assembly

    Note the dark smudge on the inside of the case. Even though nothing on the PCB looked particularly overheated, Soot Is Sign of Bad Electrical Health.

    And it turned out neither the bonds nor the plastic were up to the task. A day after successfully reassembling the transceiver, the bosses failed along new cracks and crumbled into different fragments.

    I applied a Kapton tape belly band around the case halves, verified that the transceiver no longer produced reliable X10 commands, and executed ++recycle_pile.

    So it goes.

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

  • Kenmore Progressive Vacuum Cleaner Carpet Brush Disassembly

    The beater bar found and ingested a remarkably long strip of carpet yarn, resulting in a sudden stop and an acute need for disassembly. In the unlikely event that happens again:

    • Remove hose
    • Release latch to lay hose fitting flat
    • Remove two obvious screws
    • Pry rear latches adjacent to hose fitting to release rear of top cover
    • Pry side latches to release middle of top cover
    • Pull rear of top cover away from base
    • Disengage latches along front of beater bar

    Those places, neatly marked for future reference, with the top cover against the floor:

    Kenmore Progressive vacuum - carpet brush - disassembly latches
    Kenmore Progressive vacuum – carpet brush – disassembly latches

    With the cover off, the beater bar lifts out and you can easily unwind the mess.

  • Forester: TPMS FTW, Redux

    Now I know the Forester’s TPMS icon blinks on 1000 feet from a cold start with 12 psi in the offending tire. I returned home and pulled this from a sipe in the left rear tire:

    Road debris - blade fragment
    Road debris – blade fragment

    It’s atop a 0.1 inch grid.

    The flat side on the right rode tangent to the tire surface, recessed slightly below the tread, and pretty much invisible inside the sipe. Of course, the point punched through the tire’s steel belt and let the wind out, ever so slowly.

    I initially thought it was a utility knife blade fragment, but under the microscope it looks more like a saw blade tooth. It’s obviously been kicking around on the road for quite a while; back in the day, they occasionally swept the roads, but that was then and this is now.

    Makes me glad I didn’t buy four new tires after the last flat. I suppose installing two plugs in the same tire counts as a net loss, but they’re small, widely separated injuries and that’s how it’ll roll.

    For the record: with 14 k miles on the tires, tread wear = 2/32 inch of the original 6/32 inch depth.

    Those tires should last another 30 k miles at our current pace, although I expect more random debris will kill one stone cold dead before that.

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