Calibrating core XY printers for dimensional accuracy

Use cheap calipers and this cheap print to perform iterative dimensional accuracy calibrations on your core XY printer.
23
224
0
2061
updated February 27, 2024

Description

PDF

Background

Belt tension must be set correctly on any core XY printer to ensure dimensional accuracy in the X and Y plane.

Increasing the tension on the belts (slightly!) stretches them, causing a given rotation of your stepper motor to move the toolhead further (so your parts come out a bit bigger). Similarly, reducing the tension makes your parts a bit smaller.

Your belts should already be the same length as each other from when you built your printer, and the belt paths should be the same length as one another. So ideally you would have the same tension on both belts.

You can observe the tension on your belts by putting you gantry into a known Y position (e.g. push it back so there is 150mm between the centre of the front idler to the X gantry idler on the same side) and then using a guitar tuner (app for example) to measure the frequency of the note produced when you “twang” / pluck that section of the belt.

Start by completing Eddie The Engineer's guide to basic belt tenisioning here:

https://github.com/eddietheengineer/VoronDocs/blob/master/support/secondary_printer_tuning.md

In short, put your gantry 150mm back, and then tension the belts until the frequency of the twang is 110Hz. The most important thing here is to try and put around the same tension on both belts.

Now your prints should be much closer to the correct size.

Don't bother trying to fix gross errors with the size by changing belt tension. Just get your belts to the correct, equal, tension.Increasing the tension on the belts beyond this will barely stretch them at all, so won't change the dimensional acuracy of the part too much. But it will put more stress on your steppers and belts, reducing their life time and increasing the current required to drive the motors.

If your belts are tensioned correctly already, and your parts still come out wrong, don't throw your printer in the garbage! Instead (assuming you use klipper) I can offer you “one weird trick” to bodge your config and fix it.

Concept

We want to print the largest part that we can measure, so as to maximise the observable deviation caused by incorrect belt tensions (or other x/y motion issues). We can then make adjustments until we can print the part correctly.

I found that my cheap calipers can measure just over 150mm, so this “calibration cross” part is as large as I can measure with fairly high precision.

We do not want to print a small part and use a micrometer to measure it for this calibration. Because the smaller the part, the greater the effect of under/over extrusion will have on any observed error.

I recommend you calibrate your printer's extrusion first, if possible, getting it vaguely correct, to attempt to mitigate that factor for this calibration. Just having the correct rotation distance for your extruder is pretty much required. It would be helpful to have completed pressure advance calibration as well, and that can be done before this, without caring about dimensional accuracy.

Method

So you tensioned your belts to the max and the parts are still wrong?

I guess this implies the geometry of your machine is wildly wrong for some reason, and you should feel terrible! I know I did!

Don't sweat it, we can still bodge around this :-)

I'm going to assume you can get the belts tensioned correctly, so they are tight, and have the same tension (same frequency twang) in both of them. And your parts are nice and square, but too small.

Assuming you are running a firmware like klipper that allows you to mess with the rotation distance you can “calibrate” (bodge!) that in a similar way to when you calibrated your extruder.

Each of your A and B steppers (which may be defined as X and Y depending on who you copied your config from…) has its own setting. Mine looked like this:

[stepper_x]
step_pin: PF13
dir_pin: PF12
enable_pin: !PF14
rotation_distance: 40
microsteps: 32
full_steps_per_rotation:400  #set to 400 for 0.9 degree stepper
endstop_pin: PG6
position_min: 0
...


[stepper_y]
step_pin: PG0
dir_pin: PG1
enable_pin: !PF15
rotation_distance: 40
microsteps: 32
full_steps_per_rotation:400  #set to 400 for 0.9 degree stepper
endstop_pin: PG9
position_min: 0

(aside: we have two seemingly redundant numbers here, a rotation_distance and a full_steps_per_rotation. You should be able to calculate rotation_distance if you know the full_steps_per_roation, the microsteps,  and the steps_per_mm. But the steps_per_mm setting is not easy to find! I don't know which value klipper actually uses for which calculations!)

Measure the calibration cross that you printed, divide 150mm by that number that you just measured, and that gives you a scale factor you want to apply to everything that these motors do.

For me, I measured my part at 149.49mm

150mm / 149.49mm ~= 1.003344

We want to change the rotation_distance and the full_steps_per_rotation, but klipper has a hissy fit if those are not whole numbers apparently, and didn't even like it when I set them to integers that were close to what I wanted.

But we can still implement this bodge, by exploiting a setting called “gear_ratio” to pretend we have steppers with gearboxes. And it's super easy, just plug in the number you've calculated as a “something to 1” gear ratio at the end of each existing config section, like this:

[stepper_x]
step_pin: PF13
dir_pin: PF12
enable_pin: !PF14
rotation_distance: 40
microsteps: 32
full_steps_per_rotation:400  #set to 400 for 0.9 degree stepper
endstop_pin: PG6
position_min: 0
gear_ratio: 1.003344:1
...


[stepper_y]
step_pin: PG0
dir_pin: PG1
enable_pin: !PF15
rotation_distance: 40
microsteps: 32
full_steps_per_rotation:400  #set to 400 for 0.9 degree stepper
endstop_pin: PG9
position_min: 0
gear_ratio: 1.003344:1

Because you made a core XY printer you must make the same adjustments to both the A and B steppers at once or the world will end!

You probably need to iterate this at least a couple of times, as you did with the belt tension adjustments.

Bear in mind, this is a bit unpleasant because you are effectively lying to klipper about your stepper motors. But not as unpleasant as printing parts the wrong size.

Notes

This part might be useful for systems other than core XY, but you'll probably be tensioning the belts separately for the X and Y axis so it might make more sense to use a “long line”-type object for that, and calibrate one axis at a time. You do you.

I've never had a problem like this with lead screws (e.g. the Z on my printer has lead screws and was “bang on” correctly calibrated by default), so I'm curious if there's something really wrong with my belts or the way I built the printer that caused this, or if everyone using belts hits this problem.

If your printer has a belted Z then I expect you should do a similar calibration on your Z axis but with a “tower” type print. And most belted Z printers that I've seen have multiple independent belts so this will be harder to get right. It's still probably a very good idea to build everything as square as possible and then get all the Z belts at the same tension/note as each other.

CC0 / public domain, have at it, OpenSCAD file provided in case you have larger or smaller calipers. Print as large as you can easily measure with good precision and accuracy. If you have a 150mm micrometer(!), use that instead!

If we had a second X endstop on the other side of the gantry (so 2 endstops, that are a known distance apart), we could do this automatically (using the “my parts are still too small” technique)!

 

 

Tags



Model origin

The author marked this model as their own original creation.

License