Troubleshooting the Elegoo Mars Z Accuracy/Squished First Layers

I recently got an Elegoo Mars MSLA 3D printer. Of course, what I mostly make are functional parts, and what I got the Mars for is extreme dimensional accuracy and precision, so I was a little bummed when all of my prints came off the printer apparently missing the first 1mm or so of layers.

Most MSLA users are trying to print figurines and such, but at least a few try for dimensionally accurate parts directly on the bed. Unfortunately, that seems to be just about impossible on the Mars. The most common response is “don’t do that, this ain’t FDM, you’re thinking about it wrong!” For a few reasons, pertaining to certain objects, this is nominally true: In cases where any given slice of the object has larger surface area than the surface area of what’s attached to the bed, the object is more likely to pop off the bed. This can be alleviated by printing on an angle with supports, since this tends to ensure that the projected area that gets attached to the bed is always greater than any slice of the model.

However, for plenty of objects, this is unnecessary. Consider any functional part with simple geometry and a largely consistent area, say, a cylinder – the area on the bed equals the area on the window, and since bed adhesion pressure is typically a bit higher than FEP adhesion pressure, these objects tend not to detach. And printing them without support tends to result in better dimensional accuracy and surface finish.

But the REAL point of this post is that, mechanically, printing directly on the bed SHOULD work just fine! People tend to answer that “The first few layers get squished for bed adhesion” – that is nonsense! Besides that it makes sense in the context of FDM but NOT SLA (kinda funny given the “quit thinking like FDM” response), the behavior I observed below suggests that the machine also isn’t trying to do any such thing. Instead, the software achieves bed adhesion by substantially over-curing the first few layers. Make them nice rock-solid plastic up against the bed to really hold strong on all the microscopic nooks and crannies. Then go back to a less aggressive cure for the rest of the layers to save time, since we can.

But also, I know MSLA printers should be able to produce dimensionally accurate parts right off the plate because the Photon seems to have no trouble with this. I found MANY photon troubleshooting threads looking for “Z inaccuracy” but basically all of them resolve with a successful print with axis-equal dimensional accuracy missing no layers.

OK OK so my Mars observation setup:

I put a piece of tape around the lead screw, and a piece of tape above that around the lead screw and Z rail, backed with another piece of tape so it wouldn’t stick to the lead screw. I homed the Z axis with the bed loosened, and drew a line across both tapes indicating 0* rotation and true Z=0 per the optical endstop. I moved up and down a few increments at a time, and determined that the lead screw has 1 turn for 2mm of z travel (so 180* rotation is Z=+1mm, 360* rotation is Z=+2mm, etc). So my Z=0 is actually marked 2 on the tape.


  1. Z=0 is fully repeatable with a loose or removed bed.
  2. If I tighten the bed, homing ALWAYS results in Z>0, usually something like 1.
    1. One possibility is this is because of the back pressure due to capillary action of resin between the plate and FEP, pushing up on the plate.
    2. A second possibility is that tightening the ball actually pushes the rod down slightly at the same time, which I think is a problem with the Photon, though definitely not for the same reason since it’s a different geometry.
    3. I observed the same behavior leveling against the FEP even with no resin in the tank, suggesting (b) is MUCH more likely than (a)
  3. The Mars does NOT sense force on the lead screw or anything like that – ONLY the optical endstop.
    1. I know this because if you “home” and hold the bed up manually, it’ll fight through any force and come to rest at the bottom.
  4. Putting upwards force on the end of the bed arm appears to lower the flag that trips the endstop
    1. With the bed loose or removed, you can cause an early end detection (higher Z=0) by putting an upwards force on the arm manually.
  5. The printer seems to only beep when the endstop sensor is triggered.
    1. With the bed arm at Z=0 or even a slightly too high Z>0, lifting up on the arm can make the printer beep, without commanding anything, I think due to tripping the optical endstop.
  6. The printer definitely does not, at least intentionally, “squish” layers by returning to the same Z height and re-exposing
    1. Every subsequent layer is one layer height higher, per the lead screw angle. That is, if layer 1 started printing at a false home of Z=1, the lead screw, on the next layer, rotates to Z=1+layer height.
  7. I was able to print a 1mm high test object, despite losing in excess of 1mm on my earlier cal cube print, and despite my false home usually ending up at a lead screw position indicating Z=1.
    1. This object was a few cm long, 1cm wide strip with a bunch of steps attached to a consistently 1mm high wall. The steps were 0.05, 0.1, 0.15… 1mm – 20 steps, 20 layers, one step per layer.
      Screenshot of 3d-printed test article geometry
    2. When I leveled against the FEP with resin in, then started printing, I got some squished-out bits and a total finished height around .55mm, so missing Z height.
    3. When I STARTED the print, THEN tightened down the bed WHILE the first layer was exposing, I got better results, with a finished height of .98mm and only modest smearing, probably from the bed twisting slightly when I tightened it.
    4. While printing the object, the first few layers, maybe 10, all caused beeping, which I THINK indicates the endstop triggering. This doesn’t seem to actually have an impact on Z axis behavior though, because the leadscrew rotation remains correct in the context of an incorrect home.

