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

Prusa Mk 4 3D printer with MMU3 feeder

  • Furnace Pipe Temperature Sensor Mount: Diluting the Phlogiston

    Furnace Pipe Temperature Sensor Mount: Diluting the Phlogiston

    Being that type of guy, I enjoy keeping track of the gas furnace’s behavior and the least invasive method is monitoring the inlet and outlet water temperatures. I already have an Ambient Weather station for other things, including a pair of WH31P temperature sensor probes for the heat pump’s outdoor exhaust air and indoor duct temperature. Unfortunately, those sensors top out at (an undocumented in the description) 140 °F and the furnace water runs around 180 °F.

    Because I’m more interested in furnace run time than exact water temperature, putting the sensor somewhere between the 180 °F pipe and the 60 °F basement air seemed reasonable.

    A quick test showed it might work:

    Furnace pipe sensor - proof of concept
    Furnace pipe sensor – proof of concept

    That’s a random cart coin for insulation under a random heatsink for cooling, with the WH31P probe clamped under a snippet of closed-cell packing foam.

    Emboldened by 180 °F water in the pipe producing 80 °F at the probe, I conjured a more formal mount from the vasty digital deep:

    Furnace Pipe Sensor Mount - solid model - show view
    Furnace Pipe Sensor Mount – solid model – show view

    Which looks pretty much like that in real life:

    Furnace pipe sensor - installed
    Furnace pipe sensor – installed

    A layer of heatsink tape holds it to the plastic block, which in turn just sits on the rather crusty pipe surface. The blue wire is a thermocouple reporting the actual pipe temperature and, if the sensor isn’t getting enough heat, a blob of heatsink grease on the pipe will surely help.

    The spring arms originally held the heatsink to a PCB atop a Northbridge chip (or some such), so those solderless connectors crimped on shock cord should make it feel at home.

    Installing the sensors immediately raised the outdoor temperature by 20 °F at the beginning of an atypically warm November week, so it’ll be a while before I have any results.

  • Electrolux Dust Brush: Replacement Rubber

    Electrolux Dust Brush: Replacement Rubber

    The Electrolux Model G vacuum cleaner that Came With The Previous House™ has a dust brush attachment resembling a creature from a deep sea trench:

    Electroxlux Brush Ball - OEM assembled
    Electroxlux Brush Ball – OEM assembled

    Those bristles recently fell out during a cleaning session:

    Electroxlux Brush Ball - OEM with brush
    Electroxlux Brush Ball – OEM with brush

    I will never know their backstory, but the rough-cut metal ring strongly suggests they’re a replacement for the original Electrolux bristles. Given that the Model G dates back to the early sixties, that puppy has been around for six decades and counting.

    The rubber insert in the aluminum ball had long since fossilized:

    Electroxlux Brush Ball - OEM rubber
    Electroxlux Brush Ball – OEM rubber

    Not knowing if it would come out in approximately one piece, a doodle records whatever dimensions I could measure:

    Electroxlux Brush Ball - exterior measurements
    Electroxlux Brush Ball – exterior measurements

    Surprisingly, it remained just flexible enough:

    Electroxlux Brush Ball - OEM rubber removed
    Electroxlux Brush Ball – OEM rubber removed

    So I could measure a few more rubber dimensions:

    Electroxlux Brush Ball - rubber measurements
    Electroxlux Brush Ball – rubber measurements

    And ball dimensions:

    Electroxlux Brush Ball - metal measurements
    Electroxlux Brush Ball – metal measurements

    After screwing around drawing Beziér curves for maybe half an hour, I realized a crude polygonal approximation would work perfectly well when 3D printed in TPU with a 0.8 mm nozzle:

    Electroxlux Brush Ball - show 5 view
    Electroxlux Brush Ball – show 5 view

    Which had the compelling advantage I could exactly specify the points and tweak them for an exact fit:

    SplitHeight = 15;
    SplitCube = [100,100,SplitHeight - Protrusion];
    
    NozzleHeight = 15 + SplitHeight;          // above top of ball nozzle
    
    Pts = [
      [61,11],[62,6],[61,2],[55,0],[48,0],    // outside bottom
      [38,5],[33,11],
      [31,SplitHeight],[26,SplitHeight],      // atop ball nozzle rim
      [26,18],[27,19],[31,NozzleHeight],[33,NozzleHeight],    // bristle reinforcement
      [39,19],[40,18],[40,16],
      [35,SplitHeight],
      [36,11],[40,6],                         // inside bottom
      [45,3],[48,2],[52,1],[55,1],
      [59,3],[60,6],[58,9],[59,11],                  // brush metal rim seat
      [61,11],
    ];
    
    

    Turn those points into a polygon, spin it into a ring, and add a ghostly plane to show where the model separates into printable halves:

    if (Layout == "Show") {
        scale([0.5,0.5,1.0])
          rotate_extrude(angle=Slice,start=0,convexity=5) polygon(Pts);
        up(SplitHeight)
          color("Orange",0.2)
            cuboid([100,100,Protrusion],anchor=BOTTOM);
    }
    

    The scale() compensates for the list of points having easily measured real-life diameters, but the polygon() must be at the radius away from the origin; you could divide all the X axis coordinates in the list by two. Dimensions along the Z axis remain unchanged.

    Like this:

    Electroxlux Brush Ball - show 360 view
    Electroxlux Brush Ball – show 360 view

    Split it along the ghostly plane into printable parts:

    if (Layout == "Build") {
      fwd(50)
        intersection() {
          scale([0.5,0.5,1.0])
            rotate_extrude(convexity=5) polygon(Pts);
          cuboid(SplitCube,anchor=BOTTOM);
        }
      back(30)
        intersection() {
          down(SplitHeight)
            scale([0.5,0.5,1.0])
              rotate_extrude(convexity=5) polygon(Pts);
          cuboid(SplitCube,anchor=BOTTOM);
        }
    
    }
    

    Like this:

    Electroxlux Brush Ball - build view
    Electroxlux Brush Ball – build view

    Run the model through PrusaSlicer, install the 0.8 mm nozzle in the MK4, load TPU filament, let the magic happens, then dab JB PlasticBonder urethane adhesive around the mating rim of the bottom part:

    Electroxlux Brush Ball - gluing part
    Electroxlux Brush Ball – gluing part

    Yeah, black would be more better, but tan is fine.

    Flip it over, eyeballometrically center the gooey ring in the wide rim of the nozzle, and let it cure.

    Which eventually looks like it grew that way:

    Electroxlux Brush Ball - replacement TPU
    Electroxlux Brush Ball – replacement TPU

    See? Crude low-poly models FTW!

    As usual, however, it takes two to make a thing go right:

    Electroxlux Brush Ball - TPU versions
    Electroxlux Brush Ball – TPU versions

    The first pass in the center front showed the outer rim needed a deeper recess to grip the metal ring around the bristles; I’m sure I could pry the bristles out of the second version if lives depended on it.

    I added the elongated nozzle to stand halfway up inside the bristles to keep them from collapsing inward under suction:

    Electroxlux Brush Ball - nozzle in brush
    Electroxlux Brush Ball – nozzle in brush

    It’s definitely better than it was!

    Might last another half-century; the original Electrolux vacuums are survivors.

  • PolyDryer Box Auto-rewind Spindle Spring Cap Rebuild

    PolyDryer Box Auto-rewind Spindle Spring Cap Rebuild

    Although the auto-rewind spindles for the PolyDryer Boxes have worked well for over a year, one of them recently stopped rewinding. After some fiddling about with all the usual suspects, I dismantled the spindle and found this inside:

    Auto-rewind spindle - failed spring slot
    Auto-rewind spindle – failed spring slot

    The spring tab barely visible below the separated filament layers normally fits in that slot, but now rotates freely as the spring turns with the spindle’s axle.

    A short while later:

    Auto-rewind spindle - reprinted spring cap
    Auto-rewind spindle – reprinted spring cap

    The minuscule carbon fibers in PETG-CF don’t improve the layer-to-layer adhesion and may make it worse, particularly in designs with very small cross-sections.

    I use PETG-CF mostly because I like how it looks, as few of my designs require even moderate tensile strength.

  • Halloween Candy: Now With Bones

    Halloween Candy: Now With Bones

    A skeletal hand and foot seem appropriate:

    Halloween Candy - skeleton parts
    Halloween Candy – skeleton parts

    Making them less obvious may be more effective:

    Halloween Candy - hidden skeleton parts
    Halloween Candy – hidden skeleton parts

    However, leftover junk food is known to be a Bad Idea™ …

  • Outdoor Lamp Glass Retainers

    Outdoor Lamp Glass Retainers

    Tucking seasonal decorations into the lamps bracketing the garage door would be much easier if the rubber buttons retaining the glass panes were squishy cylinders, rather than fossilized pebbles:

    Outdoor Lamp Glass Retainers - old vs new
    Outdoor Lamp Glass Retainers – old vs new

    The five tidy buttons on the right are black TPU, hot off the MK4’s printbed:

    Outdoor Lamp Glass Retainers - PrusaSlicer preview
    Outdoor Lamp Glass Retainers – PrusaSlicer preview

    The flange allows for some, shall we say, dimensional variation in the installation:

    Outdoor Lamp Glass Retainers - old vs new - installed
    Outdoor Lamp Glass Retainers – old vs new – installed

    They’re just a tube atop a cylinder:

    nx = ceil(sqrt(NumButtons));
    ny = nx;
    
    union()
    for (nx = [0:nx-1], ny = [0:ny-1])
      right(nx*(FlangeOD + Gap))
        back(ny*(FlangeOD + Gap))
          render()
          union() {
            cyl(FlangeHeight,d=FlangeOD,circum=true,anchor=BOTTOM);
            tube(ButtonOA.z,od=ButtonOA[OD],id=ScrewOD,circum=true,anchor=BOTTOM);
          }
    
    

    Feel free to set up your own dimensions, in the unlikely event you have lamps in need of similar buttons.

    Each of the three lamps has sixteen buttons and, although PrusaSlicer allows you to set the number of instances, its Arrange tool doesn’t make a tidy / compact layout. Doing the layout in OpenSCAD saves a bunch of hassle, with the overall union() turning the array into a single object.

    It might not be the best decoration, but it should suffice:

    Outdoor Lamp Glass Retainers - with decoration
    Outdoor Lamp Glass Retainers – with decoration

    Now, to make critters for the driveway …

  • Worm Bin Vent Covers

    Worm Bin Vent Covers

    The current iteration of our Tumbleweed Can-O-Worms suffers from leakage down the legs:

    Worm Bin - leg leakage
    Worm Bin – leg leakage

    Perhaps surprisingly, the whole process is odorless. This is in the basement where ugly doesn’t count for much.

    The leakage comes through the air vent holes at the top of each leg socket:

    Worm Bin Vent Cover - vent
    Worm Bin Vent Cover – vent

    Unsurprisingly, the “worm tea” (it ain’t water!) dripping from the bottom of the compost tray goes directly through the vent holes and down the leg. It’s not clear to me what they expected.

    A simple 3D printed black TPU cap atop the leg socket should prevent most of the leakage:

    Worm Bin Vent Cover - installed
    Worm Bin Vent Cover – installed

    The odd pattern comes from Concentric infill around the notch, even though Concentric infill seems better suited to round things and fat extrusion threads with a 0.8 mm nozzle than straight lines. The weird stuff on the vertical side is a reflection of the basement and phone flash from the smooth TPU layer edges.

    The tray with the worms and compost sits atop the strut between the socket and the body, with the cap allowing room for the screen keeping the worms out of the sump.

    Ribs on the underside of the cap hold it above the leg socket to let the air through:

    Worm Bin Vent Covers - solid model
    Worm Bin Vent Covers – solid model

    Although five caps fit the MK4’s platform, I printed one or two at a time while tweaking improving the design:

    Worm Bin Vent Covers - PrusaSlicer preview
    Worm Bin Vent Covers – PrusaSlicer preview

    This design is for the original Can-O-Worms shown in the second picture and may not quite fit the new version. We’ll know more when we empty the bottom tray.

    The OpenSCAD source code as a GitHub Gist:

    // Worm Bin Leg Vent Cover
    // Ed Nisley – KE4ZNU
    // 2026-10-16
    include <BOSL2/std.scad>
    /* [Hidden] */
    ID = 0;
    OD = 1;
    LENGTH = 2;
    HoleWindage = 0.2;
    Protrusion = 0.01;
    NumSides = 8*2*3;
    $fn=NumSides;
    LayerHeight = 0.4; // print with 0.8 mm nozzle
    LayerWidth = 0.9;
    WallThick = 1.5*LayerWidth;
    VentOD = 62.0; // at bottom of cover
    VentTopClear = 9.0; // to next layer bottom
    VentSideClear = 11.0; // to bin side
    VentStrutWidth = 3.0;
    CoverHeight = 15.0;
    CoverOD = VentOD + 2*VentSideClear – 2*WallThick;
    NumRibs = 6;
    RibHeight = VentTopClear – WallThick – 2.0;
    RibThick = 2*WallThick;
    //—–
    // Build things
    difference() {
    union() {
    cyl(WallThick,d=CoverOD,circum=true,anchor=BOTTOM) position(TOP) {
    tube(CoverHeight – WallThick,od=CoverOD,wall=WallThick,circum=true,
    anchor=BOTTOM,spin=180/NumSides);
    for (i=[0:NumRibs-1])
    rotate(i*(360/NumRibs) + 180/NumRibs)
    right(CoverOD/3 – RibThick/2)
    cube([CoverOD/3,RibThick,RibHeight],anchor=BOTTOM);
    }
    up(WallThick)
    right(CoverOD/2 – WallThick)
    cube([VentSideClear,VentStrutWidth + 2*WallThick,RibHeight],anchor=BOTTOM+RIGHT);
    right(CoverOD/2 – WallThick + Protrusion)
    cube([VentSideClear – WallThick,VentStrutWidth + 2*WallThick,CoverHeight],anchor=BOTTOM+RIGHT);
    }
    down(Protrusion)
    right(CoverOD/2 – VentSideClear)
    cube([CoverOD,VentStrutWidth,2*CoverHeight],anchor=BOTTOM+LEFT);
    }

  • PolyDryer Humidity: October

    After a month with 50 g of alumina in each box:

    2026-10-13
    Filament%RHWeight – gWt gain – gGain %
    PETG-CF Black2153.13.16.2%
    PETG White2352.62.65.2%
    PETG Black2353.23.26.4%
    TPU Black2452.82.85.6%
    PETG Orange2752.92.95.8%
    PETG-CF Gray3053.33.36.6%
    TPU Clear3152.92.95.8%
    PETG Clear3353.33.36.6%
    PETG-CF Blue3053.73.77.4%
    PETG Blue2553.03.06.0%

    A day later, most of the boxes were in the 10%RH to 15%RH range, with the filament spools slowly releasing their stored moisture. The PETG Orange meter jumps between 10% and 27%, with the latter more believeable.

    Changing the desiccant every month, without thinking too hard, may be the simplest path to dry filament storage.