Sucker for punishment laser build

@SupraGuy ,

I have a “blank” 0.5 inch MDF that I use for plotting and vinyl cutting. The vinyl cutting is pretty tolerant of minor overall flatness, so I just screw it down around the edges to my regular spoil board.
I also painted both sides with urethane to keep it smooth and free of warping due to moisture.

Mike

2 Likes

Yeah, I’d end up tempted to use it as a small levelled spoilboard and chewing it up, because that’s what I’d do.

Besides, I have a good machine design and a space to put it. I am starting to lean away from generalized machines and more to purpose-built. Make a machine that does a specific job really well, instead of one machine that does many jobs OK. (Probably still will leave some things to be mounted to the LR anyway, since it does many of those things reasonably well.)

Edit: almost forgot. X/Y move. No homing yet, but motor motionnks good. One of the Y motors is misaligned slightly, just enough that the belt makes a ticking noise where it comes out from the extrusion. Gonna have to wrestle with the loc-tite on the motor grub screw… it’s probably out by a half milimeter or so.

I have to tension the X axis wheels, the carriage can wobble a bit. Wouldn’t you know it, the adjustment needs a 10mm wrench. Do you think I can actually find one of those? HA! :rofl: :joy: :rofl: They will all be hiding in corners of the garage…

The Y trucks actually seem pretty good at their loosest setting.

Okay, everything tightened up, homing switches enabled and set up and the laser PWM is working.

The laser PWM is a headache. I had JLPCB make me a batch of boards following a schematic on the Duet docs page… the Duet 2 doesnt have a PWM output, so you have to hack a heater or other PWM output, but of course these switch a ground, not a 5V source. Anyway I had a batch of them made and it almost works, except it has a dangerous tendancy to just leave the laser at 100%. My testing incicated that the problem is that the heater line of course is left floating when not on, and the PWM board still thinks logic low. So I added a 1.2k pullup to 5V, and while I was at it, a LED that comes on when the heater MOSFET is on. (And just because, a “power good” LED.) So now there is a blue LED that shows what it thinks it is commanding the laser to do. That LED is a much safer way to test things, too!

I still don’t have the steel bed or the expanded sheet cutting bed, not to mention any semblance of a Z axis, so still too early to put it through its paces, but Im hoping it will be functional at a much higher rate than the LR3 laser is. So far, looks good, but time will tell. I set it for a max travel speed of 18000mm/min (300mm/s) which it seems to be able to do, so it should be interesting to see what the material tests look like.

3 Likes

So steel for the bed is coming this week, and Ive been puzzling put a Z axis.

A few random thoughts floating around… I only have 2 drives left on the Duet because dual Y motors… and I actually want to use one of those as a rotary axis, so… 1 drive left for Z.

  1. Run independent of the laser. Use a RAMPS stack (or MKS Gen L v1.0) because I have them and not using them for printers or CNC machines. Write a sketch that uses 3 motor drives and end stops, and has an “up” and “down” button, just drive the Z axis at a slowish speed when buttons pressed.

  2. Buy a Duet 3 Mini 5 and the add-on 2 drive board. This gives 7 drives on total. Seems like overkill. Like a lot but gives me 4 axis control.

  3. Go low-tech and just cut some braces to hold the bed at various heights. I have a max of about 8" variability, maybe 2" increments and stackable ¼" shims? I suppose that means I have to be Ok with the laser being ul to ⅛" out of ideal focus. Maybe make a ⅛" shim as well? (Or, 1", ½", ¼" and ⅛"…)

Gotta say the low tech solution is most appealing right now, because I’m also trying to puzzle out a design for a Z axis on any number of motors…

So here, if people want to get in on design…

So I have 6 V slot pillars around the bed. These can be used with wheels, or just as mount points. Along the Y rails, I need to keep the middle pillar clear for the drag chain, but could use the front and back. My thought for 3 motors was the center on X max, and front/rear on X min. The expanded sheet metal bed has to be in from the edge by several centimeters along X, but can be full length on Y.

Comvention would be using motors with T8 leadscrews. This is going to be almost 7 square feet of 18ga expanded sheet, plus whatever I might laser engrave on it, so might not work belted… but it might.

