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: Laser Cutter

  • Monitor Mount: USB Hub Clamp

    Monitor Mount: USB Hub Clamp

    Along with the Beelink PC, putting the Anker USB hub on the monitor mount pole helped tidy the cables just a little bit:

    Monitor pole clamp - Anker USB hub
    Monitor pole clamp – Anker USB hub

    It’s still jumbled, but at least the cables aren’t wagging the hub.

    This clamp needs only one M6 screw into a square nut:

    Monitor Pole box clamp - solid model
    Monitor Pole box clamp – solid model

    Again better seen in cross-section:

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

    The OpenSCAD code extrudes the shape from a 2D arrangement, then punches the screw through the side:

    // Monitor Pole box clamp
    // Ed Nisley - KE4ZNU
    // 2025-01-23
    
    include <BOSL2/std.scad>
    
    /* [Hidden] */
    
    ID = 0;
    OD = 1;
    LENGTH = 2;
    
    Protrusion = 0.1;
    
    Box = [22.5,45.5,25.0];         // Z is clamp height
    BoxGrip = 5.0;                  // on outer side clearing connectors
    
    PoleOD = 30.5;
    
    WallThick = 5.0;
    
    Kerf = 3.0;                     // clamping space
    Clearance = 2*0.2;              // space around objects
    
    Washer = [6.0,12.0,1.5];        // M6 washer
    Nut = [6.0,10.0,5.0];           // M6 square nut
    
    MidSpace = 35.0;                // pole to box spacing
    
    ClampOAL = Box.x + MidSpace + PoleOD + 2*WallThick;
    
    //----------
    // Build it
    
            difference() {
                linear_extrude(height=Box.z,convexity=5)
                    difference() {
                        hull() {
                            right(MidSpace/2 + Box.x/2)
                                rect(Box + 2*[WallThick,WallThick],rounding=WallThick);
                            left(MidSpace/2 + PoleOD/2)
                                circle(d=PoleOD + 2*WallThick);
                        }
                        right(MidSpace/2 + Box.x/2)
                            square(Box + [Clearance,Clearance],center=true);
                        right(MidSpace/2 + Box.x)
                            square([Box.x,Box.y - 2*BoxGrip],center=true);
                        left(MidSpace/2 + PoleOD/2)
                            circle(d=PoleOD + Clearance);
                        square([2*ClampOAL,Kerf],center=true);
                    }
                up(Box.z/2) {
                    xrot(90)
                        cylinder(d=Washer[ID] + Clearance,h=2*Box.y,center=true,$fn=6);
                    fwd(Box.y/2 - Washer[LENGTH])
                        xrot(90) zrot(180/12)
                            cylinder(d=Washer[OD] + Clearance,h=Box.y,center=false,$fn=12);
                    back(Box.y/2 + Nut[LENGTH]/2)
                        xrot(90)
                            cube([Nut[OD],Nut[OD],2*Nut[LENGTH]],center=true);
                }
            }
    

    The alert reader will have noticed I didn’t peel the protective film off the hub, which tells you how fresh this whole lashup is.

  • 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.

  • 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.

  • CD/DVD Data Destruction: Engraving

    CD/DVD Data Destruction: Engraving

    A LightBurn video suggested large scan line intervals for decorative effects, so I adapted the SCP warning labels to fit 4 inch CD/DVD discs, set up the fixture, and Fired The Laser:

    CD Engraving - fixture
    CD Engraving – fixture

    The overall effect is, in most lighting, subtle:

    CD Engraving - samples 2
    CD Engraving – samples 2

    The pair on the right with inverted engraving areas are bolder:

    CD Engraving - samples 1
    CD Engraving – samples 1

    From a distance these two look similar, but a line interval of 0.50 mm (on the left) produces a distinct lined effect compared to the overall frosty look for 0.25 mm (open in a new tab & zoom in):

    CD Engraving - vary interval
    CD Engraving – vary interval

    The left and right edges of the disc warp upward as the surface melts and cools, pulling the disc into a potato chip shape. Doing large areas with 0.5 mm spacing produces less warp than 0.25 mm.

    The laser barely fires at 10% power (on the right) and produces a line with a distinct granular look compared the smoother result at 20% (on the left), both at 0.50 mm interval to show the lines:

    CD Engraving - vary power
    CD Engraving – vary power

    A 2 mm border at 0.25 mm interval (on the right, with a DVD) appears lighter than the central area at 0.50 mm (the CD on the left does not have the border):

    CD Engraving - interval passes
    CD Engraving – interval passes

    A closer look at the border:

    CD Engraving - low power irregularity
    CD Engraving – low power irregularity

    The reason behind the granular effect at 10% power is more obvious with higher magnification:

    CD Engraving - interval passes - detail
    CD Engraving – interval passes – detail

    The spots off to the right are surface imperfections and dirt, not random laser tube firing.

    The border and the central area happen on two different passes, so it’s comforting to see how closely the scan lines match.

    I glued pairs of discs together with E6000 adhesive to discover whether it’s less awful than cutting and aligning adhesive sheets. Yup, much better, but white adhesive requires better path control to keep it out of the transparent ring around the hub and better quantity control to prevent blobs from squooshing out around the perimeter. Using clear adhesive would help, as would a fresh tube without a plug of cured gunk blocking the nozzle.

    Once again, I have Too Many Coasters.

  • HLP-200B Laser Power Meter: Mirror Losses

    HLP-200B Laser Power Meter: Mirror Losses

    With the manual laser pulse button in place, I measured the beam power at the entry and exit planes of Mirror 1 and Mirror 2, with the differences indicating something about the reflectivity (or lack thereof) of the molybdenum mirrors. Given that the losses are on the order of a few percent, tops, I expected this to be below the repeatability of the measurements.

    The Mirror 1 entry point is basically the same as the laser tube exit:

    HLP-200B - Laser tube exit
    HLP-200B – Laser tube exit

    The Mirror 1 exit plane is perpendicular to that, just behind the mirror, but there is no way I can get a picture of the arrangement. Suffice it to say I do not want to ever put any body parts that close to an operating laser tube again.

    The HLP-200B meter turned out to be exactly the right length to stand on its own in front of Mirror 2, although I needed a few test shots to figure out the lateral positioning:

    HLP-200B Mirror 2 entry check
    HLP-200B Mirror 2 entry check

    The Mirror 2 exit measurements were hand-held, with the meter braced against the mirror mount brackets on the gantry:

    HLP-200B Mirror 2 exit
    HLP-200B Mirror 2 exit

    Without further ado, the results:

    M1 EntryM1 ExitM2 EntryM2 Exit
    35.531.230.332.9
    28.330.629.132.6
    31.822.827.828.9
    30.329.029.428.5
    26.928.428.727.0
    31.131.728.626.9
    30.729.029.029.5
    2.993.270.842.67

    The bold line gives the average of the six measurements at each position, with the sample standard deviation below that.

    As expected, the pulse-to-pulse variations swamp any actual differences between the entry and exit power levels; Mirror 2 does not have a net power gain. A 2% loss in the mirror is 0.6 W at 30 W, obviously far too small for the HLP-200B meter to resolve.

    I must once again set up the photocell to measure the stray IR scattered around the beam, measure the actual tube current, then see if the two vary as much as the HLP-200B says the beam power does.

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