[Dennis] of [Made by Dennis] has been building a Voron 0 for fun and education, and since this apparently wasn’t enough of a challenge, decided to add a number of scratch-built improvements and modifications along the way. In his latest video on the journey, he rigorously calibrated the printer’s motion system, including translation distances, the perpendicularity of the axes, and the bed’s position. The goal was to get better than 100-micrometer precision over a 100 mm range, and reaching this required detours into computer vision, clock synchronization, and linear algebra.
To correct for non-perpendicular or distorted axes, [Dennis] calculated a position correction matrix using a camera mounted to the toolhead and a ChArUco board on the print bed. Image recognition software can easily detect the corners of the ChArUco board tiles and identify their positions, and if the camera’s focal length is known, some simple trigonometry gives the camera’s position. By taking pictures at many different points, [Dennis] could calculate a correction matrix which maps the printhead’s reported position to its actual position.
Leveling the bed also took surprisingly deep technical knowledge; [Dennis] was using a PZ probe to detect when the hotend contacted the bed in various places, and had made a wiper to remove interfering plastic from the nozzle, but wasn’t satisfied by the bed’s slight continued motion after making contact (this might have introduced as much as five micrometers of error). To correct for this, he had the microcontroller in the hotend record the time of contact and send this along with the hit signal to the Raspberry Pi controller, which keeps a record of times and positions, letting the true contact position be looked up. This required the hotend’s and the printer’s microcontrollers to have their clocks synchronized to within one microsecond, which the Pi managed using USB start-of-frame packets.
The final result was already looking quite professional, and should only get better once [Dennis] calibrates the extrusion settings. If you’re looking for more about ChArUco boards, we’ve covered them before, as well as calibration models. If you’re looking for high-precision bed leveling, you could also check out this Z sensor.
Thanks to [marble] for the tip!

Whenever i’ve done this kind of calibration, i’ve been surprised how easy it is to get much better than 1mm precision. Though i felt i had to be a little bit clever to make the best plane out of my most recent bed’s limited adjustments…at first i tried to get everything leveled at the print head’s “0”, and it took a while doing a tug-of-war (pulling it closer here makes it further away somewhere else) before i realized actually the absolute offset doesn’t matter (since the printer calibrates that out perfectly), so instead i tried to find the natural plane it wanted to be on and then got everything as close to that plane as i could. Calculated the triangle error across my 300mm square build plate from the slope and it’s tiny. It’s not better than 0.1mm but it’s pretty close.
But i don’t think there’s any point to doing any better than about +/0.1mm, and i think this write up kind of demonstrates why….you can’t compensate for the bed warping 0.005mm by using more precise measuring, because the bed will warp this much during regular usage too. You can’t meaningfully apply a static calibration for something that will be varying in practice. As someone just pointed out to me in the other article, simply adding weight to the bed will change its shape and height a little bit. The overall characteristics of the process simply don’t support that kind of precision.
When I did measurements on heated bed shapes at Ultimaker, it took 30 minutes before it would settle into it’s final shape after heating up. With deviations as much as 0.1mm during that half hour.
a common pre-print preparation technique these days is to preheat the bed for at least 10minutes ( this low because people are impatient but that’s another story :-D), at 10minutes it’s usually good enough but I do like to soak for 30mins sometimes. From reading your post and the article, the common theme really seems to be ‘your bed probably isn’t the shape you think it is’ and ‘when is good enough, good enough?’. I used to be happy with a saved mesh but these days, especially with 300×300 or 350×350 build plates, there seem to be too many variables that can make the bed a slightly different shape to the one you expected it to be.
9:10-9:33: If the calibration pattern has been printed with skew, rotating it by 180° and averaging the result of both measurements will not cancel out the skew. You’d need to print it on a transparent sheet and make the second measurement with it flipped on its back to cancel out the skew.
TIL