When calibrating my printer and configuring my slicer there are many different values that can affect the final distance between the print bed and the nozzle for the first layer. I'm trying to figure out where I should be making different adjustments. I'm having some first-layer issues, and I'm trying to get my layer height configured correctly to make changing materials and print settings easier.
Intuitively it seems like I should be configuring the printer so that when Z = 0 the nozzle is just touching the bed and leaving the height of the first layer entirely up to the slicer. That way the slicer can accurately calculate the first layer height. But a lot of the instructions online imply that Z = 0 is calibrated slightly above the bed (the thickness of the paper). If I were setting zero on a milling machine I'd subtract the thickness of the feeler gauge to get a 'true zero' to the table.
Some of the Marlin calibration features also seem to assume that Z is configured somewhat high. For instance when leveling the bed manually or when editing a UBL mesh it homes the printer and then moves to each point to verify the bed height, but it doesn't seem to account for the thickness of the feeler gauge. This makes me think that the feeler gauge height is expected to be built into the probe Z-offset. I'm using a 0.2 mm metal gauge as it's more repeatable than paper. If I have my Z-offset set to 'true zero' I can work around this by homing the bed to my feeler gauge and then calibrating.
As far as I can tell the following values can affect the final Z height of the first layer:
- The Marlin probe Z-offset value. If this value is accurate then Z = 0 should have the nozzle just touch the bed. If this value is set to the probe/nozzle offset plus the feeler gauge height then when the slicer asks for 0.3 mm it will get 0.3 mm + gauge height.
- If not using an ABL printer:
- The gantry level
- The Z limit switch position
- The bed level screws
- The UBL mesh values. Not only does the mesh conform to the shape of the bed, but I think that it also acts globally on the Z-offset. If I were to bias all of the values in the mesh by the same amount it should effectively have the same effect as adjusting the Z-offset. I think that this could happen when manually tuning a mesh if the Z-offset is incorrect. Tuning the mesh this way would 'hide' the incorrect Z-offset, but require that the error be replicated when the Z-offset needs to be reset (for instance after a nozzle change). This seems to imply that the UBL mesh value at the initial probe point (used when homing) should always be 0 to prevent confounding it with the Z-offset value.
- The Marlin probe XY offset values seem like they could also have an effect on nozzle/bed distance since they will affect where the UBL mesh is sampled for a given nozzle position. I don't know if these values are used when generating the mesh or when reading it. I've measured these values using a dot on a piece of paper, but I'm worried I might have the sign wrong.
- The slicer's initial layer height. Since the slicer 'knows' about this height it uses it to calculate the amount of filament to extrude to create a perfect line of the specified width and height. This setting will vary for different prints and materials.
- The slicer initial layer offset value (Z Offset in Cura). This is where it seems to make the most sense to introduce any initial layer 'squish' since it is configurable per print (as opposed to the Marlin Z Offset which stays with the printer). I could also add the squish by adjusting the initial layer flow multiplier to extrude a bit more filament than calculated by the slicer.
For reference, I have a Sovol SV01, with a BLTouch and Marlin 22.214.171.124. My pre-calibration process is as follows:
- Power up the motors and measure the height of each side of the gantry from the printer frame.
- Turn one of the Z-axis lead screws until both sides sides of the gantry are the same height.
- Home the printer.
- Run the Marlin "level corners" wizard. I use a 0.2 mm steel feeler gauge, and go through the corners until they all have the same amount of friction (the centre of the bed is a bit loose now, so the center is slightly concave).
- Home the printer.
- Measure the distance to the bed using the feeler gauge.
- Adjust the 'Z-offset' value to get a distance of 0.2 mm. This will mean that the surface of the bed is at Z = 0.
- Go back to 5 until no adjustments are needed.
- Heat up the bed and the hotend (not necessary yet, but can't hurt).
- Use the Marlin assistant to generate a 'Cold Mesh' UBL mesh.
- Save the mesh.