Open Source: Download, Build + Calibrate

We are a proud member of the open source 3D printing revolution:

REVOLUTIONi3 Open Source Files

We have posted our design files for the new REVOLUITONi3 3D Printer including our new cable chain system on pinshape for download.  The new cable chain system is compatible with our previous 3D printers and any other RepRap Prusa i3 Reworks

Download all files on pinshape

REVOLUTIONi3 3D Printer Build Documentation and Schematics
Cable Chain System:
The Revolution Media Group Cable Chain System | Specifically Designed for the Rep Rap Prusa Medel Rework i3 and our version the Revolutioni3.  The parts also  work nicely in any project of your own configuration.

Cable chain system that completely covers all cables for the Prusa i3 Rework design build. Specifically designed for RYERSON University in Toronto Canada. This is our new standard system for the REVOLUTION i3, our latest 3D printer release.


For the schematic and key see the pictures section below. There is a picture of the system and in flow chart form with the Number Key beside

Note that your RepRap Prusa i3 Rework wire lengths may need to be changed due to our cable chain system design. Here is the specific Wire Lengths needed For our Cable Chain System: Left Z Motor = 70cm Right Z Motor = 100cm Power Button = 70cm Z End Stop = 50cm X Motor = 60cm Y End Stop = 65cm Power Cable = 60cm Extruder Fan = 90 cm Extruder motor = 60cm Thermister = 105 cm Hot End Power Cables = 65cm

 While we are compiling our build documentation to post here, we have listed the build documentation and calibration process for our previous model.  Our new printer has a different build structure than below.


The purpose of this document is to provide a visual guide needed to build a Prusa Mendel i3 3D Printer.  The machine and the assembly instructions are licensed by GPL. Files.The Prusa Mendel i3 is the third version of the open source 3D printer Prusa Mendel. Our version is based on an aluminium frame cut by water jet cutter and threaded rods. Axis motion is made on linear bearings, belts and pulleys or threaded rods and NEMA 17 motors.Prusa Mendel i3 presentation

Overview of the Prusa i3 Rework.

  1. Introduction + Improvements
  2. Bill of materials
  3. Y-axis assembly
  4. X-axis assembly
  5. Connecting X-axis and Z-axis
  6. Motor assembly
  7. X and Y-axis motions
  8. Heated bed assembly
  9. Extruder assembly
  10. CNC Assembly
  11. Electronics and wiring


  • Extruder upgrade: Magma Hotend (by Trinity Lab) support.
  • New cooling fan duct for Magma Hotend.
  • Y Idler with a tensioner system.
  • X End Idler with endstop holder.
  • Upgrade X End Idler in order to support 624 bearing.
  • Y Motor with endstop holder.
  • Addition of Z endstop Holder in situ.
  • Addition of a Dremel FlexShaft Attachment for 3 Axis CNC Milling.


Bill Of Materials:

Printed parts


Smooth and threaded rods

  • 2x Smooth rod Ø8×320 mm
  • 2x Smooth rod Ø8×350 mm
  • 2x Smooth rod Ø8×370 mm
  • 2x Threaded rod M5x300 mm
  • 4x Threaded rod M10x210 mm
  • 2x Threaded rod M10x380 mm

Mechanical parts

Heated bed


Screws, nuts and washers

If using the SainSmart endstops then you will need 2 M3 flat head screws per endstop that uses the bottom 2 holes to attach it (example the X-Idler) as the SainSmart endstops has a bad design flaw that gives absolutely zero clearance for the two lower screws as the wiring harness is too close to the pcb and over laps some of the 2 bottom open holes (wiring harness points downward at a 90 degree angle). With these you can bend up the wiring harness, ever so slightly and be extremely cautious and gentle, to get the flat head M3 screw heads to go under the harness. Once they are under the harness proceed to attach with the nuts but remember the heads MUST come into the holes from the side with the wiring harness due to the mentioned lack of any clearance.

If you are having a hard time finding the M3x60mm screws you can use 1/8 inch toggle bolts and remove the screw in piece from the toggle side (easily comes out) and it fits perfectly on the extruder. Use springs and a washer and you are set though I did use a Dremel to remove the threads for 1/2 of the bolt.

Aluminium frame

  • 1x Single frame
  • 1x Heated bed mount


Prusa i3 Rework Y axis assembly

Heated bed mount

Needed parts :

  • Heated bed mount
  • Y Belt Holder
  • 3x Linear bearing LM8UU
  • 2x M3x14 mm screw
  • 2x Ø3 mm washer
  • 2x M3 nut

Mount the Y Belt Holder with two M3x14 mm screws (since the aluminum is 6mm thick and the Y Belt Holder is 4mm thick the screws are too long by 4mm since you must NOT have the screws coming out of the other side (the heated bed side) and this means you will have to trim the two screws down by 4mm), two Ø3 mm washers and two M3 nuts. Y Belt Holder orientation doesn’t matter.

Place three LM8UU linear bearings and fix them with three zip-ties.

Transverse parts

Needed parts :

  • 4x Y Corner
  • Y Idler
  • Y Motor
  • 1x Ball bearing 608
  • 4x Threaded rod M10x210 mm
  • 22x M10 nut
  • 22x Ø10 mm washer
  • 1x M8x30 mm screw
  • 1x M8 nut
  • 2x Ø8 mm wahser
  • 1x M4x20 mm screw
  • 1x M4 nut

Step 1

Drill with a 10 mm drill the four Y Corner holes (displayed in green). Set counterclockwise rotation and drill progressively and carefully along the axis.

Drilling Y Corner hole.

Step 2

Y Idler assembly: place a M4 nut inside and put a M4x20 mm screw. In case of difficulty, slightly heat the nut using a lighter or a blowtorch and place it with a clamp. Insert a 608 ball bearing into the groove and slide and M8x30 mm screw with two Ø8 mm washers and a M8 nut. You may have to force the screw into the part. Tighten slightly.

Y Idler assembly.

Step 3

Slide the Y Idler assembly in the middle of a threaded rod M10x210 mm and between two Ø10 mm washers and two M10 nuts. Do not tighten the nuts. Thread a M10 nut and washer about 30 mm on both ends. Do the same with a threaded rod M10x210 mm.

Y Idler assembly with threaded rod M10x210 mm.

Step 4

Slide two threaded rods M10x210 mm on the Y Motor and fix it with four M10 nuts and four Ø10 washers. Do not tighten the nuts. Thread a M10 nut and washer about 30 mm on both ends.

Y Motor assembly with two threaded rods M10x210 mm.

Step 5

Take two Y Corners, the Y Idler assembly and the threaded rod M10x210 mm and fix them with four Ø10 washers and four M10 nuts. Do the same with the Y Motor assembly with two Y Corners. In both cases, adjust the distance between two Y corners (186 mm). Slightly tighten the nuts.

Transverse parts assembly.

Assembly with the longitudinal parts

Needed parts :

  • Heated bed mount assembly
  • Transverse parts
  • 2x Smooth rod Ø8×350 mm
  • 2x Threaded rod M10x380 mm
  • 12x M10 nut
  • 12x Ø10 mm washer

Step 1

Take two threaded rods M10x380 mm, slide two Ø10 mm washers and thread two M10 nuts in the middle. Thread a M10 nut and washer about 30 mm on both ends.

longitudinal rods assembly.

Step 2

Insert the previous rods in a transverse side and fix them with two Ø10 mm washers and two M10 nuts. Do not tighten the nuts yet.



Step 3

Insert two smooth rods Ø8×350 mm in Y Corner top until the end. Slide the Heated bed mount assembly on both smooth rods carefully.

Smooth rods Ø8×350 mm assembly.

Step 4

Insert the last transverse side on smooth rods Ø8 and threaded rods M10. Fix them with two M10 nuts and two Ø10 mm washers. Fasten the smooth rods with four zip-ties.

Tighten with a wrench the entire assembly with care. Make sure that the four Y Corners touch the ground. Do not tighten Y Motor and Y Idler nuts.

Overview of Y axis assembly.

To finish, make sure that the Y-axis move smoothly. Otherwise, verify the distance between Y Corner lateral faces (186 mm).


Prusa i3 Rework X axis assembly


X End Idler & X End Motor assembly

Needed parts :

  • X End Idler
  • X End Motor
  • 1x 624 ball bearing
  • 4x LM8UU linear bearing
  • 1x Endstop
  • 2x M5 nut
  • 1x M4x20 mm screw
  • 1x M4 nut
  • 2x M3x14 mm screw
  • 2x M3 nut

Please take note that Step 1 is if you are using the vanilla Prusa I3 and is not required if you use the RP designed for the Reworked version found at

Step 1

Drill with an 8 mm drill X End Idler and X End Motor holes (displayed in green). Do not drill deeper than 20 mm on the X End Motor. Set counterclockwise rotation and drill progressively and carefully along the axis.

Drilling X End Idler and X End Motor holes.

Step 2

Push two LM8UU linear bearings in the X End Idler and two LM8UU linear bearings in the X End Motor. They can be pushed with hands but you can use a rubber mallet carefully if necessary.

Inserting LM8UU linear bearings.

Step 3

Insert an 624 ball bearing (the smallest) between the X End Idler and slide an M3x20 mm screw.

You may have to force the screw into the part but on the Rework’s RP (link above) simply screw the M3 into both sides but do not force it. Fix them with a M3 nut and tighten slightly.

624 ball bearing assembly in the X End Idler.

Step 4

Insert two M5 nuts in their marks. In order to do that, thread a threaded rod M5x300mm opposite to the nut. Slightly heat the nut using a lighter or a blowtorch then pull the rod. Be careful with this operation.

M5 nuts assembly.

Please note that Step 5 will not work with the SainSmart endstops as the wiring harness on the endstops gives zero room for any nuts or screws to attach the endstop to the Idler. The only way to fix this is to use a flat head screw from the side with the cable wiring harness. Even then 14mm is way too long and 8-10mm would be adequate.

Step 5

Affix one endstop with two M3x14 screws and two M3 nuts on the X End Idler.

X-axis endstop assembly.

X Carriage

Inserting LM8UU linear bearings on the X Carriage.

Needed parts :

  • X Carriage
  • 4x LM8UU linear bearing
  • Zip-ties

Insert four LM8UU linear bearings on the X Carriage and fix them with eight zip-ties. Make sure to put the « head » of the zip-tie on bearings side.

X-Axis assembly

X-Axis assembly.

Step 1

Push two smooth rods Ø8×370 mm through the X End Motor. Use a rubber mallet carefully if necessary. The excess length is about 345 mm.

Step 2

Slide the X Carriage assembly carefully through smooth rods.

Step 3

Insert the X End Idler assembly and adjust the distance between both Z-axis (about 362 mm).


Prusa i3 Rework Connecting X axis and Z axis

Connecting X-axis and Z-axis

Needed parts :

  • Single frame
  • X-axis assembly
  • Z Axis Top Left
  • Z Axis Top Right
  • Z Bottom Left
  • Z Bottom Right
  • 2x Smooth rod Ø8×320 mm
  • 10x M3x14 mm screw
  • 10x M3 nut
  • 10x Ø3 mm washer

Step 1

Fix Z Axis Top Left and Z Axis Top Right on the single frame with four M3x14 mm screws, four Ø3 mm washers and four M3 nuts. Make sure that the nut is at the back of the single frame.

Mounting Z Axis Top on single frame.

Step 2

Fix Z Axis Bottom Left and Z Axis Bottom Right on the single frame with six M3x14 mm screws, six Ø3 mm washers and 6 M3 nuts. Make sure that the nut is at the back of the single frame.

Mounting Z Axis Bottom on single frame.

Step 3

Insert two smooth Ø8×320 mm carefully on both Z Axis Top and slide them by half.

Inserting two Ø8×320 mm smooth rods on single frame.

