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

Making the world a better place, one piece at a time

  • Monitor Mount: Beelink Clamp

    Monitor Mount: Beelink Clamp

    Clearing the clutter off the top of the laser put the monitors up on mounts clamped to its wings, which required an adapter between the monitor and the mount’s standard VESA bracket:

    Acer monitor VESA adapter
    Acer monitor VESA adapter

    The Beelink PC has an adapter plate intended to put it on that VESA bracket, too, but a quick test showed the power button pointed downward in an inaccessible spot. I eventually realized the Beelink would fit neatly on the monitor mount’s pole:

    Monitor pole Beelink clamp - front
    Monitor pole Beelink clamp – front

    The view from the other side:

    Monitor pole Beelink clamp - rear
    Monitor pole Beelink clamp – rear

    The clamps have recesses for an M6 square nut and an M4 brass insert:

    Monitor Pole BeeLink clamp - solid model
    Monitor Pole BeeLink clamp – solid model

    Which is better seen in a cross-section:

    Monitor Pole Beelink clamp - PrusaSlicer preview
    Monitor Pole Beelink clamp – PrusaSlicer preview

    The M6 screw uses the same hex wrench as the rest of the monitor mount and the M4 screw fits the VESA bracket. Sometimes, you just gotta go with the flow.

    Pondering those pictures will show why the nut and insert must be on opposite sides. I came that close to building one to throw away.

    The OpenSCAD source code extrudes the overall shape upward, then punches the screw holes & fittings horizontally:

    // Monitor Pole Beelink clamp
    // Ed Nisley - KE4ZNU
    // 2025-01-23
    
    include <BOSL2/std.scad>
    
    /* [Hidden] */
    
    ID = 0;
    OD = 1;
    LENGTH = 2;
    
    Protrusion = 0.1;
    
    PoleOD = 30.3;
    
    WallThick = 5.0;
    
    Kerf = 3.0;                     // clamping space
    Clearance = 2*0.2;              // space around objects
    
    Screw = [6.0,10.0,6.0];         // M6 SHCS, LENGTH = head
    Washer = [6.0,12.0,1.5];        // M6 washer
    Nut = [6.0,10.0,5.0];           // M6 square nut
    
    Insert = [4.0,5.8,10.0];        // M4 insert
    
    ScrewSpace = Washer[OD];        // pole edge to screw center spacing
    
    Block = [4*ScrewSpace + PoleOD + 2*WallThick,PoleOD + 2*WallThick,2*Washer[OD]];       // Z = clamp thickness
    
    //----------
    // Build it
    
            difference() {
                linear_extrude(height=Block.z,convexity=5)
                    difference() {
                        rect([Block.x,Block.y],rounding=WallThick);
                        circle(d=PoleOD + Clearance);
                        square([2*Block.x,Kerf],center=true);
                    }
                up(Block.z/2) {
                    right(PoleOD/2 + ScrewSpace){
                        xrot(90)
                            cylinder(d=Washer[ID] + Clearance,h=2*Block.y,center=true,$fn=6);
                        fwd(Block.y/2 - Washer[LENGTH])
                            xrot(90) zrot(180/12)
                                cylinder(d=Washer[OD] + Clearance,h=Block.y,center=false,$fn=12);
                        back(Block.y/2)
                            xrot(90)
                                cube([Nut[OD],Nut[OD],2*Nut[LENGTH]],center=true);
                    }
                    left(PoleOD/2 + ScrewSpace) {
                        xrot(-90)
                            cylinder(d=Insert[ID] + Clearance,h=2*Block.y,center=true,$fn=6);
                        fwd(Block.y/2 - 1.25*Insert[LENGTH])
                            xrot(90)
                                cylinder(d=Insert[OD] + Clearance,h=Block.y,center=false,$fn=6);
                    }
                }
            }
    

    It’s done in PETG-CF, which looks surprisingly good in a chonky sort of way. I’ll find out how well it withstands moderate clamping forces.

  • HQ Sixteen: Thread Spool Adapter

    HQ Sixteen: Thread Spool Adapter

    The HQ Sixteen consumes thread at a prodigious rate, so it’s set up for large thread cones. Mary sometimes uses ordinary thread spools (leftovers from sewing projects) for short practice sessions and wanted an adapter to hold the little things in place:

    Thread spool adapter - installed
    Thread spool adapter – installed

    Those of long memory should recall previous adapters for both sizes and their notes about how thread should peel off spools & cones. I considered an adapter with a horizontal spool axis, but contemporary machines apparently don’t bother with such niceties. We may need a right-angle adapter to let the thread pull off from the side, but we’ll start simple and fix it if needs be.

    Update: It needed fixing.

    The solid model looks about like you’d expect:

    HQ Sixteen - thread spool adapter - solid model
    HQ Sixteen – thread spool adapter – solid model

    The small crosswise hole in the hub gets an M3 setscrew pushing a rubber pellet slightly into the central bore for a friction fit. The OpenSCAD code can distribute any number of such holes, but one seemed entirely adequate.

    The code shrinkwraps a hull() around two cylinders to create the tapered sides, thus giving the thread less surface to drag across. I have PrusaSlicer set to produce scarf joints around the perimeter and the edges came out surprisingly smooth, with only one rough spot requiring deft Xacto knife work. It’s made from white PETG for a smoother finish than PETG-CF.

    The OpenSCAD code consists mostly of constants defining the various physical measurements and a few lines assembling the model:

    // HQ Sixteen - thread spool adapter
    // Ed Nisley - KE4ZNU
    // 2025-01-21
    
    include <BOSL2/std.scad>
    
    /* [Hidden] */
    
    PinOD = 0.25*INCH;
    
    RingOD = 50.0;      // outer perimeter of thread ring
    RingEdge = 3.0;     // height of ring edge & tapers
    RingAngle = 45;     // upper & lower tapers wrt vertical
    
    RingOAH = 3*RingEdge;
    
    ScrewOD = 2.5;      // tap for setscrew compressing rubberdraulic piston
    NumScrews = 1;
    
    HubOD = 25.0;
    HubThick = 2*ScrewOD;
    HubSides = 12;
    
    ScrewCL = RingOAH + HubThick/2;
    
    AdapterOAH = HubThick + RingOAH;
    
    Protrusion = 0.1;
    
    NumSides = 12*3*4;   // smooth outer perimeter
    
    //----------
    // Build it
    
    
    difference() {
        union() {
    
            hull() {
                linear_extrude(RingOAH)
                    circle(r=RingOD/2 - RingEdge*tan(RingAngle),$fn=NumSides);
    
                up(RingEdge)
                    linear_extrude(RingEdge)
                        circle(d=RingOD,$fn=NumSides);
            }
    
            linear_extrude(HubThick + RingOAH)
                rotate(180/HubSides)
                    circle(d=HubOD,$fn=HubSides);
    
        }
    
        down(Protrusion)
            rotate(180/HubSides)
                cylinder(d=PinOD,h=2*AdapterOAH,$fn=HubSides);
    
       for (i=[0:NumScrews-1]) {
            a = i*360/NumScrews;
            zrot(a)
                up(ScrewCL)
                    yrot(90)
                        zrot(180/6)
                            cylinder(d=ScrewOD,h=HubOD,$fn=6);
        }
    
    }
    

    Putting the adapter in the light box revealed the same problem as photographing white dogs in snowstorms:

    Thread spool adapter - white on white
    Thread spool adapter – white on white

    There was no contrast to be enhanced anywhere, although the rubber pellet definitely stands out.

  • Hotel California: Vole Edition

    Hotel California: Vole Edition

    Although we had considerable success trapping voles during the last half of the 2024 gardening season, Mary found a description of what might be a better technique: a box with small entrance holes taking advantage of rodent thigmotaxis: their tendency to follow walls. The writeup shows nicely made wood boxes, but I no longer have machinery capable of cutting arbitrarily large wood slabs into pieces.

    I do, however, have a vast pile of cardboard boxes:

    Vole Box - large
    Vole Box – large

    That’s a rat-size trap.

    A smaller box has room for two mouse-size traps (one hidden on the left):

    Vole Box - small
    Vole Box – small

    The general idea: plunk the box in a garden plot, arm the trap(s), close the lid, and eventually a vole will venture inside, whereupon wall-following leads to disaster. Apparently bait is optional, as wall-following inevitably takes them over the trap pedal. I won’t begrudge them a walnut or two, should bait become necessary.

    Cardboard is obviously the wrong material for a box in an outdoor garden, but I figure they’ll survive long enough to show feasibility and I can deploy a lot of small boxes before having to conjure something more durable.

    Yes, those are laser-cut rounded-rectangle holes: 30 mm and 40 mm, assuming voles care about such things.

    Edit: More on voles.

  • Clothes Dryer Inlet Filter Holder

    Clothes Dryer Inlet Filter Holder

    It has always seemed like a Bad Idea™ to run indoor air through the clothes dryer and dump it overboard, particularly during days when the indoor air has been painstakingly (perhaps expensively) heated or cooled. The dryer now lives in a separate room with two doors, so we can close it off from the rest of the house and let it inhale outdoor air through the screen on the storm door.

    Except in winter, when a glass pane covers the screen. Propping the door open just a bit is unattractive, because an open door seems like an invitation to any field mouse looking to upgrade its domicile.

    Given that the dryer exhausts through a length of 4 inch flexible duct, I figured a similar vent, facing inward, mounted on the storm door would admit enough air to keep it happy. Keeping insects and adroit mice out requires a screen:

    Dryer Inlet Vent - filter retainer
    Dryer Inlet Vent – filter retainer

    After taking that picture, I rammed four threaded brass inserts into the holes, thereby eliminating the need for a handful of washers and nuts, some of which were absolutely certain to disappear through gaps in the deck.

    The two blue-gray rings are PETG-CF:

    Dryer Inlet Vent Filter Retainer - solid model
    Dryer Inlet Vent Filter Retainer – solid model

    The small split makes the inner retainer just springy enough to fit over the two small tabs normally locking a dryer hose in place.

    The OpenSCAD code gloms a few shapes together:

    include <BOSL2/std.scad>
    
    /* [Hidden] */
    
    VentID = 102.0;     // diameter at base of vent opening
    VentOD = 107.5;
    
    OpenAngle = 3;
    
    LipWidth = 3.0;         // lip around vent opening
    LipThick = 7.5;
    
    StrutWidth = 2.5;       // wide enough to hold filter
    StrutThick = 3.0;       // tall enough to be rigid
    NumStruts = 3;
    
    Protrusion = 0.1;
    
    NumSides = 360/6;
    
    $fn=NumSides;
    
    //----------
    // Build it
    
    union() {
    
        linear_extrude(LipThick)
            ring(NumSides,d1=VentID - 2*LipWidth,d2=VentID,angle=[OpenAngle/2,360-OpenAngle/2],spin=270);
    
        linear_extrude(StrutThick) {
            circle(r=StrutWidth);
    
            for (i=[0:(NumStruts-1)]) {
                a = 90 + i*360/NumStruts;
                zrot(a)
                    right(VentID/4)
                        square([VentID/2 - LipWidth/2,StrutWidth],center=true);
            }
        }
    
        linear_extrude(LipThick)                // outside trim ring
            ring(NumSides,d1=VentOD,d2=VentOD+2*LipWidth);
    }
    

    The overall union() keeps PrusaSlicer from identifying the thing as a multi-material model. Apparently, it still looks enough like a logo to qualify for special treatment, but I fought it to a standstill.

    Installation awaits an above-freezing day …

  • Stack Light: Controller Wiring

    Stack Light: Controller Wiring

    A stack light above the laser cutter makes the controller’s input and output status easily visible:

    Stack Light - all on
    Stack Light – all on

    Which will be especially valuable while I’m bypassing safety interlocks and poking around inside the cabinet.

    The light is unavoidably upside-down from the industrial standard, because I can’t don’t want to mount it on the laser cabinet, and my use of color does not match the industrial convention. Neither of which matter for my simple needs.

    In order from top to bottom:

    The blue and orange lights turn on when their inputs are active, so they positively show sensor satisfaction, rather than laser-disabling dissatisfaction. The entire stack lights up while the controller runs a job with assist air turned on, which is usually the case.

    (See below for a slipstream update.)

    The wiring diagram on the case is the only documentation enclosed with the stack light:

    Stack Light - label diagram
    Stack Light – label diagram

    Any power supply between 12 VDC and 24 VDC will work and, contrary to the label, the COM lead can be either polarity: the light works in either common-anode or common-cathode configuration. Because the laser controller inputs and outputs are all low-active, I wired the COM terminal to +24 V, so pulling the other leads to GND turns on their lights.

    The overall connection diagram, in order from easy to hard:

    Stack Light - wiring diagram
    Stack Light – wiring diagram

    Some of the details behind the diagram explain what’s going on.

    Stack Light - water protect wiring diagram
    Stack Light – water protect wiring diagram

    The water flow sensor is wired in series with the chiller, with a GND connection on the far end pulling the WP controller terminal low when both sensors are happy; the switches can handle another 50 mA of LED current with no problem.

    Stack Light - L-ON wiring diagram
    Stack Light – L-ON wiring diagram

    The HV power supply has an internal pullup to +5 V on its L terminal, which means the L-ON output terminal sits at +5 V when the laser tube is off. Connecting the stack light directly to the L-ON terminal dumps the LED current into the 5 V supply through the pullup resistor, producing a somewhat weak glow in the LED when it should be off.

    Running the optoisolator input from 5 V solves that problem, as its diode will be off when the L-ON output is high. When it’s low, the diode turns on, the isolator’s output transistors conduct, and the stack light gets the full 24 V it expects.

    Stack Light - lid sensor wiring diagram
    Stack Light – lid sensor wiring diagram

    The lid sensor normally goes only to the IntLock controller terminal, but I also ran it to the otherwise unused P terminal on the HV power supply, in the possibly misguided belief it would prevent the supply from firing with the lid up if it failed like the first one. Those two inputs have 5 V pullups, so the optoisolator handles the stack light’s 24 V supply.

    Stack Light - status and assist air wiring diagram
    Stack Light – status and assist air wiring diagram

    When I added the dual-path air assist plumbing, diode D1 turned on the air pump when either the Status or the AuxAir output turned on. When the job calls for assist air, the AuxAir output opens a valve to increase the air flow.

    The Status output is active when the controller is running a job and that’s generally the only time the AuxAir output will be active, but the machine console has an Air button that manually activates it, so diode D2 isolates the Status output in that unusual situation.

    Slipstream update: I realized swapping the green & orange lights would make more sense:

    Done!

  • Stack Light: EL817 Optoisolator Case

    Stack Light: EL817 Optoisolator Case

    Rather than let the boosted optoisolators flop around:

    Stack Light - controller hairball wiring
    Stack Light – controller hairball wiring

    A small case seemed like a Good Idea™:

    Optoisolator Case - OpenSCAD
    Optoisolator Case – OpenSCAD

    The little hex standoffs have M3 threads, although 6 mm screws are about as much as they’ll take. The recesses have clearance for the boost transistor underneath the PCB, but it’s your responsibility to not let random wires get in trouble with the exposed circuitry:

    Optoisolator case
    Optoisolator case

    A strip of good foam tape sticks it to the controller:

    Stack Light - controller wiring
    Stack Light – controller wiring

    Admittedly, the stack light wiring remains something of a hairball, but it’s in a good cause.

    The OpenSCAD code can build as many cavities as you need:

    Optoisolator Case - x5 - OpenSCAD
    Optoisolator Case – x5 – OpenSCAD

    The OpenSCAD source code as a GitHub Gist:

    // Optoisolator case
    // Ed Nisley – KE4ZNU
    // 2025-01-09
    include <BOSL2/std.scad>
    include <BOSL2/threading.scad>
    // Number of isolator mounts
    NumMounts = 2;
    /* [Hidden] */
    Protrusion = 0.1;
    PCB = [40.5,15.5,1.6]; // optoisolator PCB
    LipWidth = 0.8; // support lip under PCB
    Margin = [8.0,3.0,4.5]; // clearance around PCB
    BaseThick = 3.0; // underneath
    Block = PCB + [2*Margin.x, 2*Margin.y, (Margin.z + BaseThick)];
    echo(Block = Block);
    HolesOC = [9.5,10.0]; // M3 mounting holes (upper left / lower right)
    $fn = 3*4;
    //———-
    // Construct one mount
    module Mount() {
    union() {
    difference() {
    cube(Block,anchor=BOTTOM);
    up(Block.z – PCB.z)
    cube(PCB + [0,0,Protrusion],anchor=BOTTOM);
    up(BaseThick)
    cube(PCB – 2*[LipWidth,LipWidth,0] + [0,0,Block.z],anchor=BOTTOM);
    }
    for (i=[-1,1])
    translate([i*HolesOC.x/2,-i*HolesOC.y/2,BaseThick])
    threaded_nut(5.0,3.1,Margin.z,0.5, // flat size, root dia, height, pitch
    bevel=false,ibevel=false,anchor=BOTTOM);
    }
    }
    //———-
    // Mash together as many mounts as needed
    union()
    for (j=[0:(NumMounts – 1)])
    back(j*(Block.y – Margin.y))
    Mount();

  • Stack Light: Optoisolator Boost Transistor

    Stack Light: Optoisolator Boost Transistor

    The LEDs in each stack light layer require a current sink handling about 50 mA, far above the ability of cheap optoisolators based on the EL817 photocoupler:

    Optoisolator - OEM schematic
    Optoisolator – OEM schematic

    I’ll go into the motivation for optocouplers along with the laser controller wiring details.

    As delivered, the PCB has:

    • R1 = 1 kΩ (a convenient 1 V/mA current sense)
    • R2 = 10 kΩ (a rather high-value pullup)

    The idea is to add an able-bodied transistor to the output in a Darlington configuration:

    Optoisolator - Darlington output
    Optoisolator – Darlington output

    Some rummaging produced a small bag of 2N3904 transistors, although nearly any small NPN transistor will suffice. Removing R2 cleared the field for modification:

    Optoisolator modification - top
    Optoisolator modification – top

    The 2N3904 transistor (with the usual EBC pinout) fits face-down under the PCB:

    Stack Light - optoisolator transistor
    Stack Light – optoisolator transistor

    The cross-legged layout conceals the emitter and base leads being soldered snugly to the former OUT and GND terminals, respectively, with the collector going to the VCC terminal. The terminals thus become:

    • VCC → Collector
    • OUT → Emitter
    • GND→ X (no connection)

    Although I have little reason to believe the EL817 chips are anything other than what they claim to be, their topmarks seemed rather casual:

    EL817 optocoupler - top view
    EL817 optocoupler – top view

    The other four chips carried C333 rank + date codes.

    The datasheet says the C means the Current Transfer Ratio is 200% to 400%: the output current should be 2× to 4× the diode current. The test condition are 5 mA into the diode and 5 V across the transistor terminals. A quick test:

    • 2 mA → 4 mA = 2×
    • 5 mA → 15 mA = 3×
    • 10 mA → 35 mA = 3.5×
    • 12 mA → 40 mA = 3.3×

    The output transistor is rated only to 50 mA, so I stopped at 40 mA. The CTR is between 200% and 350% over that range, suggesting the parts are really real.

    The 2N3904 should have an hFE above 60 in that current range and multiply the EL817 gain by about that amount. Another quick test in the Darlington configuration, now with the 5 V supply across the 2N3904:

    • 100 µA → 8.1 mA = 81×
    • 250 µA → 43 mA = 172×
    • 500 µA → 83 mA = 166×

    The overall current gain is 40× to 50×, less than the estimate, but plenty high enough for my purposes. If you cared deeply, you’d run a circuit simulation to see what’s going on.

    Knowing I needed only 50-ish mA, stopping with the transistor burning half a watt (because VCE is held at 5 V) seemed reasonable. In actual use, VCE will be on the order of 1 V and the dissipation will be under 100 mW.

    A quick test shows they work as intended:

    Stack Light - controller hairball wiring
    Stack Light – controller hairball wiring

    But, yeah, talk about hairballs. Those things cry for little housings to keep them out of trouble.

    The chonky lumps with orange stripes are Wago Lever-Nut connectors: highly recommended.