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

  • Stick Blender Bearing Failure

    Stick Blender Bearing Failure

    The business end of a cheap stick blender we bought a year ago to replace the previous stick blender (*):

    Fresko stick blender
    Fresko stick blender

    This one failed just slightly beyond the duration of its one-year warranty, apparently with one of the shaft bearings seized to the extent of making the blade un-turnable even by (carefully protected) finger force.

    With nothing to lose (and a new blender inbound), it stood in the Basement Shop in that orientation for a week while I dripped penetrating oil around the shaft and wiggled the blade slightly back-and-forth. The bearing eventually broke free and the blade turned reluctantly.

    Still having nothing to lose, I gave the shaft a few shots with a drift punch, moving it a few millimeters in each direction. This apparently disturbed the seized bearing just enough to let it turn less reluctantly, with more penetrating oil improving the situation.

    Mixing a jar of water went well, even on high speed, but I doubt the bearing is in good health. We decided a blender with penetrating oil tucked up inside should be disqualified for food processing.

    When it first locked up, I bought a significantly more expensive stick blender, knowing full well more money does not imply better design / better materials / more QC. This one is now designated as a Cold Backup blender for garden & shop use.

    (*) For the record, my 3D printed shaft adapter failed while converting garden tomatoes into thick & zesty pizza sauce. I’m unsurprised PETG-CF wasn’t up to the task.

  • ResMed ClimateLine Heated Hose: DOA

    ResMed ClimateLine Heated Hose: DOA

    Mary plugged a new ClimateLine heated hose into her Resmed Airsense 11 CPAP machine, spent the night feeling a bit chilly, and got an error message in the morning that boiled down to “Bad Hose”.

    Unsurprisingly, the new hose looks just like the previous ones and the old picture remains relevant:

    ResMed ClimateLine heated hose ends
    ResMed ClimateLine heated hose ends

    The new hose has the same 12 kΩ resistance between the two outer contacts: the thermistor is fine.

    The two inner contacts are an open circuit, not the expected 10 Ω: the heater element or (more likely) a connector joint failed. We don’t know if it was DOA or failed during the first use, but it does not respond to the usual wiggling and poking.

    Her experience with Lincare’s Customer Disservice has been so terrible she refuses to start a warranty claim. She’ll continue using the old hose until it’s time for the next replacement and we’ll hope for the best.

    As I understand the arrangement, she must get all the consumables (masks, hoses, filters, tanks) from Lincare for five years from the date of the original prescription. After that, she can order supplies from elsewhere, although that seller must have a new prescription.

    Basically, Lincare gets five years of guaranteed business and, like the phone company of old, they don’t care about you because they don’t have to.

    So: they win.

  • Ice Flow

    Ice Flow

    Spotted at the local library:

    Roof drain ice
    Roof drain ice

    Putting the downspout inside the building probably made architectural sense, but I’d much rather have that pipe on the outside of the wall where a leak won’t be so expensive.

    It hasn’t leaked yet, but in a few months I won’t be surprised to learn my tax dollars were hard at work fixing the ensuing water damage.

    Taken at maximum zoom through a grubby windshield, so the picture quality isn’t up to contemporary standards.

  • Plywood Coaster Warpage

    Plywood Coaster Warpage

    This is what happens to an uncoated plywood coaster with fairly deep laser engraving after about half a year of use:

    Warped plywood coaster - front
    Warped plywood coaster – front

    The poor thing went all potato chip:

    Warped plywood coaster - side
    Warped plywood coaster – side

    I swapped it for one with polyurethane sealant, much like those fancier coasters with the same layout, and we’ll see if it survives longer …

  • Snow Day

    Snow Day

    Today looks like a good day to fire up the snowblower and clear the driveway:

    Snow - 2025-01-26
    Snow – 2025-01-26

    One of the bolts holding the muffler on the engine worked its way past its rebuilt locking plate and will require attention before getting out there.

    Fortunately, it looks like a good day for shop projects …

  • Olive Oil Bottle Cap Covers

    Olive Oil Bottle Cap Covers

    We buy olive oil in large bottles, then fill smaller bottles for easier handling. The caps on those bottles were never meant to last as long as we keep them and the thin, deeply drawn aluminum tends to crack after a while.

    So I conjured a cap cover from the vasty digital deep:

    Olive Oil Cap - solid model
    Olive Oil Cap – solid model

    Which looks exactly like you’d expect when printed in black PETG:

    Olive oil bottle cap - details
    Olive oil bottle cap – details

    You can see the raggedy edge of the original cap just inside the cover’s rim. A snippet of double-sided tape holds the cover in place, after de-oiling the cap with alcohol.

    Having gotten one to fit, I made enough for All The Bottles:

    Olive oil bottle cap - installed
    Olive oil bottle cap – installed

    Only two of those see regular service: one in use and another filled when the first is nearly empty. The remaining pair huddle in the back of the shelf against future need.

    The OpenSCAD source code produces those fancy knurls with BOSL2’s textured cyl() :

    // Shower soap dish
    // Ed Nisley - KE4ZNU
    // 2026-01-17
    
    include <BOSL2/std.scad>
    
    /* [Hidden] */
    
    HoleWindage = 0.2;
    Protrusion = 0.1;
    NumSides = 5*3*4;
    
    $fn=NumSides;
    
    ID = 0;
    OD = 1;
    LENGTH = 2;
    
    WallThick = 1.0;
    BaseThick = 2.0;
    
    CapOD = 36.0;
    
    CoverOA = [CapOD,CapOD + 2*WallThick,20.0 + BaseThick];
    
    //----------
    // Build it
    
      render()
        difference() {
          cyl(BaseThick,d=CoverOA[OD],chamfer1=1.0,anchor=BOTTOM) position(TOP)
            cyl(CoverOA[LENGTH] - BaseThick,d=CoverOA[OD],
                texture="trunc_pyramids",tex_size=[2,6], style="convex",
                anchor=BOTTOM);
          up(BaseThick)
            cyl(CoverOA[LENGTH],d=CoverOA[ID],anchor=BOTTOM);
        }
    
    
    
  • Translucent Night Light Light Guide

    Translucent Night Light Light Guide

    Our house came with several single-LED night lights featuring a transparent light guide / reflector:

    Nightlight light guide - original
    Nightlight light guide – original

    The plate had snapped off one of them and, being me, I wondered if I could replace it with something similar.

    Years passed.

    Obviously, this must be made from a transparent substance, which 3D printed things are not, but after some fiddling with parameters I thought the result might be informative.

    The guide plate is a section of a spherical surface, here approximated by a BOSL2 spheroid():

    Nightlight light guide - view side - solid model
    Nightlight light guide – view side – solid model

    The original is 3 mm thick, but 2 mm worked out better for my purposes by reducing the amount of infill:

    Nightlight light guide - wall side - solid model
    Nightlight light guide – wall side – solid model

    The intricate base latches into the lamp’s plastic case:

    Nightlight light guide - base - solid model
    Nightlight light guide – base – solid model

    The result is, at best, translucent, because it’s definitely not transparent:

    Nightlight light guide - translucent vs transparent
    Nightlight light guide – translucent vs transparent

    The zigzag pattern seems to come from the icosohedral approximation to the sphere, because it follows the surface tesselation.

    Getting the base shape right required several iterations, each printed with the model cut off just above the bottom of the guide plate:

    Nightlight light guide - test pieces
    Nightlight light guide – test pieces

    The first two attempts needed attention from a flush cutting pliers before fitting into the case, but they don’t call it rapid prototyping for nothin’.

    The original and replacement plugged into an outlet strip:

    Nightlight light guide - original vs printed on outlet strip
    Nightlight light guide – original vs printed on outlet strip

    While you can see the vague outline of the strip behind the printed light guide, it’s definitely lacking in detail:

    Nightlight light guide - outlet strip detail
    Nightlight light guide – outlet strip detail

    The striations throw more light into the room than the original:

    Nightlight light guide - printed
    Nightlight light guide – printed

    Fiddling with the 3D printing parameters might make it more transparent, but it’s going back into the box it came from after giving me a better idea of which parameters to tweak the next time around.

    The OpenSCAD source code as a GitHub Gist:

    // Nightlight light guide
    // Ed Nisley – KE4ZNU
    // 2026-01-13
    include <BOSL2/std.scad>
    Layout = "Show"; // [Show,Build,Plate,Base,Pipe]
    /* [Hidden] */
    HoleWindage = 0.2;
    Protrusion = 0.1;
    NumSides = 10*3*4;
    $fn=NumSides;
    ID = 0;
    OD = 1;
    LENGTH = 2;
    function ChordRadius(m,c) = (m^2 + (c^2)/4) / (2*m);
    PlateThick = 2.0;
    PlateOA = [60.0,50.0,PlateThick];
    PlateRound = 5.0;
    PlateTaper = 1.0;
    PlateAngle = atan(-2/60); // original plate angle, far end closer to wall
    PlateM = 2.4;
    PlateRadius = ChordRadius(PlateM,PlateOA.x); // light guide plate
    echo(PlateRadius=PlateRadius);
    WallThick = 2.0;
    MountOA = [23.4,17.0,5.5];
    MountRadius = ChordRadius(4.3,MountOA.x); // base arc in housing
    echo(MountRadius=MountRadius);
    PipeThick = 5.0;
    //———-
    // Define shapes
    // Oddly intricate base fitting into housing
    // Replete with magic numbers
    module Base() {
    difference() {
    union() {
    intersection() {
    cuboid([MountOA.x,MountOA.y,5.5],anchor=BOTTOM);
    back(6.5)
    tube(MountOA.z,or=MountRadius,wall=1.5,anchor=BOTTOM+BACK);
    }
    for (i=[-1,1])
    right(i*18.5/2)
    back(11.5)
    cuboid([1.8,8.0,MountOA.z],anchor=BOTTOM+BACK);
    for (i=[-1,1])
    right(i*22.0/2)
    cuboid([1.4,2.0,MountOA.z],anchor=BOTTOM+FRONT);
    fwd(5.0)
    cuboid([11.0,10.5,MountOA.z],anchor=BOTTOM+FRONT);
    }
    down(Protrusion)
    for (j=[-1,1])
    fwd(j*(1.5 + 10.0)/2)
    cuboid([7.0,10.0,MountOA.z + 2*Protrusion],anchor=BOTTOM);
    up(3.1)
    back(7.5)
    cuboid([MountOA.x,25.0,MountOA.z],anchor=BOTTOM+FRONT);
    }
    }
    // Light guide plate
    module Plate() {
    xrot(PlateAngle)
    zrot(90) yrot(90)
    left(PlateOA.x/2)
    down(PlateM + PlateThick/2)
    intersection() {
    up(PlateRadius)
    difference() {
    spheroid(PlateRadius,style="icosa");
    spheroid(PlateRadius – PlateThick,style="icosa");
    }
    cuboid(PlateOA + [0,0,2*PlateThick],rounding=PlateRound,edges="Z",anchor=BOTTOM);
    }
    }
    // Light pipe between base & plate
    // Magic numbers to fit case opening
    module Pipe() {
    difference() {
    intersection() {
    fwd(3.0/2 – 0.2)
    cuboid([MountOA.x,MountOA.y,PipeThick],rounding=0.5,edges="Z",anchor=BOTTOM+FRONT);
    back(6.5)
    cyl(MountOA.z,r=MountRadius,anchor=BOTTOM+BACK);
    }
    down(Protrusion)
    back((1.5 + 10.0)/2)
    cuboid([7.0,10.0,1.0 + Protrusion],anchor=BOTTOM);
    }
    }
    module Assembly() {
    Base();
    up(MountOA.z)
    Pipe();
    up(MountOA.z + PipeThick)
    Plate();
    }
    //———-
    // Build things
    if (Layout == "Base")
    Base();
    if (Layout == "Plate")
    Plate();
    if (Layout == "Pipe")
    Pipe();
    if (Layout == "Show" || Layout == "Build")
    Assembly();