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

  • Monthly Image: I’m So Poughkeepsie

    This example of the City of Poughkeepsie’s branding seems poorly thought out:

    I'm So Poughkeepsie
    I’m So Poughkeepsie

    Maybe not quite as bad as the “Too Cool to Do Drugs” pencil, but …

    Selah.

  • Lightning Talk: Bose Hearphones

    The PDF “slides” for a lightning talk I gave at this month’s MHV LUG meeting: MHVLUG Lightning Talk – Bose Hearphones.

    You don’t get my patter, but perhaps you’ll get the gist from the pix.

    Hearphone - Detail
    Hearphone – Detail

    Summary: I like ’em a lot, despite the awkward form factor and too-low battery capacity. If you’re more sensitive to appearances than I, wait for V 2.0.

    FWIW, I tinkered up a beamforming microphone array with GNU Radio that worked surprisingly well, given a handful of hockey puck mics and a laptop. Bose does it better, of course, but I must revisit that idea.

  • Wouxun KG-UV3D: End of Life

    Radio communication between our bikes failed on the way back from a grocery ride and the problem turned out to be a failed radio:

    Wouxun KG-UV3D - defunct
    Wouxun KG-UV3D – defunct

    The Wouxun KG-UV3D radio seems jammed firmly somewhere in its power-up sequence, doesn’t respond to any buttons, and has no hard-reset switch. On the other paw, it’s been in constant (and rugged!) use for almost exactly five years, so I suppose it doesn’t owe me much of anything.

    The new radio, another KG-UV3D from PowerWerx, has marginally different spacing around the screw attaching the plug cover preventing the previous screw from fitting, so I kludged up a screw from a 2 mm socket-head screw, a 2.5 mm (yes) washer, and a pair of 2 mm nuts:

    Wouxun KG-UV3D - APRS plug plate screw
    Wouxun KG-UV3D – APRS plug plate screw

    Which looks a bit odd, but holds the plug adapter plate firmly in place:

    Wouxun KG-UV3D - APRS Voice Plug Block
    Wouxun KG-UV3D – APRS Voice Plug Block

    I suppose when the radio on my bike fails, I must rebuild both APRS + voice interfaces for Yet Another Radio, because the Wouxuns will be completely unobtainable.

    The weather abruptly became too cold for riding, at least for sissies such as we, but maybe we’ll get out later in the month …

  • Another Failed CFL Bulb

    Unlike the last CFL failure, this time I noticed the faint smell of electrical death near the Electronics Workbench, but I couldn’t track it down until the can light over the the Bench didn’t start:

    Another Hot-Failed CFL Bulb
    Another Hot-Failed CFL Bulb

    The date code suggests it’s been in the fixture for over a decade, so I can’t complain. Having two unrelated bulbs fail within a week, after years of service, is surely coincidence. If another fails within a week or two, however, it will definitely be Enemy Action.

  • Nothing Lasts: Cranberry Harvester Corrosion

    Cranberries grow best in acidic conditions, as shown by the conditions inside an antique cranberry harvester:

    Cranberry Harvester - shaft corrosion
    Cranberry Harvester – shaft corrosion

    Admittedly, it’s been sitting untended for many years, but the worst corrosion formed along the midline of the machine, eating the conveyor housing, drive shafts, and support struts.

    I managed to go all this time without realizing cranberry plants are evergreens.

  • Sandisk Extreme Plus: End of Life

    The Fly6 rear camera on my bike started giving off three long beeps and shutting down. Doing the reformatting / rebooting dance provides only temporary relief, so I think the card has failed:

    Sandisk Extreme Plus vs. Samsung EVO MicroSD cards
    Sandisk Extreme Plus vs. Samsung EVO MicroSD cards

    The Fly6 can handle cards up to only 32 GB, which means I should stock up before they go the way of the 8 GB card shipped with the camera a few years ago.

    Some back of the envelope calculations:

    • It’s been in use for the last 19 months
    • The last 22 trips racked up 88 GB of video data = 4 GB/trip
    • They occurred over the last 6 weeks = 3.6 rides/week
    • Call it 250 trips = 1 TB of data written to the card = 32 × capacity

    That’s only slightly more than the failure point of the Sony 64 GB MicroSDXC cards. The Fly6 writes about a third of the data per trip, so the card lasts longer on a calendar basis.

    So now let’s find out how long the Samsung cards last …

  • Mostly Printed CNC: Endstop Mount

    Being a big fan of having a CNC machine know where it is, adding endstops (pronounded “home switches” in CNC parlance) to the Mostly Printed CNC axes seemed like a good idea:

    MPCNC - X min endstop - actuator view
    MPCNC – X min endstop – actuator view

    All the mounts I could find fit bare microswitches of various sizes or seemed overly complex & bulky for what they accomplished. Rather than fiddle with screws and nut traps / inserts, a simple cable tie works just fine and makes the whole affair much smaller. Should you think cable ties aren’t secure enough, a strip of double stick tape will assuage your doubts.

    A snippet of aluminum sheet moves the switch trip point out beyond the roller’s ball bearing:

    MPCNC - X min endstop
    MPCNC – X min endstop

    I’m not convinced homing the Z axis at the bottom of its travel is the right thing to do, but it’s a start:

    MPCNC - Z min endstop
    MPCNC – Z min endstop

    Unlike the stationary X and Y axes, the MPCNC’s Z axis rails move vertically in the middle block assembly; the switch moves downward on the rail until the actuator hits the block.

    Perforce, the tooling mounted on the Z axis must stick out below the bottom of the tool carrier, which means the tool will hit the table before the switch hits the block. There should also be a probe input to support tool height setting.

    The first mount fit perfectly, so I printed four more in one pass:

    MPCNC MB Endstop Mounts - Slic3r preview
    MPCNC MB Endstop Mounts – Slic3r preview

    All three endstops plug into the RAMPS board, leaving the maximum endstop connections vacant:

    MPCNC - RAMPS min endstop positions
    MPCNC – RAMPS min endstop positions

    Obviously, bare PCBs attached to the rails in mid-air aren’t compatible with milling metal, which I won’t be doing for quite a while. The electronic parts long to be inside enclosures with ventilation and maybe dust filtering, but …

    The switches operate in normally open mode, closing when tripped. That’s backwards, of course, and defined to be completely irrelevant in the current context.

    Seen from a high level, these switches set the absolute “machine coordinate system” origin, so the firmware travel limits can take effect. Marlin knows nothing about coordinate systems, but GRBL does: it can touch off to a fixture origin and generally do the right thing.

    The OpenSCAD source code as a GitHub Gist:

    // Tour Easy Fairing Endstop Mount for Makerbot PCB
    // Ed Nisley KE4ZNU – 2017-11-07
    /* [Build Options] */
    Layout = "Build"; // [Build, Show, Block]
    Section = false; // show internal details
    /* [Extrusion] */
    ThreadThick = 0.25; // [0.20, 0.25]
    ThreadWidth = 0.40; // [0.40]
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    /* [Hidden] */
    Protrusion = 0.01; // [0.01, 0.1]
    HoleWindage = 0.2;
    ID = 0;
    OD = 1;
    LENGTH = 2;
    /* [Sizes] */
    RailOD = 23.5;
    Screw = [3.4,6.8,8.0]; // thread dia, head OD, screw length
    HoleOffset = [2.5,19.0/2]; // PCB mounting holes from PCB edge, rail center
    SwitchClear = [6.0,15,3.0]; // clearance around switch pins
    SwitchOffset = [6.0,0]; // center of switch from holes
    Strap = [5.5,50,2.0]; // nylon strap securing block to rail
    Block = [16.4,26.0,RailOD/2 + SwitchClear[2] + Strap[2] + 6*ThreadThick]; // basic block shape
    //- Adjust hole diameter to make the size come out right
    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);
    }
    //- Shapes
    module PCBBlock() {
    difference() {
    cube(Block,center=true);
    translate([(SwitchOffset[0] + HoleOffset[0] – Block[0]/2),SwitchOffset[1],(Block[2] – SwitchClear[2] + Protrusion)/2])
    cube(SwitchClear + [0,0,Protrusion],center=true);
    for (j=[-1,1])
    translate([HoleOffset[0] – Block[0]/2,j*HoleOffset[1],(Block[2]/2 – Screw[LENGTH])])
    rotate(180/6)
    if (false) // true = loose fit
    PolyCyl(Screw[ID],Screw[LENGTH] + Protrusion,6);
    else
    cylinder(d=Screw[ID],h=Screw[LENGTH] + Protrusion,$fn=6);
    translate([0,0,Block[2]/2 – SwitchClear[2] – Strap[2]/2 – 3*ThreadThick])
    cube(Strap,center=true);
    if (Section)
    translate([Block[0]/2,0,0])
    cube(Block + [0,2*Protrusion,2*Protrusion],center=true);
    }
    }
    module Mount() {
    difference() {
    translate([0,0,Block[2]/2])
    PCBBlock();
    rotate([0,90,0])
    cylinder(d=RailOD,h=3*Block[0],center=true);
    }
    }
    //- Build things
    if (Layout == "Show") {
    Mount();
    color("Yellow",0.5)
    rotate([0,90,0])
    cylinder(d=RailOD,h=3*Block[0],center=true);
    }
    if (Layout == "Block")
    PCBBlock();
    if (Layout == "Build")
    translate([0,0,Block[2]/2])
    rotate([0,-90,0])
    Mount();