The rotation distance MD document says to
not use a “measure and trim” type of method to calibrate x, y, or z type axes
because it’s “not accurate enough.”
The problem is that I’ve found that calculating your rotation distance isn’t accurate enough either.
By using something like this:
and measuring the steps using a micrometer, I’ve consistently found that the calculated value for rotation distance is not accurate.
In fact in a printer farm of 12 Prusa MK3S+'s I’ve found that rotation distance can vary as much as .1mm from machine to machine.
Why is this? For the same reasons that extruder rotation distance varies: how tight you tighten your belts, manufacturing variations in the teeth and pulleys in your printer, if your belts have to twist at all, if they run at an angle, and many other factors impact exactly how the machine operates.
Does this matter? I think so. For example on my CR10, I found that the optimal rotation distance for the x axis was 39.9063. With a 310mm bed, a rotation distance of 40 would have given me as much as 0.726175mm inaccuracy. If I was 3d printing a computer case (definitely not something I’ve done), the motherboard simply wouldn’t line up with the screw holes (definitely not a situation I’ve been in).
It gets worse if you have multiple printers too. While a single part being a little small, especially at that scale might not be a big deal in some cases, printing 2 parts that would work together on 2 separate printers could lead to bigger problems with even smaller parts.
So, if you’re having problems with parts not fitting properly, or you’re just interested in having +/-0.05mm dimensional accuracy bragging rights, read on:
Before you get started
A few things I’ll note. I’m writing this at night and I don’t want to be up until 3 tonight so I won’t be going into every single possible detail about what’s happening. You’ll need some basic knowledge of manufacturing statistics, measurement theory, and precalculus to follow everything that’s going on here. If the interest comes later I might add more pictures and explanations at that time. For now, you’ll also need:
- Spreadsheet software (I used Excel but Numbers and Sheets should work as well)
- Some kind of measurement device that is capable of reading down to 3 decimal places in mm with accuracy greater than your stepper motors and that is not influenced by human error caused by pressure (micrometer (xy axis only) if you want to be measuring prints or dial gauge if you’d rather mount something to your printer or you can use a bed probe for your z axis) all of these have their pros and cons and I’m sure someone can think of another device that can be used for this but the 2 qualifiers above must be met (no calipers)
- Time
- Some filament, possibly
- Your own CAD software or you can download my stl for your xy axis
You should also have a well built printer. Many “3 piece” printers (ender 3, CR10) are not assembled well from the factory and you should tighten and possibly retighten things before you get started. For example, on a typical creality bedslinger if the 2 y axis beams are tightened to the bottom x axis beams before the z axis beams are, the y axis beams can be slightly rotated about the y axis which will cause the tension in the v rollers on the z axis to change throughout that axis, invalidating your results. This is just one example so you should really take the time to make sure your printer is assembled tightly where it should be, and square. Remember 3d printers should be assembled like a car wheel is mounted: put all the screws in loosely to start, tighten them all finger tight, and then tighten them the rest of the way in a clockwise pattern skipping every other screw.
One final note, if you’re printing objects to be measured, make sure you are printing in an “easy” environment since thermoplastics are not very dimensional stable in the first place. There’s a reason that all the commercial printers that advertise guaranteed dimensional accuracy have some kind of enclosure, typically a heated one.
XY axes
I’ll start with the XY axes because they’re generally more in need of this fine tuning than the z axis since those commonly use screws which, while not perfect, are much better than belts. However the general concept here is applicable to any axis so if you are using your own measuring method, apply the concept here only.
Start by mounting your dial gauge or printing this guy with the wide portion of the steps facing the direction of the axis you’re measuring.
XY Calibration.stl.zip (9.1 KB)
The main issue we have to combat here, and part of what causes the Klipper docs to say that test and trimming is not accurate enough for xyz axes is that we need to measure the travel distance of the printer in a way that is not affected by dimensional precision (or imprecision, actually). If you’re measuring a printed object you also need to account for issues like slicer errors, inaccurate flow, and other things which are not important to this sentence. If you’re measuring the first step of my model for example, you’re most likely going to measure more than 2mm. While some of that is due to your rotation distance being too high, by measuring the next step and calculating the difference, you’ll see that the majority of this is due to other 3d printing issues, which we’ll tackle in another post.
If you haven’t figured it out by now, what we’re looking for here is the size of the steps, not the object itself. And if you’re using a dial gauge, you’ll want to make many small steps as well. This is because even a perfectly calibrated printer will have some dimensional imprecision, which is different than inaccuracy.
Precision is that +/- you see on your calipers, dial gauge, and any other scientific instrument. It’s the repeatability of the positioning system for your printer. As you can see from my results, my first run on my CR10 had a precision of +/-0.0365. (I started with 39.79102314 because the spreadsheet I’m showing here is from a recalibration after I reassembled my gantry)
You should setup your spreadsheet something like this after you record your first results:
Make sure to replace the 300 in total error with the length of your axis
Take the value from the new column and put it in your config and go again. A few things you should know at this point:
- The ultimate goal is to get the total error to be less than the variation. While you theoretically want a total error of 0, it’s going to be really difficult, and there isn’t really a point because again, there is a repeatability limit in your stepper motors and everything else in your system
- The higher your variability the more steps you’ll have to measure to minimize the effect of the variation in your results. You can either do this by increasing the steps in your model or running the test multiple times.
- If your variability is super high, you should consider upgrading your motors, belts, pulleys, etc.
At some point you will find that your “new” rotation distance is oscillating up and down. This is because when you get that close the the target value, the effects of inaccuracy in the measurement device and plastic if you’re measuring printed parts gets too relevant. To combat this, create a scatter plot of your tested values to their “delta” values. (yours will have more points than mine as mentioned above. Create a best fit line and retrieve the equation for that line. Then solve for y=1.
Testing this value should get you your closest value yet.
At this point, getting more accurate will require measuring more steps and plotting more points to refine your best fit line. You could theoretically get to “perfect” dimensional accuracy but you’re likely to find that things like thermal expansion in your belts will throw your results while you’re tuning. The good news is that at this point, you should be well beyond what Stratasys promises for $50k machines, and you should definitely be good enough for anything you could possibly want to 3d print.
Z axis
With the Z axis you have to get a little creative if you aren’t using a dial gauge. Because beds aren’t flat as you probably well know, you can’t just print the same test part rotated. You could print a bunch of towers placed in exactly the same spot but that’s a lot of work. I like to use a bunch of towers I know the height of and the probe command to do the measuring. Just make sure that you take a couple results and average them and measure your towers with your micrometer because they aren’t going to be perfectly 2mm steps or whatever.
You could also consider printing your step tower on a raft if you already have bed leveling to compensate for the majority of the tilt in the bed. Just make sure that the bottom of your print turns out nice so you have an even measuring surface.
Final remarks
Most extruder rotation distance calibration guides recommend extruding like 50mm and measuring how far it actually went. Now that you’re probably familiar with manufacturing statistics, think about how stupid that sort of is. If you marked your filament with a sharpie and are measuring with a calipers, the best measurement you can hope to get there is within a tenth of a mm. I just sliced a benchy in simplify3d and it says 4013mm of filament. That .1mm just became 40mm of filament. Take a benchy and 4cm of filament and think about the volumetric difference you have there. Get a meter stick and extrude at least 500mm of filament. Do it a couple of times just like you’ve done for everything else. Make sure you use a temperature near the top of what your printer can do and slow down that extrusion to get the very least pressure influence.
Consider tuning input shaping and pressure advance, again if you already have as they have a large impact on your geometry and thus your dimensional accuracy in a lot of ways.
If you have bed leveling, please don’t use fixed mounting for your bed. Even if your firmware accounts for tilt in your bed, you’re still going to be left with either a slant in your prints or inaccuracies if you use mesh fade.
You’re likely to find at this point that a flow rate of 100% is actually perfect. Turns out that unless you have some special filament like a filled filament, 1.75mm is 1.75mm (or 2.85) and the volume doesn’t change so there’s no need to compensate for flow.
If you’ve gotten this far and you’re done this please let me know how precise you got.