What a dual nozzle 3D printer is and what it is for

Adding a second extruder to a single-nozzle printer

A dual extruder upgrade is a wiring and firmware job as much as a hardware one. This page lists what the mod needs, the Klipper and Marlin settings, the slicer changes, and the other routes to two materials in one print.

Published · Last verified

A hand-built 3D printer extruder with clear acrylic plates, a drive gear, black thumb screws and a hotend wrapped in orange Kapton tape, lying on a carpet
Photo: syvwlch, CC BY 2.0

Yes, if the printer runs Marlin or Klipper and you can change its firmware. You add a second hotend and extruder motor, plus a stepper driver, heater output and thermistor input to run them, then set up the firmware and slicer. Closed printers take only a maker kit: Bambu Lab’s Vortek kit converts an H2S or H2D into an H2C.

Can you add a second extruder to a single-nozzle printer?

Yes, on an open printer running Marlin or Klipper. Its mainboard needs a spare stepper driver, heater output and thermistor input, or you add a board that has them. Closed printers depend on the maker. Bambu Lab’s only dual-hotend upgrade is the Vortek kit for its H2 series, which turns the printer into an H2C.

Bambu Lab calls Vortek “an upgrade system specifically designed for the complete H2 series”, sold as a kit “for existing H2D/H2S users”. A converted printer runs up to 7 hotends: a left lifting hotend plus 6 induction hotends that swap on the right. The H2S dual nozzle page covers that conversion. The rest of this page is about open printers.

What does a dual extruder 3D printer upgrade need?

Two nozzles mean every hotend part is doubled, and the controller has to drive the extras:

  • A second hotend on the carriage. This is either a dual hotend in one body, or a second single hotend fixed beside the first on a printed or machined mount.
  • A second extruder motor. It feeds the second filament path.
  • A second stepper driver. Marlin calls it E1 (E1_DRIVER_TYPE) and Klipper gives it its own pins in [extruder1].
  • A second heater output and thermistor input. Marlin calls these heater 1 and TEMP_SENSOR_1.
  • Room on the carriage. The wider head needs a mount and part-cooling airflow for both nozzles.

Check the mainboard first. BIGTREETECH’s SKR Mini E3 V3 is a replacement board for Ender 3-class printers. Its driver sockets are XM, YM, ZAM, ZBM and EM, and its temperature inputs are TH0 and THB (bed). That leaves no second extruder driver or second hotend thermistor. The BIGTREETECH Octopus Pro takes up to 8 stepper drivers and up to 4 hotend heaters, with sensor inputs T0 to T3.

On Klipper you can keep the main board and add a second controller instead, such as a toolhead board. Klipper’s configuration reference says additional micro-controllers “introduce additional pins that may be configured as heaters, steppers, fans, etc.”.

Which dual hotends can you still buy?

E3D made two dual hotends for this mod: the Chimera+ (two nozzles) and the Cyclops+ (two filaments, one nozzle). On October 12, 2026, E3D’s own store listed only spare parts under “Cyclops & Chimera Spares”, and MatterHackers listed the Chimera+ as out of stock. The other route is two single hotends on one mount. Check that spare parts are sold for whichever hotend you plan to double.

Dual extruder 3D printer mod options compared

Every route below puts two materials in one print. They are ordered by how much hardware is added to the printer, from least to most. This is not a ranking.

