On achieving a perfect level

Full disclosure that I’m a n00b to 3D printing and humbly defer to all the proper hacking folks are doing here. Keep it up, I’m absorbing as fast as I can!

That said, I’m also lazy. I’ve been pulling my hair out trying to level the bed for larger prints after my first several smaller prints worked out fine. The print head was visibly off portions of the bed and I couldn’t get any reliable adhesion no matter what I tried. Until I had an ah ha moment after reading this thread and comments about the heated bed warping. The “Imperfect Leveling for Dummies” workaround I put together and that got me back in business (A150) was:

  • install latest software/firmware
  • manually heat the bed to 70 C
  • quickly exit and run auto calibration
  • the bed only cooled to about 60 C by the time I finished calibration
  • fired up the @#$% print that’s been giving me grief
  • success!

It’s still not perfect – the print head is closer to the bed than I’d like and distance is still not uniform across the grid – but at least everything’s staying in place. Hopefully this helps someone else get unstuck (sorry couldn’t resist) until the software catches up.

5 Likes

Good to hear it’s working for you now :+1:. I think there are more issues with the larger beds as more room for warping.

I do a similar setup and manually heat bed a little higher before starting a new print.

1 Like

I posted this in the thread about the module digging into the build plate, but this is also how I finally got my bed level issues worked out, and started getting practically perfect first layers without any hassle. I’m able to start a print and walk away without much worry now.

One of the big key bits for me was the sensor position. I had to lower it down so that it was able to detect the metal in the build surface more consistently.

These are the steps I used:

  1. Have the machine powered off.
  2. Attach your print module to the bottom half of the mounting bracket. Basically attach it so that the top screws are mounted where the bottom screws would usually goes. Yes, this means that your print module is hanging very low. Do NOT try to run your machine like this for obvious reasons. The following steps are all done with the power off. This is so that the module is level and steady, and the sensor screw is accessible.
  3. Manually position the X & Y axis more towards their centers so that when you lower the Z axis the print head is over the bed. Carefully lower it until the nozzle is just touching the plate.
  4. Use something that is 1mm thick (a credit card perhaps), and adjust the sensor down to where it is touching this. The screw is on the back of the module, the bottom left if you are looking at it from behind.
  5. Re-attach the print module back in the proper spot.

This should get it to where it won’t be digging into your build surface.

You’ll then need to recalculate your Z-offset that’s set in the firmware to keep from having to adjust it a lot from the touchscreen every time you start a print. I used the quick and dirty that is shown here: https://marlinfw.org/docs/gcode/M851.html

After that I ran my calibration again after heating my bed to 70C

That didn’t get it wholly perfect. I was still having to raise it by .1mm during the print start to consistently get a good layer, but I currently have it set as an offset in my slicer and it has been working perfectly.

I did have to also change my build plate as my original one was extremely warped. My spare was not noticeably warped at all. Between the above adjustments, and swapping the plate, I’ve been getting excellent results.

2 Likes

What does your M851 setting show? (M503)

Mine was showing 1.0, the default that’s coded into the firmware version.

I used M851 to change mine to -0.06 (I think that was it, but exact number will vary by machine/build plate state). Following the quick and dirty guide on the M851 documentation, my probe was triggering at 0.06, and I just made it negative as stated. Though since I’m adding .1mm in as the z-offset in my slicer, I’ll likely adjust that again to be 0.05 (positive number this time).

Mine also shows 1mm. Of course the physical distance may be different from where it actually triggers. I was also expecting to see X & Y values in there. It doesn’t make a difference if the bed is flat, but it does if it is not flat. The X & Y should indicate how far displace the sensor is from the nozzle.

This is what they have it set to in the copy of the Firmware I got from them after reaching out to support to ask for it:

#define X_PROBE_OFFSET_FROM_EXTRUDER 13 // X offset: -left +right [of the nozzle]
#define Y_PROBE_OFFSET_FROM_EXTRUDER 19.15 // Y offset: -front +behind [the nozzle]
#define Z_PROBE_OFFSET_FROM_EXTRUDER 1 // Z offset: -below +above [the nozzle]

Does that show up in the M503? Maybe they only display the Z.

I do not recall. I’ll have to check when I get home.

I know M851 in the videos I’ve watched would display the X & Y offset as well.

I think not. Mine only shows the Z value. Did you verify that those offset values are correct or at least pretty close?

