Welcome! Log In Create A New Profile

Advanced

issue with auto bed leveling - not enough compensation

Posted by LuBo 
issue with auto bed leveling - not enough compensation
September 18, 2014 07:45AM
Hi guys,

I've been playing round a while with the auto bed leveling feature of the Marlin v1 firmware on a RepRap Mendel and run into several problems and difficulties during setup, but now G29 behaves nearly as expected and described in the documentation, except from the fact, that the actual compensation on the z-axis during x and y moves is not big enough to maintain a gap of constant height between the print bed and the extruder nozzle, i.e. if I lower the nozzle on the front of the bed down onto a sheet of paper, I get another z-reading (M114) than the one, I get doing the same procedure on the back side of the print bed . Instead of changing the z-axis position I also tried moving the printer on the x and y axis with the z-value being controlled only by auto leveling (z-axis spindles definitely move!), but the auto leveling shows the same misbehaviour and the gap height becomes greater with increasing x and y values. All measurements were taken with bed and extruder being heated up to operating temperatures. Moreover I did some test prints, but they clearly matched my obersavtions described above, so the first layer was definitely not prallel to the printer bed surface.
So it seems for me, that the calculated correction plane is off the actual physical print bed plane.

I set up the auto leveling to a 2x2 grid (I tried 3x3 also, but with no effect), taking the probes as close to the borders of the print bed as possible, defined the right offset-values for the sensor (capcitive sensor) from the extruder nozzle and G29 works fine and the readings I get from the sensor seem to be reasonable and reproducible.

Do you have any idea what would cause the aut leveling to misfunction that way?

I'll attach the mechanics part of my Marlin config, so you might have a look at it.

//===========================================================================
//=============================Mechanical Settings===========================
//===========================================================================

// Uncomment the following line to enable CoreXY kinematics
// #define COREXY

// coarse Endstop Settings
// Stefan 11.9.2014 
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors

#ifndef ENDSTOPPULLUPS
  // fine endstop settings: Individual pullups. will be ignored if ENDSTOPPULLUPS is defined
  // #define ENDSTOPPULLUP_XMAX
  // #define ENDSTOPPULLUP_YMAX
  // #define ENDSTOPPULLUP_ZMAX
  // #define ENDSTOPPULLUP_XMIN
  // #define ENDSTOPPULLUP_YMIN
  // #define ENDSTOPPULLUP_ZMIN
#endif

#ifdef ENDSTOPPULLUPS
  #define ENDSTOPPULLUP_XMAX
  #define ENDSTOPPULLUP_YMAX
  #define ENDSTOPPULLUP_ZMAX
  #define ENDSTOPPULLUP_XMIN
  #define ENDSTOPPULLUP_YMIN
  #define ENDSTOPPULLUP_ZMIN
#endif

// The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins.
const bool X_MIN_ENDSTOP_INVERTING = false; // Stefan 11.9.2014 true; // set to true to invert the logic of the endstop.
const bool Y_MIN_ENDSTOP_INVERTING = false; // Stefan true; // set to true to invert the logic of the endstop.
const bool Z_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool X_MAX_ENDSTOP_INVERTING = true; // true; // set to true to invert the logic of the endstop.   // Lukas 15.09.2014 von false auf true gesetzt, ansonsten brummen Motoren nur beim G29 (Auto-Leveling),
const bool Y_MAX_ENDSTOP_INVERTING = true; // true; // set to true to invert the logic of the endstop.   // d.h. kein Verfahren möglich, da Endstops dauerhaft getriggert sind (s. M119)
const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
//#define DISABLE_MAX_ENDSTOPS
//#define DISABLE_MIN_ENDSTOPS

// Disable max endstops for compatibility with endstop checking routine
#if defined(COREXY) && !defined(DISABLE_MAX_ENDSTOPS)
  #define DISABLE_MAX_ENDSTOPS
#endif

// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
#define X_ENABLE_ON 0
#define Y_ENABLE_ON 0
#define Z_ENABLE_ON 0
#define E_ENABLE_ON 0 // For all extruders

