Delta 3D printer calibration with Marlin

I am not done calibrating my Kossel-Mini yet, but so far I’m finding a lot of coverage of the mechanical calibration procedure to be rather wordy and intimidating.
In retrospect, having made it part way through, it does not seem all that bad.

I moved the macros MANUAL_Z_HOME_POS and DELTA_RADIUS to the top of my Configuration.h, since they seem to be the main two variables that need tweaking.

MANUAL_Z_HOME_POS can be rather accurately estimated with a simple ruler. It is the distance from the extruder hot-end tip to the bed when in the home (top) position. I would enter a number a few mm larger than this into your MANUAL_Z_HOME_POS macro at first so that you have a little “working room” to adjust it.

DELTA_RADIUS appears to be the length of the XY projection of the diagonal rod, when the effector head is centered. I would estimate this at first with a ruler (or square).

I think that the setting of DELTA_DIAGONAL_ROD is fairly critical. This is the center-to-center distance of the holes at the ends of the diagonal push rods. Try to find somebody with good calipers to measure this as accurately as possible.


  • End stop calibration

    If the extruder tip is not at(near) the center of the print bed after homeing and moving in pure Z to a position just above the bed :
    1. Adjust the position of the endstops so that the extruder tip would be closer to the center.
    2. Re-Home, then move to a position just above the plate, at X=0, Y=0.
    3. repeat


  • Z-height calibration

    1. Home the effector.
    2. Command it to move a few mm above the center of the print bed
    3. Lower the print head (moving in -Z direction) until the extruder tip almost touches the glass (within 0.1mm or so).
    4. Read the extruder position (M114), and subtract the Z ordinate (which should be nearly 0) from the setting for MANUAL_Z_HOME_POS.
    5. Re-compile and upload with new MANUAL_Z_HOME_POS setting
    6. repeat until adjustment is (nearly) zero

  • Radius Calibration
    1. Move the head to a position slightly above the print bed and near the center, and measure the actual height above the print bed.
    2. Move the head towards the edge of the bed. A pure X-Y move, constant Z. Measure the true distance to the bed.
      • If the head is farther from the bed at the edges than the center, decrease DELTA_RADIUS.
      • If the head is closer to the bed at the edges than the center, increase DELTA_RADIUS.

    3. repeat



When the height and flattness are pretty good the residual error can be compensated for by the autoprobe procedure.

If there is not an M-code to set MANUAL_Z_HOME_POS and DELTA_RADIUS and save them to the EEPROM, I think there should be. Every time you do maintenance on the frame, belts, etc… these will need to be rechecked.


It may not be realistic to get the centering perfect by moving the endstops delta designs which do not have micro adjustment screws (like the Kossel-mini).
It would seem to me that once you have things centered fairly well, you could add G-code like:

G28 ; home
G91 G21 ; relative positioning in mm
G1 X-0.7 Y0.3 Z-0.4 ; adjust for error from imperfectly placed endstops
G92 X0 Y0 Z0 ; make this position the new home
G90 ; return to absolute positioning

to your homing operation.

Upon reading some discussions on “proper” generic G-code, I think that this should also be valid:

G21 ; make sure we are in mm
G28 ; home
G91 G28 X-0.7 Y0.3 Z-0.4 ; set proper HOME to this relative dist from G28 sensed HOME
G90 ; return to absolute positioning

If there is not a place in pronterface to define this homing procedure, it might be nice to get it into the delta firmware somehow. It would make sense that the above XYZ home offset would be among the parameters updatable by M-code, and saved in the EEPROM.

2 thoughts on “Delta 3D printer calibration with Marlin

  1. My skills at building a frame with mechanical perfection are questionable, to say the least. It looks like the center of the bed may not be the “center”. After reviewing the firmware source, it appears that there are the following assertions:

    1. The towers are perfectly perpendicular to the bed
    2. The towers are equidistant from a center, and they are EXACTLY 120.000 degrees apart

    My mechanical ability cannot guarantee these assertions. One addition I might make to the above procedure is to not assume that the “center” is the center of the bed. When the cup distortion is not radially symetric, I think it could be due to my deviation from the above assertions. It is hard for me to make sure that the towers are perfectly square, but I do my best. I can adjust the center and attempt to make the cut distortion radially symetric, then return to other calibration steps (again).

  2. There appears to be an M666 command on the Kossel-mini (at least) which stores and offset to the XYZ endstops. M500 will save these offsets to EEPROM. These can be used instead of fine adjustment screws to make the HOME position (nearly) exactly 0,0,MAX_Z_POS

Leave a Reply