Each file below is a complete FluidNC template for a 4-driver machine — X / Y1 / Y2 / Z (a dual-Y gantry) — with limit switches, probe, spindle PWM, OLED and pendant already wired to the V5.88 Ultra's real pins. Click the file name to download it.
These are not finished machine configs. Do not load one unchanged. Every file carries placeholder values that describe no real machine, and one of them (run_amps) can overheat a motor. Work through the checklist below first.
| Wiring option | File | Driver block | Current and microstepping come from |
|---|---|---|---|
| A — on-board StepStick, standard step/dir | v588-xyyz-onboard-stepstick.yaml | stepstick | driver trimmer + board jumpers + ms3_pin |
| B — external standard drivers (TB6600 / DM542 class) | v588-xyyz-external-standard.yaml | standard_stepper | the external driver's own DIP switches |
| C — on-board SPI (TMC2130) | v588-xyyz-onboard-tmc2130-spi.yaml | tmc_2130 | this file |
| D — external SPI (SilentStep TMC5160 V5) | on the TMC5160 V5 page | tmc_5160 | DIP switches, or the YAML in SPI mode |
| # | Setting | Shipped placeholder | What happens if you leave it |
|---|---|---|---|
| 1 | steps_per_mm | 800 | every distance is wrong — a 10 mm move is not 10 mm |
| 2 | run_amps (SPI files only) | 1.2 | a smaller motor overheats; a larger one has no torque |
| 3 | max_travel_mm | 300 | soft limits, once enabled, stop in the wrong place |
| 4 | homing: cycle / positive_direction / mpos_mm | a generic guess | the machine homes into the wrong end of the axis |
| 5 | limit_neg_pin / limit_pos_pin | this board's test-YAML pins | homing seeks a switch that may not be on that pin |
| 6 | microsteps (SPI files) or the board jumpers | 16 | steps_per_mm no longer matches the driver |
Do all six with the motors uncoupled from the machine, and leave soft_limits: false and hard_limits: false until the axis moves the right distance in the right direction.
NO_PIN. Read 4.1 Connect Limit Switches first — PNP (sourcing) sensors are not compatible with this board.motor block and swap in that socket's numbers.max_rate_mm_per_min is deliberately low (1000). Raise it only after the machine moves correctly.disable_pin to *disable* a motor, and step/dir drivers do not agree on which level means disabled — some ordinary drivers only run once you write disable_pin: I2SO.0:low. Try one axis first, then apply the same suffix to every axis using that driver model.gpio.3 is used here as the toolsetter input, which needs jumper ⑩ set to input mode. Delete toolsetter_pin if you use GPIO.3 as an output or as a seventh axis.← Back to 4.2 Connect Stepper Drivers
For A4988, DRV8825, TMC2208 and TMC2209 modules plugged into the sockets DRV1–DRV4.
NO_PIN in the file.ms3_pin: I2SO.n drives MS3 high; ms3_pin: I2SO.n:low drives it low.board: PiBot V5.88 Ultra name: XYYZ on-board StepStick drivers (standard step/dir) # --------------------------------------------------------------- # PiBot V5.88 Ultra - 4.2 Connect Stepper Drivers # Mode: A - on-board StepStick, standard step/dir # Axes: X / Y1 / Y2 / Z (dual-Y gantry, 4 drivers) # # Before use, set your own: steps_per_mm, travel, homing direction, # and check every limit pin against your real switches. # Limit pins follow this board's own test YAML; NO_PIN where none # is documented. This is a starting point, not a finished machine. # # ENABLE POLARITY: FluidNC asserts disable_pin to DISABLE a motor, but # step/dir drivers do not agree on which level means disabled. If a motor # is limp and never steps while STP and DIR look right, invert it: # disable_pin: I2SO.0:low # Some ordinary drivers only run that way. Try one axis, then do the rest. # # MS1 / MS2 / RST / SLP are physical jumpers on the board and are # shared by all six sockets, so they stay NO_PIN here. # MS3 has no jumper - it is the only microstep bit set in this file. # ms3_pin: I2SO.n -> MS3 = 1 (logic high) # ms3_pin: I2SO.n:low -> MS3 = 0 (logic low) # A4988 : MS1=1 MS2=1 MS3=1 -> 1/16 step # DRV8825 : MS1=1 MS2=1 MS3=1 -> 1/32 step # TMC2209 : MS1=1 MS2=1 -> 1/16 step, and that socket pin is # PDN, not MS3 - use ms3_pin: I2SO.n:low to keep the # standstill current reduction the chip enables by default. # --------------------------------------------------------------- stepping: engine: I2S_STATIC idle_ms: 250 pulse_us: 4 dir_delay_us: 1 disable_delay_us: 0 axes: shared_stepper_disable_pin: NO_PIN x: steps_per_mm: 800.000 max_rate_mm_per_min: 1000.000 acceleration_mm_per_sec2: 100.000 max_travel_mm: 300.000 soft_limits: false homing: cycle: 2 positive_direction: false mpos_mm: 150.000 feed_mm_per_min: 100.000 seek_mm_per_min: 200.000 settle_ms: 500 seek_scaler: 1.100 feed_scaler: 1.100 motor0: # X - socket DRV1 / terminal 1 limit_neg_pin: gpio.42:low limit_pos_pin: gpio.41:low limit_all_pin: NO_PIN hard_limits: false pulloff_mm: 1.000 stepstick: step_pin: I2SO.2 direction_pin: I2SO.1 disable_pin: I2SO.0 # add :low if the driver runs inverted ms1_pin: NO_PIN # MSP1 jumper on the board ms2_pin: NO_PIN # MSP2 jumper on the board ms3_pin: I2SO.3 # MS3 = 1 (add :low for MS3 = 0) reset_pin: NO_PIN # RSTP1 jumper on the board y: steps_per_mm: 800.000 max_rate_mm_per_min: 1000.000 acceleration_mm_per_sec2: 100.000 max_travel_mm: 300.000 soft_limits: false homing: cycle: 2 positive_direction: false mpos_mm: 150.000 feed_mm_per_min: 100.000 seek_mm_per_min: 200.000 settle_ms: 500 seek_scaler: 1.100 feed_scaler: 1.100 motor0: # Y1 - socket DRV2 / terminal 2 limit_neg_pin: gpio.40:low limit_pos_pin: gpio.39:low limit_all_pin: NO_PIN hard_limits: false pulloff_mm: 1.000 stepstick: step_pin: I2SO.5 direction_pin: I2SO.4 disable_pin: I2SO.7 # add :low if the driver runs inverted ms1_pin: NO_PIN # MSP1 jumper on the board ms2_pin: NO_PIN # MSP2 jumper on the board ms3_pin: I2SO.6 # MS3 = 1 (add :low for MS3 = 0) reset_pin: NO_PIN # RSTP1 jumper on the board motor1: # Y2 - socket DRV3 / terminal 3 limit_neg_pin: gpio.38:low limit_pos_pin: NO_PIN limit_all_pin: NO_PIN hard_limits: false pulloff_mm: 1.000 stepstick: step_pin: I2SO.10 direction_pin: I2SO.9 disable_pin: I2SO.8 # add :low if the driver runs inverted ms1_pin: NO_PIN # MSP1 jumper on the board ms2_pin: NO_PIN # MSP2 jumper on the board ms3_pin: I2SO.11 # MS3 = 1 (add :low for MS3 = 0) reset_pin: NO_PIN # RSTP1 jumper on the board z: steps_per_mm: 800.000 max_rate_mm_per_min: 1000.000 acceleration_mm_per_sec2: 100.000 max_travel_mm: 300.000 soft_limits: false homing: cycle: 1 positive_direction: false mpos_mm: 150.000 feed_mm_per_min: 100.000 seek_mm_per_min: 200.000 settle_ms: 500 seek_scaler: 1.100 feed_scaler: 1.100 motor0: # Z - socket DRV4 / terminal 4 limit_neg_pin: gpio.37:low limit_pos_pin: NO_PIN limit_all_pin: NO_PIN hard_limits: false pulloff_mm: 1.000 stepstick: step_pin: I2SO.13 direction_pin: I2SO.12 disable_pin: I2SO.15 # add :low if the driver runs inverted ms1_pin: NO_PIN # MSP1 jumper on the board ms2_pin: NO_PIN # MSP2 jumper on the board ms3_pin: I2SO.14 # MS3 = 1 (add :low for MS3 = 0) reset_pin: NO_PIN # RSTP1 jumper on the board i2so: bck_pin: gpio.16 data_pin: gpio.17 ws_pin: gpio.18 spi: miso_pin: gpio.2 mosi_pin: gpio.1 sck_pin: gpio.21 sdcard: card_detect_pin: NO_PIN cs_pin: gpio.9 # ---- Probe and toolsetter ---- # gpio.3 is only an input when jumper 10 selects input mode. probe: pin: gpio.47:low toolsetter_pin: gpio.3:low check_mode_start: true hard_stop: false # ---- Spindle / laser PWM on the 5 V output header ---- pwm: pwm_hz: 5000 output_pin: gpio.45 enable_pin: NO_PIN direction_pin: NO_PIN disable_with_s0: false s0_with_disable: true tool_num: 0 speed_map: 0=0.000% 10000=100.000% off_on_alarm: false # ---- OLED display ---- i2c0: sda_pin: gpio.14 scl_pin: gpio.13 oled: i2c_num: 0 i2c_address: 60 width: 128 height: 64 radio_delay_ms: 1000 # ---- Pendant / I/O Expander (UART2) ---- # Independent of the OLED on this board; delete this pair if unused. uart2: txd_pin: gpio.0 rxd_pin: gpio.35 rts_pin: NO_PIN cts_pin: NO_PIN baud: 1000000 mode: 8N1 uart_channel2: report_interval_ms: 75 uart_num: 2 start: must_home: false
For TB6600, DM420, DM542, DM556 and closed-loop drivers wired to the white EN / STP / DIR / GND terminals. Set the VDD logic jumper ⑨ to 5 V.
standard_stepper block is all that is needed.steps_per_mm.board: PiBot V5.88 Ultra name: XYYZ external standard drivers (TB6600 / DM542 class) # --------------------------------------------------------------- # PiBot V5.88 Ultra - 4.2 Connect Stepper Drivers # Mode: B - external standard drivers, step/dir/enable only # Axes: X / Y1 / Y2 / Z (dual-Y gantry, 4 drivers) # # Before use, set your own: steps_per_mm, travel, homing direction, # and check every limit pin against your real switches. # Limit pins follow this board's own test YAML; NO_PIN where none # is documented. This is a starting point, not a finished machine. # # ENABLE POLARITY: FluidNC asserts disable_pin to DISABLE a motor, but # step/dir drivers do not agree on which level means disabled. If a motor # is limp and never steps while STP and DIR look right, invert it: # disable_pin: I2SO.0:low # Some ordinary drivers only run that way. Try one axis, then do the rest. # # Current and microstepping come from the external driver's own DIP # switches, not from this file - but microstepping still decides # steps_per_mm. Set the VDD logic jumper to 5 V for these drivers. # --------------------------------------------------------------- stepping: engine: I2S_STATIC idle_ms: 250 pulse_us: 4 dir_delay_us: 1 disable_delay_us: 0 axes: shared_stepper_disable_pin: NO_PIN x: steps_per_mm: 800.000 max_rate_mm_per_min: 1000.000 acceleration_mm_per_sec2: 100.000 max_travel_mm: 300.000 soft_limits: false homing: cycle: 2 positive_direction: false mpos_mm: 150.000 feed_mm_per_min: 100.000 seek_mm_per_min: 200.000 settle_ms: 500 seek_scaler: 1.100 feed_scaler: 1.100 motor0: # X - socket DRV1 / terminal 1 limit_neg_pin: gpio.42:low limit_pos_pin: gpio.41:low limit_all_pin: NO_PIN hard_limits: false pulloff_mm: 1.000 standard_stepper: step_pin: I2SO.2 direction_pin: I2SO.1 disable_pin: I2SO.0 # add :low if the driver runs inverted y: steps_per_mm: 800.000 max_rate_mm_per_min: 1000.000 acceleration_mm_per_sec2: 100.000 max_travel_mm: 300.000 soft_limits: false homing: cycle: 2 positive_direction: false mpos_mm: 150.000 feed_mm_per_min: 100.000 seek_mm_per_min: 200.000 settle_ms: 500 seek_scaler: 1.100 feed_scaler: 1.100 motor0: # Y1 - socket DRV2 / terminal 2 limit_neg_pin: gpio.40:low limit_pos_pin: gpio.39:low limit_all_pin: NO_PIN hard_limits: false pulloff_mm: 1.000 standard_stepper: step_pin: I2SO.5 direction_pin: I2SO.4 disable_pin: I2SO.7 # add :low if the driver runs inverted motor1: # Y2 - socket DRV3 / terminal 3 limit_neg_pin: gpio.38:low limit_pos_pin: NO_PIN limit_all_pin: NO_PIN hard_limits: false pulloff_mm: 1.000 standard_stepper: step_pin: I2SO.10 direction_pin: I2SO.9 disable_pin: I2SO.8 # add :low if the driver runs inverted z: steps_per_mm: 800.000 max_rate_mm_per_min: 1000.000 acceleration_mm_per_sec2: 100.000 max_travel_mm: 300.000 soft_limits: false homing: cycle: 1 positive_direction: false mpos_mm: 150.000 feed_mm_per_min: 100.000 seek_mm_per_min: 200.000 settle_ms: 500 seek_scaler: 1.100 feed_scaler: 1.100 motor0: # Z - socket DRV4 / terminal 4 limit_neg_pin: gpio.37:low limit_pos_pin: NO_PIN limit_all_pin: NO_PIN hard_limits: false pulloff_mm: 1.000 standard_stepper: step_pin: I2SO.13 direction_pin: I2SO.12 disable_pin: I2SO.15 # add :low if the driver runs inverted i2so: bck_pin: gpio.16 data_pin: gpio.17 ws_pin: gpio.18 spi: miso_pin: gpio.2 mosi_pin: gpio.1 sck_pin: gpio.21 sdcard: card_detect_pin: NO_PIN cs_pin: gpio.9 # ---- Probe and toolsetter ---- # gpio.3 is only an input when jumper 10 selects input mode. probe: pin: gpio.47:low toolsetter_pin: gpio.3:low check_mode_start: true hard_stop: false # ---- Spindle / laser PWM on the 5 V output header ---- pwm: pwm_hz: 5000 output_pin: gpio.45 enable_pin: NO_PIN direction_pin: NO_PIN disable_with_s0: false s0_with_disable: true tool_num: 0 speed_map: 0=0.000% 10000=100.000% off_on_alarm: false # ---- OLED display ---- i2c0: sda_pin: gpio.14 scl_pin: gpio.13 oled: i2c_num: 0 i2c_address: 60 width: 128 height: 64 radio_delay_ms: 1000 # ---- Pendant / I/O Expander (UART2) ---- # Independent of the OLED on this board; delete this pair if unused. uart2: txd_pin: gpio.0 rxd_pin: gpio.35 rts_pin: NO_PIN cts_pin: NO_PIN baud: 1000000 mode: 8N1 uart_channel2: report_interval_ms: 75 uart_num: 2 start: must_home: false
For SPI-mode TMC modules in the sockets DRV1–DRV4, with the SPI jumper block ⑱ installed, the MS / RST / SLP jumpers ⑪ removed, and the VDD logic jumper ⑨ on 3.3 V.
cs_pin — that is the same MS3 line, and spi_index: -1 means independent chip select rather than a daisy chain.run_amps: 1.2 is a placeholder. Set it to your motor's rated current before you run anything.toff_disable at 0. It is the TOFF value used while the driver is disabled, and TOFF 0 means “driver disable, all bridges off”. A non-zero value keeps the power stage chopping while the motor is supposed to be off.r_sense_ohms: 0.110 matches the common TMC2130 StepStick. Check the sense resistors on your own module if the current comes out wrong.board: PiBot V5.88 Ultra name: XYYZ on-board TMC2130 SPI drivers # --------------------------------------------------------------- # PiBot V5.88 Ultra - 4.2 Connect Stepper Drivers # Mode: C - on-board SPI (TMC2130), independent chip select # Axes: X / Y1 / Y2 / Z (dual-Y gantry, 4 drivers) # # Before use, set your own: steps_per_mm, travel, homing direction, # and check every limit pin against your real switches. # Limit pins follow this board's own test YAML; NO_PIN where none # is documented. This is a starting point, not a finished machine. # # ENABLE POLARITY: FluidNC asserts disable_pin to DISABLE a motor, but # step/dir drivers do not agree on which level means disabled. If a motor # is limp and never steps while STP and DIR look right, invert it: # disable_pin: I2SO.0:low # Some ordinary drivers only run that way. Try one axis, then do the rest. # # Current and microstepping come from the tmc_2130 blocks below. # Set run_amps to your motor's rating - do not leave the 1.2 A # placeholder. Install the SPI jumper block, remove the MS / RST / # SLP jumpers, and set the VDD logic jumper to 3.3 V. # # toff_disable is the TOFF register value used while the driver is # disabled. TOFF 0 means 'driver disable, all bridges off', so leave # it at 0 - that is the FluidNC default and what every official # FluidNC example uses. A non-zero value keeps the power stage # chopping while the motor is supposed to be off, so the motor stays # energised and hot. FluidNC only writes this value when # use_enable is true, so a non-zero value here is a trap that only # springs once someone switches use_enable on. # --------------------------------------------------------------- stepping: engine: I2S_STATIC idle_ms: 250 pulse_us: 4 dir_delay_us: 1 disable_delay_us: 0 axes: shared_stepper_disable_pin: NO_PIN x: steps_per_mm: 800.000 max_rate_mm_per_min: 1000.000 acceleration_mm_per_sec2: 100.000 max_travel_mm: 300.000 soft_limits: false homing: cycle: 2 positive_direction: false mpos_mm: 150.000 feed_mm_per_min: 100.000 seek_mm_per_min: 200.000 settle_ms: 500 seek_scaler: 1.100 feed_scaler: 1.100 motor0: # X - socket DRV1 / terminal 1 limit_neg_pin: gpio.42:low limit_pos_pin: gpio.41:low limit_all_pin: NO_PIN hard_limits: false pulloff_mm: 1.000 tmc_2130: cs_pin: i2so.3 # this socket's MS3 / CS output spi_index: -1 # independent CS, not a daisy chain r_sense_ohms: 0.110 run_amps: 1.2 # SET THIS to your motor hold_amps: 0.1 microsteps: 16 stallguard: 0 stallguard_debug: false toff_disable: 0 # 0 = bridges off when disabled (FluidNC default) toff_stealthchop: 5 toff_coolstep: 3 run_mode: CoolStep homing_mode: CoolStep use_enable: false step_pin: I2SO.2 direction_pin: I2SO.1 disable_pin: I2SO.0 # add :low if the driver runs inverted y: steps_per_mm: 800.000 max_rate_mm_per_min: 1000.000 acceleration_mm_per_sec2: 100.000 max_travel_mm: 300.000 soft_limits: false homing: cycle: 2 positive_direction: false mpos_mm: 150.000 feed_mm_per_min: 100.000 seek_mm_per_min: 200.000 settle_ms: 500 seek_scaler: 1.100 feed_scaler: 1.100 motor0: # Y1 - socket DRV2 / terminal 2 limit_neg_pin: gpio.40:low limit_pos_pin: gpio.39:low limit_all_pin: NO_PIN hard_limits: false pulloff_mm: 1.000 tmc_2130: cs_pin: i2so.6 # this socket's MS3 / CS output spi_index: -1 # independent CS, not a daisy chain r_sense_ohms: 0.110 run_amps: 1.2 # SET THIS to your motor hold_amps: 0.1 microsteps: 16 stallguard: 0 stallguard_debug: false toff_disable: 0 # 0 = bridges off when disabled (FluidNC default) toff_stealthchop: 5 toff_coolstep: 3 run_mode: CoolStep homing_mode: CoolStep use_enable: false step_pin: I2SO.5 direction_pin: I2SO.4 disable_pin: I2SO.7 # add :low if the driver runs inverted motor1: # Y2 - socket DRV3 / terminal 3 limit_neg_pin: gpio.38:low limit_pos_pin: NO_PIN limit_all_pin: NO_PIN hard_limits: false pulloff_mm: 1.000 tmc_2130: cs_pin: i2so.11 # this socket's MS3 / CS output spi_index: -1 # independent CS, not a daisy chain r_sense_ohms: 0.110 run_amps: 1.2 # SET THIS to your motor hold_amps: 0.1 microsteps: 16 stallguard: 0 stallguard_debug: false toff_disable: 0 # 0 = bridges off when disabled (FluidNC default) toff_stealthchop: 5 toff_coolstep: 3 run_mode: CoolStep homing_mode: CoolStep use_enable: false step_pin: I2SO.10 direction_pin: I2SO.9 disable_pin: I2SO.8 # add :low if the driver runs inverted z: steps_per_mm: 800.000 max_rate_mm_per_min: 1000.000 acceleration_mm_per_sec2: 100.000 max_travel_mm: 300.000 soft_limits: false homing: cycle: 1 positive_direction: false mpos_mm: 150.000 feed_mm_per_min: 100.000 seek_mm_per_min: 200.000 settle_ms: 500 seek_scaler: 1.100 feed_scaler: 1.100 motor0: # Z - socket DRV4 / terminal 4 limit_neg_pin: gpio.37:low limit_pos_pin: NO_PIN limit_all_pin: NO_PIN hard_limits: false pulloff_mm: 1.000 tmc_2130: cs_pin: i2so.14 # this socket's MS3 / CS output spi_index: -1 # independent CS, not a daisy chain r_sense_ohms: 0.110 run_amps: 1.2 # SET THIS to your motor hold_amps: 0.1 microsteps: 16 stallguard: 0 stallguard_debug: false toff_disable: 0 # 0 = bridges off when disabled (FluidNC default) toff_stealthchop: 5 toff_coolstep: 3 run_mode: CoolStep homing_mode: CoolStep use_enable: false step_pin: I2SO.13 direction_pin: I2SO.12 disable_pin: I2SO.15 # add :low if the driver runs inverted i2so: bck_pin: gpio.16 data_pin: gpio.17 ws_pin: gpio.18 spi: miso_pin: gpio.2 mosi_pin: gpio.1 sck_pin: gpio.21 sdcard: card_detect_pin: NO_PIN cs_pin: gpio.9 # ---- Probe and toolsetter ---- # gpio.3 is only an input when jumper 10 selects input mode. probe: pin: gpio.47:low toolsetter_pin: gpio.3:low check_mode_start: true hard_stop: false # ---- Spindle / laser PWM on the 5 V output header ---- pwm: pwm_hz: 5000 output_pin: gpio.45 enable_pin: NO_PIN direction_pin: NO_PIN disable_with_s0: false s0_with_disable: true tool_num: 0 speed_map: 0=0.000% 10000=100.000% off_on_alarm: false # ---- OLED display ---- i2c0: sda_pin: gpio.14 scl_pin: gpio.13 oled: i2c_num: 0 i2c_address: 60 width: 128 height: 64 radio_delay_ms: 1000 # ---- Pendant / I/O Expander (UART2) ---- # Independent of the OLED on this board; delete this pair if unused. uart2: txd_pin: gpio.0 rxd_pin: gpio.35 rts_pin: NO_PIN cts_pin: NO_PIN baud: 1000000 mode: 8N1 uart_channel2: report_interval_ms: 75 uart_num: 2 start: must_home: false
The PiBot SilentStep TMC5160 V5 files, in Normal, SPI Daisy Chain and SPI Independent modes, live on their own page together with the V4.96, V5.77 and V4.7B versions:
← Back to 4.2 Connect Stepper Drivers · 1 Pinout Reference · 4.1 Connect Limit Switches