On achieving a perfect level

Hey @Tone
The grid size is defined in:
line 30: probing_points = 3 # points x points
line 37: last_z = 0.001
I think line 37 could cause the pushing into buildplate problem.

grid calculation is in following file:
line 24 + down:
measured_z = [
[ -1.20, -1.13, -1.09, -1.03, -1.19 ],
[ -1.16, -1.25, -1.27, -1.25, -1.08 ],
[ -1.13, -1.26, -1.39, -1.31, -1.18 ],
[ -1.09, -1.20, -1.26, -1.21, -1.18 ],
[ -1.13, -0.99, -1.03, -1.06, -1.32 ]
Maybe pushing because of this points at calibration for the first time?- EDIT: i think this is just a graphical-tool.

I have found more :slight_smile:
Line 925-927:
//#define PROBING_HEATERS_OFF // Turn heaters off when probing its uncommented, i think also the comment OFF is false, if activated
//#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy)

Maybe you’ve already found out, but if you start manual calibration and then sent code ( or type preffered temp in luban and send, did both at the same time) it will reheat during calibration. so the bed stays hot for the entire calibration


No, I didn’t think of that. Great Idea.

i’m looking for a way to just type in the value i want for a specific point. i now have it to a deviation of less then 0,05 but feel that if i could just change a single points value, i could level it way quicker than just running the manual calibration over and over again. have you found something?

Just use this command:
M421 In Jn Zn.nn

Where the n’s for I & J are 0,1,or 2
And Z is the Z offset value.
You can also use Q.nn in place of Z where Q is an increment to the Z offset.

Example: M421 I0J0 Q-.05
I0J0 Is the front left grid point, increment the Z offset -.05

1 Like

alright thanks! i’v got most of them between ± 0,01mm! i use the digital dail indicator you have ordered. it’s a really nice and precise tool ! i have drawn a holder that positions its tip in the same spot the nozzle will be.
klok houder~.stl (422.7 KB)


I made my mount to replace the right side cover.
I haven’t posted it the Thingiverse yet, but I will.
It’s located X+36 from the nozzle.

It’s not visible but the Indicator is at a slight angle so it doesn’t block off the flow of air.


it’s nice to have the possibility of leaving it on, only negative is that it won’t measure the exact point the nozzle is at.

one thing i’ve also noticed: when homing the Z axis, it will stop whenever One of the Two limitswitches is pushed. so if something happens to the z axis when the machine is of, it won’t correct this. when using fast calibration, it will correct any difference in the Z-axis, but when trusting manual calibration, any difference in the Z-axis alignment will screw up the bed-clearance left to right. i have shimmed one of the two rail-endcaps so when i pull both sides to their max, the are perfectly parallel to the machines base plate

My “Check Level Ind. gcode” file clear at the top of this post offsets the grid points by the Indicator offset. BUT, I find the amount the indicator can fluctuate due to backlash and play in the modules to be significant and it’s hard to account for it. I find it easier to just use the Check Level Hot.gcode” and the test card to get feedback on moving the Z offset for each grid point.

yes i also take in consideration the backlash. if i go to low, i add 2 tenths and start to go down again, this way results should be accurate. i modified the Check level ind. gcode so the offsets are gone because in my setup, i don’t need it.

Of course every time you remove and replace the print module you have to redo the Overall Z offset.

I have the same issue and until today I am still struggling with the inconsistency of the distances between the nozzle and the bed.

Explain what you have tried so far.

I’ll be watching this thread. I have a 250. It just arrived this week and I am having some bed leveling issues.

Looking at it I seem to be lucky with only one corner that is consistently low. However, I’d like to use my full print bed…

I was wondering if there was an effective way to thermally isolate the frame from the hot bed. Would a sheet of Kapton tape would be enough? Or if there was a better material to consider? Would adding something like this be bad? how much extra thickness is too much before the printer head would collide? I guess its possible to add spacers to the Z attachment that is the same thickness as any reinforcement added to the bed.

I was also wondering if any of this is from air trapped between the magnetic attached section and the heating PCB?
Is lifting the bed an option?

A thin insulating layer between the aluminum frame and the heating layer might help. You still have all the mounting screws that would be transferring heat. Maybe you could replace all the metal nuts/threads with plastic ones. That would slow down heat transfer. I was going to try replacing the aluminum frame with a epoxy/glass one that should be stiffer to start with plus it would do better with the heat.

Regards thickness, the Auto Leveling process is supposed to deal with that. You have a little wiggle room there but would run into problems if it is thicker than 3mm or so.

I think the aluminum frame is the the main problem. It warps with heat. It’s not all that stiff.

1 Like

I just met a user, Bjorn, who told me that he has solved this issue with some pieces of paper.

Just FYI though I am not sure it is the build sheet. As i started troubleshooting this issue i decided to shim the left side of the heated bed. I used some paper as my shims and added 3 sheets or about .3mm to the 3 screws down the left side and retired the print. Right off it appears that this helped. The first layer went down fairly good.

So… Here we are, new firmware took out quick cal, we have a calibration with no heat on. I’m getting the highest deltas I have since the first week, with this new firmware. Has anyone figured out how to level this bed? :thinking:

What i did is turn off auto cal.
Then level the bed using the calibration with the card, but turn on the heated bed with the M140 command,after starting the calibration, while you are connected with your pc over usb. Directly after finishing the level i noticed still some problematic points.
Then i went to the points using the G42 command to go to each point and adjust the offset of every point with the "M421 InJn Q-.05 " and the calibration card, until i got decent results. For activating the the new offset do a homing with G28.(If you want it quicker, then drive to the point of calibration fast using a G0 command, before using the G28)
Dont forget to save the values after the optimization with a M500.
This took me 45 minutes to get a perfectly leveled bed on my A250.

Using the dial indicator is in my opinion not necessary at all. We are not chasing hundreds of a milimeter here.
And additionally if the x-carriage really does some rotating movement, which i could “feel” using the calibration card, the position of the dial indicator is not spot on the point of the nozzle which introduces additional error. So my advice would be, just use the calibration card, because in the end you want the nozzle to have a constant distance from the buildplate, not that dial indicator.

Another thing is encountered: try to fix the heated bed starting from the middle, so first tighten the four screws in the middle and then over cross all screws outside. That minimizes any tension you could bring in by tightening the bed in a wrong way.

I agree with @Razor1990 about using the card vs the dial indicator. It’s too tricky to account for the Z difference between the nozzle and where the indicator is. But I do find the indicator (the one with a needle and dial, not the digital one) useful for scanning the surface to see just how bumpy it is or at least how off the matrix is from the the bed. You can also see the effects of the head torquing when changing directions. Backlash too.
I did a couple of additional tests on how the bed moved with heat at the four corners. It’s pretty close to what it is at the center so I’ve consequently switched to doing my level cold and then using the temperature vs Z movement curve (earlier in this thread) to shift the whole matrix up or down based on the bed temperature.
One other thing I discovered (like @Razor1990 mentioned) is that the M421 tweaks to grid points don’t take effect until some kind of movement has taken place. I assumed it required a “home” command so I would use my “Check Level.gcode” file to survey the grid points and write down on a piece of paper how much to tweak each point and make the changes in a macro.

1 Like

Just so I do this right :

  1. Turn off auto calibration. (3d print settings -> Auto-leveling off)

  2. Run manual calibration.

  3. a) While the machine is waiting for me to calibrate the first point, input from a connected computer, “M140 S60” - where 60 is my wanted bed temp.
    b) Wait 15 minutes for heat transfer into the aluminum frame.

  4. Use "M421 InJn Q-.05 ", and run “G28” in between each use of the “M421” code, and check the level. Note: “-. 05” is the change, and different values can be used but stick to small values.

  5. After leveling all the points, run “M500” to save the values.

Did I miss any steps there?