Route Nozzles What you add Firmware setting Fits
Single-nozzle filament changer 1 A changer unit (AMS, MMU3, ERCF, Box Turtle) Maker firmware, or Happy Hare / AFC on Klipper Many printers; see adding multi-color printing
Two filaments into one nozzle (Cyclops-style) 1 Second extruder motor and a two-inlet hotend Marlin SINGLENOZZLE; Klipper [extruder_stepper] Open printers
Fixed dual hotend 2 Second hotend, extruder, driver, heater, thermistor Marlin EXTRUDERS 2 and HOTEND_OFFSET; Klipper [extruder1] and T0/T1 macros Open printers with carriage room
Dual hotend with a lifting nozzle 2 As above, plus a servo that raises one nozzle Marlin SWITCHING_NOZZLE; Klipper SET_SERVO in the T0/T1 macros Open printers
IDEX (independent dual extruder) conversion 2 A second X carriage with its own motor, endstop and hotend Marlin DUAL_X_CARRIAGE; Klipper [dual_carriage] Cartesian and hybrid CoreXY machines
Toolchanger kit 2 or more A dock and swappable toolheads Community Klipper add-ons, or the maker’s firmware Voron (StealthChanger, TapChanger), Prusa CORE One (INDX)
Maker conversion kit Up to 7 New toolhead, heatbed, board and hotend rack Becomes an H2C Bambu Lab H2S and H2D only

Only the fixed and lifting dual hotends are a “second extruder” in the narrow sense. Cyclops-style hotends and filament changers still print every material through one nozzle, so they flush between materials. IDEX is a different machine design, not an add-on: Klipper’s [dual_carriage] supports “cartesian, generic_cartesian and hybrid_corexy/z printers”, so a standard CoreXY printer cannot use it as is. Toolchangers are covered in multi-color printing.

How to make a dual extruder 3D printer: the build steps

  1. Check the board. Find a free stepper driver, heater output and thermistor input. If any is missing, plan a bigger board or, on Klipper, a second controller.
  2. Mount the second hotend. Mount it beside the first and set both nozzle tips to the same height before tightening.
  3. Wire it. Connect the second extruder motor, heater cartridge, thermistor and hotend fan.
  4. Configure the firmware. Add the second extruder (sections below), then run PID tuning (the heater’s temperature-control calibration) on the new heater.
  5. Set up the slicer. Add the second extruder to the printer profile.
  6. Calibrate the nozzle offset. Print a test with both nozzles and enter the X and Y offset of the second; see dual nozzle offset calibration.

Klipper: [extruder1] and T0/T1 macros

Klipper names extra extruders [extruder1], [extruder2] and so on, with the same parameters as [extruder]. ACTIVATE_EXTRUDER “changes the active hotend”, and SET_GCODE_OFFSET is “commonly used to virtually change the Z bed offset or to set nozzle XY offsets when switching extruders”. The slicer emits T0 and T1, so you write those as macros. This is adapted from Klipper’s sample-multi-extruder.cfg:

[extruder1]
step_pin: ...          # second driver's pins
dir_pin: ...
enable_pin: ...
rotation_distance: ... # calibrate like the first extruder
nozzle_diameter: ...
filament_diameter: ...
heater_pin: ...        # second heater output
sensor_type: ...
sensor_pin: ...        # second thermistor input
control: pid
# pid_Kp/Ki/Kd: from PID_CALIBRATE HEATER=extruder1
min_temp: ...
max_temp: ...

[gcode_macro T0]
gcode:
    SET_GCODE_OFFSET X=0 Y=0 Z=0 MOVE=1
    ACTIVATE_EXTRUDER EXTRUDER=extruder

[gcode_macro T1]
gcode:
    SET_GCODE_OFFSET X=<measured> Y=<measured> MOVE=1
    ACTIVATE_EXTRUDER EXTRUDER=extruder1

Klipper’s sample adds a SET_SERVO line to each macro for a lifting nozzle. For a Cyclops-style hotend with one heater, do not use shared_heater. Klipper removed that option and replaced it with [extruder_stepper] sections switched by SYNC_EXTRUDER_MOTION.

Marlin: EXTRUDERS 2 and HOTEND_OFFSET

In Configuration.h, set:

#define EXTRUDERS 2
#define E1_DRIVER_TYPE TMC2209            // match your driver
#define TEMP_SENSOR_1 1                   // sensor type, same table as TEMP_SENSOR_0
#define HOTEND_OFFSET_X { 0.0, <measured> }
#define HOTEND_OFFSET_Y { 0.0, <measured> }

Marlin’s comment says the offset “has to be X=0, Y=0 for the extruder 0 hotend”, and for the others it is “their distance from the extruder 0 hotend”. HEATER_1_MAXTEMP sets the second hotend’s limit (275 °C by default). After flashing, fine-tune with M218 T1 X<offset> Y<offset> and store it with M500. Use #define SINGLENOZZLE instead for “Cyclops or any ‘multi-extruder’ that shares a single nozzle”, or SWITCHING_NOZZLE for “a dual-nozzle that uses a servomotor to raise/lower one (or both) of the nozzles”.

Slicer: second extruder profile

In PrusaSlicer, switch to Expert mode and open Printer Settings > General > Capabilities > Extruders, then set it to 2. Leave Single Extruder Multi Material off. Its tooltip reads “The printer multiplexes filaments into a single hot end.”, which is the Cyclops-style setup. Each extruder page also has Extruder offset under “Position (for multi-extruder printers)”. PrusaSlicer says to use it “if your firmware doesn’t handle the extruder displacement”. Set the offset in the firmware or in the slicer, never both.

Why do the two nozzle tips need to be the same height?

Both nozzles ride on one carriage, so the lower one drags through what the higher one prints. Marlin only accepts a Z hotend offset with DUAL_X_CARRIAGE or SWITCHING_NOZZLE, so on a fixed pair you set the tips level by hand. Klipper’s SET_GCODE_OFFSET Z= shifts the whole carriage, so it cannot stop the idle nozzle from dragging. A lifting nozzle avoids the problem: Klipper’s sample config and Marlin’s SWITCHING_NOZZLE both raise one nozzle with a servo. The idle hot nozzle also leaks; dual nozzle ooze covers standby temperatures and prime towers.

How much build width do you lose with two nozzles?

Roughly the distance between the nozzles. The carriage travel does not change, so each nozzle reaches a band of the bed shifted by that spacing, and only the overlap can be printed with both. Bambu Lab’s H2D shows the effect. Each of its nozzles reaches 325 mm across, but the right nozzle’s area starts 25 mm to the right of the left one’s. The area both reach is 300 × 320 mm. Marlin’s sample config uses a 20 mm X offset. A wider carriage can also hit the frame sooner, so re-check your X limits after the mod. Single-material prints can still use the full reach of one nozzle.

Sources

  1. Klipper documentation, Configuration reference (accessed October 12, 2026)
  2. Klipper documentation, G-Codes (accessed October 12, 2026)
  3. Klipper documentation, Configuration Changes (accessed October 12, 2026)
  4. Klipper source, sample-multi-extruder.cfg (accessed October 12, 2026)
  5. Marlin documentation, M218 Set Hotend Offset (accessed October 12, 2026)
  6. Marlin source, Configuration.h (accessed October 12, 2026)
  7. Marlin source, Configuration_adv.h (accessed October 12, 2026)
  8. PrusaSlicer source 2.9.2, Tab.cpp (printer settings pages) (accessed October 12, 2026)
  9. PrusaSlicer source 2.9.2, PrintConfig.cpp (option tooltips) (accessed October 12, 2026)
  10. BIGTREETECH wiki, SKR MINI E3 (accessed October 12, 2026)
  11. BIGTREETECH wiki, Octopus Pro (accessed October 12, 2026)
  12. E3D store, Cyclops & Chimera Spares (accessed October 12, 2026)
  13. MatterHackers, E3D Chimera+ Air Cooled Dual Extrusion Hotend 1.75 mm (24 V) (accessed October 12, 2026)
  14. StealthChanger (GitHub) (accessed October 12, 2026)
  15. TapChanger (GitHub) (accessed October 12, 2026)
  16. Prusa Research, INDX 4-Tool Conversion Kit for CORE One (Gen 2) (accessed October 12, 2026)
  17. Happy Hare (GitHub) (accessed October 12, 2026)
  18. Bambu Lab Wiki, Vortek system FAQ (accessed October 12, 2026)
  19. Bambu Lab Wiki, Introduction to the printable range of H2D dual nozzles (accessed October 12, 2026)