D3D Automatic Bed Leveling

From Open Source Ecology
Jump to: navigation, search


  • D3D Marlin covers code up to calibration.
  • Code works for following the 3D printer - such as Yousef's twisted axis.
  • Initial code used - April 29 - see April 29 version of D3D Marlin.
  • Lulzbot Cura initialization file used - File:D3DLulzbotCura.ini
  • See instructable on auto bed level - [1] - it says to use G92 to implmement the z offset correction.
  • What is the difference between G92 Z-1 and M851 Z-1 and M206 Z-1?
  • Marlin_main.cpp is main code


  1. Does G1 Zx shift do offset correction? [2]
  2. Start g code example - [3]
  3. Do homing before AND after G29? It says that you both should and shouldn't do this in this article - [4]
  4. M501 to check current axis offsets (M206) - [5]
  5. Disable EEPROM - it could be storing one value and never updating from print to print. [6]
  6. V Set the verbose level (0-4). Example: "G29 V3"
  7. Try Mattercontrol software [7]
  8. Check usign G1 Z0 command to see where the print will actually start printing - it should go to the first layer height set by the probe. - comment by Martin at [8]
  9. Contact Ryan Lutz at Matterhackers - see leveling troubleshooting - [9]
  10. Probe starting in the center. Find the center coordinate after zeroing. There may be weird things happening when probing is too close to edge (30mm or less) [10]
  11. As the last step in start gcode - move bed to required height, while leaving firmwar offset zero[11]:
G21; set mm units
G92 E0; reset extruder distance
G90; set absolute coordinates
G28; home all axes
G1 Z5; lower platform 5mm to clear bed in case of improper leveling
G1 X100 Y100 F3000; move extruder over bed center
M104 S195; set extruder temp to 195°C and start heating
M301 P39.04 I2.55 D149.66; Set PID for 195°C
M109 S195; wait for target extruder temp to be reached
G1 Z[first_layer_height]; Move Z to first layer height.
  1. This one also says you need to change the Z axis microsteps?? - [12]
  1. Another start gcode - [13]

M104 S[first_layer_temperature_0] ;set extruder temp and start heating G28 X0 Y0 ;home X and Y G29 ;probe bed G90; set absolute coordinates G92 E0; reset extruder distance G1 Z5 F300 ;move platform down 5mm G1 X145 Y145 F3000 ; move to back right corner

  1. Does it matter if you do G28 X0 Y0 Z0 in one line vs setting G28 Z0 in a separate line? [14]
  2. Do software endstops influence this work here?
#define min_software_endstops true // If true, axis won't move to coordinates less than HOME_POS.
#define max_software_endstops true  // If true, axis won't move to coordinates greater than the defined lengths below.

Useful Links

  • Good discussion with Marlin heavyweights - [15]. Bernhardt Kubicek (lastname at gmx.at)
  • Actual explanation, but for manual bed level - [16]
  • Verbose G29 - [17]

Test Procedure Logic

Find out what is happening.

At start, bed is not level. Probe gets level with G29. But the offset from bed is not known. Offset creates the initial good starting point.

So in start code - we should impose a correct offset override. The offset should not be set in firmware, as this requires a new firmware upload. Dangerous.

So let's assume that we do the correction in start g-code or initialization file of printer host.

To know that everything is happening as it should, we should test manually first.

Do G29. Then move the print head to zero height. The height should end up .1mm above bed ideally, but in reality, it will have an offset.

Is there a command that can override the head height? That should be the G92. With software endstops deactivated, setting G92 Z1 should allow movement down to zero. G1 Z0 should move the Z axis down by 1 if the axis were homed at Z=1. This means we artificially insert an offset. We can find that offset at any position on the print bed.

Say we move to the middle of the print bed. We measure the offset there:

  1. Reflash firmware to speed up testing process. Faster speed between probing. Turn of bed heat to make that faster.
  2. Move manually to mid of bed, note location.
  3. Zero all axes G28.
  4. Move to 0 height location. Record height above bed. Should be zero. Raise head to allow motion to mid of bed.
  5. Move to mid of bed. G1 Xmid Ymid.
  6. Record height above bed. It should not be at zero there - it could either be below (crash) or above. The software endstops should be disabled in firmware - so should definitely be able to crash into bed, so be careful.
  7. Shift the z offset. Does that do anything with M851 Z10? What happens with G1 Z0? Nothing, as the offset is only an automatic bed level feature?
  8. Auto bed level G29
  9. Move to mid of bed. G1 Xmid Ymid.
  10. Move to 0 height location. G1 Z0. Note the location above bed.
  11. Move down until triggered
  12. G92 Z10
  13. Move down to get offset.
  14. Set offset. M851 Z10 and M206 Z10. See if new G1 Z0 zero goes to ~10 mm above bed?


To Chris Palmer and Bernhard Kubicek, Marlin developers:

Hi Chris and Bernhard,

I saw your dev thread at https://github.com/MarlinFirmware/Marlin/issues/1244 - and I would like to ask regarding the latest status of Marlin auto bed leveling. Is nonlinear (bed warp-correcting) bed leveling implemented?

I am still not clear after that thread whether nonlinear bed correction is implemented (correction for bed warping - does not assume a perfectly flat bed surface) or does Marlin only have a linear bed tilt correction (assumes a perfectly flat but tilted bed).

I have tried to get mesh leveling to work with both 2x2 and 3x3 grids and couldn't get it to work accurately enough. I checked different aluminum print surfaces, and still no good. The following of the bed with air printing was off by up to 2 mm over a 6" area. So I switched to 3-point leveling, and that works fine, to about +/- 0.1 mm over a typical print. I am using Marlin 1.1.0-RC8 - 6 Dec 2016 from the main Github repository.

We are developing a 1'x4' print bed printer - and the nonlinear correction feature would be indispensable to keep bed costs down by allowing use of non-precision metal surfaces. You can see our work on the 3D printer at on the open source ecology wiki.