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.

The New Hotness

  • Stack Light Base

    Having external indications for the laser cutter’s internal status signals seemed like a good idea and, rather than build the whole thing, I got a five-layer stack light:

    Stack Light - disassembly
    Stack Light – disassembly

    It arrives sans instructions, apart from the data plate / wiring diagram label on the housing, so the first puzzle involves taking it apart to see what’s inside. My motivation came from a tiny chip of blue plastic on the kitchen table where I’d opened the unpadded bag. Apparently, a mighty force had whacked the equally unpadded box with enough force to crack the blue lens, but I have no idea how the sliver escaped the still-assembled stack.

    Anyhow, hold the blue/green lenses in one hand and twist the red/yellow lenses counterclockwise as seen looking at the cap over the red layer. Apply more force than you think appropriate and the latches will reluctantly give way. Do the same to adjacent layers all the way down, then glue the blue chip in place while contemplating other matters.

    A switch on each layer selects either steady (the default and what I wanted) or blinking (too exciting for my needs). Reassemble in reverse order.

    A Stack Light generally mounts on a production-line machine which might have a suitable cutout for exactly that purpose. I have no such machine and entirely too much clutter for a lamp, so I screwed it to a floor joist over the laser:

    Stack Light - installed
    Stack Light – installed

    The tidy blue PETG-CF base started as a scan of the lamp’s base to serve as a dimension reference:

    Stack Light - base scan
    Stack Light – base scan

    Import into LightBurn:

    • Draw a 70 mm square centered on the workspace
    • Round the corners until they match the 13 mm radius
    • Draw one 5.6 mm circle at the origin
    • Move the circle 52/2 mm left-and-down
    • Turn it into a 4 element array on 52 mm centers
    • Verify everything matches the image
    • Export as SVG

    Import into Inkscape:

    • Put the perimeter on one layer
    • Put the four holes on another
    • Center around an alignment mark at a known coordinate
    • Save as an Inkscape SVG

    Import into OpenSCAD, extrude into a solid model, and punch the holes:

    Stack Light Mount base - solid model
    Stack Light Mount base – solid model

    The lip around the inner edge aligns the lamp base.

    If I ever make another one, I’ll add pillars in the corners to put the threaded brass inserts close to the top for 10 mm screws instead of the awkward 30 mm screws in this one. More than a single screw hole in the bottom would align it on whatever you’re indicating.

    Now, to wire the thing up …

    The OpenSCAD source code as a GitHub Gist:

    Loading
    Sorry, something went wrong. Reload?
    Sorry, we cannot display this file.
    Sorry, this file is invalid so it cannot be displayed.
    // Stack Light mount
    // Ed Nisley – KE4ZNU
    // 2025-01-03
    include <BOSL2/std.scad>
    /* [Hidden] */
    ID = 0;
    OD = 1;
    LENGTH = 2;
    BaseCenter = [100,100,0];
    Base = [70,70]; // nominal, for figuring holes
    Insert = [4.9,5.9,6.0];
    PlateThick = Insert[LENGTH];
    HolderTall = 24.0;
    WallThick = 2.7; // outer wall of light base
    LipThick = 1.5; // alignment lip inside light base
    LipTall = 0.75;
    CableOD = 5.0;
    Protrusion = 0.1;
    difference() {
    translate(-BaseCenter)
    linear_extrude(height=HolderTall + LipTall)
    import("Stack Light – base layout.svg",layer="Base Perimeter");
    up(Insert[LENGTH])
    translate(-BaseCenter)
    linear_extrude(height=HolderTall – LipTall)
    offset(delta=-(WallThick + LipThick))
    import("Stack Light – base layout.svg",layer="Base Perimeter");
    up(HolderTall)
    linear_extrude(height=HolderTall,convexity=5)
    translate(-BaseCenter)
    difference() {
    offset(delta=WallThick) // avoid glitches on perimeter edge
    import("Stack Light – base layout.svg",layer="Base Perimeter");
    offset(delta=-WallThick)
    import("Stack Light – base layout.svg",layer="Base Perimeter");
    }
    down(Protrusion)
    translate(-BaseCenter)
    linear_extrude(height=2*HolderTall,convexity=5)
    import("Stack Light – base layout.svg",layer="Base Holes");
    up(HolderTall/2)
    yrot(90) zrot(180/6)
    cylinder(d=CableOD,h=Base.x,$fn=6);
    }