// Disables axis when it's not being used.
#define DISABLE_X false
#define DISABLE_Y false
#define DISABLE_Z false
#define DISABLE_E false // For all extruders
#define DISABLE_INACTIVE_EXTRUDER true //disable only inactive extruders and keep active extruder enabled

// Achsen-Richtungen
#define INVERT_X_DIR false // Stefan 11.9.2014 true    // for Mendel set to false, for Orca set to true
#define INVERT_Y_DIR false    // for Mendel set to true, for Orca set to false
#define INVERT_Z_DIR true     // for Mendel set to false, for Orca set to true
#define INVERT_E0_DIR true // Stefan 11.9.2014 false   // for direct drive extruder v9 set to true, for geared extruder set to false
#define INVERT_E1_DIR false    // for direct drive extruder v9 set to true, for geared extruder set to false
#define INVERT_E2_DIR false   // for direct drive extruder v9 set to true, for geared extruder set to false

// ENDSTOP SETTINGS:
// Sets direction of endstops when homing; 1=MAX, -1=MIN
// alles Min-Endstops
#define X_HOME_DIR -1
#define Y_HOME_DIR -1
#define Z_HOME_DIR -1

#define min_software_endstops false // If true, axis won't move to coordinates less than HOME_POS. (*default true) // Lukas 15.09.2014 setze wieder auf true, wenn alles andere funktioniert
#define max_software_endstops true // If true, axis won't move to coordinates greater than the defined lengths below. (*default true)
// Lukas 12.09: Software Endstops auf "false" setzen erlaubt theoretisch negative Verfahrwege unterhalb der Home-Position, max Endstops sollten aktiviert sein und die Werte unten entsprechend experimentell ermittelt werden

// Travel limits after homing
#define X_MAX_POS 200 // Lukas 16.09.2014
#define X_MIN_POS 0
#define Y_MAX_POS 165 // Lukas 16.09.2014
#define Y_MIN_POS 0
#define Z_MAX_POS 100 // (*default 200) // Lukas 12.09: muss noch experimentell ermittelt werden, ansonsten Achsen-Crash bei zu großen z-Werten möglich
#define Z_MIN_POS 0

#define X_MAX_LENGTH (X_MAX_POS - X_MIN_POS)
#define Y_MAX_LENGTH (Y_MAX_POS - Y_MIN_POS)
#define Z_MAX_LENGTH (Z_MAX_POS - Z_MIN_POS)
//============================= Bed Auto Leveling ===========================

#define ENABLE_AUTO_BED_LEVELING // Delete the comment to enable (remove // at the start of the line)
#define Z_PROBE_REPEATABILITY_TEST  // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled.

#ifdef ENABLE_AUTO_BED_LEVELING

// There are 2 different ways to pick the X and Y locations to probe:

//  - "grid" mode
//    Probe every point in a rectangular grid
//    You must specify the rectangle, and the density of sample points
//    This mode is preferred because there are more measurements.
//    It used to be called ACCURATE_BED_LEVELING but "grid" is more descriptive

