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!

22 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

  11. Tom S.
    November 27, 2019

    Hey Alex what about on the other end of the spectrum? The Elegoo Mars is rated at a max z-axis of 155 mm. However in my prints I’m finding that I can only print to approximately 140 mm. Everything beyond that height just simply becomes a flat pancake. You find the same thing?

  12. Leon
    December 2, 2019

    I’m posting on another thread about this currently, but why not just set a z home value offset in the machine configuration? Measure your offset by printing a test 20MM cube. Lets say it comes out to 19mm. The variance is 1mm. we need to convert this into motor steps. For the mars, each step= .000625 mm. 1mm=1600 steps. In the machine config there is a home offset already built in. It is parameter M8083 and M8084. You have to set M8083 to “1” to enable the offset and then input the Offset in M8084. to move the build platform up 1mm from the sensor home we actually need to set “M8084 Z-1600” (negative). Now when you level the bed it will move to the optical sensor “0” position with the spring compressed, but when you print it will start the print 1600 steps (1mm) up and there will not be any tension on the spring.

  13. December 2, 2019

    @tom I can’t say, because I haven’t actually tried printing anything that tall. It’s very possible though that Elegoo over-specified the max height by just measuring the gap between the window and build plate at maximum Z. In reality, a proper maximum model height would account for the additional distance the model has to be lifted in order to “peel” it from the FEP film, and actually, that’ll be somewhat geometry-dependent. My theory is, your model is tall enough that the FEP is still stuck to it by the time it reaches the actual maximum Z travel of the build plate, so when it returns for the “next” layer, no new resin cures.

    @leon: If you can dial in the EXACT amount of spring preload travel as an offset, that will work just fine as you suggest. I think the biggest reason to fix it mechanically is that the exact amount of spring preload travel will change with resin viscosity, and therefore both which formulation you’re using and what temperature it happens to be at. Also, I just don’t personally think that dialing in that offset is less effort than swapping the spring washer out for a fixed one (though for some, it may well be).

  14. Leon
    December 2, 2019

    CORRECTION – teh z offset is in mm and not steps so just plug in the variance into m8084 and print the gcode. So for 1mm it would actually just be “m8084 z-1”.

  15. Leon
    December 2, 2019

    Sorry just saw the comment about z offset not being easier. Explain to me how disassembling the machine and then the z axis carrier, ordering/printing precise (maybe) spacers and then putting the whole thing back together again only to find that you still need to calibrate the z-axis to get it perfect easier?

    If you want a mechanical fix, just shim the little finger the breaks the optical sensor path.

    My fix: print a cube, measure it, subtract the size of the cube from the desired size. Open notepad and type that number into the file. save file, browse to it on the printer and press print. Its a lot easier.

    Now if you’re right about the spring tension and resin viscosity (I keep hearing this, but there is zero actual evidence posted anywhere) then yes, removing the spring play is the only fix. My springs feel tough though. there no way anything under the consistently of soft model clay would affect the layer height. The elgoo brand resin especially is very thin and I am sure that at least on my machine viscosity has no effect.

    I just got my machine a couple week ago it is a M10? model or something (higher than it lists on elegoo site) Wondering if maybe my machine came with the updated z axis with stronger springs and this is why I cant understand how viscosity could possibly affect the springs?

  16. December 12, 2019

    @leon full mechanical fix for ~20m worth of effort vs somewhat-inconsistent fix for at least as much effort and potentially a few cycles of test/fix/test/fix – I’ll take the solid procedure with a little disassembly. Again, I understand why you might not. But I am, after all, an engineer and fabricator. As for shimming the sensor – that will simply result in the exact same behavior as the base case, but with the plate arm extended farther. All you’d be doing is cutting a few mm off your max build height.

    As for the effect of viscosity – well, the effect of viscosity is exactly what causes the issue in the first place. If you do the mechanical fix, you can visually watch the arm flex up as it approaches the home position, then settle out as the resin exits the gap.

    It IS true that the Elegoo resin is thinner, and that’s probably why the compensation fix works just fine for most people. If you were to try Siraya Blu, you’d probably see what I’m talking about much more readily.

    It’s also very plausible that you have the “fixed” Z axis – I haven’t posted about it just yet, but yeah – the “fix” that’s been shipping for quite a while now is just two spring washers instead of one. Not a proper “fix” at all, but will strongly diminish the effect for low-viscosity resins, and slightly diminish the effect for more viscous resins.

    I say “two springs” is a terrible solution because it only serves to more strongly load the radial bearings with an axial force. It’s not a huge problem for this Z axis application, because in the grand scheme of things, the axis doesn’t move all that much, even over the life of the product. But if you tried that on a motor with more constant usage, it’d wear out the bearings much faster.

  17. Bunny
    July 5, 2020

    Thank you Alex for such a good article. I am a dentist by profession and had an elegoo Mars.

    I virtually plan dental implants on patents x ray and prepare an surgical guide for drilling implants on patient.

    In simple words I prepare a guide on patents 3d x ray and fabricate a surgical guide .with the help of this surgical guide I place implants on patents mouth.

    My problem is:
    Done times the angulations I plan are not replicating exactly on the guide.

    So, I want to know whether the 3d prints from elegoo mars are dimensionally stable?

    If any distortion is observed, how to minimize it?

    I was checking for this long time, and luckily I found your article. Your reply matters a lot to me. Because ACCURACY MATTERS A LOT IN OUR PRACTICE AS WE HAVE TO DO IT ON PATENTS.

    CAN I USE ELEGOO OR SHOULD I SHIFT TO A BETTER ONE LIKE DLP PRINTERS

  18. July 7, 2020

    @bunny It’s tough to say whether the drift you’re seeing is specific to the Mars or due to other factors. A bunch of factors play into it:
    * Supports are super important for dimensional accuracy, since peeling off the FEP film tends to bend features while they’re weak and build up plastic to reinforce the drift in the finished product
    * Geometry of the thing you’re printing and orientation on the print bed matter quite a lot. Flat is usually bad, and ideally you’d minimize cross section of any given layer
    * Laser or DLP printers introduce sources of error MSLA printers don’t have, and to a lesser extent vice versa. BUT the major Laser players (formlabs) spend a LOT of engineering effort on fixing them, which ultimately is probably more important for the finished product.

    Long story short, I don’t think this layer squishing issue has a lot to do with the dimensional accuracy problems you’re seeing. The Mars should be just as able to deliver excellent results as any other printer, BUT you’re mostly on your own for figuring out what it takes to get those results. If you were to, hypothetically, go buy a Form 3 right now, you’d be out a lot more money, but you may find yourself in the company of a bunch of other dentists with the same problems, and tech support that knows how to fix those difficulties.

  19. mike emert
    December 1, 2020

    I can’t get my machine to Zero Out right. I will tighten bolts, hit home, adjust and hit the z=0 option, but then when I home again 1 of 2 things happen. Either it keeps trying to push down and keeps going (motor keeps pushing down, and have to manually hit the stop button). or it goes back to compressing the paper and unmovable despite how many times I’e tried resetting and adjusting it.. Thoughts?

  20. Kloin
    January 19, 2021

    @mike emert
    I think you’re not doing it like described in the manual.
    First you have to loosen the bolts, press Home until the platform stops, tighten the bolts and then press the button to zero the z-Axis

  21. Scott
    September 24, 2021

    Great article! I have an Anycubic photon as I lose about 1.5mm in squashed layers with my TARDIS lamp prints i print directly on the bed. I don’t fully understand where the spring is on my printer as I would like to replace it with the spacer if possible. This issue has been driving me mad.

Leave a Reply

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