Heightmap, BLTouch and First Layer height



  • Hi all,
    I'm using a printer with a big bed (800 x 400 mm) and a BLTouch. My nozzle is Z fixed, and the plane go down while incrementing the Z Value.

    Using no bed levelling, I'm able to obtain the desired first layer height (in the center of the bed) using the right combination of Z soft-stop (M208) and "Global G-Code offset" values.

    I've mapped all the bed with the BLTouch (G29) and I have set the correct G31 Z value inside config.g file (trough probing at the center of the bed).
    Now I need to truly implement the obtained heightmap while printing, but I don't really understand how to do that!

    I suppose that, while using an heightmap, the Z soft-stop value (M208) should be incremented in order to (virtually) let the nozzle crash on the bed, because the system will no more use this value to set the GCode Z zero, but then... how to accurately control the first layer height?

    Should I load the map with the M375 command and print the same small STL files many times, changing the G31 Z value, while measuring the obtained first layer (or the entire object) height?

    Internet give so much documents about how to properly implement a probe inside your machine, but nobody explain how to set the system to obtain a 0.2 mm first layer height (for example) on all the bed, while using your bed heigtmap.

    Thank you!
    Mark.


  • administrators

    @3dreamer said in Heightmap, BLTouch and First Layer height:

    I suppose that, while using an heightmap, the Z soft-stop value (M208) should be incremented in order to (virtually) let the nozzle crash on the bed, because the system will no more use this value to set the GCode Z zero, but then... how to accurately control the first layer height?

    Not necessary. Axis limits are enforced before height map corrections are made.

    Should I load the map with the M375 command and print the same small STL files many times, changing the G31 Z value, while measuring the obtained first layer (or the entire object) height?

    You can also load the height map using G29 S1. An easier way to finds the ideal Z offset is to use baby stepping while printing; then you can subtract the ideal baby step amount from the G31 Z parameter.



  • Hi dc42,
    thank you for your quick reply.

    I understand that the G31 Z value is an absolute value toward the distance between the nozzle and the trigger height but is a relative value toward the first layer height value.
    Is this correct?

    So are you telling me that if my 208 setting will not let the nozze approach the center bed more than 0.2 mm (for example), lowering the G31 Z value will never let me put the nozzle less than 0.2 mm from the bed?

    Or maybe the G31 and Heightmap works in order to let dynamically change the M208 soft-stop during the printing?

    On the base of your informations I'll go trough some tests, and I'll let the community know about the results.

    Thank you!
    Mark.



  • P.S. I'm using the" RepRapFirmware for Duet 2 WiFi/Ethernet", V 1.21 (2018-03-21).


  • administrators

    @3dreamer said in Heightmap, BLTouch and First Layer height:

    I understand that the G31 Z value is an absolute value toward the distance between the nozzle and the trigger height but is a relative value toward the first layer height value.
    Is this correct?

    No. If you tell your slicer to print at 0.2mm layer height, it will position the nozzle at Z=0.2mm when it starts printing the first layer. If you tell your slicer to use 0.3mm layer height, it will position the nozzle at Z=0.3mm t print the first layer. And so on.

    So are you telling me that if my 208 setting will not let the nozze approach the center bed more than 0.2 mm (for example), lowering the G31 Z value will never let me put the nozzle less than 0.2 mm from the bed?

    Actually, to cause the nozzle to start lower when printing, you need to increase the G31 Z value, not reduce it.

    It's usual to set the M208 Z minimum to zero. But when calibrating the Z probe trigger height, you need to be able to lower the nozzle until it it touching the bed (or gripping a piece of paper) even if the current Z position is a little inaccurate. So when doing that you should either set the M208 minimum Z value negative (e.g. -0.5mm) or use M564 S0 to allow axis limits to be ignored.



  • @dc42 said in Heightmap, BLTouch and First Layer height:

    No. If you tell your slicer to print at 0.2mm layer height, it will position the nozzle at Z=0.2mm when it starts printing the first layer. If you tell your slicer to use 0.3mm layer height, it will position the nozzle at Z=0.3mm t print the first layer. And so on.

    Yes, BUT also no!
    I mean that if your gcode contain, for the first layer, the instruction "G1 Z0.2" then your nozzle will physically elevate at 0.2 mm not from the bed, but from the Gcode Zero position.
    So, if you have set your M208 softstop to bring the nozzle at 0.2 mm from the bed, then you will obtain a REAL first layer 0.3mm thick. This behavior happen when not using/considering an heigthmap.

    (Sorry If I'm using a "didactic" writing, too often articles are badly written, leading to big semantic misconceptions.)

    Actually, to cause the nozzle to start lower when printing, you need to increase the G31 Z value, not reduce it.

    OK, my fault.

    It's usual to set the M208 Z minimum to zero. But when calibrating the Z probe trigger height, you need to be able to lower the nozzle until it it touching the bed (or gripping a piece of paper) even if the current Z position is a little inaccurate. So when doing that you should either set the M208 minimum Z value negative (e.g. -0.5mm) or use M564 S0 to allow axis limits to be ignored.

    I can partially understand you, because:

    • touching the bed or gripping a piece of paper is not the same thing. A piece of paper can be 0.1 mm thick, so you will "start" from different positions.
    • All pieces of the puzzle are clear to understand, but it's not clear how all the pieces comes together.

    So let me understand which can be the correct procedures to use when you want to implement an Heightmap:
    One hypothesis:

    1. Use M564 S0 to ignore axis limits.
    2. Set the M208 Z value at... ?
    3. Obtain the correct G31 Z value by probing some times the bed on it's center.
    4. Obtain an Heightmap trough G92.
    5. Use the obtained Heightmap during print.

    So If this procedure is correct (?) I ask myself how the system is able to know what is the true physical distance between the nozzle and the bed for Gcode Zero? because it is from this distance that the nozzle will elevate when create the first layer.

    Or maybe one can ask: what are the parameters that the system need to know in order to correctly obtain the desidered first layer height on all the plane, using an Heightmap? How to control, on all the plane, the physical distance between the nozzle and the bed, in order to use this distance (ex. 0.1 mm, 0.2 mm, etc.) as GCode Zero?

    Thank you!
    Mark.



  • @3dreamer said in Heightmap, BLTouch and First Layer height:

    I mean that if your gcode contain, for the first layer, the instruction "G1 Z0.2" then your nozzle will physically elevate at 0.2 mm not from the bed, but from the Gcode Zero position.
    So, if you have set your M208 softstop to bring the nozzle at 0.2 mm from the bed, then you will obtain a REAL first layer 0.3mm thick. This behavior happen when not using/considering an heigthmap.

    (I'm sorry, in this scenario you will obtain a real first layer 0.4 mm thick.)


  • administrators

    @3dreamer said in Heightmap, BLTouch and First Layer height:

    So, if you have set your M208 softstop to bring the nozzle at 0.2 mm from the bed, then you will obtain a REAL first layer 0.3mm thick. This behavior happen when not using/considering an heigthmap.

    No. If the GCode tells the firmware to put the nozzle at Z=0.2mm and the M208 X lower soft stop is 0.2mm, then it will go to Z=0.2mm. But if you change your mind and decide to print with 0.1mm first layer height, you had better reset the M208 soft stop to 0.1mm or below.

    The M208 soft stop is a limit, not a Z offset.



  • If I can afford ... for this purpose I created 2 macros that I think could serve your purpose.
    The first MACRO: G28
                                   M561
                                   M208 S1 Z-3

    The second MACRO: G92 Z0
                                       G4 P2000
                                       G1 Z5
                                       G4 P2000
                                       G30 S-1

    the first macro allows you to: bring the axes home "ATTENTION !!! I use the mini ir probe of DC42 on the center of the bed", to clear any previous survey and to get to the center ready for offset calibration extruder.
    At this point place an A4 sheet on the plate, lower the extruder until the tip touches the sheet and face it. Slightly effortlessly remove it, "I recommend you bring the extruder and the bed to print mode before the correct calibration" once you do that 'remove the sheet and launch the second macro that will allow you to bring the offest to zero, to position itself at + 5mm from the zero point and finally to read the difference.
    The final result that you will see in video or in panel of height Z will be the actual offset that you will have to put in the configuration file.
    Correct me if I'm wrong.



  • @3dreamer I think the main thing you are assuming is that in order for the mesh grid compensation to account for a dip in the bed that goes below the z=0 position you must set M208 Z to a negative value. This is not how it works however. The only time you would set M208 to a negative value is when first measuring the trigger height in case you can't lower the nozzle enough. But after that first measuring step you don't need to have M208 negative.

    Here's my procedure for setting trigger height and ensuring a good first layer.

    1. Mechanically level the bed by moving the nozzle to the 3 adjustment screws around the bed. one of them is the reference point and doesn't change. That;s my z=0. The other 2 screws are adjusted until the nozzle just touches the bed at z=0. I determine this visually. I can get close enough and even enough to see daylight between the nozzle and bed. Helps to have a bright light behind. No paper gap. With 0.02 movement steps it's easy to get it just touching.

    2. Trigger height is measured at bed center, same location as where Z homing is done. Again I touch the nozzle to the bed and reset G92 Z0. If I can't lower the nozzle enough to touch the bed I send G92 Z5 to trick the firmware into thinking it's higher than it is. No need to change M208, though that is an option. M564 S0 to allow axis limits to be ignored is another option. When the nozzle is touching the bed, send G92 Z0 and then G30 S-1 to get the trigger height. Repeat a few times and take the average result.

    3. Mesh grid compensation routine is run to map the bed. Height map is loaded automatically at startup in config.g

    4. I print a test file that covers the whole area of the bed with a 2 perimeter path. If my e steps and extrusion factor are calibrated and the z height is correct, the 2 walls should be touching and fused nicely and should be consistent across the whole surface. While it's printing if it looks too squished or too high across the whole surface I will use baby stepping to fine tune it until it looks just right. If some parts are high and some parts are low, I would go back and look at my heightmap. In my case it appears to be too squished everywhere across the bed and I raise the nozzle by 0.1mm baby steps. So I go back to the G31 and subtract 0.1 and print again. This time it prints perfect. Z height is calibrated.

    Extrusion factor must be calibrated, because it's easy to mistake over extrusion on the first layer for printing too close. You can verify this if the first layer looks perfect, but then the other layers look under extruded.

    By using a visual contact method for setting Z=0 you don't have to take any paper gap or other offset into account. But even if you do use paper to measure, you can fine tune the first layer height with baby stepping.



  • First off all, thank you dc42, Leblond and Phaedrux for your precious information

    Unfortunately the matter appear not really clear to me, I'll try to test your tips and let we see the results 🙂

    @dc42 said in Heightmap, BLTouch and First Layer height:

    If the GCode tells the firmware to put the nozzle at Z=0.2mm and the M208 X lower soft stop is 0.2mm, then it will go to Z=0.2mm. But if you change your mind and decide to print with 0.1mm first layer height, you had better reset the M208 soft stop to 0.1mm or below.

    The M208 soft stop is a limit, not a Z offset.

    My tests seems to say a different thing!
    I have set a Z value for M208 that, when I command the print to go to Z zero, the bed go up and stop when the bed-nozzle gap is about 0.2 mm.
    When I print with a gcode that contain the instruction G 0.2 (because, for ex. I have set the first layer in Simplify3D to be 0.2mm height), the nozze go physically to 0.4 mm from the bed! I have measured it with gauges.

    So... who's right? Are you right and my printer is an anomalous machine or are we right and we are missing some key point in this matter?

    Thank you so much!
    Mark.


  • administrators

    How are you homing Z? It sounds like you have a 0.2mm error in your Z homing position.



  • @dc42 said in Heightmap, BLTouch and First Layer height:

    How are you homing Z? It sounds like you have a 0.2mm error in your Z homing position.

    Homing is achieved moving the print head and the bed toward some limit switches. For the bed, this switch is positioned at the bottom of the area that accomodate the vertical movement of the bed.
    So when the bed trigger this switch, the interface indicate a big Z value , exactly the same set in M208 Z Value.

    So my M208 Z value indicate to the system how maximum the bed can go up toward the nozzle, starting from this switch. Thus, when the bed will arrive at it's maximum height, the system will consider this situation as my GCode Z zero. At this point the true physical distance between the bed and the nozzle will depend by the bed surface, the nozzle form factor, and obviously by the M208 Z Value that I have set.

    I can print objects up to 450 mm height, so If I set the M208 Z value at, for ex., 200, my GCode zero will correspond to a physical distance between the bed and the nozzle that is about 250mm!

    Thank you,
    Mark.


  • administrators

    It sounds to me that your M208 S0 Z value is 0.2mm too small.



  • @dc42 said in Heightmap, BLTouch and First Layer height:

    It sounds to me that your M208 S0 Z value is 0.2mm too small.

    Not necessarily, because is a personal choice and the important things is to know what's happening.

    As far as I know, considering the obvious deformation of the plane, virtually we would need a specific M208 Z value for each point of the bed itself, but...

    The key point of this thread is to understand how to free yourself from the M208 Z value (or some other global values) to achieve the desired first layer height, and use the “HeightMap.csv” informations to obtain a COSTANT, TRUE and SPECIFIED first layer height on all your plane (optimized steps and extrusion factor are a requirement, obviously.)

    Still searching for clear instructions or guides 😉

    P.S. I know that for the 99% (?) of the users the first layer is just the foundation of their printed model, but for me the first layer IS the model, thus the search for precise control on what's happening.


  • administrators

    @3dreamer said in Heightmap, BLTouch and First Layer height:

    Not necessarily, because is a personal choice

    Maybe you think you can define 0.0 == 0.02 as a personal choice, but that makes your printer incompatible with the GCode that your slicer generates. Z=0 must mean the nozzle touching the bed. You can make a personal choice that you won't actually allow Z=0 to be reached, because you will set Z=0.2 as the minimum allowed by the M208 S1 command.



  • @dc42 said in Heightmap, BLTouch and First Layer height:

    @3dreamer said in Heightmap, BLTouch and First Layer height:

    Not necessarily, because is a personal choice

    Maybe you think you can define 0.0 == 0.02 as a personal choice, but that makes your printer incompatible with the GCode that your slicer generates. Z=0 must mean the nozzle touching the bed. You can make a personal choice that you won't actually allow Z=0 to be reached, because you will set Z=0.2 as the minimum allowed by the M208 S1 command.

    What you write is correct.
    I can control the situation by this way: if I set Z=0.2 as the minimum allowed by the M208 command, and I set (in the slicer) the first layer to be 0.2mm, I'll put (still in the slicer) the Z value in the "Global GCode Offset" to be -0.2.
    So my gcode file will contain, as the first Z instructions, G1 Z0.00, and the nozzle will start extruding from a true physical distance that is 0.2 mm, matching my needs.


  • administrators

    @3dreamer said in Heightmap, BLTouch and First Layer height:

    @dc42 said in Heightmap, BLTouch and First Layer height:

    @3dreamer said in Heightmap, BLTouch and First Layer height:

    Not necessarily, because is a personal choice

    Maybe you think you can define 0.0 == 0.02 as a personal choice, but that makes your printer incompatible with the GCode that your slicer generates. Z=0 must mean the nozzle touching the bed. You can make a personal choice that you won't actually allow Z=0 to be reached, because you will set Z=0.2 as the minimum allowed by the M208 S1 command.

    What you write is correct.
    I can control the situation by this way: if I set Z=0.2 as the minimum allowed by the M208 command, and I set (in the slicer) the first layer to be 0.2mm, I'll put (still in the slicer) the Z value in the "Global GCode Offset" to be -0.2.
    So my gcode file will contain, as the first Z instructions, G1 Z0.00, and the nozzle will start extruding from a true physical distance that is 0.2 mm, matching my needs.

    I've much the same already, if you need to set a global offset of -0.2 then it is because your homing procedure does not establish the origin of the Z axis correctly. You can home to Z=0.2 if you like, but if you tell the firmware it is at Z=0 when it reality it is at Z=0.2 then of course you will need a global offset, to counteract your error.

    Why not use a set of feeler gauges to check the Z accuracy? Home Z, command the head to Z=0.3 or 0.5 or anything else as long as it is higher than your 0.2mm Zmin limit, and use the feeler gauges to check the accuracy of the gap between the nozzle and the bed.



  • Why not use a set of feeler gauges to check the Z accuracy? Home Z, command the head to Z=0.3 or 0.5 or anything else as long as it is higher than your 0.2mm Zmin limit, and use the feeler gauges to check the accuracy of the gap between the nozzle and the bed.

    Yes, I'm currently working with feeler gauges.


 

Looks like your connection to Duet3D was lost, please wait while we try to reconnect.