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

  • Digital Chicken

    Because you get white eggs from white chickens and brown eggs from brown chickens (*), this one came from a brown chicken with the digital option:

    Date-coded brown egg
    Date-coded brown egg

    The egg matched the carton date stamp, so this must be an additional part of the process.

    Some casual searching shows egg shell printing is a production-line thing.

    I suppose RFID-per-egg will eventually be the Next New Thing.

    (*) Yes, and chocolate milk from brown cows. Work with me on this, OK?

  • MPCNC: Ground Shaft Pen Holder

    Drilling a pair of holes into a length of ground steel shaft turned it into a holder for a Sakura Micron pen:

    DW660 Pen Holder - printed plastic vs ground steel
    DW660 Pen Holder – printed plastic vs ground steel

    The aluminum ring epoxied to the top keeps it from falling completely through the linear bearing.

    The hole sizes are the nearest inch drills matching the pen’s hard metric sizes:

    Ground 12 mm rod - Sakura pen drill diameters
    Ground 12 mm rod – Sakura pen drill diameters

    While I was at the lathe, I turned another layer of epoxy on the printed holder down to a consistent 11.95+ OD. It fits the bearing nearly as well as the steel shaft, although it’s not quite as smooth.

    The steel version weighs about 20 g with the pen, so it applies about the same downforce on the pen nib as the HP 7475A plotter. The force varies from about 19 g as the Z axis moves upward to 23 g as it move downward, so the stiction amounts to less than 10% of the weight:

    DW660 Pen Holder - ground shaft
    DW660 Pen Holder – ground shaft

    However, the more I ponder this setup, the less I like it.

    When the Z-axis moves downward and the nib hits the paper, it must decelerate the weight of the pen + holder + ballast within a fraction of a millimeter, without crushing the nib. If the pen moves downward at 3000 mm/min = 50 mm/s, stopping in 0.3 mm requires an acceleration of 4.2 m/s² and a 20 g = 2/3 oz mass will apply 0.08 N = 0.3 oz to the nib. Seems survivable, but smashing the tip a few hundred times while drawing the legends can’t possibly be good for it.

    Also, the tool length probe switch trips at 60 (-ish) g, which means the pen can’t activate the switch. Adding a manual latch seems absurd, but you can get used to anything if you do it enough.

  • Propane Tank QD Fitting Adapter, PETG Edition

    Smoking bacon during the winter months brought the third tank into play, requiring the POL-to-QD adapter I’d had in the drawer for just such an occasion. Not much to my surprise, the old PLA fitting adapter snapped along the layers near the outside end of the triangular snout:

    IMG_20180408_125018
    IMG_20180408_125018

    So I ran off the two orange ones in PETG with six perimeter layers and 50% infill density:

    Propane QD Adapter Tool - Slic3r
    Propane QD Adapter Tool – Slic3r

    Those should last roughly forever …

    The OpenSCAD source code as a GitHub Gist:

    // Propane tank QD connector adapter tool
    // Ed Nisley KE4ZNU November 2012
    // 2018-04-08 toss MCAD includes overboard
    //- Extrusion parameters must match reality!
    // Print with about half a dozen perimeter threads and 50% infill
    ThreadThick = 0.25;
    ThreadWidth = 2.0 * ThreadThick;
    HoleWindage = 0.2;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    Protrusion = 0.1; // make holes end cleanly
    inch = 25.4;
    //———————-
    // Dimensions
    WrenchSize = (5/8) * inch; // across the flats
    WrenchThick = 10;
    NoseDia = 8.6;
    NoseLength = 9.0;
    LockDia = 12.5;
    LockRingLength = 1.0;
    LockTaperLength = 1.5;
    TriDia = 15.1;
    TriWide = 12.2; // from OD across center to triangle side
    TriOffset = TriWide – TriDia/2; // from center to triangle side
    TriLength = 9.8;
    NeckDia = TriDia;
    NeckLength = 4.0;
    //———————-
    // 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);
    }
    /*
    module ShowPegGrid(Space = 10.0,Size = 1.0) {
    Range = floor(50 / Space);
    for (x=[-Range:Range])
    for (y=[-Range:Range])
    translate([x*Space,y*Space,Size/2])
    %cube(Size,center=true);
    }
    */
    //——————-
    // Build it…
    $fn = 4*6;
    //ShowPegGrid();
    union() {
    translate([0,0,(WrenchThick + NeckLength + TriLength – LockTaperLength – LockRingLength + Protrusion)])
    cylinder(r1=NoseDia/2,r2=LockDia/2,h=LockTaperLength);
    translate([0,0,(WrenchThick + NeckLength + TriLength – LockRingLength)])
    cylinder(r=LockDia/2,h=LockRingLength);
    difference() {
    union() {
    translate([0,0,WrenchThick/2])
    cube([WrenchSize,WrenchSize,WrenchThick],center=true);
    cylinder(r=TriDia/2,h=(WrenchThick + NeckLength +TriLength));
    cylinder(r=NoseDia/2,h=(WrenchThick + NeckLength + TriLength + NoseLength));
    }
    for (a=[-1:1]) {
    rotate(a*120)
    translate([(TriOffset + WrenchSize/2),0,(WrenchThick + NeckLength + TriLength/2 + Protrusion/2)])
    cube([WrenchSize,WrenchSize,(TriLength + Protrusion)],center=true);
    }
    }
    }
  • Streaming Radio Player: CE Timing Tweak

    Adding delays around the SPI control signal changes reduced the OLED glitch rate from maybe a few a week  to once a week, but didn’t completely solve the problem.

    However, (nearly) all the remaining glitches seem to occur while writing a single row of pixels, which trashes the rest of the display and resolves on the next track update. That suggests slowing the timing during the initial hardware setup did change the results.

    Another look at the Luma code showed I missed the Chip Enable (a.k.a. Chip Select in the SH1106 doc) change in serial.py:

    def _write_bytes(self, data):
        gpio = self._gpio
        if self._CE:
            time.sleep(1.0e-3)
            gpio.output(self._CE, gpio.LOW)  # Active low
            time.sleep(1.0e-3)
    
        for byte in data:
            for _ in range(8):
                gpio.output(self._SDA, byte & 0x80)
                gpio.output(self._SCLK, gpio.HIGH)
                byte <<= 1
                gpio.output(self._SCLK, gpio.LOW)
    
        if self._CE:
            time.sleep(1.0e-3)
            gpio.output(self._CE, gpio.HIGH)
    

    What remains unclear (to me, anyway) is how the code in Luma's bitbang class interacts with the hardware-based SPI code in Python’s underlying spidev library. I think what I just changed shouldn’t make any difference, because the code should be using the hardware driver, but the failure rate is now low enough I can’t be sure for another few weeks (and maybe not even then).

    All this boils down to the Pi’s SPI hardware interface, which changes the CS output with setup / hold times measured in a few “core clock cycles”, which is way too fast for the SH1106. It seems there’s no control over CS timing, other than by changing the kernel’s bcm2708 driver code, which ain’t happening.

    The Python library includes a no_cs option, with the caveat it will “disable use of the chip select (although the driver may still own the CS pin)”.

    Running vcgencmd measure_clock core (usage and some commands) returns frequency(1)=250000000, which says a “core clock cycle” amounts to a whopping 4 ns.

    Forcibly insisting on using Luma’s bitbang routine may be the only way to make this work, but I don’t yet know how to do that.

    Obviously, I should code up a testcase to hammer the OLED and peer at the results on the oscilloscope: one careful observation outweighs a thousand opinions.

  • Fluorescent Shop Light Ballasts, Redux

    As usual, several shoplights didn’t survive the winter, so I gutted and rebuilt them with LED tubes. Even the fancy shoplights with genuine electronic ballasts survive less than nine years, as two of those eight “new” lamps have failed so far.

    The dead ballast looks the same as it did before:

    Electronic ballast - label
    Electronic ballast – label

    Some deft work with a cold chisel and my Designated Prydriver popped the top to reveal a plastic-wrapped circuit board:

    Electronic ballast - interior wrapped
    Electronic ballast – interior wrapped

    Perhaps the flexy gunk reduces the sound level:

    Electronic ballast - interior A
    Electronic ballast – interior A

    While also preventing casual failure analysis and organ harvesting:

    Electronic ballast - interior B
    Electronic ballast – interior B

    The black gunk smells more like plastic and less like old-school tar. It’s definitely not a peel-able conformal coating.

    One the other paw, the two magnetic ballasts in another lamp sported actual metal-film capacitors, which I harvested and tossed into the Big Box o’ Film Caps:

    Shoplight choke ballast - film cap
    Shoplight choke ballast – film cap

    If a dying ballast didn’t also kill its fluorescent tube(s), I’d be less annoyed. I’m running the remaining tubes through the surviving fixtures, but the end is nigh for both.

    The new LED tubes produce more light than the old fluorescents, although I still don’t like their 6500 K “daylight glow” color.

  • Sena PS410 Serial Server: Shelf with Calculations

    A crude shelf bandsawed from a plank moves the Sena PS410 serial server and an old Ethernet switch off the bench:

    Serial server shelf - front
    Serial server shelf – front

    The brackets holding it to the studs came from a 2×4 inch scrap:

    Serial server shelf - rear
    Serial server shelf – rear

    Obviously, the Basement Laboratory lacks stylin’ home decor.

    None of which would be worth mentioning, except for some Shop Calculations scrawled on the 2×4:

    Wood shop calculations
    Wood shop calculations

    It’s in my handwriting, although whatever it related to is long gone.

    Trigonometry FTW!

  • Snowblower Muffler Bracket

    After three years, the bracket locking the snowblower’s muffler bolts broke, but this time I saw the bolt pop out of the muffler, fall to the driveway, and lie there sizzling in the slush. I tightened the remaining bolt and completed the mission.

    The OEM bracket was thin sheet metal and broke across one bolt hole under the head. I sawed a rectangle out of a defunct PC case, then drilled clearance holes:

    Snowblower muffler - drilling bracket
    Snowblower muffler – drilling bracket

    Bending two corners upward locks the bolt heads in position. I started the bends by clamping the bracket in the bench vise and whacking the corners, then finishing the job with a drift punch after installing it:

    Snowblower muffler installed
    Snowblower muffler installed

    Of course, I renewed the Never-Seez on the bolt threads; they obviously weren’t corroded in place!

    For whatever it’s worth, the many spot welds joining the top bracket to the muffler are doing just fine.