[DIY] Map the Nozzle-Bed Distances of any 3D Printer (the hard way...)

 

Since I was struggling with bad 1st layer quality on a new Bambu H2S 3D printer, and getting subpar support from them, I embarked on finding out the root cause. Which led me to develop a way to map and visualize the distance between a nozzle and the bed across the whole printing plate.

The photo above is click-bait, unfortunately. Not having tools to visualize sets of XYZ points, what I ended up with instead was the following:

Jolly jalapeno-on-a-stick, the distance in the back right corner was off by ~1 millimeter, compared to the rest of the bed ! 

 

 Just FYI, this post is for curious techies 

 Almost no Bambu owner will ever need to go down that rabbit hole 

 save your time and skip this post if technical meanderings aren't your thing 

 

Anyway, long story short, I developed a multisteps distance gauge and a LibreOffice Calc spreadsheet that can be used to map that stuff. It is extremely handy with closed-source and keep-users-in-the-dark printers like Bambu's that don't provide Bed Surface Maps or unencrypted logs.

Nothing new here. The method is similar to using a feeler gauge to tram a bed.

However, it doesn't exactly result in a bed surface plot (aka bed mesh) since a Bambu printer is always applying live Z offset compensation per its previous bed calibration findings, even when moving the head in manual XYZ motion mode.

So, short of disconnecting the Z axis stepper when doing the measurements, this map just captures the distance between the nozzle and the bed as it'd happen during a print. But that was sufficient to give me a hint as to what was going on and be able to fix one of the 1st-layer issues this printer has. So yay !

LibreOffice Calc, (messy) Fusion 360 CAD, STEP and 3MF files are all on Github

Feel free to copy, remix, whatever.

Happy pristine 1st layer to all !

 

______________________________________________ 

 

Important Context First 

 

The measurements performed below were done with a Powered-On motion system, and by moving the toolhead via the printer's XYZ motion user interface. Which, on Bambu, means that the distances measured include the automatic "bed leveling" Z compensation. I.e. it measures the Auto Compensated nozzle-bed distance as it'd happen during a print.

 

The same process can also be used with a Powered-Off motion system. In that case it shows the pure Mechanical nozzle-bed distance, allowing to find how much mechanically in / out of tram the bed corners are, the total amount of mechanical bed bowing + core XY surface 'saddle-ness', etc. This can be used, for instance, to flatten a bed with high temp tape, or make the bed as mechanically mean-parallel as possible across the whole coreXY surface.

 

Also, many people seem confused by what a printer's automatic Z compensation or "bed leveling" does. For single-Z-stepper printers like Bambus that can not auto mechanically level the bed's 4 corners (unlike a Voron), what it does is:

  1. makes the nozzle follow the bed shape by artificially Z-deforming the CoreXY-saddle surface the nozzle would otherwise mechanically follow (saddle shape because core XY rails are never 100% parallel / horizontal)
  2. digitally warps our parts' geometry so their bottom surface matches the bed shape, thus increasing the chance that the first layer is successful / good looking

But it does NOT make the bed flat (think about it). So, for engineering parts with tight flatness, parallelism, and dimension tolerances, ending up with a non-flat bottom surface is a NO-NO.

I design and print engineering parts. That's why I'll also use this technique at a future time in Power-Off mode, to tram and flatten my curled-up H2S bed. Indeed, Bambu doesn't recognize a bed bowing by close to 1mm as a problem, claiming that it is "in spec". Despite their Marketing's "Production & Engineering" claims for the H2 series, and selling a $140 Vision Encoder Calibration Plate for "50 micrometers precision". Yeah right, 0.05mm precision in XY but Z can go to lunch πŸ˜‚ 

 

Anyway, anybody printing fidget toys, figurines, lifestyle parts, basic repair parts, etc, will likely never need to bother with such a technique. So don't sweat it πŸ˜‰

 

 

 Multisteps Feeler Gauge

 

The gauge consists in twenty 0.1mm steps, from 5mm to 6.9mm thick.

Its shape is designed not to interfere with the H2S's toolhead volume and fan cowlings. It may need tweaks to the Fusion 360 gauge_radius and gauge_step_angle parameters for other printers.

Print settings

  • use ABS if planning to map with over 50°C bed temps. Otherwise PLA is fine
  • 0.2 nozzle if want crisp text, 0.4 otherwise
  • 0.12 layer height
  • 4 walls, 6 top & bottom layers
  • 30% sparse infill, adaptive cubic
Split-Into-Parts and assign a different filament color to letters vs body, if desired. If not, just delete the letters in the slicer, and the text will end up looking embossed just fine, though not as easy to read

 

 

Methodology 

 

1. Preheat the bed

