On achieving a perfect level

Well, almost perfect. It is within plus or minus .02mm or .0008".
I’ve posted it to Thingiverse:

Here’s a video of it in operation;

So I did a manual level and learned that the front two rows were off. The last row seemed ok. So I decided to put a Dial Indicator to it. I learned that the grid points were all over the place. So I tried manually tweaking the points using the “M421 In Jn Zn” command to input corrections to the grid. WORKS! Also wrote a couple of GCODE commands to do the check. One of them offssets the location to account for the distance to the Dial Indicator tip. The other one can be used to check with the test card delivered with the Snapmaker.

The sound isn’t great. Give me any feedback you might have.

Here’s the two gcode files:
Check Level.gcode (849 Bytes)
Check Level Indicator.gcode (1.2 KB)

Here’s versions for a heated bed. 60 degrees C.
Check Level HOT.gcode (905 Bytes)
Check Lev Ind H.gcode (1.2 KB)


With my Check Level Indicator file above I decided to check the level after heating the bed.
It changed the level in various ways. In some places it changes .1mm or .004"! Some places it doesn’t change, some that change are positive and some negative!

So this makes me think the leveling has to be done with a hot bed.


I think there is no positive change.
If the bed is warping a little bit when the bed is heating SM2 need to perform the auto-calibration only when the bed is fixed at 60° for example.

I from France can you tell me which one is the one you use ?

The one with the yellow dial.

1 Like

I dont understand what this does.

Is this different to manual calibration? What was the issue you had with the standard calibration grid points?

Im not very well versed in G-code so would appreciate an “idiots guide” explanation if possible! I have noticed that despite the autocalibration, when printing parts across a large proportion of the bed certain areas the nozzle is too far from the bed to even adhere whilst at other parts the nozzle is so close that the filament deposited is nearly transparent.


Did you watch the video? It moves around to each grid point used in the leveling code and checks whether those points are really what they should be. The gcode file “Check Level Indicator.gcode” moves to each of the 9 grid points and shows you with the indicator how close they are to what they are supposed to be.

The file “Check Level.gcode” does the same thing only without using a Dial Indicator. You simple hold the level checking card under the nozzle as it moves to the grid points and you can tell if they are loose or too tight thus validating their values.

It’s quite simple:
G28 ;home to be safe
M420 S1 ; make sure leveling is on
;Grid Point 1
G42 I0J0 F6000 ;Move to grid point I0J0
G1 Z0.1 F100 ;Go down to Z.1 (the thickness of the test card)
G4 S2; Pause 2 seconds
G0 Z2 F6000 ; Go back up to z2

Repeat for all 9 grid points I0J0 through I2J2, They will be different for the different sized Snapmakers.

The I & J correspond to the X & Y directions.The exact locations of the X & Y are programmed into the controller and are different for each size of Snapmaker.

I will try this when i get my new machine :grin:
Greets from Austria!

1 Like

I added versions of the GCODE files for a hot bed. (60 degrees C) (In the original post)
I did some experiments with a heated bed and the grid points definitely change with heat.

Edit: I think you can modify the heat value right at the beginning of running this gcode. I haven’t verified that but I will.

Thanks @Tone for all your contributions, I’m honestly getting tired of spending so much time on getting the A350 to at least match the output of the SM 1.

With A350 I can now get good adhesion (in the middle), although still I need to apply a Z+ offset in the Slicer, even though it feels right against the calibration paper. However, once you start to move to the outside of the plate there is a lot of variance. Watching the extrusion towards the bottom right (300x,30y) of the plate, it rises to ~1mm eyeballing it.

Is it possible to check the values of each offset in Gcode? I’m really curious as to what the printer is auto calibrating vs reality.

I always set the bed to a little higher temp so as it’s cooling down the auto calibration is running around the print temp.


If you do a “M503” it prints out a report on the Console that shows the Z offset for each grid point along with other information. The Marlin documentation calls them “mesh points”.

You can also do a “M420 V” to also print out the “mesh data”. The test grid Z offset values and some other values that I’m not up to speed on. @parachvte? I believe this report also tells whether or not leveling is turned on and whether Z fade is enabled or not.

EDIT: THIS NEXT SECTION WAS WRONG. I tried it and it only applies to the mode in Marlin called: “AUTO_BED_LEVELING_LINEAR”. The SM2 is not in that mode, it’s in the “AUTO_BED_LEVELING_BILINEAR” mode as I was suspicious of.
A “G29 S0” is also suppose to produce a report that includes the global Z offset. I think a “G29 S0 In Jn” will report on an individual point.I haven’t tried this yet. It may be that this only works for “AUTO_BED_LEVELING_LINEAR” type whereas SM2 uses the “AUTO_BED_LEVELING_BILINEAR” mode.

1 Like

Thé only thing I want is to have a way to add BL touch on SM2 when they will open source firmware

Thanks @Tone I picked up a dial indicator. Will design a mount for it and give all of this a go.

HEY! I ordered that same model for my next version!!! The problem with the other one is that you have to take it off when you go to print. With the new one you can retract the plunger and hold it up out of the way with a little clip on attachment that holds the plunger up.

The new one has a bigger an easier to read display and can switch between inch & metric. So, cool, we’re perhaps thinking alike.
EDIT: The one I ordered has half the travel. Don’t need 25mm.

Another video of the calibration process.

Why this video ? There is nothing new on the auto-calibration process

I’ve just received the dial indicator of the same design, but higher precision (type B - 0.001mm), which is not needed, but anyways…

So until SM has fixed this, my thoughts are to do a number of Auto levels with the bed heated and record the values and take an average of them, then find the close values using my gcode routines, then set it up to do an Auto scan and then apply an adjustment to the matrix that is the difference between the two. I think because the heating causes the bed to vary so much that an auto level is most necessary before every print. As I have been doing lots of experiments the linear actuator modules start to heat up, the base plate starts to heat up, and all those things cause the offsets to need constant updating.

@Tone Please excuse my lack of knowledge here. How is the difference in Z height between points supposed to be dealt with by the printer?

I applied a basic test today and much like yourself there is variance of ~0.05mm to ~0.1mm between points. I tried a manual calibration (via interface not commands) and then tried a print, my expectation is for the Z to lower, ideally as a gradient between points 9 and 3. I presume the minimum motor step is 0.05mm so it can’t really be super smooth but at some point it should drop down.

I didn’t observe this and the print simply doesn’t stick as it moves towards point 3 and there is a clear gap between nozzle and plate.

The leveling process is supposed to map the shape of your bed and apply those differences to the Z movement so that it tracks in a flat fashion relative to the bed. It should move so that the tip always stays the programmed difference from the bed. Something is not working right because as my indicator gcode program is showing that it doesn’t track right. It does the right thing once the leveling matrix has the right values in it. So somewhere in the manual or automatic leveling process it isn’t setting the matrix values to the correct value. I can only speculate that some math or scaling error is occuring. If the probe offset values were off then you would see that same error in all the mesh points, that’s not what is happening. The error is somewhat random. This post shows what my error matrix looks like:

1 Like