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: Repairs

If it used to work, it can work again

  • Shuttles Board Game: Replacement Pegs

    Shuttles Board Game: Replacement Pegs

    For reasons not relevant here, I made replacement pegs for the Shuttles board game:

    Shuttles Game - solid model - Slic3r
    Shuttles Game – solid model – Slic3r

    Not the most challenging solid model I’ve ever conjured from the vasty digital deep, but 3D printing is really good for stuff like this.

    The OEM pegs have a hollow center, most likely to simplify stripping them from the injection mold, which I dutifully duplicated:

    Shuttles Game pegs - hollow - solid model
    Shuttles Game pegs – hollow – solid model

    It turns out the additional perimeter length inside the pegs requires 50% more printing time, far offsetting the reduced 10% infill. Given that each solid set takes just under an hour, I decided to lose half an hour of verisimilitude.

    I plunked a nice round cap atop the OEM peg’s flat end, but stopped short of printing & installing a round plug for the butt end.

    While the 3D printer’s hot, ya may as well make a bunch:

    Shuttles game pegs
    Shuttles game pegs

    Game on …

    The OpenSCAD source code as a GitHub Gist:

    Update: They’re a bit too large, so the Gist now produces tapered pegs.

    // Shuttles game pegs
    // Ed Nisley KE4ZNU – July 2020
    /* [Layout Options] */
    Layout = "Peg"; // [Build, Peg]
    Hollow = false;
    //——-
    //- Extrusion parameters must match reality!
    /* [Hidden] */
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    HoleWindage = 0.2;
    Protrusion = 0.1; // make holes end cleanly
    ID = 0;
    OD = 1;
    LENGTH = 2;
    //——-
    // Dimensions
    /* [Dimensions] */
    Peg = [4.0,7.5,26.0]; // overall length, including the rounded Cap
    Taper = 1.0;
    CapRadius = Peg[OD]/2;
    PegBaseLength = Peg[LENGTH] – CapRadius;
    NumPegs = [1,6]; // lay out in array
    ArrayCenter = [NumPegs[0] – 1,NumPegs[1] – 1] / 2;
    NumSides = 6*4;
    //——-
    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/2 + HoleWindage,h=Height,$fn=Sides);
    }
    //——-
    // One peg
    module Peg() {
    union() {
    translate([0,0,PegBaseLength])
    difference() {
    sphere(d=Peg[OD],$fn=NumSides);
    translate([0,0,-Peg[OD]/2])
    cube([2*Peg[OD],2*Peg[OD],Peg[OD]],center=true);
    }
    difference() {
    cylinder(d1=Peg[OD] – Taper,d2=Peg[OD],h=PegBaseLength,$fn=NumSides);
    if (Hollow)
    translate([0,0,-Protrusion])
    PolyCyl(Peg[ID],PegBaseLength+Protrusion,NumSides);
    }
    }
    }
    //——-
    // Build it!
    if (Layout == "Peg")
    Peg();
    if (Layout == "Build")
    for (i=[0:NumPegs[0] – 1], j=[0:NumPegs[1] – 1])
    translate([(i – ArrayCenter.x)*1.5*Peg[OD],(j – ArrayCenter.y)*1.5*Peg[OD],0])
    Peg();

  • Miniblind Cord Caps: White PETG

    Miniblind Cord Caps: White PETG

    I managed to smash another miniblind cord cap and used white PETG this time around:

    Miniblind cord caps - white PETG
    Miniblind cord caps – white PETG

    It’s the same solid model as before, sliced with whatever improvements have transpired during the last four years.

    Made four of ’em, preemptively replaced the cap on the adjacent window, and tucked the last two away against future need.

  • Makergear M2 V4 Nozzle: Silicone Refresh

    Makergear M2 V4 Nozzle: Silicone Refresh

    After a year and a half, the silicone coat I’d applied to the M2’s nozzle had pretty much worn away, so I peeled off the remnants, buffed up the brass, and mushed on another coat:

    Makergear M2 V4 Nozzle - High-temp silicone coat
    Makergear M2 V4 Nozzle – High-temp silicone coat

    The coverage isn’t even, particularly in the direction I can neither see nor reach with the hot end still in the printer, but it’s way less hassle than recalibrating the Z=0 position. The very thin layer over the brass around the nozzle will vanish immediately on the skirt surrounding the first part.

    I should definitely recoat the nozzle more often, because PETG doesn’t stick to silicone nearly as well as it does to brass: a nice new coat makes the PETG burned-snot problem Just Go Away.

  • Can Opener Re-Gearing

    Can Opener Re-Gearing

    Six years on, I just deployed the last of the aluminum spares from the original CNC project:

    Can opener - new gear installed
    Can opener – new gear installed

    I swear the cutter gear on the left does not show that rust in person!

    This can opener has a slightly larger bolt than the previous ones, so I embiggened the hole with a step drill:

    Can opener - redrilling new gear
    Can opener – redrilling new gear

    Having run out of aluminum gears, I’ll be forced to make a hob to make a steel gear. Drat!

  • OXO Pepper Grinder: Inadvertent Abuse

    OXO Pepper Grinder: Inadvertent Abuse

    Being that type of guy, I’m reasonably sure I would not have bought what’s now clearly labeled as an OXO Radial Pepper Grinder for use as a salt mill:

    OXO Salt Mill - corrosion
    OXO Salt Mill – corrosion

    Mary recalls we got it at Target, back when one could go places and buy things, and I vaguely recall contemplating a wall of OXO gadgets. It’s been a while and I neglected to save the packaging for future reference.

    Obviously not stainless steel, but not lethal, so we’ll continue abusing it.

  • Bathroom Door Retainer: Bigger and Stronger

    Bathroom Door Retainer: Bigger and Stronger

    After three years, the retainer holding the front bathroom door open against winds blowing through the house on stormy days finally fractured, right at the top of the towel rack where you’d expect it:

    Bathroom Door Retainer - fractured
    Bathroom Door Retainer – fractured

    I was all set to add reinforcing pins and whatnot, then came to my senses and just made the whole thing a few millimeters larger:

    Bathroom Door Retainer - stronger
    Bathroom Door Retainer – stronger

    Customer feedback indicates white blends better with the background.

    I made a few minor tweaks to the original design, including slightly larger bumps to hold it against the towel bar that, regrettably, put corresponding gouges into the bar. Who knew they used such soft plastic back in the day?

    The OpenSCAD source code as a GitHub Gist:

    // Bathroom Door Retainer
    // Ed Nisley KE4ZNU – May 2017
    // 2020-07 beef up, particularly at top of bar
    Layout = "Show"; // [Show, Build]
    //——-
    //- Extrusion parameters must match reality!
    /* [Hidden] */
    ThreadThick = 0.20;
    ThreadWidth = 0.40;
    HoleWindage = 0.2;
    Protrusion = 0.1; // make holes end cleanly
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    //——-
    // Dimensions
    /* [Dimensions] */
    TowelBarSide = 20.5; // towel bar across flat side
    TowelBarAngle = 45; // rotation of top flat from horizontal
    BumpOD = 2.0; // retaining ball
    DoorOffset = 14.0; // from towel bar to door
    DoorThick = 37.0;
    WallThick = 8.0; // minimum wall thickness
    PlateThick = 4.0; // … slab
    RetainerDepth = 15.0; // thickness of retaining notch
    NumSides = 6*4;
    CornerRad = WallThick;
    BarClipOD = TowelBarSide*sqrt(2) + 2*WallThick;
    BarClipRad = BarClipOD/2;
    OAH = RetainerDepth + PlateThick;
    module LatchPlan() {
    union() {
    linear_extrude(height=OAH,convexity=4)
    difference() {
    union() {
    circle(d=BarClipOD,$fn=NumSides);
    hull()
    for (i=[0,1], j=[0,1])
    translate([i*(BarClipRad + DoorOffset + DoorThick + WallThick – CornerRad),j*(BarClipRad – CornerRad)])
    circle(r=CornerRad,$fn=4*4);
    }
    rotate(TowelBarAngle) // towel bar shape
    square(size=TowelBarSide,center=true);
    translate([0,-TowelBarSide/sqrt(2)]) // make access slot
    rotate(-TowelBarAngle)
    square(size=[2*TowelBarSide,TowelBarSide],center=false);
    }
    for (a=[0:180:360])
    rotate(a + TowelBarAngle)
    translate([TowelBarSide/2,0,OAH/2])
    rotate([90,0,45])
    sphere(d=BumpOD,$fn=4*3);
    }
    }
    module Latch() {
    difference() {
    LatchPlan();
    translate([BarClipRad + DoorOffset,-BarClipRad/2,-Protrusion])
    cube([DoorThick,BarClipOD,RetainerDepth + Protrusion],center=false);
    }
    }
    //——-
    // Build it!
    if (Layout == "Show") {
    Latch();
    }
    if (Layout == "Build") {
    translate([0,0,OAH])
    rotate([180,0,0])
    Latch();
    }

    Done!

  • Manjaro Linux vs. Dell Latitude E7250 Bluetooth

    Manjaro Linux vs. Dell Latitude E7250 Bluetooth

    Although the Dell Latitude E7250 allegedly had Bluetooth capability and the Blueman applet tried connecting to my Bluetooth headsets, the connection aways failed and nothing worked. There’s a WLAN module stuck in an M.2 socket inside the laptop providing both WiFi and Bluetooth:

    Dell E7250 - DW1560 card in place
    Dell E7250 – DW1560 card in place

    A bit of searching suggested the driver wasn’t loading properly, which became obvious after I knew where to look:

    dmesg | grep -i blue
    … snippage …
    [    5.678610] Bluetooth: hci0: BCM20702A1 (001.002.014) build 1572
    [    5.678851] bluetooth hci0: Direct firmware load for brcm/BCM20702A1-0a5c-216f.hcd failed with error -2
    [    5.678853] Bluetooth: hci0: BCM: Patch brcm/BCM20702A1-0a5c-216f.hcd not found
    [   10.854607] Bluetooth: RFCOMM TTY layer initialized
    [   10.854613] Bluetooth: RFCOMM socket layer initialized
    [   10.854619] Bluetooth: RFCOMM ver 1.11

    Without having the proper firmware / patch loaded, the module won’t work, even though the TTY / socket layers know it’s present, which explains why Blueman did everything except actually connect to the headsets.

    More searching suggested you must extract the firmware HEX file from the Windows driver. Feeding the Service Tag into the Dell support site, then feeding “Bluetooth” and “Windows 8.1, 64-bit” (preinstalled on the laptop) into the Drivers & Downloads tab gets you the relevant EXE file: Dell Wireless 1550/1560 Wi-Fi and Bluetooth Driver. It turns out to be a self-extracting ZIP file (in Windows, anyway), so unzip it all by yourself:

    unzip Network_Driver_5DFVH_WN32_6.30.223.262_A03.EXE

    This produces a blizzard of HEX files in the newly created Drivers/production/Windows8.1-x64 directory. Each firmware HEX file is keyed to the USB Product Code identifying the unique USB gadget, found with lsusb:

    lsusb
    … snippage …
    Bus 002 Device 003: ID 0a5c:216f Broadcom Corp. BCM20702A0 Bluetooth
    … snippage …

    The DW1560 apparently has a USB RAM interface, with the specific HEX file identified in the CopyList stanza of the INF file corresponding to that USB Product Code:

    grep -i -A 5  ramusb216f.copylist Drivers/production/Windows8.1-x64/bcbtums-win8x64-brcm.inf
    [RAMUSB216F.CopyList]
    bcbtums.sys
    btwampfl.sys
    BCM20702A1_001.002.014.1443.1572.hex
    … snippage …

    However, the Linux firmware loader needs a different file format with a different name, mashed together from the HEX file, USB Vendor, and USB Product codes:

    hex2hcd -o BCM20702A1-0a5c-216f.hcd BCM20702A1_001.002.014.1443.1572.hex

    The converted firmware file goes where the loader expected to find it:

    sudo cp BCM20702A1-0a5c-216f.hcd /lib/firmware/brcm/

    Whereupon next reboot sorted things out:

    dmesg | grep -i blue
    [    6.024838] Bluetooth: Core ver 2.22
    [    6.024868] Bluetooth: HCI device and connection manager initialized
    [    6.024872] Bluetooth: HCI socket layer initialized
    [    6.024874] Bluetooth: L2CAP socket layer initialized
    [    6.024881] Bluetooth: SCO socket layer initialized
    [    6.100796] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
    [    6.100800] Bluetooth: BNEP filters: protocol multicast
    [    6.100804] Bluetooth: BNEP socket layer initialized
    [    6.157114] Bluetooth: hci0: BCM: chip id 63
    [    6.158125] Bluetooth: hci0: BCM: features 0x07
    [    6.176119] Bluetooth: hci0: BCM20702A
    [    6.177114] Bluetooth: hci0: BCM20702A1 (001.002.014) build 0000
    [    7.031228] Bluetooth: hci0: BCM20702A1 (001.002.014) build 1572
    [    7.047177] Bluetooth: hci0: DW1560 Bluetooth 4.0 LE
    [   13.141854] Bluetooth: RFCOMM TTY layer initialized
    [   13.141865] Bluetooth: RFCOMM socket layer initialized
    [   13.141872] Bluetooth: RFCOMM ver 1.11

    The firmware may be in one of the myriad Bluetooth packages not installed by default, so perhaps identifying & installing the proper package would sidestep the hocus-pocus.

    Maybe next time?

    Now I can wear my Bose Hearphones in Zoom sessions with the E7250, because my Pixel 3a phone heats up almost to the gets-bendy level while thrashing its battery to death.