Musings and Experiments on the Art and Science of 3D Printing


Understanding Probing and Trigger Z Height

By SublimeLayers Monday, May 1, 2017


Before digging into probing it's useful to take a look at what happens at the beginning of a print. After the printer homes the firmware needs to know exactly where the bed surface is located, called Z=0 by convention, so it can position the nozzle for the first layer. This distance, called Z height, is configured in the firmware. The firmware uses the Z height and subtracts the layer height to position the nozzle above the bed, as shown below for a typical 0.20mm first layer.
Printing the First Layer

To recap, Z height is the total distance the nozzle must travel from the home position (top of printer) to where it is just touching the bed (Z=0) as shown in the diagram to below. Z height is an important parameter as it's what determines whether the first layer is too thin, too thick or just right. In a perfect world, you would set Z height once and be done. In the real world Z height is not static; thermal expansion and contraction can change the position of the bed slightly and the frame and delta mechanics can also change ever so slightly on a day-to-day basis.
Z Height

In the Early Delta Days (EDD) (pre-probing) you determined the Z height empirically and set it in the firmware. This was a chore and caused countless problems for newcomers. So the quest for auto-probing (or simply probing) ramped up to simplify setting the Z height as part of more comprehensive delta printer calibration.


The probe, or more precisely Z probe, is a device that accurately and precisely reports its Z position. In the hypothetical perfect world the probe would trigger just at the point where the nozzle tip touches the print surface and report the actual Z height. In practice, such a probe is not practical and there will likely be an offset from the nozzle tip to the bed surface. In RepRapFirmware and Smoothieware, this offset is called trigger Z height. The IR Probing diagram below shows this offset as 5mm.

Raise your hand if you knew that you have to calibrate your Z probe for delta auto-calibration to work properly. You do and I'll explain why and how in this post. As we learned above, real world probes do not trigger precisely at Z=0. This implies that some probes trigger with the nozzle above the bed surface and others trigger with it below the bed surface – and this is indeed the case. Probes that trigger with the nozzle above the bed surface include inductive probes, IR probes and the early simple effector-mounted mechanical switches. Probes that trigger with the nozzle below the surface typically function by pressing the nozzle into the bed and some small movement is necessary to trigger the probe. FSR (force sensitive resistor) probing is a typical example. 

I'll look at each of these two cases in detail below using the IR probe as the example for probes that trigger with the nozzle above the bed and FSR probing for probes that trigger with the nozzle below the bed surface. Let's start with the simplest case to understand, the IR probe.

IR Probing Example

IR Probing
Conceptually, an IR probe works by shining a beam of IR light from an LED at the bed surface. If the bed is IR reflective, some of that light bounces back and is detected by an IR sensor. The time it takes for the beam to make this round trip can be used to calculate the height the sensor is above the print bed. As you see in the diagram, the IR probe is mounted with its lens a few millimeters above the tip of the nozzle and it is designed to trigger before the nozzle hits the bed. The height the nozzle is above the bed when the probe triggers is called the trigger Z height. Let's assume that the tigger Z height is 5mm as shown in the diagram.

If you simply ran delta auto-calibration (G32) after installing the IR probe, without telling the firmware how to adjust for this gap (trigger Z height), the firmware would think that Z=0 is 5mm above the bed and would start your print in the air. It's hard to get a first layer to stick 5mm above the bed (actually, 5mm plus the thickness of your first layer, so 5.20mm above the bed).

Now you can see that some adjustment, or calibration, is needed to let the firmware know where Z=0 actually is. In RepRapFirmware and Smoothieware, G31 is used to set the trigger Z height – the height of the nozzle when the probe triggers. In this case that is 5mm. Think about what this means in relation to the Z height described earlier. When the printer probes, it triggers with the nozzle 5mm above the bed. The distance the probe (and nozzle) traveled is called the probed Z height. Knowing this, you could set the correct Z height using the M665 H parameter simply by adding "5" to the H value. This works as expected but the next time you probe you have to remember to reset M665 H again. This is tedious and error prone.

This is where trigger Z height comes in; the firmware sets the trigger Z height with the G31 Z parameter.  The G31 Z value is added to the probed Z height to calculate the actual Z height. Makes sense, right?
Z Height Calculation for Trigger ABOVE Bed

