[DIY] Map the Nozzle-to-Bed Distance 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(s) of the issue. 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:

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

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-sourced and keep-the-user-in-the-dark printers like Bambu's that don't provide bed surface maps (BSM).

Nothing new here. The method is similar to using a feeler gauge to tram a bed. Mine just consists in using a 3D printed multisteps feeler gauge to manually measure the nozzle-bed distance over the whole bed surface.

This doesn't really result in a BSM plot though because, while the Z spacing at each XY point is being measured, a closed-sourced printer is always applying Z offset compensation per its previous Bed Calibration findings.

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 the issue. So yay !

Details, methodology and results below.

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

Happy pristine 1st layers to all !

______________________________________________ 

 

 Multisteps Feeler Gauge

The gauge consists in twenty 0.1mm steps, to quickly measure the distance between the nozzle and the bed, from 5mm to 6.9mm thick.

Its shape is designed not to interfere withe the H2S's toolhead volume and fan cowlings, but may need tweaking to the Fusion 360 gauge_radius and gauge_step_angle parameters for other printers.

Print settings

  • use ABS if planning to map with 90+ °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 layer
  • 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 back left corner of the bed was with ABS. So the bed was preheated to 90oC and left to soak for 20 to 30 minutes 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 natural XY stopper for the motion system (max-or-min X and max-or-min Y).

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, which will reset any unknown XY offset, and start counting interval steps again back to where you were, without tossing away all the previous measurements and starting over.

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 back corners so the head can 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 your XY grid intervals for measurement, and prepare the spreadsheet

Although mapping Z distances every 10mm would result in a nice smooth visual map, it'd be 25x25 = 625 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 prepared grid for my measurements:

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

 

4 - Measure the distances

Starting at the 0,0 corner, measure the distance between the nozzle and the bed by sliding the gauge between them 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, 0.3 ... 1.7, 1.8, 1.9 text.

That allows to measure differential variations from -1mm up to +0.9mm. If your bed is warped more than that, call 911 😂  

Report the measured value in the spreadsheet as you go. It is 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 smoothly, 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 guess. It worked surprisingly well.

 

5 - Visualize the data points as a delta heat map

In the right side table:

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(offset_cell)

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

e) update the colors accordingly 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 the help from less dumb people than me...) 

 

6 - Cry a river if any number comes close to 0.5 to 1mm

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

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:

 

7 - Fix the issues

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 there is another compounding issue with the taco-shaped bed that was muddying the waters here. So I needed a tool to visualize the big picture and, later, kapton-tape my way out of the taco problem since Bambu will likely wave their hands again. But that's another story.

For now, no idea why that printer's initial Hot Bed Calib 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 spot 🤫

But don't care, I ended up developing interesting tools, learned things, and finally got a perfect 0.2mm first layer:


It's now time to resume working on the 1-month long printing queue backlog full of 340x320mm custom Skadis boards !

Comments