unable to get BLTouch mesh compensation to work properly.
-
Essentials
Duet 2 Maestro ver. 3.1.1
Custom CoreXY
Genuine BLTouch ver. 3
Wired and working with all the gcode commands, deployprobe.g, retractprobe.g files.
My offset for the BLTouch: X0, Y-21, Z4.1(edit 1)
More details:
I have a Z-min limit switch as well as a BLTouch. I set that limit to 0.05mm at the center of my build plate.
I do all steps with both the bed and the hot end at temperature, not cold.I have repeatedly done the on-line suggested steps
M561
M564 H0
G92 Z0
G30 S-1
Edit config.g to change the G31 settings with the last result
G29 Do the matrix probe, which banged along fine. Here are the console results.4/14/2024, 10:39:49 PM G29 S0
Warning: Skipping grid point (190.0, 190.0) because Z probe cannot reach it
Warning: Skipping grid point (170.0, 190.0) because Z probe cannot reach it
Warning: Skipping grid point (150.0, 190.0) because Z probe cannot reach it
Warning: Skipping grid point (130.0, 190.0) because Z probe cannot reach it
Warning: Skipping grid point (110.0, 190.0) because Z probe cannot reach it
Warning: Skipping grid point (90.0, 190.0) because Z probe cannot reach it
Warning: Skipping grid point (70.0, 190.0) because Z probe cannot reach it
Warning: Skipping grid point (50.0, 190.0) because Z probe cannot reach it
Warning: Skipping grid point (30.0, 190.0) because Z probe cannot reach it
Warning: Skipping grid point (10.0, 190.0) because Z probe cannot reach it
Warning: the height map has a substantial Z offset. Suggest use Z-probe to establish Z=0 datum, then re-probe the mesh.
90 points probed, min error -2.367, max error -2.046, mean -2.219, deviation 0.082
Height map saved to file 0:/sys/heightmap.csv
4/14/2024, 10:28:28 PM Upload of config.g successful after 0s (Did not reboot after the save)
4/14/2024, 10:27:52 PM G30 S-1
Stopped at height 1.846 mm
4/14/2024, 10:26:58 PM G92 Z0
4/14/2024, 10:24:46 PM G0 X100 Y 100
4/14/2024, 10:24:26 PM M564 H0This one turned out especially bad. Every time I run the sequence it seems to get worse.
I have attached my config.g file, I think.
config.g
heightmap.csvI have two questions:
All the instructions I have seen have you add the G31 Z offset as you measure it. The start the sequence. After the G30 S-1 step, then modify the G31 Z offset in config. I originally did this and told the software to restart after the save, then ran G29 S0 to get the height table. That did not work well, I got a bad first layer the nozzle clearly too high up.
Using baby steps got the nozzle where I wanted it, but changing the G31 offset by that change accomplished nothing that I could see - I tried arbitrary adjustments, still nothing.
Then I started doing the G29 S0 mesh probe without restarting after the config.g save. Still nozzle too high off the bed, and adjusting the G31 Z value did nothing.My two questions:
What am I doing wrong? What step am I missing.
After changing the config.g G31 Z offset to the G30 S-1 value, do I need to restart the Duet before running the G29 S0 mesh probe?Any help appreciated. I am scratching my head. All the steps seem to work as indicated, and I do see the mesh Z adjustments happening, but it the nozzle is just too far off the plate.
I Set my Z endstop and adjust screws at each corner, which gets kinda close before I do any of the above.Thank you and be well,
DLC -
@dlc60 I'm not sure I'll be able to answer all your questions, but here are a couple of things:
- The range you've selected in M557 (start, spacing of 20 in X and Y) has mesh points at Y=190, which is not reachable according to the combination of Ymax (210) and probe Y offset (-21) that you've chosen. You could get rid of those warnings by tweaking the M557 parameters (e.g., Y4:189).
- The height map looks like it would be decent if not for a ~2mm discrepancy in offset. Sounds like you're probing separately to figure out what the Z offset should be, but you then need to account for that in the G31 Z parameter. A larger Z parameter will bring the nozzle closer to the bed.
- I would suggest concentrating on getting Z=0 to be in the right place first, and then worry about the height map.
Hope this helps.
-
@paralepsis said in unable to get BLTouch mesh compensation to work properly.:
@dlc60 I'm not sure I'll be able to answer all your questions, but here are a couple of things:
- The range you've selected in M557 (start, spacing of 20 in X and Y) has mesh points at Y=190, which is not reachable according to the combination of Ymax (210) and probe Y offset (-21) that you've chosen. You could get rid of those warnings by tweaking the M557 parameters (e.g., Y4:189).
- The height map looks like it would be decent if not for a ~2mm discrepancy in offset. Sounds like you're probing separately to figure out what the Z offset should be, but you then need to account for that in the G31 Z parameter. A larger Z parameter will bring the nozzle closer to the bed.
- I would suggest concentrating on getting Z=0 to be in the right place first, and then worry about the height map.
Hope this helps.
Thanks for replying - I understand the unreachable points, since that isn't much of a problem, I've back-burnered tweaking that setting.
I agree about the height map. As noted, I do a Z=0 set everytime I run the sequence. That has been pretty repeatable. I also tried to adjust the Z offset by baby stepping and add that tweak to the Z offset, but it did not appear to change anything. I know what the issue is, I just seem to be doing something wrong when following the setup procedure.
be well,
-
@dlc60 So if you just boot up, home X and Y, home Z, and then move to Z=0, how far is the nozzle from the bed, in reality? Couple of mm away?
-
@paralepsis said in unable to get BLTouch mesh compensation to work properly.:
@dlc60 So if you just boot up, home X and Y, home Z, and then move to Z=0, how far is the nozzle from the bed, in reality? Couple of mm away?
Nope, about 0.05 mm according to my gap gauge.
be well,
DLC -
@dlc60 Ok. I'm not sure if this will help, but here's precisely what I do to set up my height map.
G1 X102 Y60 F2400 ; move to a consistent spot for probing G29 S2 ; clear mesh G30 ; probe once G91 ; relative positioning G1 Z5 G90 ; absolute positioning M557 X6.75:288 Y40:298.75 P10:10 G29 S4 P"/sys/probePoints10x10all.csv"; load probePoints10x10all.csv to skip points G29 S0 ; probe and enable mesh M376 H5 ; taper over first 5mm (ought to be more than enough)
Obviously X and Y must be homed prior to this. You can ignore the G29 S4; that's for working around magnets. I won't say this is the "right" way to do things, but it certainly works consistently for me, and I get very small discrepancies in height map (as one would hope!).
Rob
-
@paralepsis said in unable to get BLTouch mesh compensation to work properly.:
@dlc60 Ok. I'm not sure if this will help, but here's precisely what I do to set up my height map.
G1 X102 Y60 F2400 ; move to a consistent spot for probing G29 S2 ; clear mesh G30 ; probe once G91 ; relative positioning G1 Z5 G90 ; absolute positioning M557 X6.75:288 Y40:298.75 P10:10 G29 S4 P"/sys/probePoints10x10all.csv"; load probePoints10x10all.csv to skip points G29 S0 ; probe and enable mesh M376 H5 ; taper over first 5mm (ought to be more than enough)
Obviously X and Y must be homed prior to this. You can ignore the G29 S4; that's for working around magnets. I won't say this is the "right" way to do things, but it certainly works consistently for me, and I get very small discrepancies in height map (as one would hope!).
Rob
Rob,
All the instructions that I have say to do G30 S-1 to find the Z probe offset to update the G31 in the config.g file. What does your Line 3 above do? What is your G31 probe offset look like when you start this? Are you working always with a previously set G31 in config.g? You are not setting the G92 Z0 either, are you using whatever you currently have?
be well,
DLC -
@paralepsis said in unable to get BLTouch mesh compensation to work properly.:
@dlc60 Ok. I'm not sure if this will help, but here's precisely what I do to set up my height map.
G1 X102 Y60 F2400 ; move to a consistent spot for probing G29 S2 ; clear mesh G30 ; probe once G91 ; relative positioning G1 Z5 G90 ; absolute positioning M557 X6.75:288 Y40:298.75 P10:10 G29 S4 P"/sys/probePoints10x10all.csv"; load probePoints10x10all.csv to skip points G29 S0 ; probe and enable mesh M376 H5 ; taper over first 5mm (ought to be more than enough)
Obviously X and Y must be homed prior to this. You can ignore the G29 S4; that's for working around magnets. I won't say this is the "right" way to do things, but it certainly works consistently for me, and I get very small discrepancies in height map (as one would hope!).
Rob
Rob,
I did these steps first:
M561 to clear any mesh.
homed all
moved to center of bed and up 5mm
G30 S-1 to find offset.
Modified config.g G31 probe offset.
Restarted.
Then this
Homed all, moved to center 5mm up
M561 to clear any mesh
Ran your sequence but didn't do the G30 single probe - and ran my M557 pattern.
I am now getting what I expect to see, a well laid down first layer. and a reasonable height map, which could be better, but isn't too bad.I have no idea where I may have gone wrong - Maybe should not have stayed up so late?
be well,
DLC -
@dlc60 Hey! Glad you got something working.
Re: G30, that does a single probe and sets Z coordinate to probe trigger height -- it's the equivalent of homing Z using that XY coordinate as the point at which to home.
I don't have a separate Z axis endstop, so this is how I "home" prior to doing the mesh probe. I guess you do have a separate Z axis endstop, otherwise I'm not sure that G30 S-1 is meaningful?
-
This macro may be overkill, but may help. It will calculate the probe points for you. I use it for quick calibrations (small number of probe points) t0 get the bed more-or-less level then a more comprehensive calibration.
To use you would likely need to have
global zprobe_index = 0
at the start (I use a couple of different zprobes hence the variable); Creates a mesh calibration ; Assumes the bed limits (actual area reachable by the nozzle) ; have been set with M208 ; Assumes the probe offset has been set with G31 ; ;--- Prerequisites -------------- ; global.zprobe_index MUST be defined. The probe number to use. ; ; --- CHANGE THESE SETTINGS TO YOUR REQUIREMENTS --- ; ; Heat Bed and Nozzle ? var set_temp = false ; ; Set bed and nozzle temp -- Note that this is not too critical var bed_temp = 50.0 ; set at an reasonable temp (e.g. 50 should be good enough for PLA and PETG var nozzle_temp = 150.0 ; set high enough to allow for some expansion but not enough to ooze ; ; Set margin to limit area of bed to be probed should be >= 1.0 var X_margin = 1.0 var Y_margin = 1.0 ; ; Set the number of probe points in X and Y axis var P_X_points = 0 var P_Y_points = 0 ; ; ------------------------------------------ ; --- SHOULD NOT CHANGE BELOW THIS POINT --- ;------------------------------------------- ; ;Ensure a tool is selected ; if state.currentTool < 0 ; no tool selected var msg = "Cannot run if no tool is selected" M117 {var.msg} abort {var.msg} M291 R"How Many Probe points" P"Select a number" K{"9","16","64","100","Cancel"} S4 if input = 0 set var.P_X_points = 3 set var.P_Y_points = 3 elif input = 1 set var.P_X_points = 4 set var.P_Y_points = 4 elif input = 2 set var.P_X_points = 8 set var.P_Y_points = 8 elif input = 3 set var.P_X_points = 10 set var.P_Y_points = 10 else abort "Selection cancelled" M291 R"Hot or Cold Calibration" P"Turn on Heaters" K{"YES","NO","Cancel"} S4 if input = 0 set var.set_temp = true elif input = 1 set var.set_temp = false else abort "Selection cancelled" ; ;initialize local variables var X_grid_min = 0.0 var X_grid_max = 0.0 var Y_grid_min = 0.0 var Y_grid_max = 0.0 ; Get the limits for accessible parts of the bed i.e. where nozzle can reach var X_min = move.axes[0].min var X_max = move.axes[0].max var Y_min = move.axes[1].min var Y_max = move.axes[1].max ; Set the probe offset var X_offset = sensors.probes[{global.zprobe_index}].offsets[0] var Y_offset = sensors.probes[{global.zprobe_index}].offsets[1] ; ; ------------ MACRO STARTS HERE----------------- ; G90 ; use absolute coordinates M83 ; extruder relative mode ; if var.set_temp echo "Wait for Calibration Temperatures to be reached" M104 S{var.nozzle_temp} M140 S{var.bed_temp} ; set bed temp a compromise between PLA and PETG M116 ; wait for temperatures to be reached ;G1 E-4 F3600 ; retract filament quickly so no ooze M290 R0 S0 ;remove any babysteps M561 ; reset any bed compensation ; ; Calculate X max and min probe points if var.X_offset >= 0.0 ; right hand probe point is limited set var.X_grid_min = {var.X_min + var.X_margin + var.X_offset} set var.X_grid_max = {var.X_max - var.X_margin} else set var.X_grid_min = {var.X_min + min(var.X_margin, -var.X_offset)} set var.X_grid_max = {var.X_max - var.X_margin + var.X_offset} ; X offset is negative so we add echo "X offset " ^ var.X_offset ^ " (" ^ var.X_grid_min ^ ":" ^ var.X_grid_max ^ ")" ; ; Calculate Y max and min probe points if var.Y_offset >= 0.0 set var.Y_grid_min = {var.Y_min + var.Y_margin + var.Y_offset} set var.Y_grid_max = {var.Y_max - var.Y_margin} else set var.Y_grid_min = {var.Y_min + min(var.Y_margin, -var.Y_offset)} set var.Y_grid_max = {var.Y_max - var.Y_margin + var.Y_offset} ; Y offset is negative so we add echo "Y offset " ^ var.Y_offset ^ " (" ^ var.Y_grid_min ^ ":" ^ var.Y_grid_max ^ ")" ; ; Set the grid probe points M557 X{var.X_grid_min,var.X_grid_max} Y{var.Y_grid_min,var.Y_grid_max} P{var.P_X_points,var.P_Y_points} M557 ;report the settings ; echo "Performing Mesh Calibration" G28 ; must be homed first G30 K{global.zprobe_index} ; Perform a single probe to establish Z=0 (should already be at center because of home) G29 K{global.zprobe_index} S0 ; perform mesh calibration save and load G0 Z50 F3000 ; lower bed echo "Calibration Complete" if var.set_temp G1 E4 F300 ; put filament back ; Turn off heaters M568 S0 R0 A0 ; Reset temps and turn off hotend M140 S0 R0 ; Reset bed temps M140 S-273 ; Turn of bed heater
-
@stuartofmt said in unable to get BLTouch mesh compensation to work properly.:
This macro may be overkill, but may help. It will calculate the probe points for you. I use it for quick calibrations (small number of probe points) t0 get the bed more-or-less level then a more comprehensive calibration.
To use you would likely need to have
global zprobe_index = 0
at the start (I use a couple of different zprobes hence the variable); Creates a mesh calibration ; Assumes the bed limits (actual area reachable by the nozzle) ; have been set with M208 ; Assumes the probe offset has been set with G31 ; ;--- Prerequisites -------------- ; global.zprobe_index MUST be defined. The probe number to use. ; ; --- CHANGE THESE SETTINGS TO YOUR REQUIREMENTS --- ; ; Heat Bed and Nozzle ? var set_temp = false ; ; Set bed and nozzle temp -- Note that this is not too critical var bed_temp = 50.0 ; set at an reasonable temp (e.g. 50 should be good enough for PLA and PETG var nozzle_temp = 150.0 ; set high enough to allow for some expansion but not enough to ooze ; ; Set margin to limit area of bed to be probed should be >= 1.0 var X_margin = 1.0 var Y_margin = 1.0 ; ; Set the number of probe points in X and Y axis var P_X_points = 0 var P_Y_points = 0 ; ; ------------------------------------------ ; --- SHOULD NOT CHANGE BELOW THIS POINT --- ;------------------------------------------- ; ;Ensure a tool is selected ; if state.currentTool < 0 ; no tool selected var msg = "Cannot run if no tool is selected" M117 {var.msg} abort {var.msg} M291 R"How Many Probe points" P"Select a number" K{"9","16","64","100","Cancel"} S4 if input = 0 set var.P_X_points = 3 set var.P_Y_points = 3 elif input = 1 set var.P_X_points = 4 set var.P_Y_points = 4 elif input = 2 set var.P_X_points = 8 set var.P_Y_points = 8 elif input = 3 set var.P_X_points = 10 set var.P_Y_points = 10 else abort "Selection cancelled" M291 R"Hot or Cold Calibration" P"Turn on Heaters" K{"YES","NO","Cancel"} S4 if input = 0 set var.set_temp = true elif input = 1 set var.set_temp = false else abort "Selection cancelled" ; ;initialize local variables var X_grid_min = 0.0 var X_grid_max = 0.0 var Y_grid_min = 0.0 var Y_grid_max = 0.0 ; Get the limits for accessible parts of the bed i.e. where nozzle can reach var X_min = move.axes[0].min var X_max = move.axes[0].max var Y_min = move.axes[1].min var Y_max = move.axes[1].max ; Set the probe offset var X_offset = sensors.probes[{global.zprobe_index}].offsets[0] var Y_offset = sensors.probes[{global.zprobe_index}].offsets[1] ; ; ------------ MACRO STARTS HERE----------------- ; G90 ; use absolute coordinates M83 ; extruder relative mode ; if var.set_temp echo "Wait for Calibration Temperatures to be reached" M104 S{var.nozzle_temp} M140 S{var.bed_temp} ; set bed temp a compromise between PLA and PETG M116 ; wait for temperatures to be reached ;G1 E-4 F3600 ; retract filament quickly so no ooze M290 R0 S0 ;remove any babysteps M561 ; reset any bed compensation ; ; Calculate X max and min probe points if var.X_offset >= 0.0 ; right hand probe point is limited set var.X_grid_min = {var.X_min + var.X_margin + var.X_offset} set var.X_grid_max = {var.X_max - var.X_margin} else set var.X_grid_min = {var.X_min + min(var.X_margin, -var.X_offset)} set var.X_grid_max = {var.X_max - var.X_margin + var.X_offset} ; X offset is negative so we add echo "X offset " ^ var.X_offset ^ " (" ^ var.X_grid_min ^ ":" ^ var.X_grid_max ^ ")" ; ; Calculate Y max and min probe points if var.Y_offset >= 0.0 set var.Y_grid_min = {var.Y_min + var.Y_margin + var.Y_offset} set var.Y_grid_max = {var.Y_max - var.Y_margin} else set var.Y_grid_min = {var.Y_min + min(var.Y_margin, -var.Y_offset)} set var.Y_grid_max = {var.Y_max - var.Y_margin + var.Y_offset} ; Y offset is negative so we add echo "Y offset " ^ var.Y_offset ^ " (" ^ var.Y_grid_min ^ ":" ^ var.Y_grid_max ^ ")" ; ; Set the grid probe points M557 X{var.X_grid_min,var.X_grid_max} Y{var.Y_grid_min,var.Y_grid_max} P{var.P_X_points,var.P_Y_points} M557 ;report the settings ; echo "Performing Mesh Calibration" G28 ; must be homed first G30 K{global.zprobe_index} ; Perform a single probe to establish Z=0 (should already be at center because of home) G29 K{global.zprobe_index} S0 ; perform mesh calibration save and load G0 Z50 F3000 ; lower bed echo "Calibration Complete" if var.set_temp G1 E4 F300 ; put filament back ; Turn off heaters M568 S0 R0 A0 ; Reset temps and turn off hotend M140 S0 R0 ; Reset bed temps M140 S-273 ; Turn of bed heater ob
I created a simpler macro that does most of what you do here, Kind of a combination of yours and Rob's.
Mine handles homing, bed and nozzle heating, and compensation. As Rob mentioned, the G92 Z0 is not very useful for me since I have a Z end stop that I set to 0.05 mm at the center of the bed. That is my reference point. Then I get a G30 S-1 at that point to find the offset there, set my config.g G31 probe offsets. This is my starting point. Then I fire off the compensation macro.This has proven itself to work reasonably well. Certainly better than trying to manually tram the bed to any great precision. Metal plates and biosilicate glass have proven to be not very flat.
Thank you everyone!
be well,
DLC