Step 4

Insert the X-axis assembly through smooth rods carefully. Slide the two smooth rods and insert them in both Z Axis Bottom. The two rods do not have to exceed both Z Axis Botoom.

To finish, make sure that the X-axis move smoothly on the Z-axis. Otherwise, verify the distance between both Z-axis (360 mm).


Prusa i3 Rework Motor assembly


Needed parts :

  • Endstop Z Holder
  • 2x Coupling 5×5
  • 2x NEMA 17 motor
  • 1x Endstop
  • 2x Threaded rod M5x300 mm
  • 8x M3x14 mm screw
  • 2x M3 nut
  • 8x Ø3 mm washer

Step 1

Insert a threaded rod M5x300 mm at the half length of a coupling 5*5 and fix it with two grub screws. Do the same for the other rod.

Step 2

Thread each threaded rod in X End Idler and X End Motor M5 nut at half length.

Threading two M5 rods on X-axis.

Step 3

Take the single frame assembly and place two NEMA 17 motor with their supply wires against the aluminum frame. Optional feature: cut the supply wires at half-length and insert them through the dedicated hole. If you do not want to solder the wires, you can place them through the bottom notch.

Step 4

Fix an endstop to the Endstop Z Holder with two M3x14 mm screw, two Ø3 mm washers (on the rear) and two M3 nuts. Slightly tighten it at half height. The adjustment will be made in the following.

Z-axis endstop assembly on the Z Endstop Holder.

Step 5

Place the Endstop Z assembly on the Z Axis Bottom left and fix it with left motor with three M3x14 mm screws and three Ø3 mm washers.

Fix right motor with three M3x14 mm screws (on the Kysan 1124090 stepper motor M3x14mm is 1.5mm-2mm too long and you will need to cut off 2mm from the screws) and three Ø3 mm washers.

Z-axis endstop and motor assembly.

Step 6

Fix both coupling at both motor shafts with grub screws. Make sure to place a grub screw in the face of the flat of the shaft.

Tighten both grub screws with an Allen wrench.

Z-axis coupling assembly.


Needed parts :

  • 1x NEMA 17 motor
  • 1x Endstop
  • 1x GT2 pulley
  • 5x M3x14 mm screw
  • 2x M3 grub screw
  • 2x M3 nut
  • 5x Ø3 mm washer

Step 1

Thread two M3 grub screws on a GT2 pulley. Slide this pulley on the motor shaft and fix it. Make sure to place a grub face to face with the flat of the shaft.

Assembling GT2 pulley on motor shaft.

Step 2

Place and fix the previous NEMA 17 motor on the Y Motor with three M3x14 mm screws (on the Kysan 1124090 stepper motor M3x14mm is 1.5mm-2mm too long and you will need to cut off 2mm from the screws) and Ø3 mm washers. Place supply wires down.

Place and fix an endstop with two M3x14 mm screws and two Ø3 mm washers. The endstop have to be on the bottom of the groove.

Please note that the above step will not work with the SainSmart endstops as the wiring harness on the endstops gives zero room for any nuts or screws to attach the endstop. The only way to fix this is to use a flat head screw from the side with the cable wiring harness. Even then 14mm is way too long and 8-10mm would be adequate.

Assembling Y-axis motor and endstop.


Needed parts :

  • 1x NEMA 17 motor
  • 1x GT2 pulley
  • 3x M3x14 mm screw
  • 2x M3 grub screw
  • 3x Ø3 mm washer

Step 1

Thread two M3 grub screws on the GT2 pulley. Slide this pulley on the motor shaft and fix it. Make sure to place a grub screw face to face with the flat of the shaft.

Step 2

Place and fix the previous NEMA 17 motor on the X End Motor with three M3x14 mm screws (on the Kysan 1124090 stepper motor M3x14mm is 1.5mm-2mm too long and you will need to cut off 2mm from the screws) and Ø3 mm washers. Place supply wires down.

X-axis motor assembly.

Mechanical frame assembly

Needed parts :

  • Y-axis assembly
  • Single frame assembly

Step 1

Insert the single frame assembly between both M10 nuts and Ø10 mm washers which are on the Y-axis assembly. The Y-axis assembly has to be inserted on both single frame grooves. Moreover, the Y Motor has to be placed nearest you.

Step 2

Adjust the single frame assembly to have 245 mm from the front of the aluminium frame to the external side of an Y Corner. Make sure that this dimension is verified on both left and right sides of the heated bed. This setting allows you to maximize printing workspace.