//  - "3-point" mode
//    Probe 3 arbitrary points on the bed (that aren't colinear)
//    You must specify the X & Y coordinates of all 3 points

  #define AUTO_BED_LEVELING_GRID
  // with AUTO_BED_LEVELING_GRID, the bed is sampled in a
  // AUTO_BED_LEVELING_GRID_POINTSxAUTO_BED_LEVELING_GRID_POINTS grid
  // and least squares solution is calculated
  // Note: this feature occupies 10'206 byte
  #ifdef AUTO_BED_LEVELING_GRID

    // set the rectangle in which to probe
    /*#define LEFT_PROBE_BED_POSITION 15
    #define RIGHT_PROBE_BED_POSITION 170
    #define BACK_PROBE_BED_POSITION 180
    #define FRONT_PROBE_BED_POSITION 20*/
    
    // Lukas 16.09: optimales Rechteck entsprechend des Heizbetts
    #define LEFT_PROBE_BED_POSITION 17//0//0 // X0 Y40 //40
    #define RIGHT_PROBE_BED_POSITION 157//123//140 // X140 Y40 //130
    #define BACK_PROBE_BED_POSITION 100//121//165 // X140 Y165 //155
    #define FRONT_PROBE_BED_POSITION -4//-4//40 // X0 Y165 //0

     // set the number of grid points per dimension
     // I wouldn't see a reason to go above 3 (=9 probing points on the bed)
    #define AUTO_BED_LEVELING_GRID_POINTS 2


  #else  // not AUTO_BED_LEVELING_GRID
    // with no grid, just probe 3 arbitrary points.  A simple cross-product
    // is used to esimate the plane of the print bed

      #define ABL_PROBE_PT_1_X 15
      #define ABL_PROBE_PT_1_Y 80
      #define ABL_PROBE_PT_2_X 15
      #define ABL_PROBE_PT_2_Y 20
      #define ABL_PROBE_PT_3_X 100
      #define ABL_PROBE_PT_3_Y 20

  #endif // AUTO_BED_LEVELING_GRID


  // these are the offsets to the probe relative to the extruder tip (Hotend - Probe)
  #define X_PROBE_OFFSET_FROM_EXTRUDER 17 // Lukas 16.09.2014 Wert ist absichtlich auf 0 gesetzt, Korrektur findet schon oben mit den Randbegrenzungen des Probing-Rechtecks statt
  #define Y_PROBE_OFFSET_FROM_EXTRUDER -44 //   "
  #define Z_PROBE_OFFSET_FROM_EXTRUDER -4 //-4.1 // Lukas 16.09.2014


  #define Z_RAISE_BEFORE_HOMING 0       // (in mm) Raise Z before homing (G28) for Probe Clearance. (*default 4)
                                        // Be sure you have this distance over your Z_MAX_POS in case

  #define XY_TRAVEL_SPEED 8000         // X and Y axis travel speed between probes, in mm/min (*default 8000)

  #define Z_RAISE_BEFORE_PROBING 0    //How much the extruder will be raised before traveling to the first probing point.
  #define Z_RAISE_BETWEEN_PROBINGS 0  //How much the extruder will be raised when traveling from between next probing points (*default 5)

  //#define Z_PROBE_SLED // turn on if you have a z-probe mounted on a sled like those designed by Charles Bell
  //#define SLED_DOCKING_OFFSET 0 // the extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like.

  //If defined, the Probe servo will be turned on only during movement and then turned off to avoid jerk
  //The value is the delay to turn the servo off after powered on - depends on the servo speed; 300ms is good value, but you can try lower it.
  // You MUST HAVE the SERVO_ENDSTOPS defined to use here a value higher than zero otherwise your code will not compile.

  //#define PROBE_SERVO_DEACTIVATION_DELAY 300


//If you have enabled the Bed Auto Leveling and are using the same Z Probe for Z Homing,
//it is highly recommended you let this Z_SAFE_HOMING enabled!!!

  #define Z_SAFE_HOMING   // This feature is meant to avoid Z homing with probe outside the bed area.
                          // When defined, it will:
                          // - Allow Z homing only after X and Y homing AND stepper drivers still enabled
                          // - If stepper drivers timeout, it will need X and Y homing again before Z homing
                          // - Position the probe in a defined XY point before Z Homing when homing all axis (G28)
                          // - Block Z homing only when the probe is outside bed area.

  #ifdef Z_SAFE_HOMING

    #define Z_SAFE_HOMING_X_POINT (X_MAX_LENGTH/2)    // X point for Z homing when homing all axis (G28)
    #define Z_SAFE_HOMING_Y_POINT (Y_MAX_LENGTH/2)    // Y point for Z homing when homing all axis (G28)

  #endif

#endif // ENABLE_AUTO_BED_LEVELING


// The position of the homing switches
//#define MANUAL_HOME_POSITIONS  // If defined, MANUAL_*_HOME_POS below will be used
//#define BED_CENTER_AT_0_0  // If defined, the center of the bed is at (X=0, Y=0)

//Manual homing switch locations:
// For deltabots this means top and center of the Cartesian print volume.
#define MANUAL_X_HOME_POS 0
#define MANUAL_Y_HOME_POS 0
#define MANUAL_Z_HOME_POS 0
//#define MANUAL_Z_HOME_POS 402 // For delta: Distance between nozzle and print surface after homing.

