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

  • Improved Fireball Cocoa Recipe

    It turns out that non-alkalized / non-Dutch-process cocoa has a much lower surface energy than good old Hershey’s, to the extent that my Fireball Cocoa Recipe produces powder bombs, even after far more stirring than I’m willing to exert.

    The trick is to stir the mud for a while, then let it set for 15 minutes:

    Cocoa mud
    Cocoa mud

    That apparently gives the cocoa time to get along with the milk and join forces. Stir it up again, let it sit for a few minutes, then proceed with the recipe: smooooth cocoa with no powder bombs.

    A bit more Vietmamese cinnamon is no bad thing, either …

  • Bathroom Light Switch: Contact Autopsy

    The dual switch controlling the bathroom lights began requiring some fiddling, which was not to be tolerated. After replacing the switch, I cracked the old one open to see what’s inside…

    The failed side of the switch controlled the lights over the sink:

    Light switch contacts - lights
    Light switch contacts – lights

    The side for the ceiling vent fan + light got much less use, still worked, and look a bit less blasted.

    Light switch contacts - ceiling fan
    Light switch contacts – ceiling fan

    Not much to choose between the two. It’s been running for nigh onto two decades, so …

  • Treecutting

    These days, removing senescent trees and clearing out deadwood requires a combination of high-tech machinery:

    Treecutting - 76 ft manlift
    Treecutting – 76 ft manlift

    And good old manual labor:

    Treecutting - trunk takedown
    Treecutting – trunk takedown

    One of the guys observed that they get a good deal of amusement from Youtube videos of amateur tree cutting incidents.

    They worked hard all day, pacing themselves well, finished cutting in a driving rainstorm, then returned the next day for cleanup.

    I felt a nap comin’ on strong…

  • Kenmore Progressive Vacuum Cleaner: Improved Suction Control

    The Suction Control slider on the handle of our shiny new Kenmore Progressive vacuum cleaner varies the speed of the howling motor in the base unit, rather than venting more or less air into the pipe. We like that, but it’s all too easy to inadvertently slide the control and never notice it, sooo I marked the default condition:

    Kenmore Progressive Vacuum - visible suction slider
    Kenmore Progressive Vacuum – visible suction slider

    Although every vacuum cleaner we’ve ever owned has touted its “quiet operation”, we always wear 30 dB ear muffs and it’s sometimes hard to tell the difference between full throttle and not quite so fast…

  • Slic3r vs. Sequential 3D Printing

    The tiny posts on the fencing helmet ear grommet produced a remarkable amount of PETG hair, because the nozzle had to skip between four separate pieces on the platform at each layer:

    So I told Slic3r to build each part separately:

    Fencing helmet grommet - separate builds - first attempt
    Fencing helmet grommet – separate builds – first attempt

    Due to absolutely no forethought or planning on my part, that actually worked. Slic3r defines a cylindrical keep-out zone around the nozzle that I set to 15 mm radius and 25 mm height, but those numbers are completely wrong for the M2, particularly with a V4 hot end.

    To the rear, the nuts & bolts along the bottom of the X gantry sit 5 mm above the V4 nozzle, with the relaxed actuator on my re-relocated Z-axis home switch at Z=+1 mm:

    V4 PETG - extruder priming
    V4 PETG – extruder priming

    To the front, the bed fan doesn’t sit much higher:

    M2 V4 Extruder - 24 V fans
    M2 V4 Extruder – 24 V fans

    As it turned out, the front washers built first, sitting there in front of the gantry and behind the fan, the rear washers appeared last, and Everything Just Worked.

    However, even though the M2’s layout won’t allow for automated layout, I figured I could do it manually by building the parts from front to rear:

    Fencing Helmet Ear Grommet - Slic3r layout
    Fencing Helmet Ear Grommet – Slic3r layout

    That way, the already-built parts never pass under the gantry / switch. For particularly tall parts, I could remove / relocate the bed fan to clear the already-built parts as they appear.

    Come to find out that Slic3r, for whatever reason, doesn’t build the parts in the order you’d expect from the nice list on the far right side of the screen:

    Sequential Build Order - Slic3r vs Pronterface
    Sequential Build Order – Slic3r vs Pronterface

    Worse, the Slic3r 3D preview shows the threads by layer (which is what you’d expect), rather than by object for sequential builds:

    Slic3r - sequential preview vs build order
    Slic3r – sequential preview vs build order

    I don’t know how you’d force-fit a four-dimensional preview into the UI, so I won’t complain at all.

    There’s no way to tell which part will build first; selecting the part will highlight its entry in the list (and vice versa), but the order of appearance in that list doesn’t tell you where the G-Code will appear in the output file. That’s not a problem for extruders with a keep-out volume that looks like a cylinder, so there’s no reason for Slic3r to do it any differently: it will manage the extruder position to clear all the objects in any order.

    The Pronterface preview creates the objects by reading the G-Code file and displaying the threads in order, so, if you’re quick and it’s slow, you can watch the parts appear in their to-be-built order. The detailed preview (in the small window on the right in the screenshot) does show the parts in the order they will be built as you scroll upward through the “layers”, which is the only way you can tell what will happen.

    So doing sequential builds requires iterating through these steps until the right answer appears:

    •  Add all objects separately to get each one as a separate line in the list to the right
      • Using the More option to duplicate objects produces multiple objects per line = Bad Idea
    • Arrange objects in a line from front to back
    • Export G-Code file
    • Load G-Code file into Pronterface
    • Pop up the Pronterface layer preview, scroll upward to show build order, note carefully
    • Rearrange parts in Slic3r accordingly

    That’s do-able (note the different order from the Slic3r preview):

    Fencing helmet grommet - manual sequential build
    Fencing helmet grommet – manual sequential build

    But it’s tedious and enough of a pain that it probably makes no sense for anything other than parts that you absolutely can’t build any other way.

    In this case, completing each of the bottom washers separately eliminated all of the PETG hair between the small pegs. The upper washers still had some hair inside the inner cylinder, but not much. If you were fussy, you could suppress that by selecting “Avoid crossing perimeters”, at the cost of more flailing around in the XY plane.

    All those spare grommets will make a good show-n-tell exhibit…

  • Copper Pipe Corrosion Pinholes

    When we moved into this house, I noticed a hose clamp around the half-inch copper pipe carrying hard water to the toilets and kitchen sink:

    Hose clamp patch on copper pipe
    Hose clamp patch on copper pipe

    That’s obviously a whole bunch easier than removing and replacing a section of copper pipe, so I’d say it was entirely justified. The fact that it hasn’t leaked for at least the last quarter century counts for something.

    However, Mary recently discovered a small wet spot on the basement floor. Looking directly upward, we saw:

    Copper pipe corrosion pinhole - 1
    Copper pipe corrosion pinhole – 1

    That was in open air; I added the marks around the corrosion to highlight it.

    I’d applied some foam insulation on the supply end of the pipe and, just to check, peeled it back:

    Copper pipe corrosion pinhole - 2
    Copper pipe corrosion pinhole – 2

    Huh. Although that leak was slow enough to not leak out of the insulation (the slit was upward), disturbing the corrosion produced a regular drip. Again, those marks are new.

    OK, two active pinhole leaks and a small dry green spot further downstream says it’s finally time to replace that pipe. The lengths of pipe with the pinholes add up to about eight feet, which suggests the plumber installed a bad piece of pipe back in 1955.

    Yes, I applied two more hose clamps for the holiday season, but that can’t last.

    Having a good stock of tees, elbows, and unions on hand, all I need is 21 feet (not 20, alas) of shiny new copper pipe to replace the entire run containing all the pinholes; I’m not going to fiddle around replacing just a few sections.

  • Kenmore Progressive Vacuum Cleaner vs. Classic Electrolux Dust Brush

    Vacuum cleaner dust brushes, separated by millimeters and decades:

    Kenmore vs adapted Electrolux dust brushes
    Kenmore vs adapted Electrolux dust brushes

    The bulky one on the left came with our new Kenmore Progressive vacuum cleaner. It’s fine for dust on a flat horizontal or vertical surface and totally useless for dust on actual objects. It’s supposed to snap around the handle at the end of the cleaner’s flexy hose, where it helps make the entire assembly too large and too clumsy, or on the end of the “wand”, where it’s at the wrong angle. The bonus outer shell slides around the stubby bristles in the unlikely event they’re too long for the flat surface at hand.

    The brush on the right emerged from the Box o’ Electrolux Parts that Came With The House™, must be half a century old, and consists of a cast aluminum lump with various holes milled into it, adorned with luxuriously long and flexible horsehair. Suffice it to say they don’t make ’em like that any more. Heck, they probably don’t make horses with hair like that any more, either.

    The blue plastic adapter atop the aluminum ball looks like you’d expect by now:

    Electrolux Brush Adapter
    Electrolux Brush Adapter

    The short snout fits neatly into the space available inside the ball. The abrupt ledge at the top of the snout, of course, didn’t work well; I rushed the design for a show-n-tell.

    The OpenSCAD source code (as a Github gist) bevels that ledge and tweaks the interior air channel a bit:

    // Kenmore vacuum cleaner nozzle adapters
    // Ed Nisley KE4ZNU December 2015
    // Layout options
    Layout = "LuxBrush"; // MaleFitting CoilWand FloorBrush CreviceTool ScrubbyTool LuxBrush
    //- 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();
    }
    }
    //——————-
    // Refrigerator evaporator coil wand
    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();
    }
    }
    //——————-
    // 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();
    }
    }
    //——————-
    // 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 == "ScrubbyTool")
    ScrubbyTool();
    if (Layout == "LuxBrush")
    LuxBrush();

    That’s  supposed to prevent the WordPress post editors from destroying the formatting…