This is the general holding page for M2 Dual Extruder upgrade information and usage instructions.

This document covers the basics of working with the M2 Dual Extruder upgrade; for installation instructions, please see the installation documentation.


A note before beginning: Do not over-tighten screws

The dual upgrade uses tapped holes in printed plastic and milled aluminum parts for mounting and securing various components; both, if over-tightened, can fail, though obviously the plastic parts will require less force to do so. When moving/tightening/altering anything, keep an eye on the parts for signs of over-tightening (deformation or whitening of the printed parts, or aluminum shavings/debris from the metal parts), and attempt to match the original screw torque and component position.


All firmware is now hosted on the M2 Firmware page.


The dual's two V4 hotends use a similar temperature profile to the V3B: 245°C for ABS, and 220°C for PLA, are good starting points.


Controlling the second extruder isn't very difficult, though it does involve some retraining, as most of the gcode commands are the same, however, for single extruder use we often omit the tool number. In all references, Tool 0 is the Left extruder, and Tool 1 is the Right extruder.


T is the command for changing tools. Sending "T" by itself will echo back the current tool number, while sending "T0" or "T1" will change the printer to that tool number. Changing tools will also change the coordinate system to reference the new tool (or more specifically, will apply the configured tool offset to the base coordinate system).

M104 Tn Sm

Sending "M104 Sm" without specifying a tool will set the current tool to m°C. Sending "M104 Tn Sm" will set tool n to m°C, no matter which tool is active.

M218 Tn Xm Yp

Sending "M218" by itself will echo back the current hotend offsets for T0 and T1. Sending "M218 Tn Xm Yp" with any option omitted will leave the current setting - so "M218 X28" will set the current tool's X offset to 28mm, and will not change the Y offset. Sending "M218 T1 X25 Y-0.25" will set T1's X offset to 25mm and Y offset to -0.25mm.

Offsets should only be applied to Tool 1; the Tool 0 offset should always be X0 Y0.

[G0/G1] Fn Em

G0 and G1 are move commands (G0 is originally a rapid move, but in Marlin is mapped to G1 anyway). Sending "G1 F2400 E-5" will retract the current extruder 5mm at 2400mm/min. G1 only works with the current tool, and always calls that axis E, so you'll need to switch tools if you wish to control the other extruder.


The basic process for slicing models for dual extruder printing depends on the desired end result; if you just wish to use the second extruder for support material or infill, you can simply define the second extruder and tell your software to use whichever tool for whichever areas - in S3D, you can choose between the tools for Perimeters/layers, Infill and Support; slic3r has similar options.

S3D also allows you to print multiple models in the same job, with the different extruders, by defining multiple Processes and combining the output gcode. This is useful if you wish to print models with multiple colors/materials, but the desired second extruder area isn't restricted to infill or support (http://www.thingiverse.com/thing:28202 is a nice example).

The basic process in S3D is similar, except you will first create your basic Process with both extruders defined, your desired layer height, extrusion width, retraction settings, etc. etc. (though one thing to note is that you will generally _not_ want to use a raft, as S3D will generally generate a raft for both Processes that overlaps significantly). You will then add a new Process, which will copy the current Process. Name the first Process Left or 0, and the second process Right or 1 (optional but good for clarity). Then go into the Right Process and change the perimeter and infill extruder to the Right extruder (or whatever you have it named in the Extruder tab).

Once you have the two processes defined, you can add and arrange your models - S3D will place them automatically for you, but only as though they are separate objects - you'll need to manually place them by double clicking each model and settings it's X and Y offset to 100 and 125; Z is variable - if the model is supposed to be off the table, set it to 0; if the model is supposed to be on the table, leave it to what S3D set. That all assumes that your models are both set to use the same origin and coordinate system - if they're not, you'll need to experiment with the offsets to get them positioned how you'd like to print them.

Finally, go back into each Process and click Select Models, and only highlight the model you want printed with that Process/extruder. Then you're ready to slice the models - click "Prepare to Print!" and S3D will ask you which Process to prepare. Select both Processes, and then choose the radio button for Continuous Printing: Layer-by-layer. S3D will then generate the gcode. As usual, you'll want to step through it and look for any obvious issues.

S3D does not have specific options for dual extruder tool change retraction or temperature changing, however, it does have the Toolchange scripts section, where you can manually add these functions. A basic retract and recover script is:

T[old_tool] ; switches to old tool
G92 E0 ; zeroes old tool
G1 F2400 E-6 ; retracts 6mm at 2400mm/min
G92 E0 ; zeroes old tool again
T[new_tool] ; switches to new tool
G92 E0 ; zeroes new tool to be official/careful
G1 F2400 E6 ; extrudes 6mm at 2400mm/min to recover from the previous manual retract
G92 E0 ; zeroes new tool one last time, then carries on with S3D standard commands

(S3D may not like the text above due to the comments, as I added those for this document - remove the space and all text after the main command if you have an issue).

A temperature modification on that is simple as well:

M104 T[old_tool] S190 ; set the old tool to 190°C
M104 T[new_tool] S210 ; set the new tool to 210°C

The above temperature changing series is completely untested but should work; you can also use "M109" in the second command to wait to resume printing, until the [new_tool] is up to temp.

If your two hotends need to be at different temperatures, a bit of post-processing may be needed:

M104 T[old_tool] Sfoo
M104 T[new_tool] Sbar

With the above, you would then open the resulting gcode in a text editor, and do a search/replace for, for instance, "T1 Sbar" and replace all instances with "T1 S245"; then you'd also search for "T0 Sbar" and replace all instances with "T0 S220". You would then repead the process for the idle temperatures, but searching to "Tn Sfoo". This exact setup is likewise untested.

There are three S3D files attached to this page: Dual_Julia_Vase.factory is a .factory file that can be imported into S3D, and includes the models of the "Julia Vase #002 - Yin Yang" by thingiverse user virtox (http://www.thingiverse.com/thing:28202). dual_left.fff and dual_right.fff are just the Left and Right processes from the same .factory file, and can be imported into S3D as Processes as a starting point for dual slicing/printing. All three of these files are setup without temperatures.


Bed leveling

Bed leveling with the dual is the same as with the single extruder, however you should make all measurements/adjustments in relation to the Left hotend. If the Right hotend is lower than the left, loosen the M3 screw securing in into the aluminum motor plate, raise it up until it's above the Left hotend, and lock it gently back in place. Then continue with bed leveling.

Once the bed is level, set the Z endstop activation position (again in the standard way). Once the bed is level to the Left hotend, and the Z endstop is set correctly, continue on to Nozzle leveling below.

Nozzle leveling

Once the bed is level to the Left hotend, you can bring the bed up until the left nozzle touches in the center of the bed, then loosen the M3 screw securing the right hotend and let it gently drop down until it too is touching the bed. Verify that there's nothing between the bed and nozzles (filament, extra folds/ridges of polyimide tape, etc.), and then gently tighten the M3 screw securing the Right hotend. Drop the bed slightly and move the extruders left and right, observing the gap between the nozzles and the bed - if it's consistent for both nozzles, fully tighten (again, aiming for the original torque on that screw, and avoiding over-tightening - the Right hotend only needs to be unable to rotate in the mounting plate) the M3 screw securing the Right hotend.

Tool offsets

As covered above in the Gcode section, M218 adjusts the T1 offset. While measuring the distance between the nozzles is possible, unless the [imaginary] line through both of them is exactly parallel to the X axis, you'll also have a Y offset that will be much more difficult to measure. The easiest solution to this is to use your base measurement as a starting point, and "walk in" the offsets as you run a print designed for the purpose.

There are three files attached for this purpose: mydual2.gcode is a .gcode file with this test already setup, and files dualbottom.STL and dualtop.STL are the files used in that .gcode file. The .gcode file is again sliced without temperature settings.

To use that file, heat up the bed and both hotends, and start the print. Observe the relative position of the prints of both extruders - if you can see a gap between the two perimeters, or the two perimeters overlap, you'll need to adjust that offset for that axis.

To adjust the X offset, you'll use "M218 T1 Xn" where n is your offset. The default value in the dual firmware is 31.1, which should be pretty close. A positive adjustment (n+0.5 for instance) will move the L shaped "bottom" print left in relation to the "top" box 0.5mm. The box will not shift. A negative adjustment will move the L shaped print right in relation to the box.

To adjust the Y offset, you'll use "M218 T1 Yn" again with n as your offset. The default value in the dual firmware is 0, which again should be pretty close. A positive adjustment of n+0.5 will "lower" (if looking at the print from directly above) the L shaped print in relation to the box. A negative adjustment will move the L shaped print "upward" in relation to the box.

LCD Control

The Dual Extruder can be controlled through normal host software, or through an attached LCD. Older stable versions of Marlin do not fully support control of both extruders through the LCD, however - you can control both temperatures, but only manually extrude/retract Tool 0. To overcome this, a small set of macros were developed, which allow easy control of both extruders.

The file DualMacros.zip contains a folder that can be unzipped and transferred to the SD card in your LCD, which will then let you control the extruders. There are four subfolders:

  • "ABS"
  • "Cold"
  • "None"
  • "PLA".

Inside of each folder are four .g files:

  • "T0EXTRUD.G"
  • "T0RETRCT.G"
  • "T1EXTRUD.G"
  • "T1RETRCT.G"

The EXTRUD files will switch to the relevant Tool number (T0 or T1), heat up to the relevant temperature (220°C for PLA, 245°C for ABS), and Extrude 300mm of filament at 250mm/min. If the file is run from the Cold directory, the file will first disable the Cold Extrusion lockout before running; if run from the None directory, the file will not change the temperatures that are in use (so you can preheat to whatever temperature you need, then run the None file to extrude or retract filament).

The RETRCT files will run the exact same process, but will instead Retract 300mm of filament at 250mm/min. The temperature and tool notes above apply.