Connecting Y-axis and X and Z-axis assembly (.

Step 3

Strongly tighten both couple of M10 nuts and Ø10 mm washers on the single frame assembly. Make sure that the mechanical frame is stable.


Prusa i3 Rework X and Y axis motions

X-axis belt

Needed parts :

  • GT2 Belt (900 mm)
  • Zip-ties

Step 1

Insert one end of the belt on one side of the X Carriage, do a loop and fix it with two zip-ties. The belt should be at the same level as the slot.

Step 2

Insert the belt either to the X End Idler or to the X End Motor depending to how you placed the belt on the previous step.

Do a loop, temporarily tighten the belt and insert it on the last slot of the X Carriage.

X-axis belt.

Step 3

Tighten the free end of the belt and fix it with two zip-ties.

This step is difficult so please take the time to make a proper tightening.

Assembling X-axis belt on heated bed mount.

Y-axis belt

Needed parts :

  • GT2 belt (760 mm)
  • Zip-ties

Step 1

Return your machine and align Y Motor pulley, Y Belt holder and Y Idler bearing. The Y Idler assembly should not be fixed.

Step 2

Insert one end of the belt on one side of the Y Belt Holder, do a loop and fix it with two zip-ties.

The belt should be at the same level as the slot.

Assembling Y-axis belt on Y-axis assembly

Step 3

Insert the belt either to the Y Idler or to the Y Motor depending to how you placed the belt on the previous step.

Do a loop, temporarily tighten the belt and insert it on the last slot of the Y Belt Holder.

Y axis belt.

Step 4

Move your Y-axis near the motor. Adjust Y Motor placement to align the belt properly. This helps to avoid some friction of the belt (I spent 45 minutes trying to make step 4 and step 5 perfect and you just aren’t going to get it perfect so do the best you can to keep the belt from hitting the sides of the GT-2 pulley and/or the Y Idler when you move the plate along the Y-Axis). Make sure that both bolt couples are aligned. Tighten the nuts with hands.

Step 5

Move your Y-axis at the opposite and do the same operation. Repeat the step 4 and 5 until your Y belt is properly aligned.

Step 6

When the belt is aligned, tighten the free end of the belt, and fix it with two zip-ties. Slightly tighten the belt, and cut both ends if necessary.

Step 7

An M4x20 mm screw located on the Y Idler allows you to tighten the belt properly, but be careful because it is not necessary to strongly tighten the belt as it has to be a little loose.


Prusa i3 Rework Heated bed assembly

Thermistors assembly

Needed parts :

  • 2x Thermistor
  • 2x Connecting wire (2 pins)
  • Teflon wire (not included)
  • Polyimid tape

Step 1

Insert two teflon wires at both ends to protect the thermistors. Let the ends free to weld connecting wires (see pictures below).

Protecting thermistors with teflon wires.

Step 2

Weld two connecting wires to both thermistor ends. Repeat this step for the other thermistor. We strongly recommend you to protect the weld with heat shrink tubing or an insulating adhesive tape.

Thermistors welded and protected.

Heated bed assembly

Needed parts :

  • 1x PCB heatbed
  • 1x Glass plate
  • 1x Thermistor assembly
  • 4x Binder clip
  • 4x M3x14 mm screw
  • 4x M3 nuts
  • 16x Ø3 mm washer

Step 1

Place the glass plate on the top of the PCB heatbed (the face with wrinting) and fix it with four binder clips.

Step 2

Use high temperature silicone and place a drop in center hole (PCB heatbed bottom side).

Step 3

Place the head of the thermistor in the center hole and make sure that there is a contact with the glass plate. Fix thermistor wires with some Polyimid tape.


Step 4

Cover the glass plate with Polyimid tape to improve adhesion during future printings. Make sure to remove air bubbles during this step.

Step 5

Fix the Heated bed assemby on the Heated bed mount (Y-axis) with three Ø3 mm washers between, one Ø3 mm washer on top, an M3x14 mm screw and an M3 nut on each corner.

Y plate Mount.


Prusa i3 Rework Extruder assembly

Extruder assembly

Needed parts :

  • Wade Extruder Body
  • Extruder Idler
  • Fan duct
  • 3x 608 ball bearing
  • 1x Fan 4×4
  • 1x Connecting wire (2 pins)
  • 1x Hobbed bolt
  • 2x Springs
  • 1x M8x20 mm grub screw
  • 4x Ø8 mm washer
  • 1x M8 Nylstop nut
  • 4x M4 nut
  • 2x M3x60 mm screw
  • 3x M3x30 mm screw
  • 4x M3x14 mm screw
  • x M3 nut
  • x Ø3 mm washer

Step 1

Insert two M4 nuts in their marks. To do that, slightly heat the nut using a lighter or a blowtorch then push it in his mark. Be careful with this operation.

Keep the two others nuts for a following step.

Inserting two M4 nuts on the Wade Extruder Body.

Step 2

Slide an M8x20 mm grub screw thhrough a, 608 ball bearing then push this assembly inside the extruder idler. You may have to use a rubber mallet.

608 ball bearing assembled.

Step 3

Fix this assembly to the Wade Body Extruder with an M3x30 mm screw and an M3 nut. Slightly tighten to allow its rotation.

Step 4

Slide the Wade Big Gear through the hobbed bolt and slide it in the Wade Body Extruder with the following components: three Ø8 mm washers, two 608 ball bearings, one Ø8 mm washer and a M8 Nylstop nut. Before tightening, make sure that the teeth’s is facing the hole.

Extruder assembly.

Step 5

Insert two M3 nuts in their slots and use two M3x60mm screws with two Ø3 mm washers (rondelle) and two springs to maintain the Extruder Idler.

Fixing the Extruder Idler with two M3x60 mm screws.

Step 6

Make sure that the Magma Hotend is correctly assembled (tighten the parts: Cold End, rod, Hot End and nozzle). Clean the Wade Extruder Body Ø16 mm hole and insert the Magma Hotend. You have to force and to spin the Hot End (see illustration below). Thread in the Wade Extruder Body two M3x30 mm screws progressively to maintain the Cold End.

Magma Hotend assembly details.

Step 7

Take an 4×4 fan and cut the supply wire at half length. Solder the additional supply wire (black/black and red/red) and solder the plug again. We recommend you to protect the solder joint with heat shrink tubing or an insulating adhesive tape.

Step 8

Place the fan on the Fan Duct (supply wires down) and make sure that the fan’s air flow is going towards the fan duct then affix the fan to the fan duct with M3x14 mm screws and four M3 nuts.

Fan assembly.

Connecting to X-axis

Needed parts :

  • Extruder assembly
  • Fan duct assembly
  • Wade Small Gear
  • 1x NEMA 17 motor
  • 4x M4x20 mm screw
  • 1x M3x30 mm screw
  • 3x M3x14 mm screw
  • 1x M3 grub screw
  • 2x M3 nut
  • 3x Ø3 mm washer

Step 1

Insert the two previous M4 nuts in their slots and thread M4x20mm screws to maintain the extruder assembly against the X Carriage.

Assembling extruder on the X Carriage.

Step 2

Slide the Wade Small Gear on the shaft of a NEMA 17 motor with an M3 griub screw and an M3 nut inserted in his slot. If necessary, drill with hands the Wade Small Gear hole with an Ø5 mm drill. Make sure to place a grub face to face with the flat of the shaft.

Assembling Wade Small Gear on the motor shaft.

Step 3

Place the motor assembly against the Wade Extruder Body (supply wires upwards). Insert three M3x14 mm screws and three Ø3 mm washers without tightening. A note about the length of these screws: On my Kysan 1124090 motors 14mm was way too long and I had to cut off 1.5-2mm from the screws for them to go all the way into the motor. Please, be aware of this.

Slide the motor assembly against the Wade Big Gear and thread the screws. Make sure that the backlash is minimum.

Extruder motor assembly.

Step 4

Insert the resistor (cartouche de chauffe) into the Hot End (in the dedicated hole). Supply wires should extend from the right when you are facing your printer.

Resistor assembly.

Step 5

Take the other thermistor assembly, place a drop of high temperature silicone and insert the thermistor head in the little notch of the nozzle. The thermistor head should be against the nozzle.

Note: Make sure that the nozzle can move all along the heated bed. To do that, move the extruder assembly on the x-axis and the heated bed on the y-axis.

Step 6

Fix the Fan Duct assembly on the Wade Extruder Body with an M3x30 mm screw and an M3 nut.

Nozzle height adjustment

Note : This adjustment must be repeated when an extruder component (the Magma Hotend for example) is changed.

Step 1

Move the X-axis to the right. You should hear the endstop “clic” at the end. The nozzle should be near the glass plate edge.

Step 2

Rotate simultaneously both Z-axis coupling counterclockwise to move the nozzle down. Move the nozzle down until to be able to pass a sheet of paper folded in half.

Step 3

Move the X-axis to the extreme left and make sure that the nozzle is at the same height. Otherwise, hold the right coupling and rotate the left coupling to move the nozzle up or down.

Step 4

Once the nozzle height adjustment made, adjust the Z-axis endstop until you hear the « clic ». This position defines Z-axis home.


Prusa i3 Rework CNC Assembly

Prusa i3 Rework CNC Milling Addition

The development of a CNC Milling Addition to the Prusa i3 can be made out of any material with a tensile strength great enough to provide clamping force on a Dremel Flex Shaft Attachment or any spindle motor. The aim was to keep weight on the X Axis as minimal as possible and to attempt to reduce vibrations transmitted to the Prusa i3 RW.

Under Development As Of 3/10/14


Prusa i3 Rework Electronics and wiring

Mounting electronics

Needed parts

  • Arduino Mega 2650
  • 4x stepsticks
  • 3x Arduino washer
  • 3x M3x24 mm screw
  • 3x M3 nut
  • 3x Ø3 mm washer

Step 1

Mount the RAMPS on the Arduino Mega 2560. You may have to cut the solder joints located below the RAMPS power supply plug. You should have both power supply plugs on the same side.

Step 2

Plug each stepstick on the RAMPS according to the illustration below. Note the three jumpers under each stepstick. One location still free to plug a dual extruder for example.

Connecting stepsticks to the RAMPS.

A4988 diagram for direction indication.



Step 3

Fix the electronics assembly to the rear of the aluminum plate with three Arduino washers used to electrically insulate it. Power supply plugs are oriented UPWARD (original wiki entry here said downward but the hole orientation of the real Prusa I3 will not allow that). Use three M3x24 mm screws, three Ø3 mm washers (on the RAMPS) and three M3 nuts.

Electronics holes.


All electrical connections are summarized on the following scheme : LIEN PAGE REPRAP

Note : The second extruder may be replace by a fan to cool the print.

RAMPS wiring sheme.

Endstop wiring

Plug the three endstops to the RAMPS with three connecting wires (wires with an « Endstop » mark) according to the following wiring scheme :

Schéma de branchement des endstops sur le RAMPS.

Motors wiring

You have to connect both Z-axis NEMA 17 motors to work in parallel. To do that, weld both power supply wires (cut in a previous step) according to their colors : red/red, green/green, blue/blue and black/black. We strongly recommend you to protect each weld with heat shrink tubing or an insulating adhesive tape.

NEMA 17 wires color can change depending on the supplier and there is no risk in case of a wrong wiring. Indeed, the wires are always associated in pairs (one pair for each coil). SO there is no risk if the color of supply wires doesn’t match the wiring diagram.

Resistor and PCB heatbed wiring

The resistor is not polarized and is pluged to D10.

PCB heatbed is pluged to D08. Make sure to not invert the positive and negative poles.

Thermistors wiring

The thermistor is not polarized. Make sure to not invert the PCB heatbed thermistor and the Extruder thermistor.

Fans wiring

Plug the extruder fan directly to its dedicated power supply pins (see illustration below).

If you have a fan which cools the electronics then plug it directly to the RAMPS.

If you have a fan which cools the print then plug it to D9.

Wiring scheme for fans.

Power supply wiring

The principle power supply wire is not included. You have to strip an end of a power cable and to connect to the power supply (L, N, G plugs). Make sure to do this operation properly.

The power supply is connected to the RAMPS with additional connecting wires. You have to strip both ends, make sure to follow the scheme correctly.

Power supply wiring.


RepRap Options

This page attempts to make some sense, in general, of how all the pieces fit together to create a RepRap.

However, if you want to skip all this stuff and get straight to getting your hands dirty then your best bet is to take a look at The incomplete reprap beginner’s guide and the build instructions category. In addition to those guides, you may also want to take a look at the links under the Models section below.

RepRap Component Structure.

That being said, to get a higher-level overview, we must start with discussing the different models of repraps, then go on to the four main components of a reprap:

  • The software toolchain.
  • The electronics.
  • The mechanical body.
  • The extruder.


Next Section

  • 1 Models
  • 2 Software Toolchain3 More Info
    • 2.1 CAD Tools
      • 2.1.1 Software
      • 2.1.2 Files
    • 2.2 CAM Tools
      • 2.2.1 Software
        • Slicing Software
        • G-code interpreter
        • G-code sender
      • 2.2.2 Part Files
    • 2.3 Firmware
      • 2.3.1 G-codes
      • 2.3.2 Software
      • 2.3.3 Files
  • 4 Electronics
    • 4.1 Overview
      • 4.1.1 The controller
      • 4.1.2 Stepper Motors
      • 4.1.3 Stepper Drivers
      • 4.1.4 End stops
      • 4.1.5 Heated Bed
    • 4.2 More Info
  • 5 Mechanical Body
    • 5.1 X/Y/Z Axis Motion
      • 5.1.1 Belts and Pulleys
      • 5.1.2 Threaded rod
      • 5.1.3 Notes on Backlash
    • 5.2 Print Bed
      • 5.2.1 Upper Plate
      • 5.2.2 Lower Plate
  • 6 Extruder
    • 6.1 Cold End
    • 6.2 Hot End
    • 6.3 Filament
    • 6.4 Notes on PID

Software Toolchain

The software toolchain can be roughly broken down into 3 parts:

  1. CAD tools.
  2. CAM tools.
  3. Firmware for electronics.

CAD Tools

Computer Aided Design, or CAD, tools are used to design 3D parts for printing.


CAD tools in the truest sense are designed to allow you to easily change and manipulate parts based on parameters. Sometimes CAD files are referred to as parametric files. They usually represent parts or assemblies in terms of Constructive Solid Geometry, or CSG. Using CSG, parts can be represented as a tree of boolean operations performed on primitive shapes such as cubes, spheres, cylinders, pyramids, etc.

Free/Libre/Open Source Software (FLOSS) applications that fall into this category would be OpenSCADFreeCAD and HeeksCAD and more. Examples of proprietary and fully parametric CAD tools are PTC Creo (formerly PTC Pro/Engineer), Dassault SolidworksAutodesk Inventor and more.

Typically in such programs the geometry is stored in a feature tree where the dimensions can be modified numerically, and the geometry is then regenerated with great precision. The geometry is a mathematical representation where, for example, a circle is generated from its center, radius and plane parameters (hence, “parametric”). No matter how much you zoom in, a circle is still curved, and the CAD program has no problem finding its center when you click on it. This can be quite beneficial when making drawings with dimensions between the circle and sections that need to be concentrically removed.

Another looser category of CAD tool would be apps that represent parts as a 3D Polygon mesh. These applications are meant to be used more for special effects and artistic applications. They also seem to be a little more user-friendly. FLOSS-apps in this category would be Blender and Art of IllusionProprietary tools are Autodesk 3ds MaxAutodesk AliasGoogle Sketchup and more.

Further, you can create forms with just a web-browser at certain websites, such as (easy) or (more sophisticated), those permit you to download the resulting geometry.

Some of the tools mentioned above also use parametric data to generate the geometries, but a lot just register the positions of the vertices of the polygons making up the models. Some use parameters to generate the geometry but then drops that data once the vertices are placed. A curve is thus actually an approximation, generated from a number of straight lines between points. As such, those tools are better suited for design where the precision of dimensions are less important than looks and ease of use.


Most of the time 3D software apps save their files in an application-specific format, which in the case of proprietary CAD tools usually are frequently changed and heavily guarded trade secrets.

There are very few interchangeable CAD file formats. The two most widely used interchangeable CSG file formats are STEP and IGES. Both strip the geometries from parametric data and offer only “dead” solids. Features can be added and removed, but the base shape is locked. There is to date no industry-wide interchangeable file format that retain parametric data.

The most widely used interchangeable mesh file format is STL. STL files are important because, as we will see below, they are used by CAM tools.

Mesh files cannot be converted into CSG file formats because they contain no parametric data – only the coordinates of the polygon vertices that make up the solid volume. However, CSG file formats can be converted into mesh file formats.

Thus, if you’re designing a part, it’s a good idea to design it using a CSG CAD application and save and distribute its original parametric file along with generated STL files.

CAM Tools

Computer Aided Manufacturing, or CAM, tools handle the intermediate step of translating CAD files into a machine-friendly format used by the RepRap’s electronics. More info is on the CAM Toolchains page.


Slicing Software

In order to turn a 3D part into a machine friendly format, CAM software needs an STL file. The machine friendly format that is used for printing is called G-code. Early versions of RepRaps used a protocol called SNAP but industry standard G-codes are now used. To Convert STL files to G-code, you can use one of the following programs:

  1. MatterSlice (Fast and full featured – works with MatterControl)(open source)
  2. Skeinforge (Dated solution)(Still one of the best and highly recommended for accurate prints
  3. Cura (Also includes G-Code sender)(Extremely fast and accurate)
  4. Slic3r (Popular solution for most RepRappers)(Lots of bugs in every release)
  5. Kisslicer (Fast and accurate with very few bugs)(Closed source)
  6. RepSnapper
  7. RepRap Host Software
  8. X2sw
  9. SuperSkein
  10. SlicerCloud (Online Slic3r solution)
  11. Simplify3D (All-In-One Paid Suite)

The STL to G-code conversion slices the part like salami, then looks at the cross section of each slice and figures out the path that the print head must travel in order to squirt out plastic, and calculates the amount of filament to feed through the extruder for the distance covered.

(Normally you don’t need to repair, edit or manipulate STL files directly, but if you do, you might find the software at Useful Software Packages#Software for dealing with STL filesuseful).

G-code interpreter

After you have your G-code file, you have to run it through a G-code interpreter. This reads each line of the file and sends the actual electronic signals to the motors to tell the RepRap how to move. There are two main G-code interpreter options:

  1. A workstation program called EMC (or other CAM software) which controls the hardware directly or
  2. The firmware on a RepRap’s electronics platform with an integrated hardware interface that has a G-code interpreter
G-code sender

To send the G-code files to an integrated hardware interpreter, you need to either to:

  1. Load the G-code file on an memory card (typically SD card) if supported.
  2. Drip-feed the G-codes (usually a line at a time) over a serial port (RS-232 or TTL level, often used with a USB converter) or a direct USB connection using one of the following programs on your workstation:

Some of the options are cross platform while others will only work with certain operating systems or prefer specific integrated firmware interpreters.

Part Files

The main files use by CAM tools are STL and G-code files. CAM tools convert STL files into G-code files. The official STL files for Mendel are stored in the reprap subversionrepository. To get a copy of these files, run the following commands in ubuntu:

sudo apt-get install subversion
svn co

This will create a directory full of STL files that you can then give to your neighbor that already has a reprap and they can print out the parts for you. You will also notice that this directory contains AoI files. These files are for Art of Illusion. It is the CAD application that was used to design the parts and then save them as STL files.


Reprap electronics are controlled by an inexpensive CPU such as the Atmel AVR processor. Atmel processors are what Arduino-based microcontrollers use. These processors are very wimpy compared to even the average 10 to 15 year old PC you find in the dump nowadays. However, these are CPUs so they do run primitive software. This primitive software they run is the Reprap’s firmware.

Of the entire software chain that makes the Reprap work, the firmware portion of it is the closest you get to actual programming. Technically, the term for what you are doing with firmware is called cross compiling.

This process more or less consists of the following steps:

  1. Install the Arduino IDE on your PC.
  2. Download some firmware source code from a website.
  3. Make some minor changes to the source code to specify what hardware you have.
  4. Compile the firmware using the Arduino IDE.
  5. Connect the controller to your PC via a USB cable.
  6. Upload the firmware to your controller’s CPU.


After your microcontroller has its firmware loaded, it is ready to accept G-codes via the software-emulated RS-232 serial port (aka COM port). This port shows up when you plug in your arduino to the PC via USB. You can either use a program to send these G-codes over the serial port or you can type them in by hand if you fire up a plain-old terminal application like hyperterm or minicom. If you use a program, they generally take files in gcode format.

For all available firmwares see List of Firmware. The following is a brief list of the most popular firmware:


To compile and upload firmware to your arduino-based electronics, you use the arduino IDE that you can download from the arduino website.


The firmware files are usually packaged as source code for an Arduino IDE project. Arduino source code consists of a bunch of PDE (or as of Arduino ver 1.0, INO) files along with some extra .cpp and .h files thrown in. The Arduino IDE compiles the source code into a single .hexfile. When you click on the upload icon in the Arduino IDE, it uploades the .hex file to the electronics.


More Info

In a nutshell, here’s a short summary of everything above except CAD software:

RepRap Toolchain.jpg



In general, all reprap electronics are broken down into 5 different areas:

The controller

The controller is the brains of the reprap. Almost all reprap controllers are based on the work of the Arduino microcontroller. While a lot of variations exist, they are exchangeable and basically all do the same thing. Sometimes the controller is a stand-alone circuit board with chips on it, sometimes the controller is an Arduino Mega with an add-on board (called a ‘shield’). Find more at List of electronics.

Stepper Motors

stepper motor is a type of electric motor that can be accurately controlled with the controller. Most repraps use 4 to 5 stepper motors. 3 to 4 motors control the x/y/z axis movement (sometimes the z axis is controlled by 2 motors) and 1 motor is used per extruder.

Stepper Drivers

stepper driver is a chip that acts as a kind of middle-man between a stepper motor and the controller. It simplifies the signals that need to be sent to the stepper motor in order to get it to move.

Sometimes the stepper drivers are on separate circuit boards that are linked to the controller via cables.

Sometimes the stepper drivers are on small circuit boards that plug directly into the controller itself. In this case, the controller will have space for at least 4 of these small circuit boards (one for each stepper motor).

Finally, sometimes the stepper drivers are soldered right onto the controller itself.

End stops

An end stop is a very small and simple circuit board with a switch of some sort on it that tells the reprap when it has moved too far in one direction. Thus, there’s normally 6 of these: 2 for each axis (Most firmware include software settings for max position, which allows for only the min position endstops to be required). A single end stop connects via wires to either:

  1. The controller.
  2. A stepper driver board.

Heated Bed

The print bed is what the RepRap extrudes plastic onto, where the plastic parts are built up.

While a heated bed is considered to an optional component of a reprap, it often becomes a necessary and integral part of operating a RepRap over the long-term because, without a heated bed, parts have a tendency to cool down too quickly. This results in warping of corners (as the plastic shrinks while cooling) or the part physically detaching from the print bed too early, ruining the print.

Heated beds operate on the same principle as a kitchen toaster. They’re just giant resistors with a temperature sensor. See also:

More Info

To see more details about reprap electronics, take a look at the List of electronics page.

Mechanical Body

When it comes to the mechanical body, it can be generally broken down into two parts:

  1. Movement along the x/y/z axes.
  2. The print bed

X/Y/Z Axis Motion

Main category page for Mechanical arrangement

When facing the front of a reprap, X axis movement is side to side, aka left to right movement, Y axis movement is forwards/backwards movement and Z axis movement is up and down along the vertical plane.

Linear movement is generally accomplished using one of 2 different methods:

  1. Belt/pulley driven motion.
  2. Threaded rod or leadscrew motion.

Belts and pulleys are good for fast/lightweight movement and threaded rods are good for slow but forceful movement. Most repraps use a combination of belts for X/Y axis movement and threaded rod for Z axis movement.

Belts and Pulleys

When it comes to accuracy, the most important part of your reprap is your belt/pulley combination. Current state of the art is the GT2 belt, along with a machined pulley that matches the exact bore size of your stepper motors (normally this is 5mm).

There are many types of belt/pulley combinations, currently (March 2012) most in use are:

These are asynchronous metric timing belts. They have trapezoidal teeth and deliberate backlash to reduce belt wear and noise for uni-directional applications. They are difficult to get in North America. The pulleys themselves though can be printed. Using a printed pulley will give you approximately the same results as if you use an MXL pulley/belt combination with the wrong bore size.
Like the T5 these are asynchronous metric belt/pulley combinations. These have a 2.5mm (.098″) pitch and are printable. With the same diameter pulleys there is a better grip (compared to t5) on the belt and will give a better result. The best results are with metal pulleys due to the fine tooth profile.
This stands for “mini extra-light”. These belts have been around since the 1940s. Like T5 & T2.5, these are also asynchronous timing belts but they are common in North America because they use imperial sizes. The distance between teeth is 0.08″ and the teeth are trapezoidal. You *may* be able to find pulleys that have a 5mm bore but it seems difficult. Most stepper motors have spindles that are 5mm in diameter.
This stands for “high torque drive” and was introduced by Gates in 1971. These belts have less backlash than MXL and T5 belts because the teeth are deeper and are rounded. These belts were originally patented by Gates but the Patent has since expired.
These are Gates PowerGrip® GT®2 industrial synchronous timing belts. GT stands for “Gates Tooth”. GT2 came about because the HTD patents ran out and they needed a new tooth profile that was not public domain. Gates says the GT2 belts will run OK on HTD pulleys but not the other way around. GT2 belts are stronger than HTD belts, but they need the GT2 tooth profile on the pulleys to achieve their ultimate strength advantage over HTD. These may be more difficult to find everywhere.
Spectra fiber braided fishing line is quickly becoming a popular choice to replace belts in many applications after its first implementation in Tantillus and then in many Delta printers. It is cheap and available in most cities around the world. Once tightened correctly it has almost no backlash and provides very smooth movement due to the lack of bumpy teeth and its incredibly small bend radius allowing high steps per mm.

For more info see Choosing Belts and Pulleys.

Threaded rod

Most repraps use threaded rod for the Z axis. The Z axis doesn’t have to move fast (but it is better if it can move quickly) because it generally only goes up tenths of a mm at a time. Threaded rod is ok for accuracy and force. Repraps don’t require force but some CNC machines, use threaded rod for all 3 axes. Since the Z axis threaded rods support the weight of the x-carriage it’s a good idea to use high-strength stainless steel for the rod and nut, otherwise they will suffer greater wear on the threads and experience premature failure.

Notes on Backlash

One thing to note about all ways of moving is backlash. Backlash is that jigglyness that you feel in both threaded rod and belts/pulleys when you change direction. This jigglyness/sloppiness affects accuracy.

The T5 and MXL belts above were originally designed to be used as timing belts. Timing belts normally only spin in one direction so backlash is not an issue. Thus, because the GT2 belts were designed to change direction, they will be more accurate.

The standard way of compensating for threaded rod backlash is to use 2 nuts and force them apart using a spring. This kind of makes sure that the nuts are always pushing against the threads so that when you change direction, it doesn’t jiggle. Not sure if that makes sense but I’ll leave it here anyways.

Print Bed

The print bed is what parts get printed on. The print bed may be stationary, like with the original reprap Darwin, or it may move along one of the x/y/z axes. Most repraps have the bed move along the Y axis but some will also move along the Z axis.

The bed usually consists of two plates: the upper plate and the lower plate.

Upper Plate

The upper plate is mounted to the lower plate on springs. The springs allow it to be levelled using adjusting screws. It also (I think) was designed this way because it gives a little if you accidentally ram the print head down into it.

The upper plate may or may not be heated. It’s usually made of a PCB board or of metal. If the plate is heated, it will usually have a piece of glass held on top of it by bulldog clips.

Tape is usually applied to the upper plate to act as a print surface. It helps the extruded plastic stick to the bed and it also makes it easier to remove the part once it’s done. The two most common tape types used are blue painter’s tape and kapton tape.

Lower Plate

Sometimes the lower plate is called the frog plate because the original mendel’s lower plate kind of looked like a frog.

It provides a sturdy base that the upper plate can be connected to. If the bed moves along one of the axes, then the lower plate is directly connected to the mechanism that moves the bed. For the Y axis, this usually means belts or for the Z axis, this usually means threaded rod.


The extruder is responsible for feeding filament through a nozzle and melting it as it’s deposited onto the bed where the part is made.

The extruder consists of two parts:

  1. The cold end
  2. The hot end

Normally, the “Cold End” is connected to the “Hot End” across a thermal break or insulator. This has to be rigid and accurate enough to reliably pass the filament from one side to the other, but still prevent much of the heat transfer. The materials of choice are usually PEEK plastic with PTFE liners or PTFE with stainless steel mechanical supports or a combination of all three.

However, there also exist Bowden Extruders which separate the hot end from the cold end by a long tube. Bowden extruders are much faster because they are much lighter.

Cold End

This can get a bit confusing here People tend to refer to the cold end as an “extruder” also. In reality, it’s only half of the entire extruder mechanism. The cold end is the part that mechanically feeds material to the hot end, which in turn melts it.

Popular cold ends are:

Hot End

See also Hot End Design Theory

The hot end is arguably the most complex aspect of 3d printers as it deals with the tricky business of melting and extruding plastic filament. In general, the hot end is a metal case with

  1. A resistor or heater cartridge that heats up so it melts the plastic (usually around 200C)
  2. thermistor or a thermocouple which measures the temperature

The electronics basically monitor the temperature via the thermistor, then raise or lower the temperature by varying the amount of power supplied usually by some form of PWM

see Hotend comparison: Hot End Comparison and Hot End


Generally, people use one of two types of filament: ABS or PLA. ABS stinks and warps but is pretty strong like legos and PLA smells like waffles and is biodegradable (supposedly – I’ve heard that you’ll have to put it in the middle of a super hot compost pile before it even tries to degrade). ABS fumes are also not good for your health. ABS will bend before it breaks and PLA is tougher but when it goes, it breaks. So, if you need a gear for instance, use PLA because it will keep it’s shape better.

Notes on PID

Sometimes you will hear people talk about PID when discussing extruders. PID is a feedback algorithm that engineers have been using for years. It’s basically an equation for evening out something that tends to oscillate.

For example, if you’re driving your car down the highway, you’re doing PID because you’re constantly adjusting the steering wheel a little bit at a time so your car maintains a straight line. If you do it a little bit at a time, it goes pretty straight. But if you wait until you hit the lines on either side of the road, people will think you’re drunk and you’ll oscillate all over the road. You’ll still get where you’re going but it won’t be pretty. Cruise control in a car is another good example of an every day PID controller.



Note: This page contains duplicate material that RepRapSoftwareTweakingManual also attempts to cover.

Calibration is the collection of mechanical “tweaking” processes needed to get exact, quality prints. While your reprap machine may be working as far as the electronics are concerned, calibration is necessary to have well printed parts.

Without calibration, prints may not be the correct dimensions, they may not stick to the build surface, and a variety of other not-so-wanted effects can occur. A Reprap can be calibrated to be as accurate as the mechanics allow.

Once you have finished the physical build of your reprap printer Calibration is the next big hurdle. Trying to print before calibration will likely result in a messy “blob” smeared over the printer bed.

The following set of objects and notes are taken (and edited) from Coasterman who posted them to Thingiverse. They have been moved to the RepRap wiki so that they could more easily be edited and contributed to by the broader community.

The specific recommendation made in this article are based on Skeinforge (or sfact). This information should be nearly equivalent for many other softwares. Regardless of the software used, the set of calibration objects is invaluable.

Note that calibration is an ongoing process that needs to be performed throughout the life of the printer. There are almost always adjustments and tweaks that can be done to improve print quality.



  • 2 Prerequisites
  • 3 Calibration processes
    • 3.1 Motherboard
    • 3.2 Motor Calibration3.3 Thermister
      • 3.2.1 Symptoms
      • 3.2.2 Instructions
    • 3.4 End Stop
      • 3.4.1 Instructions
        • Hard Endstops
        • Software endstop
    • 3.5 Bed Leveling
      • 3.5.1 Instructions
    • 3.6 Bed surface preparation
      • 3.6.1 Instructions
        • Glass
        • Tapes3.6.1.3 Other Materials
          • Blue Tape
          • Kapton Tape
    • 3.7 Extrusion
      • 3.7.1 Extruder steps
        • Calibration for printing
      • 3.7.2 PLA
    • 3.8 Layer height
      • 3.8.1 Instructions
    • 3.9 Infill
      • 3.9.1 Instructions
    • 3.10 Temperature control
      • 3.10.1 Instructions
        • Recommendations
    • 3.11 Perimeter Width
      • 3.11.1 Instructions
    • 3.12 Bridging
      • 3.12.1 Instructions
    • 3.13 Print Precision
      • 3.13.1 Instructions
    • 3.14 Overhang
      • 3.14.1 Instructions
    • 3.15 Oozebane
      • 3.15.1 Calibration Object: oozebane-test.stl
      • 3.15.2 Calibration Object 2 (Variable sized towers for testing ooze): variable_size_ooze_test_nobase.stl
      • 3.15.3 Instructions
    • 3.16 Overhangs
      • 3.16.1 Instructions
    • 3.17 X & Y scaling and steps/mm calculations
      • 3.17.1 tl;dr
      • 3.17.2 Track Offset
  • 4 Theory and Maths5 Further reading
    • 4.1 X and Y Axis4.2 Z Axis
      • 4.1.1 Calibration Object
        • OpenSCAD
        • STL file
      • 4.1.2 Basic Equation
      • 4.1.3 Extending to Erroneous Movements
  • 6 References
  • 7 Old Version of this Page


Whilst calibration is a somewhat iterative process; the order of calibration laid out below is quite important.

It is PARTICULARLY IMPORTANT that the calibration of the motors is done first as poorly calibrated motors can destroy a Pololus and potentially the motors!


Before attempting calibration, a few things are necessary:

  • A stable build process should be established. Your machine should be completely built and all of the nuts and bolts tightened down.
  • The machine should be on a steady, flat, level surface.
  • Calipers, a level, and any necessary wrenches/screwdrivers to adjust the machine should be handy.


A great first step is calibration of the extruder. If it is very accurate, all else can be addressed one step at a time.
Line 399 in Configuration.h:
#define DEFAULT_AXIS_STEPS_PER_UNIT   {80,80,4014,780}
Tweeking 780 up or down in the line above will fine tune the amount of plastic pushed out by the extruder. I set it dead on so that when the software wants to push out 5 mm of filament, exactly 5 mm of filament is pushed out by the extruder stepper.


Calibration processes


Whislt not technically a calibration issue if you don’t set the firemware’s mother board setting correctly then calibration simply won’t work.

Basically each firwmware supports a no. of different motherboards as such on of the first things you need to do is correctly set the mother boards.

For Marlin edit Configuration.h and find the line:

  1. define MOTHERBOARD XX

Change the XX to the no. which correspond to your printers motherboard.

Motor Calibration

Objective: set the current for the stepper motors to the correct level.

Your motors should be quiet when running and can occasionally make musical sounds, particularly when making circles. If they are making a fair amount of noise then you have a problem.

Calibration Object: None

NOTE: incorrect current settings can damage your pololus and/or your motors.


Motor make significant noise.

This generally means you have too much current to the motor.

Motor vibrates without turning.

This generally means that you have insufficient current to the motor. You could also have a problem with a part sticking which stops the motor from being able to drive the axis. It might also be possible to be way off in your steps/mm (e.g. a typo in your value in the config file): when steps/mm is double the correct value your motor might vibrate on the spot.

Axis movement pauses momentarily and then resumes.

You may have too much current going to the motor which is causing the pololu to over-heat. Reduce the current. This can also be caused by firmware but check your motors first. Another possible cause is the set screw on the gear is not tight enough.


Each Pololu has a trimpot located next to the heatsink. The trimpot controls the current that is sent to each motor. Turning the trimpot counter-clockwise reduces the current to the motor, turning it clockwise increases the current to the motor.

Start by adjusting the trimpot down until your motor vibrates on the spot rather than turning cleanly. Now turn the trimpot in a clockwise direction in small increments (1 eighth of a turn) until the motors just start running. Then give the trim port a final turn of about 1 eighth of a turn and your should be good to go.



Like your mother board most firmware support a variety of thermisters. You need to ensure that the firmware is set to match your thermister. If it doesn’t then your temperature readings won’t match the real world.

For marlin the settings are in Configuration.h under ‘Thermal Settings’.

  1. define TEMP_SENSOR_0 5
  2. define TEMP_SENSOR_1 0
  3. define TEMP_SENSOR_2 0
  4. define TEMP_SENSOR_BED 2

TEMP_SENSEOR_0 is normally your hot end and TEMP_SENSOR_BED is normally your bed. Set both accoring to the table of supported thermisters.

End Stop

Objective: to correctly set the endstops on each axis.

The results of this step should see each axis correctly home and not run into the opposite end of each axis.

Signs of having mis-calibrated endstops: the bed or extruder physically crash into either end of their axis.

Importance: An head (extruder) crash can damage the extruder, bed, cogs or motors.

Calibration Object: none


Each axis of your printer has a ‘home’ position and a maximum feed length. If the firmware attempts to drive the extruder or bed beyond either of the two end points physical damage to your printer is possible.

Most printers have a single ‘physical’ end stop on each axis whilst some may have a physical end stop at each end of an axis.

End stops are typically a micro switch which is triggered when the carriage or bed touch the end stop.

Soft Endstop Printers with only a single ‘physical’ end stop will rely on the firmware implementing a ‘soft’ end stop. A soft end stop is always at the opposite end of an axis to the physical endstop. Together the physical and soft endstops ‘frame’ the axis and define the total travel of the axis.

With a software Endstop each time you turn on your printer you MUST peform a ‘home’ operation. The home operations effectively lets the firmware know where the physical endstops are. Once the firmware has confirmed the location of the physical endstops it is able to calculate the location of the soft endstops as a simple travel distance in millimetres.

A soft endstop is therefore simply a measurement entered into the firmware that tells the firmware how many millimetres of travel the axis has from the physical end stop before physically crashing into the opposite end of the axis.

Hard Endstops

Work with each axis in turn.

Start with the x end stop. Position in the Extruder so that it is in the middle of the carriage and well clear of the bed.

Most printer software will let you move each of the axis in small increments in both directions.

Connect your printer software so that you can move the xaxis. Ideally you need to be able to have the software move the axis about 10 mm.

Start by testing that your endstop is working.

Manually close x axis endstop (e.g. with your finger 😀 ).

With the carriage centred instruct the software to move the axis 10 mm towards the physical endstop.

Now instruct the software to move the axis 10 mm away from the physical endstop.

If the carriage moves in neither direction then you may need to invert your axis ‘enabled’ state.

But make certain the power is on first 😉

Normally an axis is enabled when the endstop is ‘Active Low’ (end stop switch is open). In your case it appears that this needs to be reversed.

When using Marlin firmware change X_ENABLE_ON from 0 to 1.

After reflashing the firmware, peform the above test again to ensure the endstop is working.

Recentre the carriage.

With the endstop closed instruct the software to move the axis 10 mm ‘towards’ from the physical end stop.

It should refuse to move.

If the end stop moves then whilst holding the endstop closed instruct the axis to move 10 mm ‘away’ from the physical endstop. If it refuses to move then you need to ‘invert’ the ‘x’ direction for the endstop.

If you are using Marlin this requires both the INVERT_X_DIR and the X_HOME_DIR to be reversed to false and 1 respectively.

Once you have reflashed the firmware with the above settings peform the test again to ensure that the axis refuses to move ‘towards’ the endstop when it is manually closed.

The next action is to find the limit of the x axis in the direction of the physical endstop. The limit is defined as the most extreme position the x axis can be in without impacting the side of the printer.

Move the x axis slowly towards the physical endstop. As you approach the end stop reduce the no. of mm you move each time.

Check the carriage before each move to ensure that the next move isn’t going to cause the carriage to impact. Once you have the carriage in the most extreme position move the endstop into contact with the carriage so that the carriage triggers the end stop.

Move the carriage away from the end stop and adjust the end stop a little further in towards the centre of the axis to give yourself a little more buffer between the carriage stopping and a possible impact.

Finally you need to do a test ‘home’ for the axis.

Have you hand near the power switch incase the ‘homing’ operation moves the axis in the wrong direction.

Start by moving the carriage so that it is 10 mm clear of the physical end stop.

Instruct the printer software to ‘home’ the single axis. DO NOT tell the software home ALL axis.

The carriage should move towards the endstop, back away from the end stop a couple of mm and then move towards the endstop and on contact stop.

If the carriage moves in the wrong direction or fails to stop when it contacts the endstop immediately cut power to the printer. Now repeat the above process again to correct the problem!

You have no completed configuration of the x axis physical end stop.

Repeat this process for each physical end stop.

You should now do a test ‘home’ of ALL axis.

Software endstop

Configuring the software end stop is a simple matter of determining how far the axis can travel away from the physical endstop before it impacts the other side of the printer.

Start by homing the axis. Now move the carriage in 10 mm increments towards the far side of the printer. Count the no. of movements. As the carraige approaches the far side of the printer you may want to reduce the travel of each movement. Once you are within about 5mm of the far side of the printer add up the total distance traveled.

Now update your firmware with the location of the software end stop.

For Marlin firmware you need to se the X_MAX_POS, Y_MAX_POS and Z_MAX_POS with each of the above settings.

Once you have reflashed your firmware. Home the printer on each acess and then with your finger on the power cut off switch send the carriage in the direction of the soft end point, reducing the distance of each move as you approach the soft end stop’s logical location. Ensure that the carriage stops moving when it hits the soft and stop (and not the printer side).

Do this for each axis in turn.

Your end stops are now calibrated.

Bed Leveling

Objective: To level the print bed so that your objects will adhere to the surface. The result of this step should make the extruder nozzle the exact same height above the bed across the entire bed surface.

Signs of having an unlevel bed: Plastic will adhere to part of the bed but not others. The extruder nozzle might “dig” into parts of the bed, pulling up or deforming the bed surface.

Importance: The first layer of the print is the foundation of all subsequent layers. A bad first layer could mean the part might peel off of the print bed during the print, “blobs” of plastic may form, causing problems in following layers, and a variety of other things.

Calibration Object: bedleveling.stl


Step 1 – Establish a corner height:

  • Move the nozzle to a corner of the bed and measure its height at this point.
  • Move the nozzle down close to the bed.
  • Use a thick piece of paper or plastic as a shim and slide it under the nozzle. You should feel a slight drag from the extruder on the paper as you pull the paper through. If not, move your nozzle up or down slightly until it does.

Step 2 – Getting the second corner:

  • Move the Y axis (the bed should move) to the second corner.
  • Using the same shim, determine if the bed is too close or too far away from the nozzle at that point.
  • Adjust the screws that hold up the bed along that edge so that the height at the corner matches your shim.
  • Move back to the first corner and check the height with the shim again. It should match, if not, repeat step 1 and step 2 until it does.

Step 3 – Getting the third and fourth corners:

  • There are two ways to adjust this – tweaking the jack screws that hold up your X axis rails and adjusting the bed itself.
    • Jack screw method:
      • Move the Y axis to the third corner and check it with the shim. If it is too high or too low, turn off the motors and slightly rotate one of the jack screws until the nozzle height matches the shim.
      • If this method is used, you MUST return to the second corner and move the nozzle up/down to the shim, and then repeat this method until both sides line up with the shim.
    • Nut and bolt method:
      • Move the Y axis to the third corner and check it with the shim. If it is too high or too low, adjust the bed screws along that edge until they line up.
      • Check the height with the second corner and repeat this method until the corners line up

Once the bed is level print the Bed Leveling Calibration test object and ensure that each square is even, smooth and consistent.

Other methods do exist. Reference Leveling the Print Bed for more information. You may want to download the original scad file so that you can change the dimensions to match your print bed.

Bed surface preparation

Objective: correct preparation of the bed to ensure that objects adhere to it.

Additional troubleshooting info can be found in the Bed Adherence section of the Print Troubleshooting Pictoral Guide.


An incorrectly prepared bed can result in poor adhesion of the plastic to the bed as well as a ‘bubbling’ effect.

Even a little bit of finger print grease on some surfaces is enough to ruin a print.

Bed preparation will depend on what material your bed is made out of, what you intend on covering it with, as well as what material you expect to be printing:


Clean the glass with a non-abrasive common household window cleaner using a lint free cloth. Spare no effort in ensuring that the glass is spotless. Alternative recommended cleaners include:

  • acetone/cheap nail polish remover,
  • isopropyl alcohol.

With a heated bed and ABS you will probably want something to help the print stick to the bed. Options include:

  • Sugar water (Sugar dissolved in Water, approx. 1:10 by weight) -> bed temp approx. 95,
  • ABS juice (ABS dissolved in acetone, e.g. 10mm length of 3mm filament (0.07g) dissolved in 10ml acetone) -> bed temp approx. 90,
  • Kapton tape (as below).


When applying any type of tape to print on, it is important to make sure the print surface is still smooth when you are done. Attempt to lay down tape edge-to-edge, with no overlap. If applying multiple layers, it can be benificial for the layers to alternate directions, so that direction-specific defects do not build up as you add layers.

Blue Tape

For those printing with PLA filament, blue tape has been found to adhere well when using 3M’s ‘Scotch-Blue Painters Tape for Multi-Surfaces #2090′. This tape may be found in two inch rolls, or three inch rolls. The PLA will adhere to multiple layers, so it is advised to place down at least three layers of tape, before printing on a surface, to prevent damage to the print bed.

Kapton Tape

Kapton tape is a heat resistant tape which is commonly used to cover a variety of material types used in beds. The kapton tape provides good adherence for a variety of plastics. It is important to avoid bubbles while applying the tape. The “wet method” is particularly helpful as explained in this video.

Other Materials

TODO: need details on other materials.


Objective: to ensure the hot end temperature is set correctly so that material is extruded cleanly

Calibration Object: None

Extruder steps

Objective: to adjust the extruder steps per unit

To set the extruder steps per distance of filament, (the 3mm or 1.75mm filament, NOT the material that comes out of the hot end) send M92 E<new value>. You can check the current value by sending “M503″. Your host software is part of the CAM toolchain that you use to send G-Code to control the printer.

If you received filament driver as a whole unit the first estimate is calculated, however the error margin is possibly too great to leave it as it is. Importantly, write the initial value for M92 down, then raise the hot end and extrude, then measure the length extruded.

Then the value (wanted_length/measured_length)*old_M92 is a better value. You might want to do it some more times until it doesn’t change much.

Calibration for printing

We also want to calibrate based on how it actually prints, basically for this a calibration Object is used and the value is increased/decreased, this can be done both by using M92 E again, or setting extrusion multipliers in slicer software.

Basically you do this until it looks good, increasing if it looks like too little, decreasing if too much. Pictures are in the Print Troubleshooting Pictorial Guide.

Note that this calibration is affected by the xyz calibration, if the part is made larger than intended, it takes more filament to make it, so that calibration should be correct. However calculations from gear ratios should already give values very close to the correct ones.


Layer height

Objective: to correct the layer height settings to reflect your printer’s actual layer height.

Calibration Object: 0.5mm-thin-wall.stl

When your extruder draws a line of plastic, that line has a height and width. You get to choose these values.

Best results are obtained when layer height < 80% of nozzle diameter, and extrusion width >= nozzle diameter.

Eg; with an 0.35 nozzle, your maximum layer height is 0.35*0.8= 0.28mm and your extrusion width should be 0.4mm or greater. with an 0.5mm nozzle, your layer height can be up to 0.4mm, and an 0.25mm nozzle will give you 0.2mm max layer height.

You can use a lower layer height or larger extrusion width if you wish, it will work fine. The slicing software automatically calculates the appropriate volume to extrude based on the settings you choose. There is no hard lower limit on layer height – it is limited by your ability to keep flow consistent at very low flowrates. Some reprappers have printed layers as small as 5 micron – 0.005mm!

Triffid Hunter (who’s guide this text was stolen from 😀 ) recommends layer height of 0.2mm, and extrusion width of 0.5mm regardless of which nozzle he’s using.

Slic3r automatically chooses an extrusion width for you based on your nozzle diameter. If you’re determined to choose, you can use the extrusion width advanced setting. It is frequently advantageous to choose as models may have walls of a particular width, and by choosing you can ensure they are entirely filled with perimeter with no gap in the middle and no infill.


Print the 0.5mm thin wall cube and make sure that the layers adhere well but the nozzle does NOT drag through while printing.

Adjust the layer height in .01 increments until you get a nice print. In Pronterface/Skeinforge settings, this can be found under Craft > Carve.

Depending on other factors you may find it hard to get all four walls to print nicely. For the first pass if you can get just one wall looking good then move on to the next test.


Objective: to correct the infill setting.

Calibration Object: 20mm-box.stl


Set infill solidity to 1.0 for this, using linear infill. In Pronterface/Skeinforge settings, this can be found under Craft > Fill.

Print the cube and analyze the top. If there is NOT ENOUGH plastic (a concave top), reduce the Infill Width over Thickness by .05 increments. If there is TOO MUCH plastic (convex top), turn that parameter up by .05 increments. In Pronterface/Skeinforge settings, this can be found either in Craft > Inset in some versions, or Craft > Fill in other versions.

Once you’re feeling close, start bumping it around in smaller increments.

You may also need to adjust your feed rate.

Adjust the feed rate by increments of 2 or so until you feel close. If it looks really disgusting and blobby, go by increments of 0.5mm. Then go by smaller and smaller increments until you’ve nailed it. Although you probably just want to decrease Infill Width over Thickness instead of decreasing Feedrate because lowering feedrate will degrade the resolution.

Temperature control

Objective: to set the hot end temperature correct for your preferred plastic.

Note: you will find that different types of plastic have vastly different temperatures for both your hotend and your bed. What you might not expect is that different colours for the same material can also required different printing temperatures.

As the tower has quite a small ‘top’ surface area you may need to cool this object as you print. If your printer doesn’t have a built in fan you can use any room fan as a substitute.

Calibration Object: 50mm-tower.stl


Set the ‘Infill solidity’ to 1.0. In Pronterface/Skeinforge settings, this can be found under Craft > Fill.

If the plastic comes out as a drip instead of a cylindrical filament, the temperature is too high. –

Start by doing a simple extruder test to determine what the range of temperatures are that you can extrude at. Reduce the temperature in 5 degree increments until the extruder starts skipping when you do a manual extrude. Turn the extruder up 5 degrees and note this as your minimum extruder temperature.

Print this block.

If it looks like a blob, turn down all the temps by 5 degrees until you get something good. Chances are you won’t need to do this more than 5 degrees.

Note: Be careful as going too low can result in the plastic setting making it hard for the motors to drive the plastic, possibly causing wear or damage.

TODO: list temperature ranges for common plastics.



Hotend: 185 °C

Bed: 60 °C


Hotend: 230 °C

Bed: 110 °C

Perimeter Width

Objective: correct the perimeter width over thickness. In newer versions Edge Width over Height.

Calibration Object: Perimeter_Width.stl


This test prints two objects which are designed to fit together.

Try to insert the smaller block into the larger block. Try inserting it differently a few times, and check your belt tensions.

TODO: Need notes on calibration of belt tensions
If you can get it in a few mm, good. If you can get it in all the way, awesome. The fit should be snug. If it is loose and can jitter around inside, decrease the perimeter width over thickness, also called Edge Width over Height. In Pronterface/Skeinforge, “Edge Width over Height” can be found in Craft > Carve in the Slicing Settings. If you CANNOT get it in AT ALL, and you are sure there are no whiskers blocking it, INCREASE perimeter width over thickness or Edge Width over Height. The latter is more likely.


Objective: to maximize your printers ability to bridge gaps (i.e. print in thin air).

Calibration Object: 20mm-hollow-box.stl


Print the calibration object and if the top droops in, increase the BRIDGE FEEDRATE MULTIPLIER in Speed by increments of .1 until the top stops drooping.

Print Precision

Objective: improve print precision

Calibration Object: precision-block.stl


Then there is the precision block. No real huge calibration parameter here. Just play with this and see how well it does on the overhangs and shapes.

TODO: We need to add some recommendations on how to improve this or find more direct methods of calibrating specific aspects of the print.


Objective: fix overhang problems

Calibration Object: overhang-test.stl



Then there is a simple overhang test. Print and observe the overhangs. This is up to you to figure how to improve the overhangs.

TODO: We need to add some recommendations on how to improve this or find more direct methods of calibrating specific aspects of the print.

gregor: i get better results when i add a fan to cool the overhang down

this was my test object: [1]


Objective: stop material oozing out of the noozle during ‘non-printing’ moves.

Many extruders will emit (ooze) plastic even when the extruder motor is not turning. To overcome this your slicing software needs to ‘retract’ the print medium during head movement when not printing. The retraction creates negative pressure within the hot end heating chamber which effectively sucks the print medium back up through the nozzle, stopping it from oozing.

Calibration Object: oozebane-test.stl

The calibration object prints two towers about 30 mm apart. The head must move between each of the towers at each layer. If your printer is not set correctly then you will see many fine filaments (or strings) between the two towers. You can eliminate these filaments by eliminating ooze.

Calibration Object 2 (Variable sized towers for testing ooze): variable_size_ooze_test_nobase.stl

This is a simple model to help tune reversal parameters for a stepper extruder (using much less filament before actually testing the ooziness). It consists of a number of towers with different thicknesses, with different spacing between each tower. A well-tuned bot should be able to produce even the smallest towers.


This is to try to control ooze and calibrate it to be useful.

Start by setting the Early Shutdown distance to 0 and Slowdown Startup Steps to 1.

Print the piece and measure the length of stringers where the extruder shut off and the line is thick before becoming a thin whisker. Take that length and put it into early shutdown distance.

Play with Early Startup Distance Constant until the place where the extruder arrives at the other tower is nice and smooth, so that there isn’t any empty space where plastic should be, but there isn’t excess plastic extruded.

Since Slic3r 0.9.10b there is a wipe before retract option (under Printer Settings => Extruder) which seems to make the most difference. Other options to consider: reduce temperature, increase travel speed, retracting more, retract slower, z-lift before travel or lowering extrusion ratios.


Objective: eliminate droop from overhangs.

Calibration Object: BridgeTestPart.stl


If the calibration object droops, you likely need to decrease “Bridge Flowrate over Operating Flowrate.” Or increase “Bridge Feedrate over Operating Feedrate.”

X & Y scaling and steps/mm calculations

The following information concerning steps/mm adjustments is outdated. It has since been agreed that steps/mm should be set to the exact calculated values since printing with non-ideal steps/mm results in an accurate test piece, but makes the dimensions on every other part even more inaccurate.

Scaling goes into the STEPS_PER_MM of the firmware, track offset goes into the G-code compiler (Skeinforge etc.).


The most simple way to get reasonably accurate parts is to simply ignore the track offset or to set it to some guessed value, then adjust scaling of the axes, only:

frac {mbox {current steps per mm} cdot mbox {expected distance movement}} mbox{actual measured distance}



Then repeat:


Until you get your desired steps per mm.

(Do note that there is a setting in configuration.h that enable these EEPROM functions.)

M501 (show current settings (steps per mm etc) M92 X44.04982491245622811406 (change steps per mm to your calculated value, useful for any axis; X,Y,Z and E for Extruder) M500 (save your new settings)

  • In Teacup firmware you multiply these values by 1000, to get steps per meter, and put the value left of the decimal into config.h’s STEPS_PER_M_X, STEPS_PER_M_Y, … . Then, re-upload the firmware.

Track Offset

OK, here we get a bit stuck. While the theory section below nicely shows how to calculate the optimum track offset, Skeinforge has no configuration option to adjust this value.

An excerpt from a chat between Greg Frost and Traumflug, on 2011/22/06:
[14:30] <GregFrost_> I calibrated the extruded length and then set feed=flow and pw/t and iw/t to 1.5 and immediately got nice looking prints. However, and here is the kicker, the objects are all slightly too big because my single wall box has an actual w/t of 2.1
[14:31] <GregFrost_> I can fix this with p flow but then i get thin preimeters and they dont alway bond well to each other (but objects are the right size).
[14:31] <GregFrost_> I would like normal flow on the perim but a wider w/t but if i do that it adjusts all of the flows up and I get far too much plastic.
[14:32] <GregFrost_> what I really need is a way to change the distance inside the objest that the perimeter is traced without changing the flow rates.
[14:37] <Traumflug> To be honest, I never used Skeinforge, this adjustable track offset is an assumption.
[14:38] <GregFrost_> Traumflug: it would be a good setting, i agree.
[14:38] <GregFrost_> Traumflug: I think the only way to achieve a track offset is to adjust the perimiter w/t ratio.
[14:38] <Traumflug> So, Skeinforge doesn’t compensate for track width?
[14:38] <GregFrost_> Traumflug: it does. but it uses the perimiter witdth/t and infill w.t settings
[14:39] <GregFrost_> Traumflug: then it uses the layer height
[14:39] <GregFrost_> Traumflug: and useing those it works out the track offset.
[14:39] <Traumflug> ok, good to know.
[14:39] <GregFrost_> Traumflug: but the kicker is, changing perimeter w/t also adjusts the flow rate
[14:40] <GregFrost_> Traumflug: so theoretically when you choose a new w/t, it puts out enuf plastic to fill the width.
[14:40] <Traumflug> Yes, theoretically
[14:41] <GregFrost_> Traumflug: but on the perimiter if you use the same volumetric flow as the infill, it bulges past the desired width because there is no containing line.
[14:42] <GregFrost_> but the one setting that allows you to compensate for that adjusts the flow on all other lines (both infill and permiiters)
[14:42] <Traumflug> IMHO, changing the plastic flow to compensate for size errors isn’t a good way.
[14:43] <GregFrost_> Traumflug: I agree completely.
[14:43] <Traumflug> Each time you change the flow, a lot of minor parameters change as well, so a prediction is very difficult.
[14:43] <GregFrost_> I want to change the track offset.

Theory and Maths

By Markus “Traumflug” Hitter.

X and Y Axis

Both horizontal axes can be calibrated with two values: track offset and overall scaling. To find out how this is done, let’s have a look at a part specially designed to find out those values:

RepRap Calibration Frame Drawing.png

It’s a frame, similar to the one you use to put pictures up onto the wall. The essential part here is, it has long and short distances to measure on the same part. We need to measure both, to distinguish between track offset and scaling.

To the right of the drawing, a few tracks laid down by the extruder are sketched in. It shows how the track offset lets the extruder move closer to the inside of the part, so the outer side of the track just ends where the part should end as well.

All the sizes are overlaid by scaling, which is sort of a “gear ratio” between measurement units and stepper motor steps.

Calibration Object


// X-Y Calibration object // See difference() { cube([100,100,3], true); cube([80,80,3.1], true); }

STL file


Basic Equation

With that knowledge, we can sum up what the extruder moves to get the size T = 10 mm exactly 10 mm wide:

movement=(intended size2track offset)scaling

This holds true for measurements of any size, i.e. also for the 100 mm size of our calibration frame:


You see? Two unknowns and two equations, so the set is solvable.

Extending to Erroneous Movements

Now, the whole point of this writing is, the extruder movement doesn’t match what we need to get accurately sized parts. So we have not only a movement, but also a movement error.

The reason for the movement error is, according to the basic equation, erroneous track offset and/or erroneous scaling.

Get these two into the basic equation, result to the left, reason to the right:

movementmovement error=(intended size2track offsettrack offset errorscalingscaling error

Again, this holds true for both our measurements:


… to be continued … about a formula to get scaling and track offset from measuring these 10 mm and 100 mm …

Z Axis

On the Z axis, there is no track offset compensation, so calibration is reduced to scaling of part height. Build any part of 50 mm height, let it cool down, measure it. Then adjust your STEPS_PER_MM in your firmware’s config.h to reduce the difference between intended and received part.

As most RepRaps use a threaded rod on the Z axis, the theoretical value, which can be generated from the online calculator, should match reality pretty close. However, there’s also material shrink as the plastics is printed at a higher temperature than room temperature.

Further reading



Old Version of this Page

put here as the new part is still incomplete –Traumflug 22:55, 21 June 2011 (UTC)

Is this part of commissioning? Is this part of Builders/Config/Config Axes?

To calibrate, you will need the following: a Rep(st)rap, a slide caliper, and printing material (ABS, PLA, HDPE, etc).

You will also need this object file to print out.

  1. Setup and load your printing material.
  2. Print the calibration object.
  3. Allow the object to cool.
  4. Use the slide caliper to measure each edge and the diagonals.
  5. Make a note of each measurement and this will allow you to determine where a problem is IF there is a problem.

With the above measurements, you should be able to determine any alignment issues. The sides should measure within 0.5mm of 40mm.

if it is off consistently, then it is probably a firmware issue.

Most inconsistent discrepancies are a sign of backlash (i.e. slop or play in your mechanical system). Make sure the grub screws on the pulleys are tight; make sure the belts are tensioned so that when you turn the stepper by hand, it immediately produces a movement in the axis; make sure all the bearings turn smoothly, and that the carriages only move along their intended axis. with all of that double checked, try printing your test piece again, and pay very close attention while it is printing. If your stepper motors make strange noises occasionally, it might be that they are skipping steps because they don’t have enough torque. Try turning up the trim pot for that axis.

If all this fails, the best place to go to figure out how to fix your issue, once you’ve identified it, is either to ask someone in the forums, or on IRC, if you prefer. Then come back here and make this page better, or complain to the forum users.

Once you get a simple cube printed adequately, you might consider trying a more difficult object such as the bearing clip 01 for more fine-tuning.

Triffid Hunter’s Calibration Guide





  1. A tool to precisely measure 100mm. A vernier caliper is ideal.
  2. A tool to precisely measure something 0.5mm wide. A micrometer is ideal, but a vernier caliper will do.
  3. Know your stepper motors’ full steps per revolution value. steps = 360 / angle, so 1.8° = 200 steps, 0.9° = 400 steps, etc.
  4. Know your stepper drivers’ microsteps setting. Most Pololus are set to 16x. GEN3 driver 2.3 is fixed to 2 (half step). Some boards have 32x.
  5. Know the number of teeth on your pulleys. Standard printed pulleys have 8 teeth. Most machined pulleys have 10 or 12 teeth since 8 tooth is technically too small for T5 belt
  6. Know your belt pitch! XL and T5 belts /look/ the same, but the difference is important!
  7. Know the number of teeth on your extruder gears, or at least the gear ratio.
  8. Remove all sources of backlash. Your parts won’t be usable as calibration pieces if you have lash!
  9. Open the Online RepRap Calculator to find XY and E steps, layer heights, and acceleration.

XY steps

Assuming you’re using belts and pulleys, the XY steps-per-mm can be accurately calculated using your motor, pulley, and belt characteristics, and once set they shouldn’t need to be calibrated further. But there’s no harm in making sure! If you’ve calculated this value correctly but your objects come out the wrong size by a noticeable amount, your belts may be damaged or something else is awry!

The basic formula is:

 steps_per_mm = (motor_steps_per_rev * driver_microstep) / (belt_pitch * pulley_number_of_teeth)

Some common examples:

// NEMA 17 motor with T2 belt and 20-tooth pulley:
(200 * 16) / (2 * 20) = 80.0

// NEMA 17 motor with T5 belt and 8-tooth pulley:
(200 * 16) / (5 * 8) = 80.0

// NEMA 17 motor with XL belt and 8-tooth pulley:
(200 * 16) / (5.08 * 8) = 78.74

Z steps

Most RepRap printers use a pair of threaded rods for the Z axis. So to calculate how far the Z axis moves for each revolution of the motor, first you need to know how much rotation is being transmitted to the Z rods, and then use the “thread pitch” of the rod (distance-per-revolution) to determine the vertical motion.

The basic formula to calculate motion on a rotating rod is:

 steps_per_mm = (motor_steps_per_rev * driver_microstep) / thread_pitch 

Some common examples:

// NEMA 17 with standard pitch M5 threaded rod:
(200 * 16) / 0.8 = 4000

// NEMA 17 with standard pitch M8 threaded rod:
(200 * 16) / 1.25 = 2560

// NEMA 17 with SAE 5/16" threaded rod. It has 18 threads per inch (25.4mm / 18):
(200 * 16) / (25.4 / 18) = 2267.7165355

Some printers connect the Z motor to the Z rods with a belt and pulleys. As long as the pulleys have the same diameter the above formula will work. But if the pulleys differ you’ll need to include this ratio in the final result. For example, if the motor pulley was half the size of the rod pulley, you would need to multiply the final result by 2.

E steps

There are an increasingly wide variety of motors and extruder setups to choose from. “Wade” extruders use a NEMA motor to drive a large reduction gear that turns a “hobbed bolt.” Direct-drive extruders typically use a motor with a planetary gearbox to turn a drive gear, such as the popular MK7. Bowden setups can use either method to push the filament through a tube to the hot end. There are others, such as worm drives, but we won’t get into those here.


For a typical Wade extruder, the hobbed bolt will be made from an M8 bolt, and its “effective diameter” will be around 7mm. The direct-drive MK7 gear is specified as having an effective diameter of 10.56mm. These are just starting points to get close to the correct value, and then you’ll measure and calibrate to get the exact value later.

The standard formula is:

 e_steps_per_mm = (motor_steps_per_rev * driver_microstep) * (big_gear_teeth / small_gear_teeth) / (hob_effective_diameter * pi)

Some typical examples:

// Classic Wade with a 39:11 gear ratio
(200 * 16) * (39 / 11) / (7 * 3.14159) = 515.91048

// Gregstruder with a 51:11 gear ratio
(200 * 16) * (51 / 11) / (7 * 3.14159) = 674.65217

// Gregstruder with a 43:10 gear ratio
(200 * 16) * (43 / 10) / (7 * 3.14159) = 625.70681

// MK7 Direct Drive with 2engineers 50:1 planetary gear motor
(48 * 16) * (50 / 1) / (10.56 * 3.14159) = 1157.49147


Required tools: vernier caliper with depth gauge, or similar tool that can precisely measure 100mm. Your hob effective diameter is unlikely to be exactly 7mm.

  1. Remove the hot-end from extruder so you don’t waste filament.
  2. Feed in some filament.
  3. Using the extruder body as a reference point, mark the filament at 120mm.
  4. Tell the printer to feed 100mm of filament.
  5. Measure the distance from the extruder body to the mark you made. It will be over 20mm if it moved too little, under if it moved too far.
  6. new_e_steps = old_e_steps * (100 / distance_actually_moved) … or, old_e_steps * (100 / (distance_to_mark + 80))
  7. Set this value in your firmware. You may need to re-flash your board. Sprinter/Marlin supports M92 Ennn to set this value temporarily.
  8. Repeat from Step 3 until you get between 96-104mm. Then continue with this guide. You’ll dial it in perfectly later on.
  9. Don’t flash firmware yet. There’s a further refinement to this value below. Why? The back-pressure from the hot-end alters how much plastic each hob revolution pushes, and you’ll probably end up tightening your idler more which reduces the hob effective diameter.
  10. Re-attach hot end.

Z height

At Z=0, you should be able to have a single piece of paper between your nozzle and the bed, and move it with a little “grabbing” but not quite enough to bend the paper when you push it. This is a simple, quick and effective test to use when levelling your bed. This small gap almost perfectly compensates for thermal expansion, which causes your hot-end to actually get longer as it heats up!

Rather than tuning your endstop endlessly, you could simply make a macro that homes Z using the endstop then sends G92 Z-nnn where -nnn is the negative position of your endstop. Your endstop must of course be below Z=0 for this to work. (Not too much, or you may damage the nozzle and/or print-bed!) Ideally in this setup your endstop would be set so that the (cold) nozzle just touches the bed, and then you’d send G92 Z=-0.1 (or your measured thermal expansion). Note that most slicing software adds a HOME command followed by G92 Z0 to the starting G-Code, so you will also need to tune your slicing settings to make sure your G-Code homes to Z-nnn. There are now many adjustable Z-endstops available for download, and these can be real time-savers.

When your Z=0 point is set correctly, your bottom layer will be slightly fatter than layers on top, but not extremely so. Most slicing software is set up by default to extrude a little extra material in the first layer, and you can tune this to get the perfect extrusion for your first layer, as well. (See below.)

Bed adhesion is strongly related to the Z=0 point. If you’re not getting enough adhesion, print slower with a lower Z=0 point so the first layer is squished more. If you’re getting too much adhesion, raise the Z=0 point a little so the first layer isn’t quite so squished.

  1. Find the appropriate Z=0 point.
  2. Send G92 Z0.
  3. Prepare printer for printing- warm up bed, load filament, etc.

Slicer settings

Layer height, Extrusion width

These are simple to visualise. When your extruder draws a line of plastic, that line has a height and width. You get to choose these values.

Best results are obtained when layer height < 80% of nozzle diameter, and extrusion width >= nozzle diameter.

Eg; with an 0.35 nozzle, your maximum layer height is 0.35*0.8= 0.28mm and your extrusion width should be 0.4mm or greater. with an 0.5mm nozzle, your layer height can be up to 0.4mm, and an 0.25mm nozzle will give you 0.2mm max layer height.

You can use a lower layer height or larger extrusion width if you wish, it will work fine. The slicing software automatically calculates the appropriate volume to extrude based on the settings you choose. There is no hard lower limit on layer height – it is limited by your ability to keep flow consistent at very low flowrates. Some reprappers have printed layers as small as 5 micron – 0.005mm!

Personally I go for layer height of 0.2mm, and extrusion width of 0.5mm regardless of which nozzle I’m using.

Slic3r automatically chooses an extrusion width for you based on your nozzle diameter. If you’re determined to choose, you can use the extrusion width advanced setting. It is frequently advantageous to choose as models may have walls of a particular width, and by choosing you can ensure they are entirely filled with perimeter with no gap in the middle and no infill.

Nozzle Temperature

Each type of plastic, and each colourant for each type of plastic alters the ideal printing temperature. E.g., I can print opaque PLA at 165°C with fantastic results, but my translucent PLA prefers 180°C!

Every machine will have different numbers due to differences in thermistor, and how close to barrel temperature your thermistor is actually sensing.

Here’s how I find my optimum temperature for each roll of filament that I have:

  1. Choose a fairly simple model that’s large enough that you can clearly see the infill while it’s printing
  2. Make sure your hobbed bolt’s teeth are clean of debris such as chunks of plastic
  3. Make sure your idler is tight! really tight! “it hurts my fingers to pull on it and I still can’t move it” tight! A too-loose idler gives exactly the same symptoms as too low temperature.
  4. Start printing
  5. Lower temperature by 5° every 2-3 layers
  6. When infill starts being a row of dots instead of a line, increase temperature by 10°.
  7. Keep monitoring print, increase by 5° if your infill goes dotty again If you find that your prints are weak along the layer lines or even delaminate mid-print, you may need to go higher again. With ABS, wrapping your printer in a towel helps a LOT by keeping out draughts and breezes- but beware any PLA parts caught within!
  8. Store or remember that temperature for that type of filament

Bed Temperature

Bed adhesion is critically important for quality prints. With the right amount of bed adhesion, your parts will:

  1. stick to the bed
  2. not curl or warp
  3. not exhibit ‘hourglass’ warping, and
  4. detach by themselves when the bed is cool.

This procedure helps attain 1 through 3 by finding the correct bed surface temperature. 4 is obtained by experimenting with various bed coatings such as PVA wood glue (best for PLA), UHU Glue(for nylon), automotive window tint, hairspray, ABS juicesugar water (ABS), etc.

  1. Pick a starting temperature. a little too high is better than too low for this test. Suggestions: 110°C for ABS, 65°C for PLA.
  2. Start a print. If your first layer gets poor adhesion, increase by 3-5° and start again.
  3. At layer 2, send M104 S0 so your nozzle heater turns off. LEAVE THE BED HEATER ALONE.
  4. At layer 3, pause the print and move the nozzle away from it. LEAVE THE BED HEATER ALONE.
  5. Prepare/consume a <favourite beverage> while you wait for bed surface temperature to reach thermal equilibrium. This should take 10 minutes at most, generally 5 minutes is plenty.
  6. Remove the print from your bed. If it is soft or stretchy, your bed temperature is too high. Reduce by 5° and start again. It should behave almost the same as when it is cold.
  7. When your bed temperature is correct, your part will have hardened while you consumed <favourite beverage> and if you set your bed temperature 5° higher it will remain soft.

You should generally print your first layer with the bed about 10° hotter than the regular layers’ temperature, to ensure that the plastic is very sticky and gets a good grip.

For reference, the SURFACE temperature of your bed (NOT the temperature measured by your sensor) should be around 105°C for ABS, and around 57°C for PLA.

Your thermistor WILL sense a higher temperature than the surface – a gradient of several degrees forms across your glass. DO NOT muck with thermistor tables or move your thermistor to the surface. You WANT it close to the heater so it can respond quickly and give a short feedback loop. Just find whatever number gets the surface to the right temperature, and stick with it!

After performing this procedure, if your prints warp off the bed mid-print at ends or corners, try adding a brim (Slic3r/Cura setting) and experimenting with various bed coatings. PVA wood glue diluted very thinly in water is excellent for PLA, and certain brands of hairspray are reportedly excellent with ABS.

E Steps Fine Tuning

Now, with everything very close to ideal values, we can finally dial E steps in that final little bit!

  1. Find an object with flat tops on a number of levels, such as this cube stack test
  2. Slice at 95% rectilinear infill. Use the lowest layer height you’re comfortable with – the lower the layer height used for this test, the finer your resulting E steps calibration will be. I use 0.2mm for first run, and if I’m feeling ambitious I’ll repeat this process at 0.1mm.
  3. Print.
  4. Ignore the first 5-6 layers because they’re too sensitive to the exact height of the first layer. If it’s obviously over-filling or under-filling, alter E steps or Z=0 point and restart the print.
  5. Observe infill. If you can’t see tiny little gaps between the lines, reduce E steps by 0.5% every 2 layers until you can see tiny gaps.
  6. Observe solid top layers. If you can see tiny gaps, increase E steps by 0.5% every 2 layers until there’s no gaps in the top.
  7. Send the new E steps to your printer with M92 Ennn without even pausing the print – you will see the result in a couple of layers when the change is this small.
  8. Goto 5 until the infill has tiny gaps AND the solid top layers do not.
  9. Now, your E steps value is extremely fine-tuned! Save this value in your firmware’s configuration and flash to make permanent.


Now print your favourite calibration piece (e.g., ultimate calibration) and see how it measures!

Optional: Switch to volumetric E units

Note: as of Feb 1, 2014, Marlin supports volumetric E units natively, without this modification. Just send an M200 D<millimeters> to set filament diameter before your print, and the Marlin settings below are unnecessary. You still need to do step 3 (change the filament diameter in your slicer to scale the output to cubic millimeters).

It seems silly to me to have to reskein if you change filament diameter (i.e., when switching colours – or printers!). Follow these instructions if you want to use mm^3 units for E instead of mm.

  1. Record the filament diameter setting you’ve been using in your slicer.
  2. Calculate (filament_diameter / 2) ^ 2 * PI. For filament_diameter = 3.0mm, this is almost exactly 7. For 1.75mm filament, it’s almost exactly 2.4.
  3. Change your filament diameter in your slicer to 2*sqrt(1 / pi) = 1.128379
  4. Divide your E_steps by the number from Step 2.
  5. Multiply all your E-related speeds and accelerations (esp. maximums in firmware config!), and retract distance by the value from Step 2.
  6. Repeat E steps calibration above. Your first print should be extremely close.

Now you can reuse the same gcode over and over again, and simply alter E steps with M92 when you change filament, or use the same gcode on another printer.


We currently have 3 tunables affecting one measurable – extrusion multiplier, filament diameter and E steps all affect the amount of plastic extruded.

Filament diameter does not change significantly – it should not change mid-print, and only changes by a small amount when switching from one roll of filament to another.

It should be possible to set two of these tunables to fixed values, and alter only the 3rd when necessary.

It is sensible to choose the tunable which is easiest to alter – this is E steps which can be altered at any time (even mid-print) by sending M92 Ennn.

The slicer calculates the volume of filament to extrude for each line segment. Then, it takes this volume and divides it by (filament_diameter / 2) ^ 2 * PI to find the distance of filament to extrude.

SO if we alter our filament diameter such that (filament_diameter / 2)^2 * PI == 1.0, then the E words in our gcode will be in units of mm^3.

Since our new unit is 7x bigger (area of a 3mm diameter circle is ~7mm^2, so 1mm(length) becomes 7mm^3(volume), for 1.75mm filament the factor is 2.4x), we have to adjust our retraction distance, and E steps and acceleration to suit the new units.