They were right about what I was able to estimate with the measurements on the calibration card.

Comparing their M851.cpp file with the default Marlin 2.X one, they gutted a fair bit of the code.

Theirs is 44lines (with the Marlin license header), and the stock on is 99 (with Marlin license header)

Mainly they pulled out the parts that would let you see and set the X&Y offset. Since the module comes with a probe, it’s not super crucial. However, if someone wanted to change the probe type they were using or location, they’d definitely need to change those.

Not sure how I feel about gutting functionality of some of the core commands. I could understand adding functionality, but I’d rather see core Marlin code be left as is where possible, and SM specific functionality be added on top of it via includes and such. That would make it far easier to bring new Marlin features forward.

Hopefully such a thing is part of the cleanup process before they make it readily available to everyone without having to reach out to them.

I hear ya. I think they are just trying to make it as simple and user friendly as possible.
BTW, I think I found a bug in the leveling code. (I haven’t mentioned that in this thread) They aren’t writing the z offsets to the matrix in the right order. That’s what I discovered in my experiments and just waiting for them to verify my suspicions.

It has been confirmed that the manual leveling process has a bug where the leveling matrix gets written with the X & Y axes are switched. What this means is that the matrix points 1, 5, 9 are still correct but the others get mirrored about the line that goes through those points. This bug may not affect you if you bed is pretty level anyway. The more your bed is tilted or warped, it actually amplifies the problem! They will fix it in the next release.

3 Likes

Does that affect their auto-calibration too?

I’m not sure, I haven’t tested that. What surely does affect auto calibration is that it’s done with a cold bed. I’ve confirmed that a heated bed changes the leveling. They need to change it so you can heat the bed before doing calibration. (Yes, you can heat it first and then do the auto leveling, but it is then starting to cool off and that changes the level)

Currently I think using my “Check Level Hot.gcode” file above and tweaking the individual mesh points is the best way to get an accurate level. It’s tedious and it will not be necessary once they fix the bug and allow leveling to be done with a hot bed.

1 Like

Yeah, I can see in the code where they make a call to turn off the heaters when the leveling starts.I just haven’t had a chance to really dig into the loop logic for gather and writing the data points.

Did the experiment with Auto Leveling, it doesn’t look like it is affected by the leveling bug.

Did another experiment where I did a manual level, then put the values where they are supposed to be, they were sill off by an average of .13mm.
That may all be because of a variance in heat. I tried to do the manual level with a hot bed. Of course all I can do is heat the bed up (to 70) and run the calibration. The heat drops to 59 by the end.

Also did an Auto Level starting with cold and then hot. The change in the level matrix was:
I:____0____1_____2
0 -0.11 -0.05 -0.04
1 +0.03 +0.07 +0.02
2 -0.06 -0.02 -0.05
J

The difference between Auto and Manual (both hot) is:
I:____0____1_____2
0 0.18 0.14 0.13
1 0.19 0.12 0.10
2 0.13 0.12 0.06
J
Average of .13mm

Edit: I removed the third decimal digit as it’s not very relevant. Rounded to nearest .01

1 Like

I have confirmed this now as well. Work around is to preheat the nozzle, and over preheat be bed, before actually starting the print, then let the quick cal happen. I’ve found 75 is about right for 55 temp bed.

@parachvte, Here’s the test you asked for. Auto level when cold, then 30 min at 70 deg C.
The temperature dropped to 60 by the time the Auto Hot test was completed.

This is the Auto Hot - Auto Cold (difference), Average: .08mm
I___0___1___2
0 0.22 0.05 0.05
1 0.07 0.09 0.05
2 0.04 0.06 0.05
J
This makes sense because as the bed and surrounding hardware get warm they expand causing the Z offsets to increase.

Here is how different the Auto cold was from an adjusted manual level cold. (That means I adjusted it to be near perfect with “Check Level.gcode”.

Auto cold - Manual adjusted. Average: .14mm
I___0___1___2
0 0.03 0.15 0.24
1 0.17 0.11 0.14
2 0.17 0.10 0.17
J
When the Auto level completes is says how much the Z offset is adjusted. In both cases it was 1.1mm. The Z offset for the sensor is 1mm so that roughly means the Auto level is adjusted by an additional .1mm.

I’ve ran through the auto calibration many times to see how the results vary. It would be great if SnapMaker Luban terminal would let you copy & paste text!!

level auto s60 2