I think I don’t need to worry about Z wobble. Chances are that I will not be adjusting Z during the cut, and if Z wobble happens, then I will just never do that. (Even if so, not likely to move more than a couple mm in total.)

So any brilliant ideas?

Bonus points if the idea scales up as a drop table for the Primo and/or LR3.

2 Likes

You can manually drive leadscrews. You can even put a leadscrew in each corner and attach pulleys and a loop of gt belt to sync them.

But a separate Arduino with a DRO seems coolest to me.

1 Like


Well, the A axis drive part is ready.

Based around a 252mm GT2 belt loop, features a 16T motor drive gear and 20T pulleys. The guides were removed from 2 toothed gears to allow the belt to stand proud of the gear and be the interface between the drive and the work.

The motor mount allows for 7.5mm of adjustment for tension.

This should give me a surface speed close to the target of 100 microsteps/mm, but it will be off by the difference between the tooth circle size of a 20T pulley and the size at the back of the belt, but this is a pretty small ratio. The math based on the theory gives me 96.46 steps/mm. I can probably just leave it at 100 if I switch out the rotational axis for X or Y and it’ll be close enough, but it’s easy enough to correct for.

6 Likes

Dusting this off…

So I pulled the Duet and put my Jackpot on this. The motors are set up as XYY. I did have motion, but have not used it a while, and now I need to laser some stuff…

X moves OK, Y2 moves OK. Y1 doesn’t move, but does lock.

At present, I have not had enough correct movement to actually try the laser, so not sure if it is set up correctly.

I wanted to do some.laser engraving for a gift. Can’t believe howong it has actually been since I’ve had this working.

Config.yaml:

board: Jackpot TMC2209

name: XYY Laser
meta: 2025-04-05 DanG/SupraGuy

planner_blocks: 32

stepping:
  engine: I2S_STATIC
  idle_ms: 255
  pulse_us: 2
  dir_delay_us: 1
  disable_delay_us: 0

uart1:
  txd_pin: gpio.0
  rxd_pin: gpio.4
  rts_pin: NO_PIN
  baud: 115200
  mode: 8N1

axes:
  shared_stepper_disable_pin: NO_PIN

  x:
    steps_per_mm: 100.000
    max_rate_mm_per_min: 9000.000
    acceleration_mm_per_sec2: 200.000
    max_travel_mm: 1260
    soft_limits: false
    homing:
      cycle: 2
      positive_direction: false
      mpos_mm: 3
      feed_mm_per_min: 300.000
      seek_mm_per_min: 1500.000
      settle_ms: 500
      seek_scaler: 1.100
      feed_scaler: 1.100
    #X
    motor0:
      limit_neg_pin: gpio.25:high
      limit_pos_pin: NO_PIN
      limit_all_pin: NO_PIN
      hard_limits: false
      pulloff_mm: 4.000
      tmc_2209:
        uart_num: 1
        addr: 0
        cs_pin: NO_PIN
        r_sense_ohms: 0.110
        run_amps: 0.800
        homing_amps: 0.800
        hold_amps: 0.700
        microsteps: 16
        stallguard: 0
        stallguard_debug: false
        toff_disable: 0
        toff_stealthchop: 5
        toff_coolstep: 3
        run_mode: StealthChop
        homing_mode: StealthChop
        use_enable: false
        direction_pin: I2SO.1
        step_pin: I2SO.2
        disable_pin: I2SO.0

  y:
    steps_per_mm: 100.000
    max_rate_mm_per_min: 9000.000
    acceleration_mm_per_sec2: 200.000
    max_travel_mm: 2480
    soft_limits: false
    homing:
      cycle: 2
      positive_direction: false
      mpos_mm: 3
      feed_mm_per_min: 300.000
      seek_mm_per_min: 1500.000
      settle_ms: 500
      seek_scaler: 1.100
      feed_scaler: 1.100
    #Y
    motor0:
      limit_neg_pin: gpio.33:high
      limit_pos_pin: NO_PIN
      limit_all_pin: NO_PIN
      hard_limits: false
      pulloff_mm: 4.000
      tmc_2209:
        uart_num: 1
        addr: 1
        cs_pin: NO_PIN
        r_sense_ohms: 0.110
        run_amps: 0.800
        homing_amps: 0.800
        hold_amps: 0.700
        microsteps: 16
        stallguard: 0
        stallguard_debug: false
        toff_disable: 0
        toff_stealthchop: 5
        toff_coolstep: 3
        run_mode: StealthChop
        homing_mode: StealthChop
        use_enable: false
        step_pin: I2SO.5
        direction_pin: I2SO.4
        disable_pin: I2SO.7

    #Z
    motor1:
      limit_neg_pin: gpio.32:high
      limit_pos_pin: NO_PIN
      limit_all_pin: NO_PIN
      hard_limits: false
      pulloff_mm: 4.000
      tmc_2209:
        uart_num: 1
        addr: 2
        cs_pin: NO_PIN
        r_sense_ohms: 0.110
        run_amps: 0.800
        homing_amps: 0.800
        hold_amps: 0.700
        microsteps: 16
        stallguard: 0
        stallguard_debug: false
        toff_disable: 0
        toff_stealthchop: 5
        toff_coolstep: 3
        run_mode: StealthChop
        homing_mode: StealthChop
        use_enable: false
        step_pin: I2SO.10
        direction_pin: I2SO.9
        disable_pin: I2SO.8

