3D delta printer improvements (X/Y calibration, temperature)


This page describes how to improve your delta 3d printer, so you can

  • get highest effective print precision (x/y) for your prints (in my case I managed to improve from worst case 2mm print precision to average 0.1mm/worst case 0.4mm print precision )
  • improve temperature control (e.g. avoid object warping)

I’m using a ‘Geeetech Delta Rostock mini G2s pro‘ (170 x 200mm print volume, 0.4 mm nozzle)  and Marlin firmware using the described steps below.
This articles describes how to improve your printer’s position accuracy. Additionally, you can improve overall print precision by improving your printer’s extruder accuracy.

What do I mean with print precision?
Example: let’s print a 60mm x 10mm x 2mm cube  (x/y/z). You can download it here.


Now measure the cube. Does it have exactly 60mm x 10mm x 2 mm?  (In my case it had 62mm x 8mm x 1.8mm, so I had 2mm precision in worst case). So let’s get better precision!

1. General calibration idea
A delta printer basically consists of three triangles (at towers A, B, C). What we are trying to do is to get all triangles equal in size. Look at this picture (only showing tower A and B here):


As the printer’s firmware will only know the rod length (DELTA_DIAGONAL_ROD) and the horizontal distance of one triangle (for the case when printer is in home position)  (DELTA_SMOOTH_ROD_OFFSET), all of them must be equal. For a better understanding, here’s how – for a given cartesian point XYZ – the firmware computes the stepper motor position for tower A (the other towers are computed accordingly) based on Pythagoras’ theorem:

stepper_tower_a  =  sqrt( sq(DELTA_DIAGONAL_ROD)
                          - sq( -SIN_60 *  DELTA_RADIUS - cartesian_x)
                          - sq( -COS_60 *  DELTA_RADIUS - cartesian_y)
                    ) + cartesian_z

(Note: The firmware required DELTA_RADIUS will be computed indirectly by DELTA_SMOOTH_ROD_OFFSET – We will correctly get those values further below)

So let’s start calibration.

2. Verify your stepper motor tower movements are calibrated
This is a pre-check only to see if your stepper motors are controlled correctly. The firmware needs to know how many steps a delta stepper motor should move (DEFAULT_AXIS_STEPS_PER_UNIT) for one unit (mm). Let your printer go into home position. Then output the current stepper motor positions (steps) on serial console with this g-code:


output is:  X, Y,Z  (mm-cartesian), then X, Y, Z (mm-steppers)

Now move the Z position (that’s also the tower position if you keep the XY axis in home position) down by 100mm, and output again the stepper motor positions. The stepper motor positions should have changed by the moved millimeters. If not, adjust the value DEFAULT_AXIS_STEPS_PER_UNIT in your firmware.

Note: You can calculate the theoretical value here. Example for DEFAULT_AXIS_STEPS_PER_UNIT = 80:

  • 1.8° motor step angle (200 per revolution)
  • driver microstepping: 1/16
  • belt pitch (mm): 2
  • pulley tooth count: 20
  • theoretical resolution: 12.5 micron  (home work: since we know the theoretical stepper resolution, what would be the theoretical overall print resolution for a delta printer?)

3. Calibrate delta rod lengths

Make sure all diagonal rods (towers A, B, C) have exactly the same length [1]. If not, adjust them. Mine had a tolerance of 1-2mm before adjustment.

delta_schema         calibrate_rod_length

Set your measured rod length (mm) value in Firmware (Marlin):

4. Calibrate delta center
Bring your machine into home position (end-position), so the print head is centered. Make sure that all rods (at tower A, B, C) have exactly the same horizontal distance to their tower when in home position [2]. Use the end-stop adjustments, so that the horizontal distances [2] are exactly all the same. After each adjustment, bring the machine into home position again and measure. I had a tolerance of 1-2mm before adjustment.

delta_schema         calibrate_rod_horizontal_distance

Next, we need to measure the exact distance from center point to tower [2] (when the printer is in home position) for the firmware. As it is difficult to measure the exact distance, let’s do it the other way around (try & error). Put some millimeter-paper onto your bed, add a pen to your printer head and drive 50mm into each direction (x/y) from center point.


Is the moved distance correct? If not, adjust the distance (mm) in the firmware (Marlin) over and over until your head moves exactly the correct distance on your millimeter-paper:


5. Adjust Z axis length

Put a paper on bed, bring printer into home position once, and after that make sure that z axis zero (0) is exactly on the paper surface. Adjust the bed so that it is leveled at all positions. If required adjust z axis length (mm) in firmware:

#define MANUAL_Z_HOME_POS 203

That’s it – now print out a test object again and measure it. I had print precision 2mm before calibration (X/Y), and 0.4mm after calibration 🙂 Good luck!


6. Improve temperature control by adding an additional fan

So, you object is warping while printing? Then you need an additional fan to quickly cool down the printed material. The air flow should go directly onto the printed surface (not onto the hot-end):

print_surface_fan         print_surface_fan2

Also, make sure that your existing hot-end fan is not running too fast (so your extruder output is not over-saturated):



8. My Geeetech G2sPro configuration

  • Printer shape: rostock,  home x=0, y=0, z=max
  • Printer radius: 100m
  • Printer height: 204mm (adjust)
  • Number extruders: 2
  • Extruder 1 offset  X: 0, Y: -13mm
  • Extruder 2 offset  X: 0, Y: 13mm
  • Slicer start g-code:
    G28  ; home pos
    M84 S0 ;  keep motors on
    M106 S127 ; fan 50% speed
    G4 S2 ; wait 2 seconds (otherwise you may get probe pos error)
    G29 ;  auto-calibration
    G1 Z50 F5000  ; lift up nozzle
  • Slicer end g-code:
    M190 S0  ; turn off bed temp
    M104 S0  ; turn off extruder temp
    G28  ; home
    M84  ; motors off

9. Useful G-codes (Marlin firmware)

  • G28  go home (always start with this)  NOTE: this will forget auto-leveling!
  • G29  start auto-leveling
  • G28 Z100  home Z
  • G1 Z50 F5000  lift nozzle
  • M119  output endpoint switch states on serial console
  • M114  output current xyz position (mm) AND stepper motors position (mm) on serial console  (this is useful to calibrate DEFAULT_AXIS_STEPS_PER_UNIT in firmware for stepper motors)
  • M106 S127  set fan PWM 50%  (I have this in my start g-code)
  • M84 S0  keep motors on
  • M104 S0  turn off extruder temp
  • M190 S0  turn off bed temp
  • M84   turn motors off
  • M665  set delta printer config
  • G4 S10 wait 10 seconds
  • M107 fan off

Leave a Reply

Your email address will not be published. Required fields are marked *

IMPORTANT! To be able to proceed, please enter the magic word 'gaedan' so we know hat you are a human)

Enter the magic word:
Please leave these two fields as-is:

A blog on projects with robotics, computer vision, 3D printing, microcontrollers, car diagnostics, localization & mapping, digital filters, LiDAR and more