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: Home Ec

Things around the home & hearth

  • Icecast and Ezstream Configuration

    Plugging a 64 GB USB stick with directories full of MP3 / OGG files into an always-on Raspberry Pi running Pi-Hole, one can use Icecast to stream them for clients on the LAN, so as to avoid over-the-Intertubes streaming issues.

    The only changes in the /etc/icecast2/icecast.xml file cover passwords, the number of source streams, and the hostname. It’s that simple, really.

    Given a directory of files, generate a file-per-line playlist:

    find /mnt/music/goodmusic/ -name \*mp3 | sort > /mnt/music/goodmusic/playlist.m3u
    

    Then set up a corresponding Ezstream XML file, perhaps imaginatively named goodmusic.xml:

    <ezstream>
        <url>http://localhost:8000/goodmusic</url>
        <sourcepassword>make-up-your-own</sourcepassword>
        <format>MP3</format>
        <filename>/mnt/music/goodmusic/playlist.m3u</filename>
        <shuffle>1</shuffle>
        <stream_once>0</stream_once>
        <svrinfoname>Good Music</svrinfoname>
        <svrinfourl>pihole.local</svrinfourl>
        <svrinfogenre>Good Music Streaming 24x7</svrinfogenre>
        <svrinfodescription>Techno Dub</svrinfodescription>
        <svrinfobitrate>128</svrinfobitrate>
        <svrinfochannels>2</svrinfochannels>
        <svrinfosamplerate>44100</svrinfosamplerate>
        <svrinfopublic>1</svrinfopublic>
    </ezstream>
    

    Fire off the source stream in /etc/rc.local:

    ezstream -c /home/pi/Icecast/goodmusic.xml &
    

    The ampersand tells Bash to fire-and-forget the process, so it runs all the time. One could, I suppose, put it in crontab to start after each boot or puzzle out the corresponding systemd incantation, but …

    Add the station to your streaming media player:

             'KEY_KP5'   : ['Good Music',False,['mplayer','-playlist','http://192.168.1.2:8000/goodmusic.m3u']],
    

    And then It Just Works™.

  • Bird Feeder Unbending

    At some point in its history, the left rail holding the wood perch on our industrial-strength “squirrel proof” seed feeder took a hit, most likely from being dropped:

    Squirrel on bird feeder
    Squirrel on bird feeder

    I finally got a Round Tuit and un-bent the poor thing:

    Bird feeder - rail un-bending
    Bird feeder – rail un-bending

    Because the bend happened at the base of the vertical strut holding the shutter, I clamped a Genuine Vise-Grip sheet metal pliers along the straight section. The Craftsman knock-off Vise-Grip then applied torque at the bend, rather than just making things worse, and some two-axis tweakage lined up the rail pretty well.

    With the bend taken care of, I clamped the rail in the bench vise with some scrap wood around the strut:

    Bird feeder - warped rail
    Bird feeder – warped rail

    A percussive adjustment jam session flattened the top flange, leaving both sections as flat as they’re gonna get.

    While I was at it, I turned a pair of stepped aluminum washers for the new wood rod:

    Bird feeder - parting off washer
    Bird feeder – parting off washer

    Which looked about like you’d expect, including a little chatter from the cut off tool:

    Bird feeder - perch hardware
    Bird feeder – perch hardware

    Yeah, I drilled the wood rod on the lathe, too; I loves me some simple lathe action.

    Reassemble in reverse order and it’s all good:

    Bird feeder - perch installed
    Bird feeder – perch installed

    We’re supposed to bleach the feeder every week to kill off the bacteria causing House Finch Eye Disease and, while I can’t promise a weekly schedule, we’ll (try to) reduce the amount of crud on the feeder this year.

    If you’ve got a feeder, sign up for Project Feederwatch and do some citizen science!

  • Let the Dead Past Bury Its Dead

    My old Gen 1 Kindle Fire hasn’t seen much action lately, so I figured maybe it could end its days by becoming a slide show / picture frame. While fiddling around, I tried to fire up the Amazon Shopping app:

    Amazon App Unsupported on Amazon Gen 1 Kindle
    Amazon App Unsupported on Amazon Gen 1 Kindle

    Clicking the big orange button fired up Amazon’s Silk browser, which promptly crashed.

    Some days, the punch line writes itself …

  • Kenmore Progressive Vacuum Tool Adapters: Third Failure

    The adapter for an old Electrolux crevice tool (not the dust brush) snapped at the usual stress concentration after about three years:

    Crevice tool adapter - broken vs PVC pipe
    Crevice tool adapter – broken vs PVC pipe

    The lower adapter is the new version, made from a length of 1 inch PVC pipe (that’s the ID, kinda-sorta) epoxied into a revised Kenmore adapter fitting.

    The original OpenSCAD model provided the taper dimensions:

    Electrolux Crevice Tool Adapter - PVC taper doodles
    Electrolux Crevice Tool Adapter – PVC taper doodles

    The taper isn’t quite as critical as it seems, because the crevice tool is an ancient molded plastic part, but a smidge over half a degree seemed like a good target.

    Start by boring out the pipe ID until it’s Big Enough (or, equally, the walls aren’t Scary Thin) at 28 mm:

    Crevice tool adapter - boring PVC
    Crevice tool adapter – boring PVC

    Alas, the mini-lathe’s craptastic compound has 2° graduations:

    Minilathe compound angle scale
    Minilathe compound angle scale

    So I set the angle using a somewhat less craptastic protractor and angle gauge:

    Crevice tool adapter - compound angle
    Crevice tool adapter – compound angle

    The little wedge of daylight near the gauge pivot is the difference between the normal perpendicular-to-the-spindle axis setting and half-a-degree-ish.

    Turning PVC produces remarkably tenacious swarf:

    Crevice tool adapter - PVC swarf
    Crevice tool adapter – PVC swarf

    The gash along the top comes from a utility knife; just pulling the swarf off didn’t work well at all.

    The column of figures down the right side of the doodles shows successive approximations to the target angle, mostly achieved by percussive adjustment, eventually converging to about the right taper with the proper dimensions.

    Cutting off the finished product with the (newly angled) cutoff bit:

    Crevice tool adapter - cutoff
    Crevice tool adapter – cutoff

    And then It Just Worked™.

    The OpenSCAD source code for all the adapters as a GitHub Gist:

    // Kenmore vacuum cleaner nozzle adapters
    // Ed Nisley KE4ZNU November 2015 and ongoing
    // Layout options
    Layout = "CrevicePipe"; // MaleFitting CoilWand FloorBrush
    // CreviceTool Crevice Pipe ScrubbyTool LuxBrush DustBrush
    //- Extrusion parameters must match reality!
    // Print with +1 shells and 3 solid layers
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    HoleWindage = 0.2;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    Protrusion = 0.1; // make holes end cleanly
    //———————-
    // Dimensions
    ID1 = 0; // for tapered tubes
    ID2 = 1;
    OD1 = 2;
    OD2 = 3;
    LENGTH = 4;
    OEMTube = [35.0,35.0,41.7,40.5,30.0]; // main fitting tube
    EndStop = [OEMTube[ID1],OEMTube[ID2],47.5,47.5,6.5]; // flange at end of main tube
    FittingOAL = OEMTube[LENGTH] + EndStop[LENGTH];
    $fn = 12*4;
    //———————-
    // 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);
    }
    //——————-
    // Male fitting on end of Kenmore tools
    // This slides into the end of the handle or wand and latches firmly in place
    module MaleFitting() {
    Latch = [40,11.5,5.0]; // rectangle latch opening
    EntryAngle = 45; // latch entry ramp
    EntrySides = 16;
    EntryHeight = 15.0; // lower edge on *inside* of fitting
    KeyRadius = 1.0;
    translate([0,0,6.5])
    difference() {
    union() {
    cylinder(d1=OEMTube[OD1],d2=OEMTube[OD2],h=OEMTube[LENGTH]); // main tube
    hull() // insertion guide
    for (i=[-(6.0/2 – KeyRadius),(6.0/2 – KeyRadius)],
    j=[-(28.0/2 – KeyRadius),(28.0/2 – KeyRadius)],
    k=[-(26.0/2 – KeyRadius),(26.0/2 – KeyRadius)])
    translate([(i – (OEMTube[ID1]/2 + OEMTube[OD1]/2)/2 + 6.0/2),j,(k + 26.0/2 – 1.0)])
    sphere(r=KeyRadius,$fn=8);
    translate([0,0,-EndStop[LENGTH]]) // wand tube butts against this
    cylinder(d=EndStop[OD1],h=EndStop[LENGTH] + Protrusion);
    }
    translate([0,0,-OEMTube[LENGTH]]) // main bore
    cylinder(d=OEMTube[ID1],h=2*OEMTube[LENGTH] + 2*Protrusion);
    translate([0,-11.5/2,23.0 – 5.0]) // latch opening
    cube(Latch);
    translate([OEMTube[ID1]/2 + EntryHeight/tan(90-EntryAngle),0,0]) // latch ramp
    translate([(Latch[1]/cos(180/EntrySides))*cos(EntryAngle)/2,0,(Latch[1]/cos(180/EntrySides))*sin(EntryAngle)/2])
    rotate([0,-EntryAngle,0])
    intersection() {
    rotate(180/EntrySides)
    PolyCyl(Latch[1],Latch[0],EntrySides);
    translate([-(2*Latch[0])/2,0,-Protrusion])
    cube(2*Latch[0],center=true);
    }
    }
    }
    //——————-
    // Refrigerator evaporator coil wand
    module CoilWand() {
    union() {
    translate([0,0,50.0])
    rotate([180,0,0])
    difference() {
    cylinder(d1=EndStop[OD1],d2=42.0,h=50.0);
    translate([0,0,-Protrusion])
    cylinder(d1=35.0,d2=35.8,h=100);
    }
    translate([0,0,50.0 – Protrusion])
    MaleFitting();
    }
    }
    //——————-
    // Samsung floor brush
    module FloorBrush() {
    union() {
    translate([0,0,60.0])
    rotate([180,0,0])
    difference() {
    union() {
    cylinder(d1=EndStop[OD1],d2=32.4,h=10.0);
    translate([0,0,10.0 – Protrusion])
    cylinder(d1=32.4,d2=30.7,h=50.0 + Protrusion);
    }
    translate([0,0,-Protrusion])
    cylinder(d1=28.0,d2=24.0,h=100);
    }
    translate([0,0,60.0 – Protrusion])
    MaleFitting();
    }
    }
    //——————-
    // Crevice tool
    module CreviceTool() {
    union() {
    translate([0,0,60.0])
    rotate([180,0,0])
    difference() {
    union() {
    cylinder(d1=EndStop[OD1],d2=32.0,h=10.0);
    translate([0,0,10.0 – Protrusion])
    cylinder(d1=32.0,d2=30.4,h=50.0 + Protrusion);
    }
    translate([0,0,-Protrusion])
    cylinder(d1=28.0,d2=24.0,h=100);
    }
    translate([0,0,60.0 – Protrusion])
    MaleFitting();
    }
    }
    //——————-
    // Crevice tool
    // Hacked for 1 inch Schedule 40 PVC pipe stiffening tube
    module CrevicePipe() {
    PipeOD = 33.5;
    union() {
    translate([0,0,10.0])
    rotate([180,0,0])
    difference() {
    cylinder(d1=EndStop[OD1],d2=PipeOD+2*8*ThreadWidth,h=10.0);
    translate([0,0,-Protrusion])
    cylinder(d=PipeOD,h=100);
    }
    translate([0,0,10.0])
    MaleFitting();
    }
    }
    //——————-
    // Mystery brush
    module ScrubbyTool() {
    union() {
    translate([0,0,60.0])
    rotate([180,0,0])
    difference() {
    union() {
    cylinder(d1=EndStop[OD1],d2=31.8,h=10.0);
    translate([0,0,10.0 – Protrusion])
    cylinder(d1=31.8,d2=31.0,h=50.0 + Protrusion);
    }
    translate([0,0,-Protrusion])
    cylinder(d1=26.0,d2=24.0,h=100);
    }
    translate([0,0,60.0 – Protrusion])
    MaleFitting();
    }
    }
    //——————-
    // eBay horsehair dusting brush
    // Hacked for 3/4" Schedule 40 PVC stiffening tube
    // eBay: 30.0 32.0 30.0
    // Shopvac: 30.3 31.0 25.0
    // Must build snout down with brim to avoid support
    module DustBrush() {
    PipeOD = 27.0; // stiffening pipe
    Snout = [0,0, 31.0, 30.3, 25.0];
    TaperLength = 10.0; // transition cone from fitting to snout
    union() {
    translate([0,0,Snout[LENGTH] + TaperLength])
    rotate([180,0,0])
    difference() {
    union() {
    cylinder(d1=EndStop[OD1],d2=Snout[OD1],h=TaperLength);
    translate([0,0,TaperLength – Protrusion])
    cylinder(d1=Snout[OD1],d2=Snout[OD2],h=Snout[LENGTH] + Protrusion);
    }
    translate([0,0,-Protrusion]) // 3/4 inch Sch 40 PVC
    PolyCyl(PipeOD,100);
    }
    translate([0,0,Snout[LENGTH] + TaperLength – Protrusion])
    MaleFitting();
    }
    }
    //——————-
    // Electrolux brush ball
    module LuxBrush() {
    union() {
    translate([0,0,30.0])
    rotate([180,0,0])
    difference() {
    union() {
    cylinder(d1=EndStop[OD1],d2=30.8,h=10.0);
    translate([0,0,10.0 – Protrusion])
    cylinder(d1=30.8,d2=30.0,h=20.0 + Protrusion);
    }
    translate([0,0,-Protrusion])
    cylinder(d1=25.0,d2=23.0,h=30 + 2*Protrusion);
    }
    translate([0,0,30.0 – Protrusion])
    MaleFitting();
    }
    }
    //———————-
    // Build it!
    if (Layout == "MaleFitting")
    MaleFitting();
    if (Layout == "CoilWand")
    CoilWand();
    if (Layout == "FloorBrush")
    FloorBrush();
    if (Layout == "CreviceTool")
    CreviceTool();
    if (Layout == "CrevicePipe")
    CrevicePipe();
    if (Layout == "DustBrush")
    DustBrush();
    if (Layout == "ScrubbyTool")
    ScrubbyTool();
    if (Layout == "LuxBrush")
    LuxBrush();
  • Cheese Slicer Rebuild

    Cheese Slicer Rebuild

    The cheese slicer frame looked much better after sandblasting with 220 aluminum oxide grit:

    Cheese slicer - sandblasted
    Cheese slicer – sandblasted

    The flower bed outside the Basement Laboratory door seems a bit dusty, though.

    Slathering it with JB Weld steel-filled epoxy went reasonably well:

    Cheese slicer - JB Weld curing
    Cheese slicer – JB Weld curing

    JB Weld is much much more viscous than the clear XTC-3D I used last year and the final coating, while smoother than what you see here, has too many sags and dents to say “good job”. I didn’t bother coating the upper tips, because the epoxy will wear off from my morning KP.

    The aluminum roller turned on those bare stainless steel screws in the tray, with the threads chewing into the roller bore. While the epoxy was curing, I drilled out the roller to remove most of the ridges:

    Cheese slicer - drilling roller
    Cheese slicer – drilling roller

    Cut a pair of stainless screws slightly longer than the old screws, then turn the threads off to make a shaft:

    Cheese slicer - screw reshaping
    Cheese slicer – screw reshaping

    The lathe spindle runs in reverse, so the cutting force tends to tighten the screw in the nuts. The big old South Bend lathe had a screw-on chuck and didn’t really like turning backwards.

    The new screws won’t win any beauty prizes, but they get the job done:

    Cheese slicer - screw shafts
    Cheese slicer – screw shafts

    Turn a Delrin rod to a press fit in the drilled-out roller:

    Cheese slicer - turning Delrin bearing
    Cheese slicer – turning Delrin bearing

    Part it off, repeat, ram them into the roller, then drill to a loose fit around the smooth-ish screw shafts:

    Cheese slicer - drilling Delrin bearing
    Cheese slicer – drilling Delrin bearing

    Reassemble in reverse order:

    Cheese slicer - rebuilt
    Cheese slicer – rebuilt

    Looks downright industrial, it does.

    Stipulated: this makes no economic sense, absent the simple fact we appreciate utensils that just work.

  • Monthly Science: End of the Cheese Slicer Epoxy Coating

    The corrosion growing on our long-suffering cheese slicer finally ruptured its epoxy coating:

    Cheese Slicer - epoxy coating split
    Cheese Slicer – epoxy coating split

    Most of the epoxy remains in good shape, but it’s obviously not the right hammer for this job.

    Having recently spotted my tiny sandblaster, I think I can clear off the corrosion and epoxy well enough to try again with good old JB Weld epoxy. It’s not rated for underwater use, so I don’t expect long-term goodness, but it’ll be an interesting comparison.

    Bonus: the slicer will start with a uniform gray surface!

     

  • MPCNC Vinyl Cutting: Squidwrench Logo

    The Mighty Thor provided the new-ish Squidwrench logo in various digital formats, not including DXF, but dxf2gcode can process PDF files (and a few others), and the cutting / weeding / transfer ended well:

    MPCNC Vinyl Cutting - Squidwrench logo on mug
    MPCNC Vinyl Cutting – Squidwrench logo on mug

    That’s the same 14 mil gold vinyl you saw in the Crown test.

    Alas, I re-covered the pattern with the transfer film when I ran the mug through the dishwasher, in the mistaken belief the film would protect the vinyl. Come to find out the film adheres better to the vinyl than to the mug: it pulled loose during washing and peeled most of the logo off the mug.

    Setting the drag knife to cut hot pink 9 mil = 0.25 mm vinyl film produced another logo:

    SqWr logo - hot pink
    SqWr logo – hot pink

    It’s now survived several trips through the dishwasher with no protection, so I’ll call it a win.

    I set dxf2gcode to use a cutting depth = 1.0 mm for about 400 g of downforce, which seems to work, although the vinyl surface showed some marks from the flat nose around the drag knife blade.

    The USB camera provides a convenient way to set the “workpiece origin” before cutting:

    bCNC - Video align
    bCNC – Video align

    Because the camera sits 130 mm beyond the blade in the +Y direction, it can’t see the swathe along the front of the MPCNC. Hard and soft limits in bCNC / GRBL keep you (well, me) from smashing the gantry into the rails, but it’s a nuisance when you forget to tape the vinyl far enough from the front.