FSR Probing Example

Now that you understand the simple case where the probe triggers above the bed surface, let's take a look at FSR probing where the trigger point is below the bed surface.

A typical FSR probing system consists of three FSRs positioned evenly (120°) around the perimeter to support the print bed. These FSRs are connected to an interface board that converts the resistance signals into a simply binary on/off signal so the system behaves like a simple endstop switch to the controller (Duet). This board is the infamous JohnSL controller and is really the magic that makes FSRs practical to use.

Watch this short video showing how the nozzle pushes the bed slightly to trigger the FSRs.

We saw earlier that the IR probe triggers with the nozzle above the bed surface, here the FSR probe triggers with the nozzle just slightly below the bed surface – exactly the opposite. Here's a still view of the situation, lets assume the trigger point is 0.5 mm below the bed – greatly exaggerated for illustration.
FSR Probing
Now we should be able to apply what we learned about setting the trigger Z height for the IR probe in the example above. In this case the probed Z height is longer than the actual Z height so we need to subtract the trigger Z height from probed Z height to calculate the correct Z height.
Z Height Calculation for Trigger BELOW Bed
Again, it makes sense.

Ok, that's all great, how do I determine the Trigger Z Height?

Now that you know you have a problem (you need to calibrate your Z probe trigger Z height) you can learn how to fix the problem. The Duet Wiki has a nice procedure for doing this but I'm going to recommend a slight modification to the process and I'll explain why.

