Connecting a Z probe
This describes how to connect a variety of Z probes to the Duet hardware.
The Duet 2(WiFi and Ethernet) and Duet 0.8.5 provide a dedicated 4-pin connector for connecting a Z probe. The Duet 0.6 does not have the Z-probe connector, but you can use some pins on the expansion connector for the same purpose.
For a comparison of advantages and disadvantages for various Z probe options see Choosing a Z probe.
If you don't have a Z probe, you can still use delta auto calibration, mesh bed compensation and other features normally associated with a Z probe. See Mode 0 below.
Z Probe Header/ Expansion header pins
These are the pins provided on the 4- or 5-pin connector, and the corresponding pins on the Duet 0.6 expansion connector. On Duet 3 there is no dedicated Z Probe connector, because you can use any of IO_3 through IO_8. Caution! The pinout of the 5-pin IO_ connectors on Duet 3 is not the same as the pinout of the 5-pin Z Probe connector on Duet Maestro!
|Duet WiFi/Ethernet pin marking||Duet Maestro pin marking||Duet 3 pin marking||Duet 0.8.5 pin marking||Duet 0.6 expansion connector pin||Purpose|
|IN||IN||IN||AD12||39 (AD12)||Input from Z probe|
|GND||GND||GND||GND||2 (or use the GND pin on E0 endstop connector)||Ground|
|MOD||MOD||OUT||PC10||41 (AD14)||Control signal for some types of Z probe|
|3.3V||3.3V||3.3V||3.3V||3 (or use the 3V3 pin on E0 endstop connector)||Power to Z probe|
|-||5V||5V||-||-||5V power to Z probes that need it (e.g. BLTouch)|
You can use a Z probe with either an analog or a digital output. The advantage of an analog output is that the firmware will slow down the probe speed when it is getting close to trigger height. Some types of Z probe with digital output should be connected to the E0 endstop connector instead of the Z probe connector.
To configure the firmware to recognise the output mode of the Z probe you are using and which pin it is connected to, use the P parameter of the M558 command in config.g. For example, M558 P1 selects Z probe mode 1.
Z probe modes selectable in firmware
Using the M558 Gcode the type of Z probe can be selected. Overview:
|Mode||Probe type||Control signal (MOD or OUT pin)|
|0||No probe||Not used|
|2||Analogue probe with modulation||Modulation (IR LED on/off control)|
|4||Digital probe connected to E0 endstop input, or endstop input set by C parameter||Not used|
|5||Digital probe connected to Z Probe input||HIGH during probing, LOW at other times|
|6||Digital probe connected to E1 endstop input||Not used|
|7||Switch triggering Z endstop||Not used|
|8||Digital probe connected to Z Probe input, unfiltered||HIGH during probing, LOW at other times|
|9||BLTouch with output connected to Z Probe input||Not used, but on Duet Maestro and Duet 3 can be configured to control deployment/retraction|
|10||Z motor stall detection||Not used|
Select this mode if you have no Z probe. When the firmware tries to execute a command to probe the bed, it will instead show a dialogue in Duet Web Control, and also on Panel Due if you are running recent Panel Due firmware, asking you to jog the head down until the nozzle just touches the bed and then press the OK button.
This is a probe with an analog output connected to the Z probe connector. The probe output must rise as it gets closer to the bed, unless you use parameter I1 in the M558 command to indicate that the probe output falls as it gets closer to the bed (the I1 parameter is supported in firmware 1.16 and later). The control signal is driven HIGH.
This is a probe with an analog output that requires the Duet to provide modulation signal and demodulate the returned signal. The probe output rises as it gets closer to the bed. The Duet drives the control signal with a 500Hz square wave. The firmware extracts that part of the analog signal received on the IN pin that is in phase with the modulation.
As mode 1 except that the control signal is driven LOW.
The trigger signal is read from the E0 endstop circuit. You can choose whether the signal is high or low when triggered. In firmware 1.15 and earlier this is done by using M574 E0 S1 to select active high, or M574 E0 S0 to select active low. In firmware 1.16 and later, use I1 in the M558 command to select active low, otherwise it defaults to active high. The device connected to the E0 STP pin must be able to sink 1.5mA for the Duet 2 WiFi and Duet 2 Ethernet, 0.3mA for the Duet 2 Maestro, or 2.1mA for the Duet 0.6 or 0.8.5. In firmware 2.03 and later you can choose a different endstop input using the C parameter of the M558 command.
A switch or digital output device connected between the IN and GND terminals of the Z probe connector. Similar to mode 4 except that the Z probe connector is used. The input must be active high when triggered, or in firmware 1.16 and later you can use the I1 parameter in the M558 command to select active low. The only pullup resistor is the 100K nominal pullup in the microcontroller so the sink current requirement is tiny.
Similar to mode 4 except that the E1 endstop input is used. Deprecated in firmware 2.03 and later, use mode 4 with parameter C4 instead.
Similar to mode 4 except that the Z endstop input is used. Deprecated in firmware 2.03 and later, use mode 4 with parameter C2 instead.
Similar to mode 5 except that the input is not filtered, for slightly faster response. Supported in firmware 1.20 and later.
Special mode for BLTouch probe. Supported in firmware 1.21 and later.
Use the Z motor stall detection as the Z probe trigger. Supported in firmware 1.21 and later. There are limitations to stall detection and it is not always appropriate for accurate Z probing however there is a detailed discussion on the forum and some users have had success.
Connecting different types of Z probe
Mini differential IR sensor by dc42
Connect the VCC, GND and OUT pins of the sensor to 3.3V, GND and IN respectively on the Z probe connector, and select mode 1 in the M558 command. See also DC42's web page on the IR sensor for more on setting up this probe.
RepRapPro 3-wire IR sensor (as shipped with Ormerod 1)
Connect as shown in the RepRapPro Ormerod 1 wiring instructions, using the table above to translate between expansion connector pins and Z probe connector pins if necessary, and select mode 1.
RepRapPro 4-wire IR sensor (as shipped with Ormerod 2, Huxley Duo and Mendel)
Connect as shown in the RepRapPro Ormerod 2/Huxley Duo/Mendel wiring instructions, using the table above to translate between expansion connector pins and Z probe connector pins if necessary, and select mode 2.
Force sensitive resistor(s)
If not using JohnSL's trinket board: Connect the FSR(s) in parallel, between +3.3V and the IN pin of the Z-probe connector, and connect a potentiometer or fixed resistor between the IN pin and the GND pin. Select mode 1. Choose the value of the fixed resistor to give reliable triggering. With firmware 1.16 and later it is possible to connect the FSRs between IN and ground instead, and the fixed resistor between IN and +3.3V, if you use the I1 parameter in the M558 command.
If using JohnSL's trinket board: Connect its Vcc, Output and Ground pins to 3.3V, IN and GND on the Z-probe connector respectively and select mode 5.
Connect it between the STP and GND pins of the E0 connector and select mode 4. If it is a normally-closed microswitch, then with version 1.15 or earlier firmware use M574 E0 S1 to select active high trigger level. For normally-open contacts (not recommended), send M574 E0 S0 instead. With 1.16 or later firmware, include parameter I1 in the M558 command if you are using a normally-open switch.
NPN output normally-open inductive or capacitive sensor
Duet 2 Maestro, or revision 1.04 or later of Duet 2 WiFi or Duet 2 Ethernet: you can connect the output of the sensor directly to the Z-probe IN pin.
Other Duets: Connect the output wire of the sensor to the cathode of a diode, and the anode of the diode to the Z probe IN pin. The diode should preferably be a small-signal Schottky diode such as BAT43 or BAT85, but a small signal silicon diode such as 1N4148 works for some people.
All Duets: Connect the sensor ground wire to a ground pin on the Duet, and the sensor's + power wire to a suitable voltage (typically to VIN because these sensors usually need between 6 and 30V power).
Select mode 5 (P5) in the M558 command, also include parameter I1 in the M558 command.
PNP output normally-open inductive or capacitive sensor
Connect the sensor output wire to one end of a resistor (call this R1), and connect one end of another resistor (call this R2) to GND on the Z-probe connector. Connect the free ends of R1 and R2 together and to the IN pin of the Z-probe connector. The values of R1 and R2 should be chosen so that about +3V appears at their junction when triggered. If R2 is 10K, then suitable values of R1 are 30K if the sensor is powered from +12V, and 68K if it is powered from +24V. If you are using the Duet Maestro or the Duet Ethernet/WiFi revision 1.04 or later, the resistor values are less critical and you can use 10K for both.
Connect the sensor ground wire to Duet ground, and the sensor's + power wire to a suitable voltage (typically to VIN because these sensors usually need between 6 and 30V). An always-on fan connector can be used for this, but make sure you get the polarity right.
Select mode 5 in the M558 command.
[Note: on the Duet 2 Maestro and on revision 1.04 or later of Duet 2 WiFi or Duet 2 Ethernet, you can instead connect the output of the sensor directly to the IN pin of the Z probe connector because the IN pin is 30V-tolerant. You must still connect a pulldown resistor between IN and GND of the Z probe connector. 10Kohms is a suitable value. Caution! Make quite sure that you connect the sensor output to the IN pin on the Z probe connector. There are 2 versions of the Duet WiFi wiring diagram, and one has the connector reversed with respect to the other. Make sure that the diagram you are using is for the 1.04 revision of the Duet. Connecting the sensor output to the +3.3V pin by mistake will destroy the Duet! Due to the risk of mis-connection, we recommend the wiring method described earlier instead, using two 10K resistors.]
BeTrue3d.dk has a very detailed tutorial on using a BL touch, including how to setup bed leveling and bed compensation here:
Please note that this tutorial is a little out of date. So please do read the following documentation as well. The main difference is that it uses probe type P5, however, there now exists probe type P9 which is dedicated to the BLTouch specifically. So instead of M558 P5, use M558 P9.
Duet 2 WiFi/Ethernet without a Duex 2 or Duex 5 expansion board
Connect the BLTouch as follows:
|+5V (pin 1)||+5V||Red|
|Heater3 (pin 8)||Control||Orange or Yellow|
|GND (pin 2)||GND||Brown or Blue|
Duet 2 WiFi/Ethernet with Duex 2 or Duex 5 expansion board
First, you need to allocate an unused heater expansion channel to reconfigure as the servo control for the BLTouch. For example, if the E2Heat output is unused, you can use heater 3 which corresponds to the PWM1 connector.
If you have a Duex v0.9 or v0.9a board, check that you have a jumper on the "5V AUX JUMPER SELECT PINS" between the 5V AUX and 5V INT pins. See this thread on the forum for details.
Connect the BLTouch as follows:
|Duet ZProbe connector pin||DueXn PWM connector pin||BLTouch pin||Colour|
|PWM||Control||Orange or yellow|
|GND||GND||Brown or blue|
For all Duet 2 WiFi/Ethernet boards prior to version 1.04
If you have the older BLTouch, also connect the 240 ohm resistor between Probe GND and Probe IN. On the newer BLTouch, cut the PCB trace on the BLTouch to reduce the output to 3.3V as described in the BLTouch instructions.
The Z probe input on the Duet 2 Maestro and Duet 2 WiFi/Ethernet rev 1.04 and later is 30V tolerant, so it doesn't matter whether you reduce the output of the BLTouch to 3.3V or leave it at 5V.
Duet 2 Maestro
Connect the BLTouch to the Z probe connector as follows:
|GND||GND||Black + (Brown or Blue)|
|MOD||Control||Orange or Yellow|
Connect the BLTouch to IO_7 as follows:
|GND||GND||Black + (Brown or Blue)|
|OUT||Control||Orange or Yellow|
It's also possible to use IO_4 or IO_5 instead of IO_7.
Software setup (Duet 2 WiFi/Ethernet running RepRapFirmware 2)
Important: In the M280 commands in the following, leave out the I1 parameter if the BLTouch is connected to a servo output on a DueX board.
1. In your software config.g file input the following G-Code commands to allow the setup to work:
M307 H3 A-1 C-1 D-1
M558 P9 H5 F100 T2000
G31 X0 Y0 Z0 P25
- Important: mode 9 is supported in firmware 1.21 and later only. If you are using earlier firmware, replace P9 in the M558 command by P5.
- In the G31 command the X and Y are the offset of the sensor in relation to the nozzle (so input your own) the number for Z is the trigger height (read on for this). This is the height that is obtained from reading the height the nozzle is from the bed when the sensor pin contacts the bed and retracts, P is the signal threshold.
- Ensure in your config-override.g file (in the /sys folder of the SD card) does not contain an M307 H3 command that overrides the above configuration.
- In the M280 commands (see below), you must invert the servo signal using “I1” in the M280 commands if you connect the BLTouch servo input to the expansion header pins, but not if you connect the BLTouch servo input to a Duex.
2. Create a deployprobe.g file (in the /sys folder of the SD card) it should contain the following single command:
M280 P3 S10 I1
See the important note earlier about including the I1 parameter or not.
3. Create a retractprobe.g file (in the /sys folder of the SD card) it should contain the following single command:
M280 P3 S90 I1
Software setup (Duet 2 Maestro running RepRapFirmware 2)
As for the Duet 2 WiFi/Ethernet with the following changes:
- The M307 line is not required
- In all M280 commands, use P64 instead of P3, and leave out the I1. This applies to the following section too.
Software setup (RepRapFirmware 3)
1. Identify the name of the pin that you connected the control input of the BLTouch to. On a Duet WiFi/REthernet without an attached DueX expansion board, it will be one of exp.heater3 thru exp.heater7. If you have a DueX attached, one of duex.pwm1 thru duex.pwm5. On a Duet Maestro it is zprobe.mod. On Duet 3 it is one of io4.out, io5.out or io7.out. If you use one of these pin names, you will not need to invert the output.
2. The Z probe input pin will be zprobe.in on a Duet 2, or one of io4.in, io5.in or io7.in on a Duet 3. If using zprobe.in, you need to enable the pullup resistor using the ^ character in front of the pin name.
3. In your M558 command, specify probe type 9 and the input pin, for example:
M558 P9 C"^zprobe.in" H5 F100 T2000
If using pin zprobe.in then must include the ^ character in front of the pin name to enable the pullup resistor.
4. Create a GPIO/Servo pin index using your chosen control pin:
M950 S0 C"exp.heater3"
In this example we chose GPIO/Servo in index 0.
5. Set up the probe offsets, trigger height and trigger value in G31:
G31 X20 Y0 Z3.3 P25
In this example the trigger height is 3.3mm (you will need to measure it) and the probe is offset from the head reference point by 10mm in the +X direction.
6. Create the deployprobe,g and retractprobe.g macros as described for using RepRapFirmware 2. The P value in the M280 commands should be your chosen GPIO/Servo index. You do not need the I1 parameter.
Commissioning & Testing
To test the setup with the nozzle maybe a 100mm up from the bed you can check if the trigger signal is reaching the Duet by attempting to extend the pin by using the following command:
M280 P3 S10 I1
Then put the Sensor in to test mode by inputting the following command:
M280 P3 S120 I1
If all is well the web interface should report a value of ”0” in the Z probe column when the pin is extended. You can then lightly touch the extended probe pin to check that the pin retracts, the value in the Z probe Column should change to “1000”
The BL Touch will continue to cycle deploy in the test mode, to end the test mode enter:
M280 P3 S160 I1
If all is good It is at this point that you can deploy the probe using the M280 P3 S10 I1 command and slowly lower the nozzle to the bed and find out your own Z trigger height, when the probe touches the bed and the pin retracts you can take a reading of the Z height and use that to input into the G31 command in the config.g file.
See also: BLTouch Troubleshooting
The Touch-Mi is based on an IR end stop with a metal pin for probing in the z direction. While the probe is documented to run at 5v, it can also be run at 3.3v (this has been confirmed with hotends.fr, the manufacturer of the Touch MI). As such, the Touch MI can be connected to the z probe headers of the duet board as shown below.
Alternately, you can connect the Touch-Mi to a 5V pin (from the PanelDue header or from the expansion header) for VCC and to the E0 endstop for GND and IN (use the outer pins of the E0 endstop header).
The Touch-Mi probe is active low. If connected to the z probe port, the M558 configuration should be like this:
M558 P8 F500 H10 I0 T4000
`H` should be at least 3mm, but during the first runs with a new probe (or after changing out your bed), it is advisable to increase H to a safe diving height. The example sets diving height at a comfortable triple minimum distance, and you can reduce H if you are sure the probing pin won't catch after deploying and/or drag across the bed surface during moves.
Also, set trigger value, nozzle offset, trigger offset using G31:
G31 P500 Xnnn Ynnn Znnn
See the calibration section for a method to determine z offset.
The Touch-Mi is deployment is triggered via a magnet. As this magnet is usually installed so it triggers deployment by hitting X0 or X(max), the probing should be at a distance to X0/X(max). As such, it is recommended your mesh definition happens a bit inside the outer edges of your bed parameters. For a 220x220 size bed,
M557 could look like this for a 6x6 grid:
M557 X10:210 Y10:210 S40
M557, M558 and G31 P... as described here should be added to config.g.
; deployprobe.g ; this is a manual probe deployment by touching the Touch-Mi Probe ; with the magnet included. G91 ; relative positioning G1 Z7 F600 S2 ; lift Z relative to current position G90 ; absolute positioning ; G1 X0 F1800 ; move X to zero M291 P"Trigger Magnet" S3 ; prompt for magnet action
; retractprobe.g G0 Z0.5 ; dive to retract probe with magnetic ball bearing
; homez.g ; called to home the Z axis G91 ; relative positioning G90 ; absoute position M401 ; deploy probe G1 X163 Y129 F1800 ; move to middle of bed plus probe offsets G30 ; home z0 M402 ; retract probe
; homeall.g ; called to home all axes G91 ; relative positioning G1 S1 X-225 Y-225 F1800 ; move quickly to X and Y axis endstops and stop there (first pass) G1 X5 Y5 F6000 ; go back a few mm G1 S1 X-225 Y-225 F360 ; move slowly to X and Y axis endstops once more (second pass) G90 ; absoute position M401 ; deploy probe G1 X163 Y129 F1800 ; move to middle of bed plus probe offsets G30 ; home z0 M402 ; retract probe
Calibrating the Touch-Mi
1. Calibrate nozzle to zero manually (paper test).
2. Set Z to zero (G92 Z0)
3. Lift nozzle by 5 to 10 mm (G0 Z10)
4. Determine probe trigger height (G30 S-1) and note the result shown on the G-Code console.
5. Repeat steps 3 and 4 a couple times to ensure the result of G30 S-1 has accetable repeatability (variance smaller or equal to 0.03mm). Note the average of these repeated measurements.
6. Set the trigger height in G31 in your config.g