#  c:
#    steps_per_mm: 80.000
#    max_rate_mm_per_min: 5000.000
#    acceleration_mm_per_sec2: 100.000
#    max_travel_mm: 300.000
#    soft_limits: false
#    homing:
#      cycle: 0
#      positive_direction: true
#      mpos_mm: 150.000
#      feed_mm_per_min: 100.000
#      seek_mm_per_min: 800.000
#      settle_ms: 500
#      seek_scaler: 1.100
#      feed_scaler: 1.100
#
#    motor0:
#      limit_neg_pin: gpio.39:low
#      limit_pos_pin: NO_PIN
#      limit_all_pin: NO_PIN
#      hard_limits: false
#      pulloff_mm: 3.000
#      tmc_2209:
#        uart_num: 1
#        addr: 3
#        cs_pin: i2so.22
#        r_sense_ohms: 0.110
#        run_amps: .8
#        homing_amps: 0.800
#        hold_amps: 0.050
#        microsteps: 16
#        stallguard: 0
#        stallguard_debug: false
#        toff_disable: 0
#        toff_stealthchop: 5
#        toff_coolstep: 3
#        run_mode: StealthChop
#        homing_mode: StealthChop
#        use_enable: false
#        step_pin: I2SO.21
#        direction_pin: I2SO.20
#        disable_pin: I2SO.23

i2so:
  bck_pin: gpio.22
  data_pin: gpio.21
  ws_pin: gpio.17

spi:
  miso_pin: gpio.19
  mosi_pin: gpio.23
  sck_pin: gpio.18

sdcard:
  cs_pin: gpio.5
  card_detect_pin: NO_PIN
  frequency_hz: 20000000

probe:
  pin: gpio.36:low
  toolsetter_pin: NO_PIN
  check_mode_start: true

start:
  must_home: false

coolant:
  flood_pin: gpio.2
  mist_pin: gpio.16
  delay_ms: 0

control:
  safety_door_pin: NO_PIN
  reset_pin: NO_PIN
  feed_hold_pin: NO_PIN
  cycle_start_pin: NO_PIN
  macro0_pin: NO_PIN
  macro1_pin: NO_PIN
  macro2_pin: NO_PIN
  macro3_pin: NO_PIN

macros:
  startup_line0:
  startup_line1:
  macro0:
  macro1:
  macro2:
  macro3:

user_outputs:
  analog0_pin: NO_PIN
  analog1_pin: NO_PIN
  analog2_pin: NO_PIN
  analog3_pin: NO_PIN
  analog0_hz: 5000
  analog1_hz: 5000
  analog2_hz: 5000
  analog3_hz: 5000
  digital0_pin: NO_PIN
  digital1_pin: NO_PIN
  digital2_pin: NO_PIN
  digital3_pin: NO_PIN

Laser:
  pwm_hz: 5000
  output_pin: gpio.27
  enable_pin: NO_PIN
  disable_with_s0: false
  s0_with_disable: true
  tool_num: 0
  speed_map: 0=0.000% 255=100.000%
  off_on_alarm: true