Setting trigger Z height

  1. Position the nozzle until it is at Z=0 – this is where I deviate from "standard practice" of using the paper snag test. Typical notebook or printer paper (20#) is about 0.1mm thick (see photo below), about half of a typical 0.20mm first layer height. An old machinist's trick is to use cigarette rolling paper; it is remarkably thin (~0.02mm) and tears easily when snagged. I recommend buying a pack or two and using it for all your Z=0 testing.
  2. Set this height to Z=0 with G92 Z0.
  3. Move the nozzle up a centimeter or so, just to get it out of the way and clear of the bed.
  4. Now run a single probe that doesn't update the printer's coordinates with G30 S-1.
  5. Finally, get the Z height using M114. This is the value to put in the G31 Z parameter in config.g. This will be positive for probes that trigger above the bed surface like the IR probe and negative for probes that trigger below the bed surface like FSR probes. 
Here's a photo showing the thickness of common 20# printer paper, 0.10mm.
20# Printer Paper is 0.10mm thick

Tweak, tweak

Once you've determined and set the trigger Z height you should make a test print to ensure your first layer height is what you expect. I like to use my SingleLayerTest model to do this, it is simply a 75mm diameter disk that is one layer height tall (0.20mm is typical). Run the delta auto-calibration and print the SingleLayerTest. Once the part has cooled, peal it off the bed and carefully measure its thickness with a micrometer or caliper. It should be very close to your layer height – 0.20mm in this example. If it is not, you need to tweak the G31 Z parameter to compensate. Here's where it gets fun and where a lot of users get confused and frustrated – especially those who are using FSR probes!

Probes that trigger above the bed (IR probe)

This one is easy. Remember the Z Height Calculation for Trigger ABOVE Bed drawing above? The Z height – which is the value the firmware cares about – is calculated by adding the probe Z height to the trigger Z height. If your SingleLayerTest is too thick, you need to increase trigger Z height to move the nozzle closer to the bed. Conversely, if the SingleLayerTest was too thin, decrease trigger Z height. The way to think about this is from the perspective of the desired Z height. The probe Z height is fixed as long as you don't physically alter the probe or its mount. So if a first layer is too thick, your goal is to increase the Z height, thereby moving the nozzle closer to the bed. You do this by increasing the trigger Z height (since probe Z height does not change).

Probes that trigger below the bed (FSR probe)

Look at the Z Height Calculation for Trigger BELOW Bed drawing above. In this case, if the SingleLayerTest is too thick the probe Z height must change in the positive direction (a smaller negative number). If the SingleLayerTest was too thin, probe Z height must change in the negative direction (a more negative number). This might seem a little counterintuitive until you consider that the direction and magnitude of the change is relative to the probe Z height. Let's take a concrete example so it sticks in your mind:

Assume you have 0.20mm layer height and FSR probe with G31 Z-0.15 to let the firmware know the probe triggers slightly below the bed surface.

Now you print the SingleLayerTest and measure it at 0.16mm thick. This is 0.04mm thinner than you expected. What this says is that the Z probe height is longer than the desired Z height so you need to make it shorter. You've already told the firmware to move -.15mm with the G31 Z-0.15 but that wasn't enough, so to move back more, subtract 0.04mm from the Z height offset (-.15m) to get -0.19mm. Set G31 Z-0.19 in config.g and auto-calibration should result in a perfect Z height and perfect first layer thickness the next time you print.

Or the easy way with RRF 1.18 Baby Stepping

RepRapFirmware v1.18 introduced a new feature – M290 baby stepping – and Duet Web Control v1.15a supports it with new buttons on the Print Status page.
Baby Stepping Buttons
With baby stepping, you can actually move the nozzle up or down to change the first layer height while the printer is printing the first layer. So for the example above, if the first layer was printing too thin you could click the Up button to make the layer thicker by the set increment – in my case it is 0.02mm per click. Make note of the Current Offset value shown above the buttons. Once the print has completed, subtract the Current Offset value from the Z height offset and update the G31 Z. For the example I would have clicked the Up button twice to increase the 0.16mm first layer to get the 0.20mm layer height I expected. The G31 Z value was -0.15 so I subtract 0.04mm from it:

-.015 - .04 = -0.019mm

Set G31 Z-0.019 and you have corrected your Z height offset.


I realize this is probably more detail than most would like but I wanted to capture this so I don't have to repeat myself. I receive a lot of questions about probing and bad first layer heights. Many times, the simple explanation and answer is that delta auto-calibration does require calibrating the probe itself – Z height offset!

E3D Online V6 hot end drawing used with permission.

10 comments to ''Understanding Probing and Trigger Z Height"

  1. Any particular rolling paper you can recommend for this task?

  2. Zig Zag - widely available and work great.

  3. Thanks, that worked great my first layer was supposed to be 0.40mm (0.8mm nozzle) and it came out between 0.42 and 0.43mm. Unfortunately my second print of a calibration cube stuck so hard to the Buildtak that it tore up the Buildtak when I tried to remove it. Unfortunately I can't find PEI large enough for this 340mm round monster and my custom Printbite has been on order for a month now.

  4. Michael...Jim here with a few newbie questions but not before I searched a ton on Google forums and Seemecnc forums. I am at the point where I am connecting the electronics and I also purchase the Nimble for this delta I am designing......Does it matter which axis I use for X.Y or Z? Do I just designate as I feel? Also I read on the Duet forum that it is of the utmost importance for a level effector plane that the distance between the 2 rods on each axis HAS to be parallel. Meaning the distance between the barbells on the Metal Max effector has to match the distance between them on the slides of my sg10 demon rails.....Is this true? Just be eyesight, the effector does not seem to be level at the edges of print glass base, it seems to slant slightly towards the prospective tower. What are your thoughts if you have time. Thanks buddy

    1. Ok, I think I found my answers and your input would be greatly wanted and appreciated. X axis forward left, Y axis forward right and Z in back. Also I read it is vitally important that the distance between the parallel rods be the same so as not to cause effector tilt which is what I am witnessing on mine.

  5. Hey Jim, I was busy at an off-site work event all day today. Firstly, the tower designation convention is as you state: X to the front left, Y to front right and Z in the center back.

    And yes, absolutely essential that the arms be parallel. It is best to use the barbells on both the effector and carriages - that essentially guarantees parallelism.

  6. Thank you.....I need to make some adjustments :)

  7. I know you run G32 at the start of every print. Where do you have it set up to run in relation to the preheating of the bed and/or hot end? I would figure you would want both at printing temps, but then how do you deal with any filament ooze once the hot end hits temp?

  8. When the bed probes the center of the bed it triggers but on the outside close to the edges the hotend reaches zero a few mm above the bed. I've tried adding a h parameter but it seems to not have any effect.

  9. I'd suggest adding some more information about different Z height triggers on different areas of the plate. This can be an issue with almost any type of sensor, but especially with under bed sensors. The trigger height at 0,0 often will be slightly different than the trigger height at an edge of a bed.

    Of course, finding the correct trigger heights across 13 trigger points in bed.g can be... tedious.