Voron Klipper Multiple MCU Configuration Guide
Klipper Electronics Advanced
As your Voron evolves, a single controller board often cannot handle every peripheral. Adding a chamber heater controller, a second extruder for tool-changing, additional temperature sensors, or CAN bus toolhead boards all require multiple MCUs working in sync. Klipper natively supports multi-MCU configurations with microsecond-level synchronization — every stepper, heater, and sensor is orchestrated as one unified system. This guide covers wiring multiple boards, configuring printer.cfg for additional MCUs, setting up a chamber heater controller on a secondary board, adding extra thermistors and fans, multi-MCU synchronization, and troubleshooting common issues. Last updated: May 2025.
Why Add Multiple MCUs?
- Chamber heating control: A dedicated MCU (e.g., BTT SKR Pico or Manta M4P) drives chamber heaters and chamber fans, independent of the main motion-control board.
- Second extruder / toolhead: For IDEX (Independent Dual Extruder) setups or tool-changer systems (e.g., StealthChanger or TapChanger), each toolhead needs its own stepper driver and heater controller.
- Additional sensors: Multiple thermistors for chamber temperature mapping, filament width sensors, load cells, or accelerometers can exceed the ADC and GPIO capacity of a single board.
- CAN bus toolhead: An EBB36 or EBB42 CAN board acts as a secondary MCU on the toolhead, drastically reducing the wiring harness between the toolhead and the main electronics bay.
- Pin expansion: When you run out of GPIO pins on your main board for endstops, fans, LEDs, or solenoid valves, a low-cost secondary MCU is cheaper than replacing the main board.
Supported MCU Types for Voron
| Board | MCU | Steppers | Thermistors | Heaters | CAN-FD | Ideal Role |
|---|---|---|---|---|---|---|
| BTT Octopus Pro | STM32F446 | 8 | 6 | 4 | Yes | Main motion board (V2.4/Trident) |
| BTT Manta M8P | STM32F407 | 8 | 5 | 4 | Yes | Main motion board + CB1 compute |
| BTT SKR Pico | RP2040 | 4 | 3 | 3 | No | Chamber heater / auxiliary controller |
| BTT EBB36/42 | STM32G0B1 | 2 | 3 | 2 | Yes | CAN bus toolhead board |
| BTT Manta M4P | STM32F405 | 4 | 4 | 3 | Yes | Secondary extruder / IDEX controller |
| Raspberry Pi Pico | RP2040 | 0 | 3 | 1 | No | Sensor hub / GPIO expander |
Wiring Multiple MCUs
USB Connection (Simple Method)
Each secondary MCU connects to the Raspberry Pi (or CB1/CB2) via USB. Klipper detects each MCU by its unique serial ID. This method requires no extra hardware beyond USB cables and a powered USB hub if the Pi's ports are insufficient.
- Connect USB cable from secondary MCU to Pi USB port (or powered USB hub).
- Power the secondary MCU independently (e.g., 24V PSU for BTT boards, 5V for Raspberry Pi Pico).
- Flash Klipper firmware to the secondary MCU (see Flashing section below).
- Find the serial ID with
ls /dev/serial/by-id/*— Klipper will use this path in printer.cfg.
CAN Bus Connection (Recommended for Toolheads)
CAN bus reduces wiring to two wires (CAN_H and CAN_L) plus power. This is the standard for Voron toolhead boards.
- Install a CAN interface on the Pi: USB-to-CAN adapter (e.g., CANable or U2C) or built-in CAN on boards like Manta M8P.
- Connect CAN_H and CAN_L between the adapter and each CAN-capable board. Terminate the bus with 120-ohm resistors at both ends.
- Power all CAN boards from a shared 24V supply. Do not rely on CAN bus power alone for stepper drivers.
- Configure the CAN interface in your OS (add
dtparam=spi=onand CAN interface config in /boot/config.txt on a Pi). - Use
~/klipper/scripts/flash_can.py -qto query CAN UUIDs. - Reference boards by UUID in printer.cfg:
mcu: can0_uuid:1234567890abcdef
Flashing Klipper Firmware to Secondary MCUs
- SSH into your Pi and navigate to
~/klipper. - Run
make menuconfig. Select the correct microcontroller architecture (e.g., STM32F446 for Octopus, RP2040 for Pico). - Enable the correct communication interface:
- USB: Select "USB (on PA11/PA12)" or similar for your board.
- CAN: Select "CAN bus" and set CAN bus speed (250000 or 500000).
- Run
maketo build the firmware binary (out/klipper.binorout/klipper.uf2). - Flash the board:
- STM32 boards: Copy
out/klipper.binto the SD card (rename to firmware.bin), insert into the board, and power on. - RP2040 boards: Hold BOOTSEL, connect USB, mount the RPI-RP2 drive, and copy
out/klipper.uf2to it. - CAN boards (DFU): Use
make flash FLASH_DEVICE=0483:df11(check withlsusbfirst).
- STM32 boards: Copy
Configuring Multiple MCUs in printer.cfg
Each MCU gets an [mcu] section with a unique name. The main MCU keeps the default name [mcu]. Secondary MCUs get descriptive names.
# Main motion board (BTT Octopus Pro)
[mcu]
serial: /dev/serial/by-id/usb-Klipper_stm32f446xx_12345-if00
restart_method: command
# Chamber heater controller (SKR Pico)
[mcu chamber_mcu]
serial: /dev/serial/by-id/usb-Klipper_rp2040_67890-if00
restart_method: command
# CAN bus toolhead (EBB36)
[mcu toolhead_mcu]
canbus_uuid: 1234567890abcdef
restart_method: command
Assigned Heaters and Sensors
[extruder]
step_pin: toolhead_mcu:STEPPER1_STEP
dir_pin: toolhead_mcu:STEPPER1_DIR
enable_pin: !toolhead_mcu:STEPPER1_EN
heater_pin: toolhead_mcu:heater0
sensor_pin: toolhead_mcu:PB0
# ... remaining extruder config
[heater_bed]
heater_pin: mcu:heater_bed
sensor_pin: mcu:PB1
# ... remaining bed config
# Chamber heater (controlled by chamber MCU)
[heater_generic chamber_heater]
heater_pin: chamber_mcu:heater0
sensor_pin: chamber_mcu:PB2
control: pid
pid_Kp: 70
pid_Ki: 0.5
pid_Kd: 150
min_temp: 0
max_temp: 100
# Chamber temperature sensor
[temperature_sensor chamber_temp]
sensor_type: NTC 100K B3950
sensor_pin: chamber_mcu:PB3
min_temp: 0
max_temp: 100
Multi-MCU Stepper Synchronization
When stepper motors are controlled by different MCUs (e.g., Z motors on main MCU, extruder on CAN toolhead, second extruder on another MCU), Klipper uses a synchro step algorithm to coordinate motion. Add the following to enable synchronization:
[mcu chamber_mcu]
serial: /dev/serial/by-id/...
restart_method: command
# Synchronize the chamber MCU with the main MCU
[mcu chamber_mcu]
synchro: mcu
Klipper automatically handles synchronization for movements that involve hardware from different MCUs. The primary MCU sends timed command batches to each secondary MCU, and all MCUs execute the steps at precisely the same moment using their local hardware timers. No additional configuration is needed for simple moves — Klipper handles it transparently.
Chamber Heater Controller — Full Setup Example
A common multi-MCU use case is adding a dedicated chamber heater controlled by a low-cost RP2040 board. Here is a complete setup:
- Wire a 120V or 240V AC chamber heater through a solid-state relay (SSR). The SSR control signal connects to the SKR Pico's heater output pin (e.g., heater0 on PB14).
- Wire a chamber thermistor (NTC 100K B3950) to the SKR Pico's thermistor input (e.g., PB2 configured as ADC).
- Flash Klipper firmware to the SKR Pico with USB communication enabled.
- Add the
[mcu chamber_mcu]section as shown above. - Configure the chamber heater as a
[heater_generic]with PID control. - Place the chamber temperature sensor in your Klipper macros to control pre-heat sequences.
[gcode_macro PRINT_START]
gcode:
# Pre-heat chamber first
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=55
G4 P30000 ; Wait 30 seconds for chamber heater to start
# Then heat bed and nozzle
G28
...
Adding a Second Extruder / IDEX Setup
For dual-extruder Voron builds (e.g., IDEX using two toolheads on separate carriages), each extruder needs its own stepper driver, heater, and thermistor. A second MCU (e.g., Manta M4P) handles the second toolhead.
[extruder]
stepper_config: stepper_x2 ; Second X axis for IDEX
...
[extruder2]
step_pin: secondary_mcu:STEPPER1_STEP
dir_pin: secondary_mcu:STEPPER1_DIR
enable_pin: !secondary_mcu:STEPPER1_EN
heater_pin: secondary_mcu:heater0
sensor_pin: secondary_mcu:PB0
# ... remaining extruder2 config
For IDEX specifically, add [dual_carriage] and [gcode_macro] commands for copy mode and mirror mode. Klipper coordinates the dual MCUs automatically for synchronized movement.
Adding Additional Sensors
Secondary MCUs are excellent for expanding sensor capacity:
- Chamber thermistors: Multiple
[temperature_sensor]entries on the chamber MCU. Place sensors at different Z heights for chamber temperature mapping. - Filament width sensor: Uses a secondary MCU's ADC input. Configure with
[filament_switch_sensor]or custom macros. - Enclosure humidity sensor: Connect an AHT20 or DHT22 to the secondary MCU's I2C or GPIO pins. Use Klipper's
[sensor]module or custom polling macros. - Accelerometer (ADXL345): Connect to the secondary MCU via SPI or I2C for input shaper calibration. Use
[adxl345]with thecs_pinpointing to the secondary MCU.
Troubleshooting Multi-MCU Issues
MCU Not Found / Serial Timeout
- Check that the secondary MCU has power (LED indicator).
- Verify the serial path:
ls /dev/serial/by-id/*. If the board does not appear, flash Klipper firmware again. - Ensure the correct
restart_method(command, rpi_usb, or reset). STM32 boards typically usecommand; RP2040 boards may needrpi_usb.
CAN Bus Not Detected
- Verify CAN interface is active:
ip link show can0— should show state UP. - Check termination resistors (120-ohm at both ends of the CAN bus).
- Query UUIDs:
~/klipper/scripts/flash_can.py -q. If no UUIDs appear, check wiring and power. - Baud rate mismatch: Ensure all boards and the CAN interface use the same speed (250000 or 500000).
Stepper Position Loss / Skewed Moves
- Multi-MCU stepper synchronization relies on accurate clock calibration. Check Klipper logs for "mcu skew" warnings.
- Add
#sync_clock: mcu(uncommented) to the secondary MCU section if Klipper reports clock synchronization errors. - Run
STEPPER_BUZZ STEPPER=stepper_xon each stepper controlled by a secondary MCU to verify motion is smooth and correctly timed.
Power and Grounding Considerations
- Shared ground: All MCUs must share a common ground reference. Connect the ground terminals of all PSUs together. Without a shared ground, USB and CAN communication becomes unreliable.
- Independent power: Each MCU should have its own fused power input. Do not daisy-chain 24V power through multiple boards on a single wire pair — use a distribution block.
- USB isolation: If using USB for multiple MCUs, consider a USB isolator (e.g., Adafruit 2107) to prevent ground loops between the printer's 24V system and the Pi's 5V system.
Multiple MCU configurations unlock the full potential of your Voron. Whether you are adding chamber heating, dual extrusion, or a CAN bus toolhead, Klipper's multi-MCU architecture handles the complexity so you can focus on printing.
Happy building!