# pwm:
#  pwm_hz: 5000
#  direction_pin: gpio.26
#  output_pin: gpio.27
#  enable_pin: NO_PIN
#  disable_with_s0: false
#  s0_with_disable: true
#  spinup_ms: 0
#  spindown_ms: 0
#  tool_num: 0
#  speed_map: 0=0.000% 1000=100.000%
#  off_on_alarm: false

# 5V out gpio.26/27
# VMot out gpoi.2/16
# In's left to right gpoi.25/33/32/35/34/39/36

Your Y axis YAML is missing the 2nd motor definition (motor1:)

The comment is #Z, but it should be there as motor 1 in the config… pretty sure that’s the one that works…

You also need a
Y
Motor 1.

The entire second Y motor config section is not there.

I made the same observational mistake, the #Z comment masks this.

At this point, I want to see the $ss ouptut from the machine.

1 Like
$SS
[MSG:INFO: FluidNC v3.9.6 https://github.com/bdring/FluidNC]
[MSG:INFO: Compiled with ESP32 SDK:v4.4.7-dirty]
[MSG:INFO: Local filesystem type is littlefs]
[MSG:INFO: Configuration file:config.yaml]
[MSG:INFO: Machine XYY Laser]
[MSG:INFO: Board Jackpot TMC2209]
[MSG:INFO: UART1 Tx:gpio.0 Rx:gpio.4 RTS:NO_PIN Baud:115200]
[MSG:INFO: I2SO BCK:gpio.22 WS:gpio.17 DATA:gpio.21Min Pulse:2us]
[MSG:INFO: SPI SCK:gpio.18 MOSI:gpio.23 MISO:gpio.19]
[MSG:INFO: SD Card cs_pin:gpio.5 detect:NO_PIN freq:20000000]
[MSG:INFO: Stepping:I2S_STATIC Pulse:2us Dsbl Delay:0us Dir Delay:1us Idle Delay:255ms]
[MSG:INFO: Axis count 3]
[MSG:INFO: Axis X (3.000,1263.000)]
[MSG:INFO:   Motor0]
[MSG:INFO:     tmc_2209 UART1 Addr:0 CS:NO_PIN Step:I2SO.2 Dir:I2SO.1 Disable:I2SO.0 R:0.110]
[MSG:INFO:  Neg Limit gpio.25]
[MSG:INFO: Axis Y (3.000,2483.000)]
[MSG:INFO:   Motor0]
[MSG:INFO:     tmc_2209 UART1 Addr:1 CS:NO_PIN Step:I2SO.5 Dir:I2SO.4 Disable:I2SO.7 R:0.110]
[MSG:INFO:  Neg Limit gpio.33]
[MSG:INFO:   Motor1]
[MSG:INFO:     tmc_2209 UART1 Addr:2 CS:NO_PIN Step:I2SO.10 Dir:I2SO.9 Disable:I2SO.8 R:0.110]
[MSG:INFO:  Neg Limit gpio.32]
[MSG:INFO: Axis Z (-1000.000,0.000)]
[MSG:INFO:   Motor0]
[MSG:INFO: X Axis driver test passed]
[MSG:INFO: Y Axis driver test passed]
[MSG:INFO: Y2 Axis driver test passed]
[MSG:INFO: Kinematic system: Cartesian]
[MSG:INFO: Connecting to STA SSID:SupraGuysWIFI]
[MSG:INFO: Connecting.]
[MSG:INFO: Connecting..]
[MSG:INFO: Connecting...]
[MSG:INFO: Connected - IP is 192.168.42.88]
[MSG:INFO: WiFi on]
[MSG:INFO: Start mDNS with hostname:http://XYYLaser.local/]
[MSG:INFO: HTTP started on port 80]
[MSG:INFO: Telnet started on port 23]
[MSG:INFO: Laser Ena:NO_PIN Out:gpio.27 Freq:5000Hz Period:8191]
[MSG:INFO: Flood coolant gpio.2]
[MSG:INFO: Mist coolant gpio.16]
[MSG:INFO: Probe gpio.36:low]

Drat, I managed to bust the microswitch for Y2… well, easy enough to repair


A pic of the motor wire connections. The paler blue are the wire extensions to X and Y2, the darker blue are straight to Y1 motor.

I also tried swapping the TMC2209 drivers with a different channel to see if it would help (it did not.) Edit: Wow, I managed to move those heat sinks around a bit swapping them…