Zero First Layer Issues - FIXED

My Zero has been plagued with intermittent first layer issues. Most of the time it’s good but approximately 10% of the time it prints too high with little to no bed adhesion and the print fails. This issue was discussed as part of the “Z-Offset is not saved” thread, where cardoc made a very useful observation. After cleaning the nozzle, it’s parked at 30,30 while it cools, leaving a tiny plastic blob on the bed.

Here’s what the Zero does before printing:

Move to X=96 Y=76 Z=5
Bed pre-heating
Home X & Y
CLEAN_NOZZLE macro
Move to X=96 Y=76 Z=5
Preheat nozzle to 200 C
Nozzle cleaning on silicone scrubber
X=30, Y=30, Z touching bed to prevent nozzle ooze
Cool nozzle to 130 C
Move to X=76 Y=76
Nozzle contact probe build plate a few times to determine Z offset in middle of bed
X=96 Y=76 (Eddy to X=76 Y=76)
Get Eddy reading of the same Z offset spot (calibrate Eddy to nozzle touch)
Eddy probe scan to produce bed mesh
Home X and Y
X=0 Y=0 Z=0.30
Pre-heat nozzle

The previous manual Z offset in Mainsail is cleared by the bed probing. The Zero isn’t interested in the user’s Z offset because it has fully automated that process for a “perfect first layer”.

On other Klipper printers, I set the Z offset to the proper value and then save the configuration, and Mainsail then reports a Z offset of 0.00 but that’s after internally resetting to my desired Z offset. The Zero’s Save restarts Klipper but apparently is not saving the Z offset or that value is reset during the automated Z offset at the start of each print.

Even weirder, sometimes my Zero has very good bed adhesion with a Z offset of 0.00, and sometimes it has weak bed adhesion with a Z offset of -0.075, with all other factors the same on subsequent prints. It feels as if something is occasionally and randomly adjusting the Z offset internal to the Zero, with no way for me to see the true Z height for the first layer. The Zero mostly works, but occasionally it doesn’t, for no reason that I could understand.

When all of this is under my manual control, I could adjust the Z height with a sheet of paper as a shim and set it. With the Zero, it seems that the intermittent problem occurs between the bed probing and start of the print. I now believe, based on the Zero’s behavior, that the Z offset is overwritten by the bed probing (just before bed mesh scanning) and occasionally a small bit of nozzle ooze results in the 130 C nozzle contacting the build plate at a higher elevation, causing the Z offset to be too high, resulting in poor bed adhesion.

When I first watched my new Zero doing the pre-print operations, I thought I would have designed it to slowly scrub the 200 C nozzle on the silicone pad while cooling it to 130 C to constantly wipe off any ooze until the nozzle was too cold to ooze, to prevent exactly this problem of nozzle ooze resulting in a too-high contact Z offset. Pressing the nozzle against the bed while cooling in an attempt to prevent nozzle ooze is leaving little bits of plastic that can be picked up later to result in a too-high Z offset calibration. Be sure to scrape clean the X=30 Y=30 spot before every print.

I tried an experiment to simulate a worst case nozzle blob when doing the contact probing at X=76 Y=76. While it was doing that probing, I slid four sheets of paper between the nozzle and the build plate, with a thickness of 0.45 mm. As expected, the subsequent first layer printed way too high. That’s the left half of this image. The right side was printed by reprinting the same file and not shimming the nozzle while the Zero was contact probing the build plate.

Conclusion: It would be great to take Z offset control away from the user and have the printer contact probe the build plate, then calibrate the nozzle contact with the Eddy probe, and then use the Eddy probe to create a bed mesh before each print, but only if every step of that process is accurate and repeatable. Occasionally picking up a tiny leftover piece of plastic that causes the nozzle contact probing to be higher than the actual nozzle results in a Z offset that’s too high and a failed first layer. The problem isn’t that the user input Z offset isn’t saved. That’s deliberate. The problem is that the nozzle isn’t always scrupulously clean when the Zero recalibrates its Z offset automatically at the start of each print. When it works, it works great. It’ll even automatically compensate for swapping to a different nozzle, which is very convenient. But like all fully automated processes, when it doesn’t work there is little the user can do other than watch to see if the first layer is too high and manually adjust the Z offset or restart the print. If the nozzle cleaning can’t be 100% effective, I’d prefer to be able to save a good Z offset and use that each time with a new Eddy bed mesh rather than relying on the automated nozzle contact Z offset before each print that may or may not work properly. Hopefully, a future update will change the CLEAN_NOZZLE macro, but until then, I edited that macro to do what I initially thought the Zero should do - cool the nozzle as it’s being cleaned and NOT touch the build plate afterward. Here is the CLEAN_NOZZLE macro I’m now using. Every line that I added or edited has a comment. The macro could be cleaner but I wanted to leave it as close to the original so it’d be easy to understand my changes and easy to revert to the original.

[gcode_macro CLEAN_NOZZLE]
gcode:
BED_MESH_CLEAR
{% if printer.toolhead.homed_axes != “xyz” %}
G28
{% endif %}
M109 S200
G90
G1 X30 Y30 F9000
G4 P100
M400
RUN_PROBE_VIR_CONTACT
G91
G1 Z2
G90
G1 X-9.2 Y0
G91
G1 Z-2.4
G90
M106 S255 ; Start cooling nozzle
M104 S130 ; Nozzle setpoint of 130 C, but don’t wait for it
G1 Y45 F350 ; Slow clean nozzle while waiting for nozzle to cool - was F2400
G1 X-8.2 Y10
G1 Y45
G1 X-8.2 Y10
G1 Y38
G1 X-9.2 Y12
G1 Y38
G1 X-9.2 Y12
G1 Y33
G1 X-8.2 Y14
G1 Y33
G1 X-8.2 Y14
G1 Y28
G1 X-9.2 Y16
G1 Y28 F2400 ; Fast clean at the end to dislodge any remaining booger
G1 X-9.2 Y16
G1 Z3
G1 X30 Y30 F9000
G4 P300
M400
; RUN_PROBE_VIR_CONTACT No longer need to press nozzle into build plate
M106 S255
M109 S130
M106 S0
G1 Z5

If you try this alternate CLEAN_NOZZLE macro, be sure to save your entire Klipper configuration so you can restore it in case anything goes wrong, and of course, I take no responsibility for any harm that may be caused if something goes wrong.

I’ve been using the revised CLEAN_NOZZLE macro and so far I have no random intermittent first layer issues, the nozzle is cool and clean, and the little blob of plastic is no longer being deposited at X=30 Y=30.

I printed eleven different parts which I wouldn’t have been able to do without a first layer failure. Then I printed 21 consecutive “perfect first layer” 150x150 mm test sheets, with three each of seven different materials.

From top to bottom:

ABS-CF - eSun, dark red
ABS - MakeShaper, orange
PET-CF - Siraya, black
Rapid PETG - Elegoo, white
Rapid PLA+ - Elegoo, black
TPU-LW - eSun, black
TPU - 3DBest, black

All were solid uniform sheets with no thick or thin spots despite the front of my Zero bed drooping 0.3 mm. The only adjustments for each material was the bed temperature and the nozzle temperature in the middle of the manufacturer’s recommended values as appropriate for each material. The extrusion rate was 1.0 for all test prints. The carbon fiber test prints had a rougher top surface but the unfilled ABS, PETG and PLA were the promised “perfect first layer” - smooth on top and bottom.

Caveats: I used a Microswiss 0.6 mm CM2 nozzle with a hardened steel insert for all of the test prints and I printed 150x150 mm test sheets that are 0.32 mm thick. I usually print a 0.25 mm first layer with a 0.4 mm nozzle so I scaled up the thickness of the first layer for the 0.6 mm nozzle and to better accommodate the carbon fiber materials. I print all first layers at 30 mm/s, around 5 mm^3/sec volumetric flow. I’m not printing speed Benchy boats so there is no need to rush that critical first layer.

There is no more nozzle ooze with the new nozzle cleaning macro but it’s important to use tweezers to remove the post print nozzle ooze and remove previous nozzle cleaning debris from the silicone nozzle scrubbing pad before each print to start with a clean build area. I failed to clean the silicone scrubbing pad in the earlier test prints and it flicked some black material onto the build plate that is visible on a couple of the orange and white test prints.

7 Likes

@sovol3d

Can you implement this is a future update..??

1 Like

As explained in this post linked below, that’s not possible because of the lack of a separate Z height reference point which isn’t measured with the tip of the nozzle:

I’ve been talking to Sovol about this the last few days, but I couldn’t find this thread.
I sent them a video & pics.

I sent them this thread this morning, so let me ask a question to see if I’m clear on your Macro.
It no longer leaves the blob/ooze on the plate..but leaves it on the wiper..??

When Sovol reads this later, I’d like it to be 100% clear on what we are trying to do.

Thanks.

No, it doesn’t work because the “before” and “after” nozzle wiping bed touch spots are the same X30 Y30. If something was deposited on the plate during the initial touch then the following touch has a high likelyhood of collecting that blob and the messing up the Z offset.

I’ve changed my macro to do the initial heating above X25 Y8, first plate touch at X30 Y8 and after wiping bed touch and cooldown at X35 Y12. Otherwise it’s the same as provided by Sovol. That’s enough to make the calibration far more consistent than it’s by default. It also avoids collecting anything after wiping since the locations aren’t the same and don’t align either. Avoiding those aligning is also important since I’ve seen some filaments leaving a thin string between the initial touch spot and the wiper. You don’t want the cooldown to happen on top of that string either.

Sovol Techs are saying this is a non-issue, I’m trying to tell them that it is.
I would like them to make some kind of update to fix this.

I pointed them to this thread, so any more input would be appreciated.

This thread is a continuation of

AND

AND

Also read back through the Zero channel at the Sovol Discord. Many folks trying to improve the nozzle clean routine.

My changes to the Sovol Zero nozzle clean macro heat the nozzle to melt the plastic that’s in the nozzle and on the outside of the nozzle, then starts scrubbing the nozzle on the siicone wiper as the nozzle is cooled to 130 C, below the filament melt temperature. Any plastic on the outside of the nozzle is wiped into the silicone wiper pad. Any filament inside the nozzle that oozes out is wiped into the silicone wiper pad. When the wiping is finished, the nozzle is clean and it is too cool to ooze any more filament, so it stays clean. That eliminates any need to park the hot nozzle at 30,30,0 to try to prevent it from oozing as it cools, which then leaves a small divot of plastic on the build plate that can stick to the nozzle and cause it to touch probe the bed at a too high elevation, resulting in the Z offset being too high approximately 10% of the time.

Before I rewrote the nozzle cleaning macro, I was having random first layer adhesion issues approximately 10% of the time, although sometimes it would happen a few times in a row. After changing the nozzle cleaning macro, the nozzle always probes the Z offset with a clean nozzle and the Zero always has a perfect first layer.

I’m not on Facebook or Discord, so I don’t know what people are doing over there, but I’m not surprised that they’re messing with the nozzle cleaning macro, because despite what Sovol may claim, this was a problem for me. When I first watched the Zero preparing to print, it seemed goofy to me that it would clean the nozzle then allow filament to ooze from the nozzle after cleaning it. I assumed it must not be a problem in practice or Sovol wouldn’t have released the Zero with this print preparation process, but it was in fact a problem… not all the time, but approximately 10% of the time. The first layer needs to work every time. Now it does.

Compared to my SV08, it’s a joy to watch the Zero lay down a perfect first layer, every time. R3men shipped the carbon fiber print bed for my SV08 today. On the Sovol live stream a couple of days ago, Ben said that Sovol is “very close” to releasing the Eddy probe upgrade for the SV08. I am SO looking forward to a perfect 350x350 mm first layer on my SV08 soon. I’ve missed that printer. It’s such a great printer otherwise that it’ll be worth spending $400 to upgrade my $500 SV08. Sovol needs to release a $700 SV08 Ace with a very flat bed and Eddy probe, to upgrade it to the standards of the Zero and SV08 Max.

I tried Liberty4Ever’s CLEAN_NOZZLE macro but then my nozzle wipes too high over the silicone scrubber to clean it. Perhaps the issue is with RUN_PROBE_VIR_CONTACT? Is this a macro? I can’t find it and could use tips in investigating what it is doing.

Did it wipe properly with the original CLEAN_NOZZLE macro? The changes made to the macro to cool the nozzle while scrubbing it and then not touching the build plate should not have altered the X, Y, or Z locations for the silicone scrubbing wiper pad, although the timing of the original scrubbing was slowed to correspond to the 200 C to 130 C cooling.

