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.

Day: August 2, 2017

  • 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);
    }