In my case the worst issue with the bed's back left corner was with ABS. So the bed was preheated to 90°C and left to soak for 30' before starting the measurements.

 

2. Home the XYZ motion system

Not sure that's a step on all printers, but it is a prerequisite on Bambus to take manual control of the X, Y and Z axis.

Once homed in, pick a corner of the bed as your 0,0 XY coordinate that also corresponds to the maximum X and Y range in that direction. I.e. that corner must be a hard XY stop for the motion system.

This way, if you lose count of where the head is while making measurements you can always come back to that fixed 0,0 hard stop. That will reset any lost-track-of XY offset, so you can start counting interval steps again back to where you were, without having to start over again.

On Bambu X/P/H series, and most Core XY printers, that XY end-of-range is either the front left or the front right bed corner. Not the back of the bed, as their Y axis extends way past the bed, as the head needs to reach the poop chute, nozzle wiper, etc.

Move the toolhead in the Z axis until the printer thinks the nozzle is 6mm above the bed. Then move the toolhead in X and Y until the nozzle is positioned at your 0,0 corner of choice.

 

3. Pick the XY grid interval for measurement, and prepare the spreadsheet

Although mapping Z distances every 10mm would result in a nice smooth visual map, it'd be 26x26 = 676 points for a 250x250mm bed. Good luck.

So, for the 340x320 bed of the H2S I picked a 40mm interval, for a total of 90 points. Here is the grid ready for measurement:

Then, later, I added a few more points at 10mm intervals but only around areas of concern, like near my bed's curled up back left corner.

 

4 - Measure the distances

Starting at the 0,0 corner, measure the distance between the nozzle and the bed by sliding the gauge in until a slight resistance is felt.

The gauge must be held flat against the bed for proper feel. Each step on it corresponds to a flat ~7x10mm spot facing the bed.

The gauge increments go from 5mm (0) to 6.9mm (1.9) thickness. We don't care about the absolute distance, only about the variations between spots on the bed. That's why the gauge only displays 0, 0.1, 0.2 ... 1.8, 1.9 text.

This allows to measure differential variations between spots from -1mm up to +0.9mm, when the nozzle is 6mm above the bed. If your bed / core XY plane is warped more than that, call 911 πŸ˜‚  

Report the measured values in the spreadsheet as you go. It's easier to pick an axis, say Y, and stick to it until reaching its end, then increment the other axis and come back:

Note: although the feeler gauge only provides 0.1mm increments, several of my data points are reported with 0.05mm precision. It just comes from feeling by hand. After a while one gets used to the feel of the gauge sliding snuggly, or tightly, or bumping against the next increment. A tight-ish feel was simply reported as a distance in-between 2 steps, i.e. as a 0.05mm value. It worked surprisingly well.

 

5 - Visualize the data points as a delta heat map

In the Delta Heat Map table on the right side of the Calc sheet:

a) update the offset cell as the MIN() of your left table's data points

b) update the median cell to the MEDIAN() of your left table's data points

c) update the top left data cell to = value($median_cell) - value(cell)

d) copy that cell's formula across the whole table

e) update the colors according to the color scale (did it manually, couldn't figure out how to do it with 2-color or 3-color conditional formatting, would appreciate any help from people less dumb than me...) 

 

6 - Curl up in a ball if any number comes close to 0.5mm

Yeah, I cried a lot: 0.95+0.2= 1.15mm max total deviation ! This is throw-it-in-the-dumpster garbage level... 😑

That's one reason why the 1st layer test was initially so bad:

And why full-bed 340x320 prints looked like crap in the back left corner where, clearly, the filament didn't even get squashed against the bed:

 

7 - Fix the issue(s)

In my case, I reran the H2S's Auto Full Hot Bed Calibration and 30' later I had a setup that measured like this:

Sweet heavenly Goddess of 3D printing, this is close to perfection ! 

 

Yes, I could have simply rerun the Hot Calibration from the get-go, without embarking on this whole rigamarole. But another compounding issue (that printer's taco-shaped bed) was muddying the waters here. So I needed a tool to visualize the big picture and, later, help with kapton-taping my way out of the taco problem since Bambu will likely wave their hands again. But that's a story for another day.

For now, no idea why that printer's initial Hot Bed Calibration was so wrong (had done it after unboxing the thing). Maybe there was a booger between the plate and the bed, or the dog had drooled on that very corner πŸ€«

But don't care, I ended up developing interesting techniques, learned things, now have a tool to tackle the curled-up-bed problem, and finally got a perfect 0.2mm first layer:


And now it's finally time to resume working on the 1-month-long printing queue backlog full of 340x320mm custom Skadis panels. ¡Γndale!

Comments