So here’s my theory.

  • Tightening the bed causes the arm-bed gap to grow slightly.
  • The force of the bed impacting the window torques the arm away from the window slightly, which causes the endstop flag to trigger the endstop early.
  • As the first few layers are cured, the pre-existing torque on the arm causes force on the model, and thinner than expected layers.
    • The layers still exist, because the Z axis doesn’t mechanically overcome 100% of the capillary force of the newly-wet latest layer when the Z raises to pull in more resin.
    • My layers work out pretty OK, since I’m using relatively viscous Siraya Blu without heating.
  • The first few layers are thinner than expected, and some squished out the sides, and eventually this thinness provides enough Z relief that the error and therefore torque on the arm nulls out, and from that point on, you get proper Z layers.
Picture of first test article
First Z test print, leveled and tightened against FEP with resin present.
picture of second test article.
Second test article with mostly-accurate Z height, printed by tightening Z height WHILE first layer was curing. The error bottom left was because I accidentally stabbed the side and delaminated some layers with my removal spatula.

If this theory is right, I should be able to null the ball-z-growth (ha) by performing the leveling on top of both FEP AND a few extra sheets of paper, adding paper to the stack until the first time I can remove the paper and get Z=true zero re-homing. If I remove all the paper shims and re-home but still get Z>0 per the lead screw, I still need more paper. The gap of paper required is equal to the height by which the bed arm grows during tightening.

Stay tuned to see if this works.


I tried out my theory, but on revisiting the level-no-resin, I got a repeatable Z home at 0, which would seem to negate the “bed height grows” theory. To maybe break the conflict and see if it’s a procedure difference, I took apart the ball joint to see if it even CAN grow, and it looks like the answer is no – it’s well designed not to. The ball sits inside a steel sleeve inside the aluminum piece. The tiny little set screw at the back just serves as an end-stop to prevent the ball from falling out, and to keep the steel sleeve clocked right. The front set screw tightens the sleeve more circumferentially, and the right side set screw is close to the gap so that it provides more final pinching force than the first, which is probably why they say tighten that one second – coarse adjustment then fine, if you will. In either case, there’s really no way the Z offset could grow, aside from MAYBE a few microns if the pieces line up right. Definitely not enough to torque the arm.

image of Mars bed joint disassembled
not pictured: spring that goes inside sleeve before ball.

That said, when I re-home in resin, I DEFINITELY see the problem, and looking closely at the Z bearings, there’s enough slop that I can see the arm angle up at the end, rather than staying a perfect 90*. So that seems to get us back to resin viscosity, but I then don’t know why tightening IN resin doesn’t null that Z offset.

Another possibility is that the mere act of tightening the screws torques the bed arm, and therefore provides the pre-gapping. I did try torquing those screws down while HOLDING the arm down by putting pressure downward on the knob, and that brought me CLOSER to true Z=0, but not all the way there. So I’m still not sure.

Either way, I think the optical endstop combined with slop in the Z bearings results in a poor-repeatability Z=0 when Z is loaded, and the finer-grained control over Z leveling on the Photon is why they don’t tend to have this problem.

Update: A Fix

It turns out, everything above is CLOSE, but totally misses the real root cause, discovered by Jan Mrázek over at mind.dump().

It turns out, the leadscrew is built in to the stepper motor just like Prusa does it, but because the construction doesn’t use thrust bearings, tolerance is taken up in the shaft axis by a spring washer. The bottom bearing sits right against the housing, so compression on the screw is reacted. But the top bearing sits with a compression washer between it and the housing, which offers about 1.5mm of slop that gets taken up when the screw is in tension.

What happens is, the bed comes down to level, but the viscosity of the resin pushes it away. The lead screw eventually wins and pulls the bed to the Z=0 position as determined by the optical end stop, but the washer at this point is fully compressed with a ton of tension on the screw. It takes the model 1.4mm or so of growth in the Z direction before the spring is fully relieved, and the bed returns for the next layer to the proper +50µm gap (or whatever your layer height).

Jan noticed that the position in the model didn’t matter, because when he was printing a big flat plane around the test article, it was providing a whole bunch of capillary force against the spring, and the tension wasn’t getting let go. In fact, the same root cause can explain both behaviors.

My solution was to simply remove the spring washer and replace it with a 3D printed spacer. Ultimately, a 1.4mm thick spacer took up all the slack without over-compressing the bearings, so the screw still rotates just as freely.

excel table and graphs of the final test article layer heights.

As you can see above, the test article isn’t perfect, and the first few layers are too thick. But ultimately, the layers grow by <50µm to finish at the proper design part thickness of 1mm. My expectation is that any features in excess of 1mm off the plate will therefore be dimensionally accurate her on out!

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *