No need for Z-probing before print if G32 and G33 were executed even before reset?

Liebe Kollegen, 

As usually thank you for developing and maintaining such a nice software! I have tried Klipper and thanks God I am now back home to Repetier. No more heresy.  ;)

It's about Prusa-like cartesian printer with home on Z-max. My printing surface (glass) changes when I change glass  and also when I print on the same glass but different heatbed temperatures: 60C and 100C, it bends a little. 

So after each printing surface change or heatbed temp change I run a routine: 
    - M322 S1
    - G33 R0
    - G28
    - M140 S%(bed_temp)s
    - M190 S%(bed_temp)s
    - G28
    - G32
    - G28 X Y
    - G33
    - G33 L0
    - M140 S0

It seems like after this routine rotation matrix, distortion matrix and Z-max (home) height are stored in EEPROM and they even survive the reset. Does this mean that I can just start prints without using Z-probe? 
Thank you! 


  • G32 must be G32 S2 to store it to eeprom. G33 normally stores directly to eeprom.

    And yes, you do only need to do it once and can then use simple G28 homing to z max. Data will survive due to eeprom storage. So only time you need a change if you change bed or use different bed temperature so it deforms differently.
  • Thank you!
  • Hello again.
    Here are two points to discuss.


    If I change the bed surface and want to: 
    - probe using a grid
    - to use the rotation matrix correction method
    - store it for many next prints in EEPROM
    what command should i use:
    G32 S1 P0 ; according to wiki it measures a grid and enables rotation. But how to write it to EEPROM than? 
    G32 S2 P0; according to repetier web page values will be stored in EEPROM. But how to give the command that I want to measure a grid, not the "Bending correcting 4 point measurement"?
    There is a difference in description of G32 parameters in "Z-probe" section of Repetier-web page and G-code wiki:

    On your page  the S2 parameter of G32 command stores data in EEPROM: 

    "Once you run auto level G32, the firmware switches to auto level mode. If you stored it in EEPROM (adding S2) it even survives printer restarts. Then new leveling is only needed if you have to assume that bed has changed the height." 

    On G-code wiki S2 parameter is responsible for bed leveling and bed correction method (bending correction 4-point measurement): 
    Snnn Bed leveling method
    Pnnn Bed correction method

    The values for Snnn and Pnnn are as follows:

    S0 This method measures at the 3 probe points and creates a plane through these points. If you have a really planar bed this gives the optimum result. The 3 points must not be in one line and have a long distance to increase numerical stability.
    S1 This measures a grid. Probe point 1 is the origin and points 2 and 3 span a grid. We measure BED_LEVELING_GRID_SIZE points in each direction and compute a regression plane through all points. This gives a good overall plane if you have small bumps measuring inaccuracies.
    S2 Bending correcting 4 point measurement. This is for cantilevered beds that have the rotation axis not at the side but inside the bed. Here we can assume no bending on the axis and a symmetric bending to both sides of the axis. So probe points 2 and 3 build the symmetric axis and point 1 is mirrored to 1m across the axis. Using the symmetry we then remove the bending from 1 and use that as plane.
    P0 Use a rotation matrix. This will make z axis go up/down while moving in x/y direction to compensate the tilt. For multiple extruders make sure the height match the tilt of the bed or one will scratch. This is the default.
    P1 Motorized correction. This method needs a bed that is fixed on 3 points from which 2 have a motor to change the height. The positions are defined in firmware by BED_MOTOR_1_X, BED_MOTOR_1_Y, BED_MOTOR_2_X, BED_MOTOR_2_Y, BED_MOTOR_3_X, BED_MOTOR_3_Y Motor 2 and 3 are the one driven by motor driver 0 and 1. These can be extra motors like Felix Pro 1 uses them or a system with 3 z axis where motors can be controlled individually like the Sparkcube does. This method requires a Z max endstop.


        Is it normal that nozzle goes to Z=20 mm before each probing in G33 command even if this command is preceded by G32 S1 P0? It makes measurement so long. By performing G32 command the probe goes up only for 2mm. Is there a way to change the lift up height of the probe in G33 command?

    My settings are: Optical endstop with mechanical probe lifted by servo. 

    Measurement routine:

        - G28

        - M140 S%(bed_temp)s

        - M190 S%(bed_temp)s

        - G32 S1 P0 ; measure a grid, use rotation matrix

        - G28 X Y

        - G33 ; measure distortion map

        - G33 L0 ; report distortion matrix

        - M140 S0

        - G1 X100 Y120 Z30 F15000

    Settings of the probe lift:

    #define Z_PROBE_Z_OFFSET 0

    #define Z_PROBE_Z_OFFSET_MODE 0

    #define UI_BED_COATING 0

    #define FEATURE_Z_PROBE 1

    #define EXTRUDER_IS_Z_PROBE 0


    #define Z_PROBE_BED_DISTANCE 2


    #define Z_PROBE_PULLUP 0

    #define Z_PROBE_ON_HIGH 1

    #define Z_PROBE_X_OFFSET -39.5

    #define Z_PROBE_Y_OFFSET -5


    #define Z_PROBE_SPEED 2

    #define Z_PROBE_XY_SPEED 100



    #define Z_PROBE_USE_MEDIAN 1

    #define Z_PROBE_HEIGHT 3.5

    #define Z_PROBE_DELAY 0

    #define Z_PROBE_START_SCRIPT "M340 P0 S1100\nG4 P500\nM340 P0 S0"

    #define Z_PROBE_FINISHED_SCRIPT "M340 P0 S500\nG4 P500\nM340 P0 S0"






    #define Z_PROBE_X1 5

    #define Z_PROBE_Y1 0

    #define Z_PROBE_X2 165

    #define Z_PROBE_Y2 0

    #define Z_PROBE_X3 5

    #define Z_PROBE_Y3 189





        Thank you! 

  • One more tiny question: is it possible to take heatbed measurements only once and to use those data for both: rotation (autoleveling) and distortion correction? 
  • Forget the wiki description you quoted - that was not for our firmware. G32 S2 stores data to eeprom.
    G33 always uses eeprom or never uses it depending on configuration. Default is to use eeprom so it is permanent.

    In firmware V2 only way to get distortion correction is grid measurement and then it does it in one pass as it is a combined solution. In V1 these are 2 steps and can not be unified.
  • Oops, I've found the answer to the second question one post above. Here it is:
    Sorry for bothering. But the first question remains. 
  • Thank you!   So, after changing the bed surface if I want to:

    - mesure a grid, store it to EEPROM, use the rotation correction;

    - measure distortion map, store it in EEPROM and use after printer reboots

    the following sequence should do the job: 

        - G28

        - M140 S%(bed_temp)s

        - M190 S%(bed_temp)s

        - G32 S2 ; measure a grid, use rotation matrix, store in EEPROM

        - M320 S2 ; Activate auto level permanently

        - G28 X Y

        - G33 ; measure distortion map

        - M323 S1 P1 ; enable distortion correction and store in EEPROM

    or could M320 and M323 commands be thrown away?

    Sorry for being so boring, just want to be 100% sure. 
    Thank you again!
  • Yes, also M323 and M320 are not required. If you measure it is activated and stored already.
  • Thank you!
Sign In or Register to comment.