This page is about using the Bondtech INDX tool board with Duet 3 or other electronics running RepRapFirmware.
The INDX documentation from bondtech is here: https://github.com/BondtechAB/INDX
It should be read in conjunction with this page.
| Stepper driver | Maximum 1.0A peak current, 0.71A RMS |
| FAN output on MCU board maximum current | TBD |
| Input power voltage | 24V +/- 2V |
| Power input max current | 4A |
| Inputs | IO_0 is 30V-tolerant |
| Fuses | None onboard. Use INDX Link board (4A fuse fitted), Duet 3 Tool Distribution Board (4A fuse fitted), or if directly connected to a power supply use an inline fuse holder with 4A or lower fuse depending on required current draw. |
| 5V (LED port) maximum load current | TBD |
| 3.3V (ENDSTOP/IO0_IN port) maximum load current | TBD |
| Maximum ambient temperature | 80°C |
The INDX tool board comprises two PCBs connected by two 20-way FFCs (Flexible Flat Cables). These will normally be supplied ready-mounted on a tool head.
The VF board is connected to the induction heater, IR temperature sensor, heatsink fan, and load cell. Do not make any other connectons to the VF board, or remove the existing connections. The heatsink fan is connected to the VF board and defaults to running continuously; therefore it will run whenever no firmware is installed on the board, or firmware is being updated, or no configuration commands have been received from the main board.
The MCU board is connected to the rest of a Duet/RepRapFirmware system using a single XT30 2+2 connector. This provides power to the board (thick red and black wires, positive and ground respectively) and CAN FD (yellow and white wires, CANH and CANL respectively).
The board requires 24V nominal power, fused externally at 3A or 4A. We recommend that you use a Duet 3 Tool Distribution Board or INDX Link Board because they include the necessary fuse and simplify wiring. If the INDX is the only CAN-connected expansion in your system then you can instead use a direct CAN connection to the main board and an inline auto fuse in the positive supply wire.
The MCU board also provides the following connections:
this is linked from the Bondtech documentation for convenience,
If you need to disconnect and reconnect the FFCs linking the two boards, be aware of the following:
RRF supports the CAN connection, so set the CAN <-> USB switch on the MCU board to the CAN position.
The following jumper blocks are provided:
The Bondtech INDX tool head is normally supplied with an associated Link board. This board provides the following:
You will not have VIN reverse polarity protection.
Aside from the status LEDs mounted on the VF board, LEDs are provided on the MCU board to indicate the following:
| Label | Colour | Function |
|---|---|---|
| VIN | Blue | Indicates presence of VIN power |
| 3.3V | Green | Indicates presence of 3.3V power from on-board regulator |
| ACT / LED 1 | Green | Indicates activity (other than regular time sync messages) on the CAN-FD bus |
| STATUS / LED 0 | Red | Status LED. See description below |
Status LED: In normal use, the red LED flashes slowly (approx 1Hz) in sync with the main board to indicate that it has CAN time sync, or flashes continuously and rapidly to indicate that it doesn't. It also flashes startup error codes, for example if the bootloader doesn't find valid firmware on the board. For a list of these error codes see CAN_connection basics.
The RepRapFirmware binary file for this board is called Duet3Firmware_TOOLINDX.bin.
The bootloader file for this board is called Duet3Bootloader-SAME5x_CAN_USB.bin.
The minimum RepRapFirmware version for this board is 3.7.0-beta.1. This applies to the firmware running on the main board too. If older main board firmware is used then some of the functionality may be missing, in particular the heater and the load cell are unlikely to work.
The default CAN address (which is also the CAN address after the reset jumper is used) is 121.
The inductive heater is fast and powerful, therefore the standard RepRapFirmware default tool heater model is inappropriate. When it is first configured as a heater, a more suitable default model is applied automatically. Heater tuning must be run before using the INDX tool.
CAUTION! The inductive heater is fast and powerful. It can easily heat the nozzle or other metalwork placed inside the heater coil to dangerously high temperatures. Use only the correct firmware versions, and keep the firmware up to date. If the nozzle assembly is not fully inserted into the heater coil or is misaligned, this can result in the temperature being under-read, resulting in heating to a higher temperature than was intended. Do not allow paper or other flammable material to enter the heater coil area.
For more information on pin names, see Pin Names.
RepRapFirmware 3 uses pin names for user-accessible pins, rather than pin numbers, to communicate with individual pins on the PCB. Pins can be defined for use by a number of gcode commands, e.g. M308, M574, M558, M950.
The RepRapFirmware 3 uses the pin name format expansion-board-address.pin-name to identify pins on expansion board, where expansion-board-address is the numeric CAN address of the board. A pin name that does not start with a sequence of decimal digits followed by a period, or that starts with 0. refers to a pin on the Duet 3 main board.
| Function | Pin location | RepRapFirmware pin name | Notes |
|---|---|---|---|
| Outputs | FAN (on VF board) | hsfan | Heatsink fan, VIN voltage |
| hsfan.tach | Pulled up to +5V | ||
| FAN (on MCU board) | pcfan | Intended for print cooling fan, VIN voltage | |
| pcfan.tach | Pulled up to +5V | ||
| LED | led | 5V drive for WS2812 or similar LED strings | |
| Inputs | IO_0 | io0.in | Input with 3.3V power provided, 30V tolerant |
| (internal) | boardtemp | MCU board temperature | |
| Coil FFC | coiltemp | Scanning Z probe coil temperature |
If you change the CAN address, the CAN address in the following commands will need to change from
121to match
The thermopile sensor is configured using the M308 command with sensor type "thermopile_tpis.object" and pin name "i2c". As well as the main output which provides nozzle temperature, it has two additional outputs which may be used for monitoring. Auxiliary output 1 has type "thermopile_tpis.ambient" and is the ambient temperature reported by the thermopile sensor. Auxiliary output 2 has type "thermopile_tpis.environment" and is the temperature of the nozzle surround reported by the auxiliary thermistor.
As at 2026-06-29 the M308 command to configure the thermopile sensor accepts the following parameters, however many of these are likely to be withdrawn in future. None of these parameters should be needed in normal use.
The inductive heater is configured using the M950 command with pin name "nozzleheat". The temperature sensor number in the M950 command must refer to the thermopile sensor primary output.
Example configuration, using sensor #1 for the nozzle temperature, heater #1, and the default CAN address (121):
M308 S1 Y"thermopile_tpis.object" P"121.i2c" A"INDX" ; configure thermopile main output
M308 S2 Y"thermopile_tpis.ambient" P"121.S1.1" A"Thermopile ambient" ; configure thermopile ambient output (optional)
M308 S3 Y"thermopile_tpis.environment" P"121.S1.2" A"Hot end surround" ; configure nozzle environment output (optional)
M950 H1 C"121.nozzleheat" T1 ; configure induction heater
This helps monitor chamber and INDX MCU board temperature.
M308 S10 Y"thermistor" P"121.boardtemp" A"INDXboardtemp" ; Onboard INDX board sensor
The location of the thermistor is shown here:

It is not immune from self heating on the INDX PCB, so it is not an absolute measure of the chamber temperature, but is a useful data point about the temperature of INDX mcu board which is useful, especially if running INDX in a heated chamber close to the design limits set by Bondtech.
Use the following commands, adjust if you have changed the CAN address
M584 E121.0 ; set extruder mapping
M350 E16 I1 ; configure microstepping with interpolation
M92 E561.4 ; equivalent to a rotation distance of 5.7mm at 16 microstepping
M566 E600 ; set maximum instantaneous speed changes (mm/min)
M203 E9000 ; set maximum speeds (mm/min)
M201 E3500 ; set accelerations (mm/s^2)
M906 E600 ; 600mA - If bondtech specify a different current use the one they recommend
The heatsink fan should be configured to run at full PWM when the nozzle is significantly above ambient temperature (e.g. above 45C). Here are suitable commands to configure it as fan #1, assuming again that the nozzle temperature sensor is sensor #1:
M950 F1 C"121.hsfan+hsfan.tach" ; heatsink fan
M106 P1 C"Heatsink" H1 T45 S1 ; turn on when nozzle temperature is >= 45C
Directly connected fans
M950 F0 C"121.pcfan"
M106 P0 C"Part" S0 ; turn off print cooling fan
if you use a directy connected part cooling solution with a tacho then:
M950 F0 C"121.pcfan+pcfan.tach"
Use this command to configure an LED string connected to the LED port of the INDX board:
M950 E0 T1 C"121.led"
Then use M150 commands to set the LED colours.
Add the following to your config.g:
M955 P121.0 I16 ; Add INDX accelerometer
See M955 for how to setup and configure the accelerometer.

In the normal INDX mounting orientation, with tools picked up from the front Z+ of the accelerometer is +Y on the machine, and +X is oriented to -Z. so the correct command is
M955 P12.1 I16
If you have tools mounted on the rear instead and the INDX head mounted backwards, then Z+ of the accelerometer is -Y, and +X is oriented to -Z. so the correct command is
M955 P12.1 I56
For an overview of using accelerometers to capture data on axis movement see: Connecting an accelerometer
There is a calibration stage that needs to be added to this documentation from Bondtech's documentation.
M558 K0 P1 C"121.loadcell"
The scanning z probe coil, if attached is setup as a second Z probe. It integrates the same inductive sensing chip as the Duet 3 Scanning Z Probe. It allows for a point mesh of the bed to be built up quickly as no movement in Z is required to read the bed distance, and individual readings happen very quickly.
The INDX tool has an optiona mount for the SZP coil that should be used. It ensures correct mounting distance from the bed. It places an offical SZP coil 3mm above the nozzle, centered on X and 35.1mm "behind" the nozzle on Y. (Measured in CAD)
If an alternative mounting solution is used then aim for a 3mm offset between the nozzle and the coil.
Add the following to your config.g:
; Scanning Z probe
M558 K1 P11 C"121.i2c.ldc1612" F24000 T24000
M308 S10 Y"thermistor" P"121.coiltemp" A"SZP coil temp" ; thermistor on SZP coil
M558.2 K1 S16 R87251
G31 K1 X0 Y-35.1 Z2 ; set SZP probe trigger value, offset and trigger height
; Mesh Bed Compensation
M557 X-100:100 Y-100:100 S10 ; define grid for mesh bed compensation probe 2
The M558.2 parameters need to be calibrated, see the next section.
The M557 mesh parameters need to be set to your bed co-ordinates that the coil can reach. The example is for a 200x200 bed with the zero point in the center
For general in formation about SZP calibration and usage, see Scanning Z Probe calibration
The endstop input on tool can be used for any digital IO function. The moost common use is to home the tool along the X axis. The configuraiton line for this is:
M574 X1 P"121.io0.in" S1 ; configure X axis endstop on the low end of the X axis
To follow.
For testing the following command will report the angle and encoder status are in M122 after the encoder is configured
M569.1 P121.0 T3
The following glbal variable definitions are needed in config.g , they are then used by the INDX tool macros
;variables for tool changes
if !exists(global.tool_clearance_y)
global tool_clearance_y = 0
;INDX States:
; -1 = Open / no tool
; 0,1,2 etc = Closed with that tool loaded
;@TODO extend to persist the state through power cycles.
if !exists(global.INDX_State)
global INDX_State = -1 ; for now intialiase as open
;variables that modify the speeds for tool changes
if !exists(global.INDX_TC_SPEED)
global INDX_TC_SPEED = 12000 ; Highest safe toolchange feedrate
else
set global.INDX_TC_SPEED = 24000
if !exists(global.INDX_TC_ACCEL)
global INDX_TC_ACCEL= 1 ; Highest safe toolchange acceleration
else
set global.INDX_TC_ACCEL = 10000
;Set the mode in use (1.0 = Full speed, Bondtech calls "SPORT, 0.7= "NORMAL", 0.3 = "STEALTH"
if !exists(global.INDX_TC_MODE)
global INDX_TC_MODE = 1.0
else
set global.INDX_TC_MODE = 1.0
The values for INDX_TC_SPEED and INDX_TC_ACCEL should be set to appropriate values for the specific machine mechanics, they are the max safe values. The options to modify them down by 70% or 30% are options shown by Bondtech. These values for "Normal" and "stealth" can be chend for 70% and 30% to other values as you like.