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.

Observations:

  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.

Update

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!

11 Comments

  1. MK
    September 30, 2019

    Thanks a lot for your thorough investigation of the issue, you are a hero!
    I’ll have a go at the washer replacement as soon as I can this week

  2. Ryan
    October 4, 2019

    I’m sorry if this isn’t the right place for this. Does the elegy mars build platform move when you tighten the set screws. I can’t find anything about this and was wondering since you own one you could answer it. I contacted the company with no response. When I lower the build platform to level the platform and tighten the set screws the lift the platform. The platform can swivel freely. Is this Normal?

  3. October 4, 2019

    Not a lick. The two set screws tighten different sections of a steel sleeve around the ball end. Think a tennis ball in a pipe with a split down it – squeeze the pipe and capture the ball.

    Because the sleeve takes a lot of force just to compress, you have to really crank down on the set screws to get a tight fit, and do them in order (front first, side second), or the side screw will fight the front screw a bit.

    Complicating matters, the hex heads of the included set screws have terrible tolerance and tend to strip out.

  4. MK
    October 7, 2019

    Spoiler first: I got rid of the missing 1.5 mm layers and achieved a little under 1% linear Z error in the end (I need to get a measuring screw to be certain how much below 1%, the caliper is no real help here anymore).

    I took a page out of Alex’s book and compensated for 1.4mm surplus space. Interestingly, I got best results when adding a 1.1 mm printed PETG washer to the front side of the motor and placing the spring washer between custom washer and bearing. The fully compressed spring washer is 0.3 mm. Measurement error is compensated by the spring washer at max force and you don’t need to worry about over- or undertightening the housing screws.
    Silencer block was replaced by a solid, screw-through plastic one I printed. It does not (measurably) yield and still reduces motor vibrations quite a bit. If anyone is interested, I can put up the files on thingiverse.

    Cheers, thanks again!
    – Matt

  5. Mike
    October 15, 2019

    Matt’s findings brought me to the conclusion that all is about this way too high z-axis tolerance by force on the printing arm. Right now I am working on a construction for eliminating the tolerance on the other end of the axis – the upper end. Here we have a rock solid all metal not moving fixing point. I tried a special double ball bearing that is able to to axis forces. Will report if it’s working.

  6. Larry Franz
    November 6, 2019

    Alex, I have run into the problem you mentioned about stripping the set screws. Do you know what size they are so I can get a replacement?
    Also, I have the problem Ryan has. When I tighten the screws, the platform still moves freely. This is after hundreds of successful prints.
    Inspecting the sleeve reveals that there are scratches where the sleeve holds the ball. I have “fixed” this by placing a strip of paper between sleeve and ball, which has temporarily fixed the problem. Any idea how to fix this or get a replacement sleeve?

  7. November 7, 2019

    I couldn’t tell you how to find a replacement sleeve. Probably I’d just contact Elegoo on Facebook – they’re pretty responsive and generally MUCH better about support and maintenance than you’d expect for a $250 printer.

    As for the set screws, they’re M6. You can find replacement M6 set screws, but it might make things easier and stronger to replace them entirely with either socket head cap screws, or even hex bolts like this guy did: https://www.youtube.com/watch?v=zrWymPswV6s. It’s a little awkward that they stick out, but they’re more accessible for tightening and WAY stronger.

  8. Zoltan
    November 10, 2019

    This is very informative and great article. Usually I do not comment on blog posts, there are plenty of people dong that usually. I got my Mars 2 days ago and right on the first two prints I noticed the missing 1.5mm from the bottom of my prints.
    Can you share the dimensions of the 1.4mm washer you printed? I would like to print it before I take the printer apart, so when I do I have the parts ready.
    What is the OD and ID of the washer please?
    Thank you for this great article. Maybe spice it up with a quick video of implementing the fix.

  9. November 11, 2019

    Thanks!

    I don’t recall exactly, but I think I used 1.4mm. OD=19mm ID=12.6mm. I didn’t document this well in this post, but what I did was print a series of washers that could be stacked in combination to produce any 0.1mm increment. I think I printed a couple at .2mm and a couple at .3mm, then stacked them up to 1.4mm, reassembling the motor with different combinations until it 1) had zero play in thrust, and 2) didn’t offer any new resistance to spinning. If you add too thick a spacer, you’ll load the two bearings in thrust, which they shouldn’t be, and the motor will gain friction.

    I’ve got a replacement stepper on the way to see how Elegoo fixed this – once I’ll get it, I’ll swap the two to test, and let you know what my exact finished stack height was.

  10. MK
    November 11, 2019

    Hi Zoltan, if you like you can try the files I made for myself a while ago. I just uploaded them on thingiverse. The washer is only 1.1mm high on the outside because I am also using the spring washer, which is compressed to 0.3 mm. It also has one raised side to prevent pressure against the housing bending it out of shape.

    https://www.thingiverse.com/thing:3970464

    Cheers – Matt

Leave a Reply

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