Automatic Delta Calibration Pt. 1 – Bed Tilt

Ever since I built my Kossel Mini, I’ve had tons of calibration challenges. I’ll admit that it’s mostly due to my lack of knowledge on how to properly calibrate, but there was actually a deeper issue that took me longer to figure out. Ultimately, I think the issue is a mechanical one, but I was able to make a software adjustment to compensate. That’s one blessing of delta printers – that you can correct most issues in software to compensate for hardware defects.

I didn’t realize how badly my printer was out of calibration until several weeks after using it. Up until that point, I was doing prints that were fairly small (less than 100mm) and only took up half of the bed space. It wasn’t until I tried some prints that take up the entire bed, that I realized how much my bed was tilted. As a result, I had a large gap on one end of the X axis, and the nozzle was digging into the other end. I knew that if I could get the first layer out, everything would print fine after that, but since the nozzle was so close on one side of the bed, the hot end kept jamming.

Now, up to this point, I was running Rich Cattell’s marlin fork, which included an awesome auto calibration capability and the ability to adjust most of the calibration variables using the M666 command. So to calibrate, I would run “G30 A” and let the firmware figure it out for me. However, I still had that weird bed tilt issue, and running a G29 before the print didn’t solve it either. I wondered if maybe the auto calibration code assumes that your bed didn’t have a tilt, so I ended up forking Rich’s firmware and added a new G code – G31 – for adjusting the soft end stops to account for bed tilt.  You can grab a copy here from my GitHub repository.

G31 is pretty simple. First, you have to manually deploy the probe before running the command. If not, the command will be cancelled and a message will be shown in the log:


When the command runs, I start the probe at 50mm above the bed and will lower it .1 mm until it hits the bed surface. From there, I raise the probe up 1mm and lower it according the AUTOCALIBRATION_PRECISION variable defined in configuration.h, until it hits the bed and triggers the probe end stop. This will be repeated 10 times, and it takes note of the average height of the nozzle over those 10 probes. This process is performed for the center of the bed, and also in front of each tower, 5mm in from the edge of the bed (make sure your BED_DIAMETER variable is correct in configuration.h).


The above picture shows the results of my printer after running G31. In my case, when the nozzle is at the center position it is slightly closer to the bed than when at each of the 3 towers. This indicates that I have a very slight convex motion and should adjust my delta radius.  Fortunately, it’s very minute, so it really isn’t enough to affect my prints, though.

Looking at the bottom of that picture, you’ll see that each of the soft end stops are adjusted accordingly to compensate for the tilt.  Note that I raise the end stops up so that the one farthest from the bed is at 0mm (the X end stop in the picture above, in my case), in order to maximize the print height.


I would recommend running G31 a couple of times in sequence, until all of the points probed are within your defined precision.  It should only take 2 or 3 iterations to get there. Afterwards, run M500 to save it back to the EEPROM. Here is the result on my printer after running G31 a second time.  You’ll see that my bed tilt is off by 0.02mm, which is good enough for me (and within my AUTOCALIBRATION_PRECISION value of 0.03 mm), so I’m going to stop running it here.  You’ll see, also, that my convex motion is now more pronounced after adjusting the tilt – it looks to be between 0.04 and 0.06 mm. Maybe I should adjust my delta radius after all. Smile


I’m not exactly sure why I had so much trouble with my bed tilt using the other firmware options.  My approach seems to correct it for me, at least.  If you have the same issue, give this firmware a shot and let me know how it works for you.

One other thing I’ll mention is that I added two other G Codes – G32 and G33.  G32 will perform an automatic delta radius adjustment and G33 will perform an automatic bed height adjustment.  I’ll explain what I did for these other codes in parts 2 and 3 of this series.


  1. Ken, Tried your code – thanks for putting it all together. Unfort I’m not getting the right results for G31 or G33 – calculated be high ends up about 20+mm higher than it should be. I should get around 200mm and G31 gives me back 177mm ish. after probing first time it moves up 5mm ten times – I thought is was supposed to make 10 iterations/probed touches at each point? Can you take a look at you code – something seems off. Looking forward to your response

  2. Hi Marco –
    Didn’t realize that you had left this comment, apologies for taking so long to get back to you. I assume that you’ve found another solution by now. I’ve updated the code since then, so maybe the current version would work for you? Let me know – if you are still interested in trying my code, I can do some troubleshooting and see if I can figure out what’s going on –

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s