FluidNC ports are assigned by the YAML file, so the software functions are configurable rather than permanently fixed.
The definitions on this page match the supplied V4.7B I/O-test YAML. Check your active YAML and board revision before wiring a machine.

| Channel | Physical Port | Pins in Test YAML | Typical Use |
|---|---|---|---|
| UART0 | Main USB 12 | On plug-in ESP32 module | Firmware, console and G-code sender |
| UART1 | RS485 3 | TX GPIO.15 · RX GPIO.16 · RTS GPIO.14 | Modbus VFD, 9600 8N1 in test YAML |
| UART2 | RJ12 9 | TX GPIO.25 · RX GPIO.27 when enabled | Compatible PiBot pendant / I/O expander |
Eight signal inputs are available along the board edge. The supplied test YAML assigns them as follows.
| GPIO | Test function | GPIO | Test function |
|---|---|---|---|
| GPIO.2 | Probe, pull-up, active low | GPIO.26 | Tool setter, pull-up, active low |
| GPIO.33 | X limit − | GPIO.32 | X limit + |
| GPIO.35 | Y motor 0 limit | GPIO.34 | Y motor 1 limit |
| GPIO.39 | Z limit | GPIO.36 | A limit |
io.12-MOS-GND follows GPIO.12 and io.4-MOS-GND follows GPIO.4.0x3C.Each connector provides EN / STP / DIR / GND. All six groups are intended for compatible external stepper drivers; V4.7B has no on-board StepStick sockets.
| Connector | Enable | Step | Direction | Test YAML use |
|---|---|---|---|---|
| X | I2SO.0 | I2SO.2 | I2SO.1 | X motor |
| Y | I2SO.7 | I2SO.5 | I2SO.4 | Y motor 0 |
| Z connector | I2SO.8 | I2SO.10 | I2SO.9 | Y motor 1 |
| A connector | I2SO.15 | I2SO.13 | I2SO.12 | Z motor |
| B connector | I2SO.16 | I2SO.18 | I2SO.17 | A motor |
| C connector | I2SO.23 | I2SO.21 | I2SO.20 | M7 / M8 / M64 P0 signal test |
############################################################################## ## THIS EXAMPLE IS ONLY FOR I/O TESTING. MODIFY IT BEFORE USING IT ON A MACHINE. #### ############################################################################# board: PiBot V47B name: PiBot V47B IO Test YAML stepping: engine: I2S_STATIC idle_ms: 255 pulse_us: 4 dir_delay_us: 4 disable_delay_us: 0 segments: 6 ###################################START TEST UART################################### ## uart0 main usb port ## uart1 RS485 tx rx ## uart2 RJ12 TX rx ##################################################################################### ## Begin expansion port uart and channel setup (test the rj12 port) ##uart2: ## txd_pin: gpio.25 ## rxd_pin: gpio.27 ## baud: 1000000 ## mode: 8N1 ##uart_channel2: ## report_interval_ms: 75 ## uart_num: 2 ###################################END TEST UART#################################### spi: miso_pin: gpio.19 mosi_pin: gpio.23 sck_pin: gpio.18 sdcard: card_detect_pin: NO_PIN cs_pin: gpio.5 i2so: bck_pin: gpio.22 data_pin: gpio.21 ws_pin: gpio.17 ## Begin OLED i2c0: sda_pin: gpio.27 scl_pin: gpio.25 oled: i2c_num: 0 i2c_address: 60 width: 128 height: 64 radio_delay_ms: 1000 ## END OLED probe: pin: gpio.2:pu:low toolsetter_pin: gpio.26:pu:low check_mode_start: true hard_stop: false coolant: mist_pin: I2SO.23 flood_pin: I2SO.21 ## m7 m8 user_outputs: digital0_pin: I2SO.20 ##M64 P0 / on -- M65 P0 / off // M64 P1 on -- M65 P1 off start: must_home: false axes: shared_stepper_disable_pin: NO_PIN x: steps_per_mm: 800.000 max_rate_mm_per_min: 5000.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: limit_neg_pin: gpio.33:low limit_pos_pin: gpio.32: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 ######disable_pin:This is used if your controller uses individual disable pins for each driver. ######Most basic controllers use a common disable pin for all drivers and that is set elsewhere in the config file. ######You can invert the direction by changing the active state attribute (:high or :low) y: steps_per_mm: 800.000 max_rate_mm_per_min: 5000.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: limit_neg_pin: gpio.35:low limit_pos_pin: NO_PIN 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 motor1: limit_neg_pin: gpio.34: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 z: steps_per_mm: 800.000 max_rate_mm_per_min: 5000.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: limit_neg_pin: gpio.39: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 a: steps_per_mm: 800.000 max_rate_mm_per_min: 5000.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: limit_neg_pin: gpio.36:low limit_pos_pin: NO_PIN limit_all_pin: NO_PIN hard_limits: false pulloff_mm: 3.000 standard_stepper: step_pin: I2SO.18 direction_pin: I2SO.17 disable_pin: I2SO.16 # Begin PWM pwm: pwm_hz: 5000 # direction_pin: NO_PIN output_pin: gpio.4 enable_pin: NO_PIN disable_with_s0: false s0_with_disable: true # spinup_ms: 0 # spindown_ms: 0 tool_num: 0 speed_map: 0=0.000% 10000=100.000% off_on_alarm: false # Begin Laser Laser: pwm_hz: 5000 output_pin: gpio.12 enable_pin: NO_PIN disable_with_s0: false s0_with_disable: true tool_num: 1 speed_map: 0=0.000% 255=100.000% off_on_alarm: true ## Start 0-10V 10V: forward_pin: NO_PIN reverse_pin: NO_PIN pwm_hz: 5000 output_pin: gpio.13 enable_pin: NO_PIN direction_pin: NO_PIN disable_with_s0: false s0_with_disable: true spinup_ms: 0 spindown_ms: 0 tool_num: 2 speed_map: 0=0.000% 1000=0.000% 24000=100.000% off_on_alarm: false ## Start only for test the RS485chip communication uart1: txd_pin: gpio.15 rxd_pin: gpio.16 rts_pin: gpio.14 baud: 9600 mode: 8N1 ModbusVFD: uart_num: 1 modbus_id: 1 debug: 0 poll_ms: 250 retries: 5 spinup_ms: 6000 spindown_ms: 6000 tool_num: 3 speed_map: 0=0.00% 24000=100.00% off_on_alarm: false atc: m6_macro: s0_with_disable: false disable_with_s0: false model: Huanyang min_RPM: 6000 max_RPM: 24000 cw_cmd: 03 01 01 > echo ccw_cmd: 03 01 11 > echo off_cmd: 03 01 08 > echo set_rpm_cmd: 05 02 rpm*100/60 > echo get_min_rpm_cmd: 01 03 0b 00 00 > 01 03 0B minRPM*60/100 get_max_rpm_cmd: 01 03 05 00 00 > 01 03 05 maxRPM*60/100 get_rpm_cmd: 04 03 01 00 00 > 04 03 01 rpm*60/100