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

  • USB Gooseneck Extension Innards

    The bandsaw needs more light on the blade, but a fixed lamp will certainly get in the way of something. Pondering the solution space of available parts suggests a COB LED on a flexible gooseneck, which led to some 30 cm USB extenders, then smashing one of the connectors to reveal the wiring inside:

    USB Gooseneck Extender - disassembled
    USB Gooseneck Extender – disassembled

    It was (probably) assembled by soldering the USB terminals to the wires, mounting it in a fixture, then injection-molding the shell around everything. The injected plastic fills the end of the gooseneck and immobilizes the wires.

    I’d like slightly longer wire ends, although they’re workable if I don’t make any further mistakes. Perhaps I can heatsink the gooseneck, slit 10 mm of the metal sheath with an abrasive wheel, and peel off the pieces without damaging the wires. It could happen!

    Speaking of mistakes, wiring an ordinary USB connector with +12 VDC for an LED seems fraught with peril…

  • Electronics vs. Dark Rooms

    Despite its diminutive size, the white LED on the end of the Dell AC511 USB SoundBar lights up a dark bedroom surprisingly well:

    Dell AC511 USB SoundBar - white power LED
    Dell AC511 USB SoundBar – white power LED

    That’s pretty much the only power-on indicator for the streaming players, so I didn’t want to just slap a strip of black tape over it. Instead, because white LEDs don’t emit much energy toward the red end of the spectrum, I made a cute little filter from a snippet of Primary Red gel filter material, surrounded by a black Gorilla Tape donut:

    Red filter for Dell AC511 USB power LED
    Red filter for Dell AC511 USB power LED

    Two layers of Primary Red cut the light intensity to a dim glow that’s barely visible in daylight and completely inoffensive at night:

    Red filter for Dell AC511 - installed
    Red filter for Dell AC511 – installed

    The blue activity LED on the SunFounder got the black electrical tape treatment, however, with just a sliver showing through to give a hint that it’s still active:

    SunFounder RT5370 USB WiFi Adapter - masked LED
    SunFounder RT5370 USB WiFi Adapter – masked LED

    One of the other WiFi adapters has a pinhole over a red LED that’s barely visible. Another, seemingly identical one, lacks the red LED under the pinhole; when I asked the vendor about that, I was told it was removed “to save power.” Yeah, right. That was part of the motivation to try a different adapter next time around, with good results.

    Of course, you must wrap an opaque black case around the Raspberry Pi to tamp down the red and green LEDs on the PCB. It’s possible to control them in software, with varying degrees of difficulty depending on which Pi you have, but …

  • Raspberry Pi 3 Reset Switch

    The (relatively) new Raspberry Pi 3 PCB layout puts the Run header in a different location than in the Pi 2, but a minute of filing gnaws a suitable opening:

    Raspberry Pi 3 - Reset Switch
    Raspberry Pi 3 – Reset Switch

    As before, a hot-melt glue blob holds the switch in place. I’d prefer a black case, if only to hide the blob, but clear-ish is what’s available right now.

    Remember those orderly shutdowns, even at the cost of a keypad button!

  • Cast Iron Pan Seasoning: Round 3

    After seasoning the pan after every meal for a few weeks, then not doing that for a few more weeks, its thick glaze began looking somewhat scuffed:

    Cast Iron Pan - scuffed
    Cast Iron Pan – scuffed

    You may recognize some of those scars from the previous picture:

    Wagner skillet - two weeks of use
    Wagner skillet – two weeks of use

    Perhaps the multi-layer seasoning was entirely too thick and prone to chipping; this time, I’ll try a thinner coating. Because it’s cast iron, the pan under the coating remains undamaged.

    A few hours in a bucket of sodium carbonate solution with a battery charger driving a few amps through it removed most of the glaze and a few minutes with a sponge sanding block cleaned off the rest. Applying flaxseed oil and heating it to 400 °F on a regular burner (under close supervision!) produced a nice coating:

    Cast Iron Pan - seasoned
    Cast Iron Pan – seasoned

    The single layer was way slick for veggies in the evening and handled the morning omelet with aplomb, so we’ll run with it until something interesting happens.

  • Respooling Stainless Steel Thread: The Knack

    The comments on my previous stainless-steel thread respooling attempt suggested that I was entirely too much of a sissy, so, when another empty spool appeared, I tried again with more vigor:

    Stainless steel thread - second spool
    Stainless steel thread – second spool

    As before, I put the larger spool on the floor under the lathe and let the thread spill straight off the top toward the smaller spool. This time, I didn’t have a twist accumulating in the loose thread between the two spools:

    • Grab longer lengths of the loose thread
    • Absolutely no slippage between the fingers!
    • Put more tension on the thread at the takeup spool

    As nearly as I can tell, the thread still has a slight twist coming off the larger spool, but grabbing longer lengths captures the twist and more tension lays it on the smaller spool. After cutting the thread, what was left had maybe three turns of twist, which was no big deal and obviously hadn’t accumulated.

    Seems better: thanks for all the comments!

  • Fordham FG-801 Function Generator Power Switch

    The power switch in my trusty Fordham FG-801 Function Generator failed with an accumulation of oxidation / crud on the contacts. That’s fix-able, but the switch contained not one, but two powerful springs, and puked its guts all over the floor around the Squidwrench Operating Table. Even with (a preponderance of) the parts in hand, I couldn’t figure out how to reassemble the thing; the only way out was to replace the switch.

    The OEM switch had a 0.360+ inch diameter pushbutton that fit into a ⅜ inch hole and, alas, my remaining stock of line-voltage switches had toggle levers and used ¼ inch holes. So I converted a bit of aluminum rod into a suitable bushing:

    Fordham FG-801 Fn Gen - new switch hardware
    Fordham FG-801 Fn Gen – new switch hardware

    The lock washer in the middle started with a much wider tab that I filed down into a tooth for the dent from a #2 center drill. Protip: center drills don’t walk off like twist drills, even when you hand-hold the front panel at the drill press with all the electronics dangling below.

    The bushing dimension doodle:

    Fordham FG-801 Function Generator - Replacement Switch Bushing
    Fordham FG-801 Function Generator – Replacement Switch Bushing

    The internal wiring routes the 120 VAC line conductor to the switch, then to the fuse, then to the transformer. I don’t know whether it’s better to have an unfused switch or an unswitched fuse (surely there’s a UL spec for that), but I didn’t change anything. The new switch, being slightly smaller and mounting directly on the panel, required a new wire (the blue one) from the fuse:

    Fordham FG-801 Fn Gen - power switch - installed
    Fordham FG-801 Fn Gen – power switch – installed

    The OEM switch mounted on two round brass standoffs and, wonder to tell, the new switch fit between them!

    From the front, the new switch looks like it grew there:

    Fordham FG-801 Fn Gen - switch in action
    Fordham FG-801 Fn Gen – switch in action

    The PCB mounts to the top of the case with one screw and four hexagonal brass standoffs. The standoffs have 6-32 tapped holes on one end and a 6-32 stud on the other; one of those stud had broken off. A 6-32 stainless steel screw secured in a clearance hole with a dab of epoxy solved that problem:

    Fordham FG-801 Fn Gen - standoff stud
    Fordham FG-801 Fn Gen – standoff stud

    I stood it vertically and tweaked the screw to be perpendicular while the epoxy cured.

    Memo to Self: The next time around, put a nut on the stud to make sure the answer comes out right. I didn’t do this time to avoid epoxying the nut to the standoff.

    Done!

  • Loop Antenna Splice Reinforcement

    Those solder joints and finicky little wires seem much too fragile on their own:

    LF Loop Antenna - complete joint
    LF Loop Antenna – complete joint

    This should help:

    Loop Antenna Splice - assembled
    Loop Antenna Splice – assembled

    Foam blocks hold the ribbon cable in place and provide a bit of strain relief around the hard plastic edge:

    Loop Antenna Splice - hardware
    Loop Antenna Splice – hardware

    The brass inserts in the bottom block (on the left) got epoxied in place, because they must provide quite a bit of force to clamp the foam. Their larger knurled end sits flush with the outside surface and the smaller end has one thread thickness of clearance below the inner surface.

    A last look at the wiring:

    Loop Antenna Splice - wiring
    Loop Antenna Splice – wiring

    I think the preamp must sit at some distance from the antenna to prevent feedback, but that remains to be seen.

    The M2’s nozzle accumulated a huge blob of PETG that turned into a giant smear:

    Loop Antenna Splice - PETG booger
    Loop Antenna Splice – PETG booger

    Fortunately, it’s on the inside where nobody will ever see it. If you know where to look, it’s barely visible from the outside.

    The solid model shows off the structure a bit better:

    Loop Antenna Splice - show view
    Loop Antenna Splice – show view

    The inside view:

    Loop Antenna Splice - bottom
    Loop Antenna Splice – bottom

    The OpenSCAD source code as a GitHub Gist:

    // Ribbon cable loop antenna splice
    // Ed Nisley KE4ZNU December 2016
    Layout = "Text";
    //- 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
    Cable = [200,48.0,1.5]; // X = longer than anything else
    Splice = [15.0,53.0,5.0]; // epoxy blob around joints
    Foam = [15.0,Splice[1],2.0];
    CornerRadius = 5.0;
    ID = 0;
    OD = 1;
    LENGTH = 2;
    Insert = [3.9,4.6 – 0.1,5.8]; // 4-40 knurled brass insert
    Screw = [2.7,5.5,2.0]; // OD = head LENGTH = head thickness
    Washer = [3.0,8.0,0.8];
    BlockOA = [60.0, // convenient length
    Splice[1] + 4*Washer[OD], // clearance around washer on top
    2*(Insert[LENGTH] + 2*ThreadThick)]; // insert sets both thicknesses
    NumScrews = 2; // screws along each side of cable
    ScrewOC = [BlockOA[0] / NumScrews,
    BlockOA[1] – 2*Washer[OD],
    2*BlockOA[2] // ensure complete holes
    ];
    TextThick = 3*ThreadThick; // depth of text into surface
    TextFit = HoleWindage/2; // clearance around text polygons
    //———————-
    // 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(d=(FixDia + HoleWindage),h=Height,$fn=Sides);
    }
    //—–
    // Blocky model of cable + splice + wire tap for subtraction
    module Antenna() {
    union() {
    cube(Cable,center=true);
    cube(Splice,center=true);
    for (i=[-1,1])
    translate([0,-Splice[1]/2,0])
    cube([Splice[0]/2,Splice[1],2*Foam[2]],center=true);
    }
    }
    // Outside shape of splice Block, less screw clearance
    module SpliceBlock() {
    difference() {
    hull()
    for (i=[-1,1], j=[-1,1])
    translate([i*(BlockOA[0]/2 – CornerRadius),j*(BlockOA[1]/2 – CornerRadius),-BlockOA[2]/2])
    cylinder(r=CornerRadius,h=BlockOA[2],$fn=4*8);
    for (i = [0:NumScrews – 1], j=[-1,1])
    translate([-BlockOA[0]/2 + ScrewOC[0]/2 + i*ScrewOC[0],j*ScrewOC[1]/2,-(BlockOA[2]/2 + Protrusion)])
    PolyCyl(Screw[ID],BlockOA[2] + 2*Protrusion,6);
    }
    }
    // Splice block less cable
    module ShapedBlock() {
    difference() {
    SpliceBlock();
    Antenna();
    }
    }
    // Bottom
    module BottomPlate() {
    difference() {
    ShapedBlock();
    translate([0,0,BlockOA[2]/2])
    cube(BlockOA + 2*[Protrusion,Protrusion,0],center=true);
    Antenna(Splice);
    for (i = [0:NumScrews – 1], j=[-1,1])
    translate([-BlockOA[0]/2 + ScrewOC[0]/2 + i*ScrewOC[0],j*ScrewOC[1]/2,-(BlockOA[2]/2 + Protrusion)])
    PolyCyl(Insert[OD],2*Insert[LENGTH],6);
    for (i=[-1,1])
    translate([i*((BlockOA[0] – Foam[0] + Protrusion)/2),0,(BlockOA[2]/2 – Cable[2]/2 – Foam[2])])
    cube([Foam[0] + Protrusion,Foam[1],BlockOA[2]],center=true);
    }
    }
    // Top
    module TopPlate() {
    difference() {
    ShapedBlock();
    translate([0,0,-BlockOA[2]/2])
    cube(BlockOA + 2*[Protrusion,Protrusion,0],center=true);
    Antenna(Splice);
    for (i=[-1,1])
    translate([i*((BlockOA[0] – Foam[0] + Protrusion)/2),0,-(BlockOA[2]/2 – Cable[2]/2 – Foam[2])])
    cube([Foam[0] + Protrusion,Foam[1],BlockOA[2]],center=true);
    rotate(90) {
    translate([0,6,BlockOA[2]/2 – TextThick])
    TextHack("KE4ZNU",8,0.0,1.15,TextThick + Protrusion);
    translate([0,-6,BlockOA[2]/2 – TextThick])
    TextHack("2016·12",6,0.0,1.20,TextThick + Protrusion);
    }
    }
    }
    module TextHack(Text="sample",Size=10,Offset=0.0,Space=1.0,Thick=ThreadThick) {
    linear_extrude(height=Thick,convexity=10)
    offset(r=Offset)
    text(Text,font=":bold",size=Size,spacing=Space,halign="center",valign="center");
    }
    //———-
    // Build them
    if (Layout == "Antenna")
    Antenna();
    if (Layout == "SpliceBlock")
    SpliceBlock();
    if (Layout == "ShapedBlock")
    ShapedBlock();
    if (Layout == "Bottom")
    BottomPlate();
    if (Layout == "Top")
    TopPlate();
    if (Layout == "Text") {
    translate([0,6,0])
    TextHack("KE4ZNU",8,-TextFit,1.15,TextThick);
    translate([0,-6,0])
    TextHack("2016·12",6,-TextFit,1.20,TextThick);
    }
    if (Layout == "Show") {
    translate([0,0,5])
    TopPlate();
    translate([0,0,-5])
    BottomPlate();
    color("Orange",0.2)
    Antenna();
    }
    if (Layout == "Build") {
    translate([0,-0.6*BlockOA[1],BlockOA[2]/2])
    rotate([180,0,0])
    TopPlate();
    translate([0,0.6*BlockOA[1],BlockOA[2]/2])
    BottomPlate();
    }