//// MOVEMENT SETTINGS
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
#define HOMING_FEEDRATE {50*60, 50*60, 1*60, 0}  // set the homing speeds (mm/min)

// default settings

#define DEFAULT_AXIS_STEPS_PER_UNIT   {65,65,2560,100} // Stefan 11.9.2014 // default steps per unit for Ultimaker
#define DEFAULT_MAX_FEEDRATE          {500, 500, 1, 45}  // Stefan 11.9.2014  // (mm/sec)
#define DEFAULT_MAX_ACCELERATION      {200,200,5,300} // Stefan 11.9.2014   // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for Skeinforge 40+, for older versions raise them a lot.

#define DEFAULT_ACCELERATION          3000    // X, Y, Z and E max acceleration in mm/s^2 for printing moves
#define DEFAULT_RETRACT_ACCELERATION  3000   // X, Y, Z and E max acceleration in mm/s^2 for retracts

// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing).
// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder).
// For the other hotends it is their distance from the extruder 0 hotend.
// #define EXTRUDER_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis
// #define EXTRUDER_OFFSET_Y {0.0, 5.00}  // (in mm) for each extruder, offset of the hotend on the Y axis

// The speed change that does not require acceleration (i.e. the software might assume it can be done instantaneously)
#define DEFAULT_XYJERK                20.0    // (mm/sec)
#define DEFAULT_ZJERK                 0.2     // (mm/sec)
#define DEFAULT_EJERK                 5.0    // (mm/sec)
Re: issue with auto bed leveling - not enough compensation
September 18, 2014 08:58PM
This is the exact same issue I came across tonight on my printer, crazy eye popping smiley. Sorry I do not have anything constructive but my Bed leveling setup is pretty much the same as yours.
Re: issue with auto bed leveling - not enough compensation
September 18, 2014 09:45PM
With a bit of research I figured out my issue. My custom G-code was like this:

G28 X0 Y191
G29
G28 X0 Y191

The issue is the G28 command seems to remove the auto leveling data. So now my custom G-code is this:

G28 X0 Y191
G29

And it seems to be working
Re: issue with auto bed leveling - not enough compensation
September 19, 2014 03:38AM
Hi,

if you do a G28 after the G29 the calculated compensation plane is being removed, that's no doubt. But my start code is

G28;
G1 Z6 F100;
G28;
G29;
G1 X0 Y0 F3000;
G1 Z0.5 F100;
G92 X0 Y0 Z0;

where the first two commands are only for preventing the sensor from homing from the bottom up since that would cause an offset of 0.3 mm due to sensor hysteresis. The G1 Z0.5 is for fine tuning the actual z-offset and the G92 moves the coordinates origin into that point. And that code seems to be working fine. I recognized the z-axis to be moving on x- and y-moves too, so auto leveling is defvinitely happening. The direction in which the compensation takes place, is also okay, but it's simply not enough.

But after doing some more research I suppose the sensor readings to be off the actual height differece between the bed surface and the z-axis origin. As mentioned above I use a capacitive sensor, so maybe someone has experince with that kind of z-probe and has any tips on how to improve measurement accuracy? Is there a chance that the bed (2mm glas over a mk2a) is not homogenous enough for taking accurate measurements?

Edited 2 time(s). Last edit at 09/19/2014 03:39AM by LuBo.
Re: issue with auto bed leveling - not enough compensation
September 19, 2014 02:30PM
I was using a capacitive height sensor on my Ormerod for a while and I found the bed compensation worked quite well, although it did depend on the glass having uniform thickness. The Ormerod has an aluminium heat spreader plate between the heatbed pcb and the glass, which may have helped to get consistent readings. I switched to using differential IR because I wanted to be able to switch glass bed plates without re-calibrating.



Large delta printer [miscsolutions.wordpress.com], E3D tool changer, Robotdigg SCARA printer, Crane Quad and Ormerod

Disclosure: I design Duet electronics and work on RepRapFirmware, [duet3d.com].
Sorry, only registered users may post in this forum.

Click here to login