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

  • Amazon Packaging: Lindt Chocolate

    Amazon may toss lithium cells into a cardboad box without much care, but chocolate requires attention to detail:

    Amazon - Lindt Chocolate packaging
    Amazon – Lindt Chocolate packaging

    An ice pack, with a lump of ice in the middle, snuggled under the chocolate carton. The box arrived UPS Next Day from Amazon’s Kentucky distribution center, with the carton inside still cold to the touch.

    On the average, I suppose, Amazon’s packaging averages out, but I’d rather they paid more attention to protecting hazardous material.

    The picture shows a reenactment of actual events, because we were in the middle of something else when the UPS truck arrived.

  • Sony DSC-H5 End-of-Life, With Reprieve

    So my trusty Sony DSC-H5 camera emitted a horrible crunching sound from inside its lens assembly, spat out several error codes which boiled down to “throw me out”, stopped retracting its lens, and developed a nasty rattle. If I thought dropping $2k on a fancy mirrorless DSLR would improve my photography, I’d do it, but instead I picked up a $60 used DSC-H5 from eBay and continued the mission.

    Of course, the new-to-me H5 suffers from the half-press switch failure common to that entire line of Sony cameras; my DSC-H1 repair notes still come in handy for many folks.

    I’d preemptively repaired the shutter button + switch in my now-defunct H5, so I dismantled it, extracted the control assembly + shutter button, bulldozed the debris aside, dismantled the new(er) H5, transplanted the parts, reassembled it, and declared victory.

    Which left me with a pile of parts that could become an H5, if I could fix the lens assembly, which seemed unlikely. While pondering the futility of human existence, I applied a low-effort repair to the defunct shutter button by scuffing the nicely chromed and absurdly tapered tip of the OEM shutter button’s shaft, then applying a dot of JB Kwik epoxy:

    DSC-H5 Shutter Button - epoxy dot
    DSC-H5 Shutter Button – epoxy dot

    The nice sphere came from hanging downward, with the button sitting atop a short brass tube on the workbench.

    Filing the dot’s end flat produced a blunt plunger much larger than the OEM tip:

    DSC-H5 Shutter Button - filed epoxy dot
    DSC-H5 Shutter Button – filed epoxy dot

    You can just see the edge of the OEM tip inside the grayish end, which puts the filed flat at the original pin’s length.

    I punched a new plastic disk to replace the indented one:

    DSC-H5 - shutter switch cover
    DSC-H5 – shutter switch cover

    Based on past experience, the new plunger tip will work fine, although, unlike the brass screw repair, the OEM plastic pin can still break and launch the spring-loaded shutter button cap into a nearby bush. Given that I may never actually use the repaired button, I’ll take the risk.

    Finding out if the new tip will work may take a while:

    DSC-H5 - disassembled
    DSC-H5 – disassembled

    I did a bit more disassembly than strictly necessary to replace the shutter button, but not by much; you’d be crazy to pay me to fix your camera, fer shure.

  • Torchiere Lamp Shade

    Torchiere Lamp Shade

    A pair of torchiere lamps lit the living room for many, many years:

    Torchiere Lamp Shade - original
    Torchiere Lamp Shade – original

    During their tenure, they’ve gone from 100 W incandescent bulbs to “100 W equivalent” CFL curlicues to “100 W equivalent” warm-white LED bulbs. The LEDs aren’t up to the brightness of the original incandescents, but you can get used to anything if you do it long enough.

    After so many years, the plastic shades / diffusers became brittle:

    Torchiere Lamp Shade - original broken
    Torchiere Lamp Shade – original broken

    That’s after a bump, not a fall to the floor. So it goes.

    Some casual searching didn’t turn up any likely replacements. The shade measures 14 inch = 355 mm across the top, far too large for the M2’s platform, but maybe a smaller shade in natural PETG would work just as well.

    ACHTUNG! This is obviously inappropriate for the original incandescent bulbs and would be, IMO, marginal with CFL tubes. Works fine with LEDs. Your mileage may vary.

    OpenSCAD to the rescue:

    Torchiere Lamp Shade - section
    Torchiere Lamp Shade – section

    That’s a section down the middle. The top is 180 mm across, leaving 20 mm of general caution on the 200 mm width of the platform. The section above the sharply angled base is 90 mm tall to match the actual LED height, thereby putting them out of my line-of-sight even when standing across the room.

    I ran off a short version, corrected the angles and sizes for a better fit, tweaked the thickness to fuse three parallel threads into a semitransparent shell, and …

    Torchiere Lamp Shade - M2 platform
    Torchiere Lamp Shade – M2 platform

    Producing what looks like thin flowerpot required just shy of seven hours of print time, as it’s almost entirely perimeter, goin’ down slow for best appearance. The weird gold tone comes from the interaction of camera flash with warm-white CFL can lights over the desk.

    If you hadn’t met the original, you’d say the new shade grew there:

    Torchiere Lamp Shade - no epoxy
    Torchiere Lamp Shade – no epoxy

    It’s definitely a Brutalist design, not even attempting to hide its 3D printed origin and glorying in those simple geometric facets.

    Those three threads of natural PETG makes a reasonably transparent plate, clear enough that the bulb produced an eye-watering glare through the shade:

    Torchiere Lamp Shade - no epoxy - lit
    Torchiere Lamp Shade – no epoxy – lit

    So I returned it to the Basement Laboratory, chucked it up in the lathe (where it barely clears the bed), dialed the slowest spindle speed (150 rpm according to the laser tach, faster than I’d prefer), and slathered a thin layer of white-tinted XTC-3D around the inside:

    Torchiere Lamp Shade - lathe spinning
    Torchiere Lamp Shade – lathe spinning

    For lack of anything smarter, I mixed 2+ drops of Opaque White with 3.1 g of Part A (resin), added 1.3 g of Part B (Hardener), mixed vigorously, drooled the blob along the middle of the rotating shade, spread it across the width using the mixing stick, smoothed it into a thin layer with a scrap of waxed paper, and ignored it for a few hours.

    If the lathe perspective looks a bit weird, it’s perfectly natural: I raised the tailstock end enough to make the lower side of the shade just about horizontal. Given the gooey nature of XTC-3D, it wasn’t going anywhere, but I didn’t want a slingout across the lathe bed.

    The lit-up result isn’t photographically different from the previous picture, but in person the epoxy layer produces a much nicer diffused light and no glare.

    I might be forced to preemptively replace the other shade, just for symmetry, but we’ll let this one age for a while before jumping to conclusions.

    The OpenSCAD source code as a GitHub Gist:

    // Torchiere Lamp Shade
    // Ed Nisley KE4ZNU – July 2017
    /* [Build] */
    Section = false;
    Shorten = false;
    //- Extrusion parameters – must match reality!
    /* [Hidden] */
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    Protrusion = 0.01;
    HoleWindage = 0.2;
    //- Dimensions
    ID = 0;
    OD = 1;
    LENGTH = 2;
    /* [Dimensions] */
    ShadeThick = 1.2; // perpendicular thickness
    BaseAngle = 42; // lamp base angle wrt vertical
    BaseTopDia = 131.0; // lamp ID at top
    ShadeBaseThick = 6*ThreadThick; // horizontal bottom thickness
    SeatDepth = 10.0 + ShadeBaseThick; // shade bottom to base top
    SeatDia = BaseTopDia – 2* SeatDepth / tan(BaseAngle); // lamp ID at seating depth
    ShadeTopDia = 180.0; // top OD, limited by printer platform width
    ShadeHeight = 90.0; // height above lamp base
    ShadeHoleDia = 36.0; // central hole dia
    ShadeAngle = atan(ShadeHeight / ((ShadeTopDia – BaseTopDia)/2));
    echo(str("Shade angle: ",ShadeAngle));
    ShadeHThick = ShadeThick / sin(ShadeAngle);
    echo(str(" horiz thickness:",ShadeHThick));
    NumSides = 6*4;
    $fn = NumSides;
    //- Build it
    render(convexity=2)
    difference() {
    union() {
    cylinder(d1=SeatDia,d2=BaseTopDia,h=SeatDepth); // section within lamp base
    translate([0,0,SeatDepth])
    cylinder(d1=BaseTopDia,d2=ShadeTopDia,h=ShadeHeight);
    }
    translate([0,0,SeatDepth]) // inside of upper shade
    cylinder(d1=BaseTopDia – 2*ShadeHThick,
    d2=ShadeTopDia – 2*ShadeHThick,
    h=ShadeHeight + Protrusion);
    translate([0,0,ShadeBaseThick]) // seating base
    cylinder(d1=SeatDia – 2*ShadeHThick,
    d2=BaseTopDia – 2*ShadeHThick,
    h=SeatDepth – ShadeBaseThick + Protrusion);
    translate([0,0,-Protrusion]) // socket clearance
    cylinder(d=ShadeHoleDia,h=2*ShadeHeight);
    if (Section)
    translate([0,-ShadeTopDia,0])
    cube(2*ShadeTopDia,center=true);
    if (Shorten > 0)
    translate([0,0,(ShadeTopDia + 2*SeatDepth)])
    cube(2*ShadeTopDia,center=true);
    }
  • Layout Pen For Black Objects

    This worked surprisingly well to lay out black foam gaskets for new fairing mounting plates:

    Black foam layout with ceramic fabric pen
    Black foam layout with ceramic fabric pen

    Mary uses the Fons & Porter Mechanical Pencil to mark quilting patterns on fabric. It has, they say, a “strong ceramic 0.9MM white lead” with “water-soluble dyes” capable of both laying down a durable mark and washing out without leaving a trace. I don’t care about the latter, of course, but it did brush off reasonably well.

    The next step involved running an X-Acto knife around the perimeter of the plate and punching the holes.

    You can get colored ceramic leads (for small values of color) for use on other backgrounds.

  • Amazon EK3211 Scale: Re-Footing

    Our long-suffering kitchen scale lost a pair of feet, most likely because those two feet do most of the skidding as we slide it onto a shelf below a cabinet. The scale has (well, had) six silicone rubber feet:

    Amazon EK3211 Scale - OEM foot
    Amazon EK3211 Scale – OEM foot

    The vagaries of color photography turned a neutral-gray silicone disk into that weird blue.

    A pair of ¼ inch disks punched from non-skid textured rubber tape fit perfectly into the recesses:

    Amazon EK3211 Scale - tread foot
    Amazon EK3211 Scale – tread foot

    Now, we’ll see how tread adhesive withstands the same abuse.

  • Drying Rack Re-Repair

    Despite having sworn a mighty oath to the contrary, I found myself doing this again:

    Clothes Rack - end clamp
    Clothes Rack – end clamp

    A strut on the other end of the dowel split across its face:

    Clothes Rack - split clamp
    Clothes Rack – split clamp

    The white stuff is wood-filled epoxy, normally used to repair rotted wood, left over from another project. I’ll claim this tests its mechanical strength against peeling forces.

    Easily determined by inspection: a sensible person would toss the rack, but …

  • Mailing Tube End Caps: Screw-in Version

    The mailing tube arrived with contents intact, although the USPS inlet scanning didn’t work and the tube pretty much teleported across several states without leaving any tracking data behind. The recipient suggested several modifications to the caps:

    Review of user experience of tube end:
    The ribs on the endcap are very good at holding the cap on, so much so that I had to use a prying implement to remove it, which cracked the flange.
    Would consider less depth on the cap, and possibly another layer on the flange.

    Some continuous process improvement (a.k.a OpenSCAD hackage) produced a swoopy threaded cap with thumb-and-finger grips:

    Mailing Tube Screw Cap - top - Slic3r
    Mailing Tube Screw Cap – top – Slic3r

    The finger grips are what’s left after stepping a sphere out of the cap while rotating it around the middle:

    Mailing Tube Cap - finger grip construction
    Mailing Tube Cap – finger grip construction

    That worked out surprisingly well, with the deep end providing enough of a vertical-ish surface to push against.

    The two hex holes fit a pin wrench, because the grips twist only one way: outward. The wrench eliminates the need for a flange, as you can now adjust the cap insertion before slathering packing tape over the ends. Man, I loves me some good late binding action!

    A three-start thread seemed like overkill, but was quick & easy. The “thread form” consists of square rods sunk into the cap perimeter, with one edge sticking out:

    Mailing Tube Cap - thread detail
    Mailing Tube Cap – thread detail

    They’re 1.05 times longer than the cap perimeter facets to make their ends overlap, although they’re not tapered like the ones in the broom handle dingus, because it didn’t (seem to) make any difference to the model’s manifoldhood.

    Not needing any endcaps right now, I built one for show-n-tell:

    Threaded mailing tube end cap - installed
    Threaded mailing tube end cap – installed

    The OpenSCAD source code as a GitHub Gist:

    // Mailing tube end cap
    // Ed Nisley KE4ZNU – June 2017
    Layout = "Build";
    Model = "Screw";
    //- Extrusion parameters – must match reality!
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    Protrusion = 0.1;
    HoleWindage = 0.2;
    //- Screw sizes
    inch = 25.4;
    TubeID = 2 * inch;
    TubeWall = 0.1 * inch;
    CapInsert = 15.0;
    CapRim = 6*ThreadThick;
    CapWall = 3*ThreadWidth;
    NumFlanges = 3;
    FlangeHeight = 3*ThreadThick;
    FlangeWidth = ThreadWidth/2;
    FlangeSpace = CapInsert / (NumFlanges + 1);
    ThumbHoleOD = 20.0;
    ThumbHoleAngle = 100;
    ThumbHoleSteps = 10;
    SpannerPinOD = 5.0;
    HelixOD = 4*ThreadThick;
    HelixHeight = 0.75*CapInsert;
    HelixAngle = atan(HelixHeight/(PI*TubeID));
    HelixStarts = 3;
    OAHeight = CapInsert + CapRim;
    NumRibs = 3*4;
    NumSides = 3*NumRibs;
    //- Adjust hole diameter to make the size come out right
    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 ScrewCap() {
    union() {
    difference() {
    cylinder(d=TubeID,h=OAHeight,$fn=NumSides);
    for (a=[0,180])
    for (i=[0:ThumbHoleSteps-1])
    rotate(a + i*ThumbHoleAngle/ThumbHoleSteps)
    translate([TubeID/4,0,-i*ThumbHoleOD/(2*ThumbHoleSteps)])
    sphere(d=ThumbHoleOD);
    for (a=[0,180])
    rotate(a – 60)
    translate([0.75*TubeID/2,0,-Protrusion])
    rotate(0*180/6)
    PolyCyl(SpannerPinOD,0.75*CapInsert,6);
    }
    for (s=[0:HelixStarts-1])
    for (i=[0:NumSides-1])
    rotate(i*360/NumSides + 180/NumSides + s*360/HelixStarts)
    translate([TubeID/2 – 0.25*HelixOD,0,i*HelixHeight/NumSides + HelixOD])
    rotate([90 + HelixAngle,0,0])
    cylinder(d=HelixOD,h=1.05*PI*TubeID/NumSides,center=true,$fn=4);
    }
    }
    module PushCap() {
    difference() {
    cylinder(d=TubeID,h=OAHeight,$fn=NumSides);
    translate([0,0,CapWall])
    cylinder(d=TubeID – 2*CapWall,h=OAHeight,$fn=NumSides);
    }
    for (i=[1:NumFlanges])
    translate([0,0,i*FlangeSpace])
    difference() {
    cylinder(d=TubeID + 2*FlangeWidth,h=FlangeHeight,$fn=NumSides);
    translate([0,0,-Protrusion])
    cylinder(d=TubeID – 2*CapWall,h=FlangeHeight + 2*Protrusion,$fn=NumSides);
    }
    for (i=[0:NumRibs-1])
    rotate(i*360/NumRibs)
    translate([0,-ThreadWidth,CapWall + ThreadThick])
    cube([TubeID/2 – CapWall/2,2*ThreadWidth,CapInsert + CapRim – CapWall – ThreadThick],center=false);
    translate([0,0,CapInsert]) {
    difference() {
    cylinder(d=TubeID + 2*TubeWall,h=CapRim,$fn=NumSides);
    translate([0,0,-Protrusion])
    cylinder(d=TubeID – 3*2*CapWall,h=2*CapRim,$fn=NumSides);
    }
    }
    }
    //- Build things
    if (Model == "Push")
    if (Layout == "Show")
    PushCap();
    else if (Layout == "Build")
    translate([0,0,OAHeight])
    rotate([180,0,0])
    PushCap();
    if (Model == "Screw")
    if (Layout == "Show")
    ScrewCap();
    else if (Layout == "Build")
    translate([0,0,OAHeight])
    rotate([180,0,0])
    ScrewCap();