This document outlines calibration procedures for 3D Delta Printers. The contents of this document have been derived from several sources. I take no credit for the information within. Any variable names used will reflect their usage in the Marlin firmware, as I'm not familiar with Repetier or any other. I'm using Johann's fork of Marlin with a couple of tweaks to allow for individual delta radii. Rich Cattell's fork of Marlin has recently been updated with improvements to the autocalibration feature, which I hope to try out in the coming months.

Before we begin, a few assertions must be made:

If you need to get in touch (corrections, questions, suggestions) feel free to send me an email.

Tower Levelling

The first step to calibrating your delta is to level each tower endstop. By doing this, you will be able to ascertain whether your effector moves flat in relation to the build platform. Chances are, your effector will either move in a convex or concave manner. This can be corrected by adjusting the DELTA_RADIUS value. You may notice that DELTA_RADIUS is a value derived from three others. Assuming your DELTA_CARRIAGE_OFFSET and DELTA_EFFECTOR_OFFSET are correct, the best way to adjust DELTA_RADIUS is to adjust DELTA_SMOOTH_ROD_OFFSET. The comments in the Configuration.h file should provide a clear enough explaination on what these values correspond to.

Firstly, adjust your MANUAL_Z_HOME_POS value to something sensible to reduce the risk of a head crash. time.

Next, set up the following buttons/scripts in Pronterface that will move the effector to the following locations:

  1. Tower A (front left): G0 F8000 X-77.94 Y-45 Z0
  2. Tower B (front right): G0 F8000 X77.94 Y-45 Z0
  3. Tower C (rear): G0 F8000 X0 Y90 Z0
  4. Centre: G0 F8000 C0 Y0 Z0

Move the effector to each of the locations, taking note of the height. It's important that you home the effector each time you move it to each location. If you're worried about crashing the head, send the command manually and slowly decrease the Z value. Adjust your MANUAL_Z_HOME_POS if need be, and try again. I like to start with the nozzle about 1 - 2mm off the build platform.

Now that you have a general idea for the Z height of the effector at each location, it's time to adjust the end stop screws until the effector is at the same Z height at the base of each tower. I prefer to just eyeball it to begin with.

If the effector is too high, turn the end stop screws out a quarter of a turn at a time. If the opposite is true, turn it in. With Tower A adjusted, move to Tower B, and then to Tower C. You should now be able to home the effector and move it to Towers A, B, and C and have it come to rest at the same Z height at each location. We'll fine tune for this later, so they don't have to all be precisely the same, but they should be very close.

Next, send your effector to the centre. It's a good idea to manually punch this one in, and slowly reduce the Z height. One of two things will happen - the effector will either be lower or higher at the centre than at the towers. If it isn't, you're in luck, and your DELTA_RADIUS is probably quite close to its correct value.

Now that each tower end stop is roughly dialed in, it's time to get that effector moving flat.

Radius Correction

Now that you've determined whether your effector moves in a convex or concave manner, you can correct that by adjusting the DELTA_RADIUS value. As stated earlier, it's probably best to adjust this using DELTA_SMOOTH_ROD_OFFSET, assuming the other values are correct to begin with. Start by making adjustments of 0.5mm.

To lower the effector at the centre of the build platform, increase DELTA_SMOOTH_ROD_OFFSET.

To raise the effector, decrease DELTA_SMOOTH_ROD_OFFSET.

Changing the DELTA_RADIUS value will change the overall Z height of the effector (imagine straightening out a curved line). Rather than adjusting each tower endstop all over again, I prefer to adjust the MANUAL_Z_HOME_POS to either bring the effector up or down so you can start fine tuning each end stop and the DELTA_RADIUS value. Doing this will make any convex or concave movements more obvious.

As before, send the effector to each location, taking note of its position above the platform. Tweak your tower end stops again until each tower is level, and the effector moves flat between all points. You will probably have to go back and adjust DELTA_SMOOTH_ROD_OFFSET by smaller and smaller increments before you hone in on the perfect value to get that effector dead flat.

Eventually, you should end up with the nozzle just a pinch above the build platform (about 0.2 - 0.3mm). If you have a sharp eye, you can usually just eyeball this, but using a sheet of paper as a feeler gauge seems to work as well. I recommend raising the effector by about 0.1 - 0.2mm afterwards though, as I find having it a papers' thickness from the platform too close.

It might take a few iterations to get everything dialed in, but in the end you should be able to move the effector between any point on the build surface when Z=0 (without homing) and have it maintain the same Z height.

Dimensional Inaccuracies

Perhaps the most common problem with Delta printers is are dimensional inaccuracies. I am not sure if this calibration method produces other undesirable results, and your milage may vary. My Rostock had a discrepancy of ~0.3mm in Tower A, and this is how I corrected it. It took me about 5 iterations of this process before I was able to print an asterisk that is symmetrical to 0.05 - 0.1mm, which should be good enough to produce parts for another printer (an oversized Kossel is my next project).

Here is a test object that I use for calibration. It's quite simple. It's an asterisk with the diagonal lines running parallel to each tower, with a horizontal line through the centre. It should be rotated so that the diagonal lengths are parallel to Towers A and B.

The purpose of this shape is to try and isolate movement from each tower to determine whether the 'lines' each one draws is dimensionall accurate. Inevitable inaccuracies in the build (radial positioning of towers, distance from centre and rod length) will produce distortions in the X and Y axes.

Dimensional inaccuracies are best accounted for by assigning individual DELTA_RADIUS values for each tower. If you happen to have uneven rods, I recommend remaking them.

In order to allow for individual DELTA_RADIUS values for each tower, add the following lines to your Marlin Configuration.h file:

// Tower position correction
#define DELTA_TOWER1_CORRECTION 0.0 // front left tower
#define DELTA_TOWER2_CORRECTION 0.0 // front right tower
#define DELTA_TOWER3_CORRECTION 0.0 // back middle tower

// Effective X/Y positions of the three vertical towers.
#define SIN_60 0.8660254037844386
#define COS_60 0.5
#define DELTA_TOWER1_X -SIN_60*(DELTA_RADIUS + DELTA_TOWER1_CORRECTION) // front left tower
#define DELTA_TOWER2_X SIN_60*(DELTA_RADIUS + DELTA_TOWER2_CORRECTION) // front right tower
#define DELTA_TOWER3_X 0.0 // back middle tower

You'll need a pair of calipers for this part. I find that it's best to use them as a kind of feeler gauge, rather than relying on the reading they give. You'll probably find that the length changes a little depending on where you measure and how much pressure you apply. With any luck, the lengths of the lines will be very close to one another. If you have large discrepancies (> 1mm), I suggest backtracking and looking for errors in the build. It is important that you measure test prints once they have properly cooled. ABS will shrink more than PLA, so it might be a good idea to do this with PLA.

Measure each length of the asterisk, taking note of the differences between them. Pick the two lengths that are closest to one another, or the length closest to your target size and use that as your reference point.

Start by adjusting the tower correction value for your innacurate tower(s) by twice the negated value of the difference. If you have two towers that are out of kilter, just start by adjusting one of them. For example, you have a difference of -0.3mm in Tower A, set the correction value to be 0.6mm.

Adjusting the radii of each tower will affect the endstop calibration for that tower (if you increased DELTA_RADIUS, it'll raise the effector at the base of the tower). You might also need to tweak the overall DELTA_RADIUS value (start by making a +/- 0.25mm adjustment to DELTA_SMOOTH_ROD_OFFSET).

In any case, get the effector moving flat once more (again, it shouldn't matter if it's not perfect, as you'll be tweaking things again) and perform another test print. Measure and repeat.

Once you're happy with the symmetry of your asterisk, work on getting each tower perfectly level and the effector moving dead flat. You should be able to send it moving all over the build platform without having it lift or dip.

Scale Correction

At this point, you should be able to print objects that are dimensionally accurate, but the scale might be slightly off. This can be corrected by adjusting the DELTA_DIAGONAL_ROD_LENGTH value, using this formula:

Measured Length / Expected Length * DIAGONAL_ROD_LENGTH

In other words, decreasing DIAGONAL_ROD_LENGTH will increase the size of the print, and increasing it will have the opposite effect. It's unlikely that you will need to make any further adjustments to endstops or tower radius after this.

Extruder Calibration

While this is slightly out of the scope of what this document is meant to cover, I thought I'd include it anyway, as it helps to have a properly calibrated extruder before performing test prints. It was pointed out to me that it's easy to under extrude without realising, and end up with lines that are a little thin. The last value in DEFAULT_AXIS_STEPS_PER_UNIT is how many steps per millimetre your extruder is performing.

In Pronterface, extrude 50mm of filament (M302 to allow cold extrusions). Measure how much filament the extruder actually passed through. Using the following formula, punch in your values:

Steps per millimetre * 50 = Total steps.
Total steps / Measured length = New steps per millimetre.

Adjust firmware as necessary, compile and upload and repeat. It should only take one pass, but it's worth double checking.