I’m using the new CLEAN_NOZZLE macro to run production for my online business. I just watched more closely as the nozzle is cleaned. Half of the nozzle is buried in the silicone wiper pad as it scrubs in the Y direction.

Yes, the original macro wipes through the pad and the new macro wipes a bit above the pad. I’m guessing it is due to the different bed probing functions although I wanted to know what they are doing before attempting further experiments. Where the new macro says RUN_PROBE_VIR_CONTACT my original macro says RUN_PROBE_PRESSURE. Was this a change you made or is it due to a revision by Sovool?

You most likely have 1.3.7 or 1.3.8 firmware or a partially failed upgrade if your macro uses RUN_PROBE_PRESSURE. Starting from 1.4.0, RUN_PROBE_VIR_CONTACT is being used and the pressure sensor is no longer active.

2 Likes

As I mentioned in my previous post, I didn’t change anything other than when the nozzle is cooled (so it cools as it’s wiping), the slowed nozzle cleaning to allow time for the nozzle to cool as it’s cleaning, and not pressing the nozzle into the bed after cooling because it doesn’t need to do that in a partially successful attempt to prevent nozzle oozing. I didn’t change anything related to bed probing and all of the motion is the same except for not pressing the nozzle into the bed. The lines I changed in the macro are all commented to show which lines changed. It’s not that many.

As Vergo said, you probably had a different CLEAN_NOZZLE macro. My Zero is updated to the latest code from Sovol. Maybe you have an older CLEAN_NOZZLE macro? Maybe see if you have the latest firmware update, and if not, then upgrade and then try the new CLEAN_NOZZLE macro?

1 Like

Yes, I have the older firmware and have yet to do any updates. After a careful review of the two macros I failed to see any reason not to use your macro with my original probing function. Happily it seems to work well. After numerous tests I appear to finally be getting very consistent 1st layers. I made one other change to the macro which was to move the probing location from 30,30 to 5,5 as it sometimes leaves a small blob when probing and I prefer it is more out of the way and did not otherwise see a difference in results.

Now my only issue is I did the testing with the tool head cover removed for better visibility and after putting it back on the part cooling fan no longer works. I did not see any obvious sign of damage to either the wires or the connectors. I think I can salvage compatible connectors from a junk box to let me start testing and hopefully get this sorted out. [I’m such a dummy. Despite having successfully momentarily disconnected the fan a few times, this time I left it unplugged overnight and then today reconnected it with certainty to the wrong unused fan port. All is good on the correct port…]

Sovol Techs are saying this is a non-issue, I’m trying to tell them that it is.

This is a issue, I almost boxed the dang printer up and sent it back because of this “non issue”

If I wanted a project printer I’d buy one. I bought this so I wouldn’t have these issues. I’m starting to think I should have just built a Voron instead. But I didn’t want to build another so soon. I just finished a 2.4. and have a Trident 50% completed. I didn’t want another project just yet. But, it seems I have one anyway.

Ask me about my SV08. :grinning_face:

I don’t mind some tinkering. Truth be told, I enjoy it. I built my first two printers from the Orbot Hadron open source project… the OG Voron, because there were no consumer 3D printers then. I no longer want that much fun, but a few optimizations are enough to feed my inner geek.

Still, I think this is a simple optimization that Sovol should do so we don’t need to do it and those not inclined to do it benefit. It’s greatly improved my overall satisfaction with the little Zero, which is now my favorite printer and getting better all the time with a few geek tweaks.

So…I am having the opposite problem. My Zero suddenly started printing too close to the bed, having previously been spot-on with great first layers.

I’ve tried probe and bed mesh calibrations several times with no joy. The only thing that allows me to print at the moment is manually baby-stepping away from the bed.

Nozzle is clean etc etc, so I’m a bit stumped as to why this is happening and what the fix would be.

1 Like

You can persist the baby steps in OrcaSlicer as GCODE. This is what I have done because the nozzle was too high.

Of course this only fixes the symptom and not the original problem.

I don’t think this is true. The pressure sensor is still being used. I just rammed my nozzle into the bed because I changed something in the CLEAN_NOZZLE macro. If the nozzle is not at X30 Y30 before RUN_PROBE_VIR_CONTACT then it fails.