Replacing dual endstops with BL Touch

Hi,

I’m trying to replace my dual endstops on the z axis with a BL touch however I’m having some issues. The bl touch probes the centre of the bed and then stops. I have set it up to probe a 3x3 matrix with the x axis set at max 450 and y at max 750. Here is some my configuration.h:

#define BLTOUCH
#if ENABLED(BLTOUCH)
#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed
#define SERVO0_PIN P2_00
#endif
/**

  • BLTouch V3.0 and newer smart series
  • For genuine BLTouch 3.0 sensors. Clones may be confused by 3.0 command angles. YMMV.
  • If the pin trigger is not detected, first try swapping the black and white wires then toggle this.
    */
    //#define BLTOUCH_V3
    // #if ENABLED(BLTOUCH_V3)
    //#define BLTOUCH_FORCE_5V_MODE
    //#define BLTOUCH_FORCE_OPEN_DRAIN_MODE
    // #endif

// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN)
//#define SOLENOID_PROBE

// A sled-mounted probe like those designed by Charles Bell.
//#define Z_PROBE_SLED
//#define SLED_DOCKING_OFFSET 5 // 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.

// A probe deployed by moving the x-axis, such as the Wilson II’s rack-and-pinion probe designed by Marty Rice.
//#define RACK_AND_PINION_PROBE
#if ENABLED(RACK_AND_PINION_PROBE)
#define Z_PROBE_DEPLOY_X X_MIN_POS
#define Z_PROBE_RETRACT_X X_MAX_POS
#endif

//
// For Z_PROBE_ALLEN_KEY see the Delta example configurations.
//

/**

  • Z Probe to nozzle (X,Y) offset, relative to (0, 0).
  • X and Y offsets must be integers.
  • In the following example the X and Y offsets are both positive:
  • #define X_PROBE_OFFSET_FROM_EXTRUDER 10
  • #define Y_PROBE_OFFSET_FROM_EXTRUDER 10
  •  +-- BACK ---+
    
  •  |           |
    
  • L | (+) P | R ← probe (20,20)
  • E | | I
  • F | (-) N (+) | G ← nozzle (10,10)
  • T | | H
  •  |    (-)    | T
    
  •  |           |
    
  •  O-- FRONT --+
    
  • (0,0)
    */
    #define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle]
    #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle]
    #define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle]

// Certain types of probes need to stay away from edges
#define MIN_PROBE_EDGE 40

// X and Y axis travel speed (mm/m) between probes
#define XY_PROBE_SPEED 2000

// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2)
#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z

// Feedrate (mm/m) for the “accurate” probe of each point
#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2)

// The number of probes to perform at each point.
// Set to 2 for a fast/slow probe, using the second probe result.
// Set to 3 or more for slow probes, averaging the results.
//#define MULTIPLE_PROBING 2

/**

  • Z probes require clearance when deploying, stowing, and moving between
  • probe points to avoid hitting the bed and other hardware.
  • Servo-mounted probes require extra space for the arm to rotate.
  • Inductive probes need space to keep from triggering early.
  • Use these settings to specify the distance (mm) to raise the probe (or
  • lower the bed). The values set here apply over and above any (negative)
  • probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD.
  • Only integer values >= 1 are valid here.
  • Example: M851 Z-5 with a CLEARANCE of 4 => 9mm from bed to nozzle.
  • But: `M851 Z+1` with a CLEARANCE of 2  =>  2mm from bed to nozzle.
    

*/
#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow
#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points
#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes
//#define Z_AFTER_PROBING 5 // Z position after probing is done

#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping

// For M851 give a range for adjusting the Z probe offset
#define Z_PROBE_OFFSET_RANGE_MIN -20
#define Z_PROBE_OFFSET_RANGE_MAX 20

// Enable the M48 repeatability test to test probe accuracy
//#define Z_MIN_PROBE_REPEATABILITY_TEST

// Before deploy/stow pause for user confirmation
//#define PAUSE_BEFORE_DEPLOY_STOW
#if ENABLED(PAUSE_BEFORE_DEPLOY_STOW)
//#define PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED // For Manual Deploy Allenkey Probe
#endif

/**

  • Enable one or more of the following if probing seems unreliable.
  • Heaters and/or fans can be disabled during probing to minimize electrical
  • noise. A delay can also be added to allow noise and vibration to settle.
  • These options are most useful for the BLTouch probe, but may also improve
  • readings with inductive probes and piezo sensors.
    */
    //#define PROBING_HEATERS_OFF // Turn heaters off when probing
    #if ENABLED(PROBING_HEATERS_OFF)
    //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy)
    #endif
    //#define PROBING_FANS_OFF // Turn fans off when probing
    //#define PROBING_STEPPERS_OFF // Turn steppers off (unless needed to hold position) when probing
    //#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors

// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
// :{ 0:‘Low’, 1:‘High’ }
#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 stepper immediately when it’s not being used.
// WARNING: When motors turn off there is a chance of losing position accuracy!
#define DISABLE_X false
#define DISABLE_Y false
#define DISABLE_Z false

// Warn on display about possibly reduced accuracy
//#define DISABLE_REDUCED_ACCURACY_WARNING

// @section extruder

#define DISABLE_E false // For all extruders
#define DISABLE_INACTIVE_EXTRUDER // Keep only the active extruder enabled

// @section machine

// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way.
#define INVERT_X_DIR false
#define INVERT_Y_DIR true
#define INVERT_Z_DIR false

// @section extruder

// For direct drive extruder v9 set to true, for geared extruder set to false.
#define INVERT_E0_DIR false
#define INVERT_E1_DIR false
#define INVERT_E2_DIR true
#define INVERT_E3_DIR false
#define INVERT_E4_DIR false
#define INVERT_E5_DIR false

// @section homing

//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed

//#define UNKNOWN_Z_NO_RAISE // Don’t raise Z (lower the bed) if Z is “unknown.” For beds that fall when Z is powered off.

//#define Z_HOMING_HEIGHT 4 // (mm) Minimal Z height before homing (G28) for Z clearance above the bed, clamps, …
// Be sure you have this distance over your Z_MAX_POS in case.

// Direction of endstops when homing; 1=MAX, -1=MIN
// :[-1,1]
#define X_HOME_DIR -1
#define Y_HOME_DIR 1
#define Z_HOME_DIR -1

// @section machine

// The size of the print bed
#define X_BED_SIZE 450
#define Y_BED_SIZE 700

// Travel limits (mm) after homing, corresponding to endstop positions.
#define X_MIN_POS 0
#define Y_MIN_POS 0
#define Z_MIN_POS 0
#define X_MAX_POS X_BED_SIZE
#define Y_MAX_POS Y_BED_SIZE
#define Z_MAX_POS 250

/**

  • Software Endstops
    • Prevent moves outside the set machine bounds.
    • Individual axes can be disabled, if desired.
    • X and Y only apply to Cartesian robots.
    • Use ‘M211’ to set software endstops on/off or report current state
      */

// Min software endstops constrain movement within minimum coordinate bounds
//#define MIN_SOFTWARE_ENDSTOPS
#if ENABLED(MIN_SOFTWARE_ENDSTOPS)
#define MIN_SOFTWARE_ENDSTOP_X
#define MIN_SOFTWARE_ENDSTOP_Y
//#define MIN_SOFTWARE_ENDSTOP_Z
#endif

// Max software endstops constrain movement within maximum coordinate bounds
//#define MAX_SOFTWARE_ENDSTOPS
#if ENABLED(MAX_SOFTWARE_ENDSTOPS)
#define MAX_SOFTWARE_ENDSTOP_X
#define MAX_SOFTWARE_ENDSTOP_Y
#define MAX_SOFTWARE_ENDSTOP_Z
#endif

#if EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS)
#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD
#endif

/**

  • Filament Runout Sensors
  • Mechanical or opto endstops are used to check for the presence of filament.
  • RAMPS-based boards use SERVO3_PIN for the first runout sensor.
  • For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc.
  • By default the firmware assumes HIGH=FILAMENT PRESENT.
    */
    //#define FILAMENT_RUNOUT_SENSOR
    #if ENABLED(FILAMENT_RUNOUT_SENSOR)
    #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each.
    #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor.
    #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins.
    //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins.

// Set one or more commands to execute on filament runout.
// (After ‘M412 H’ Marlin will ask the host to handle the process.)
#define FILAMENT_RUNOUT_SCRIPT “M600”

// After a runout is detected, continue printing this length of filament
// before executing the runout script. Useful for a sensor at the end of
// a feed tube. Requires 4 bytes SRAM per sensor, plus 4 bytes overhead.
//#define FILAMENT_RUNOUT_DISTANCE_MM 25

#ifdef FILAMENT_RUNOUT_DISTANCE_MM
// Enable this option to use an encoder disc that toggles the runout pin
// as the filament moves. (Be sure to set FILAMENT_RUNOUT_DISTANCE_MM
// large enough to avoid false positives.)
//#define FILAMENT_MOTION_SENSOR
#endif
#endif

//===========================================================================
//=============================== Bed Leveling ==============================
//===========================================================================
// @section calibrate

/**

  • Choose one of the options below to enable G29 Bed Leveling. The parameters
  • and behavior of G29 will change depending on your selection.
  • If using a Probe for Z Homing, enable Z_SAFE_HOMING also!
    • AUTO_BED_LEVELING_3POINT
  • Probe 3 arbitrary points on the bed (that aren’t collinear)
  • You specify the XY coordinates of all 3 points.
  • The result is a single tilted plane. Best for a flat bed.
    • AUTO_BED_LEVELING_LINEAR
  • Probe several points in a grid.
  • You specify the rectangle and the density of sample points.
  • The result is a single tilted plane. Best for a flat bed.
    • AUTO_BED_LEVELING_BILINEAR
  • Probe several points in a grid.
  • You specify the rectangle and the density of sample points.
  • The result is a mesh, best for large or uneven beds.
    • AUTO_BED_LEVELING_UBL (Unified Bed Leveling)
  • A comprehensive bed leveling system combining the features and benefits
  • of other systems. UBL also includes integrated Mesh Generation, Mesh
  • Validation and Mesh Editing systems.
    • MESH_BED_LEVELING
  • Probe a grid manually
  • The result is a mesh, suitable for large or uneven beds. (See BILINEAR.)
  • For machines without a probe, Mesh Bed Leveling provides a method to perform
  • leveling in steps so you can manually adjust the Z height at each grid-point.
  • With an LCD controller the process is guided step-by-step.
    */
    //#define AUTO_BED_LEVELING_3POINT
    //#define AUTO_BED_LEVELING_LINEAR
    #define AUTO_BED_LEVELING_BILINEAR
    //#define AUTO_BED_LEVELING_UBL
    //#define MESH_BED_LEVELING

/**

  • Normally G28 leaves leveling disabled on completion. Enable
  • this option to have G28 restore the prior leveling state.
    */
    //#define RESTORE_LEVELING_AFTER_G28

/**

  • Enable detailed logging of G28, G29, M48, etc.
  • Turn on with the command ‘M111 S32’.
  • NOTE: Requires a lot of PROGMEM!
    */
    //#define DEBUG_LEVELING_FEATURE

#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL)
// Gradually reduce leveling correction until a set height is reached,
// at which point movement will be level to the machine’s XY plane.
// The height can be set with M420 Z
#define ENABLE_LEVELING_FADE_HEIGHT

// For Cartesian machines, instead of dividing moves on mesh boundaries,
// split up moves into short segments like a Delta. This follows the
// contours of the bed more closely than edge-to-edge straight moves.
#define SEGMENT_LEVELED_MOVES
#define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one)

/**

  • Enable the G26 Mesh Validation Pattern tool.
    */
    //#define G26_MESH_VALIDATION
    #if ENABLED(G26_MESH_VALIDATION)
    #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle.
    #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool.
    #define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool.
    #define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for the G26 Mesh Validation Tool.
    #define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for XY Moves for the G26 Mesh Validation Tool.
    #endif

#endif

#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR)

// Set the number of grid points per dimension.
#define GRID_MAX_POINTS_X 3
#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X

// Set the boundaries for probing (where the probe can reach).
#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE
#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE))
#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE
#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE))

// Probe along the Y axis, advancing X after each column
//#define PROBE_Y_FIRST

#if ENABLED(AUTO_BED_LEVELING_BILINEAR)

// Beyond the probed grid, continue the implied tilt?
// Default is to maintain the height of the nearest edge.
//#define EXTRAPOLATE_BEYOND_GRID

//
// Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh.
//
//#define ABL_BILINEAR_SUBDIVISION
#if ENABLED(ABL_BILINEAR_SUBDIVISION)
  // Number of subdivisions between probe points
  #define BILINEAR_SUBDIVISIONS 3
#endif

#endif

#elif ENABLED(AUTO_BED_LEVELING_UBL)

//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================

//#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh

#define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed
#define GRID_MAX_POINTS_X 10 // Don’t use more than 15 points per axis, implementation limited.
#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X

#define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle
#define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500

//#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used
// as the Z-Height correction value.

#elif ENABLED(MESH_BED_LEVELING)

//===========================================================================
//=================================== Mesh ==================================
//===========================================================================

#define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed
#define GRID_MAX_POINTS_X 3 // Don’t use more than 7 points per axis, implementation limited.
#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X

//#define MESH_G28_REST_ORIGIN // After homing all axes (‘G28’ or ‘G28 XYZ’) rest Z at Z_MIN_POS

#endif // BED_LEVELING

/**

  • Points to probe for all 3-point Leveling procedures.
  • Override if the automatically selected points are inadequate.
    */
    #if EITHER(AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_UBL)
    //#define PROBE_PT_1_X 15
    //#define PROBE_PT_1_Y 180
    //#define PROBE_PT_2_X 15
    //#define PROBE_PT_2_Y 20
    //#define PROBE_PT_3_X 170
    //#define PROBE_PT_3_Y 20
    #endif

/**

  • Add a bed leveling sub-menu for ABL or MBL.
  • Include a guided procedure if manual probing is enabled.
    */
    //#define LCD_BED_LEVELING

#if ENABLED(LCD_BED_LEVELING)
#define MESH_EDIT_Z_STEP 0.025 // (mm) Step size while manually probing Z axis.
#define LCD_PROBE_Z_RANGE 4 // (mm) Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_EDIT_MENU // Add a menu to edit mesh points
#endif

// Add a menu item to move between bed corners for manual bed adjustment
//#define LEVEL_BED_CORNERS

#if ENABLED(LEVEL_BED_CORNERS)
#define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling
#define LEVEL_CORNERS_Z_HOP 4.0 // (mm) Move nozzle up before moving between corners
#define LEVEL_CORNERS_HEIGHT 0.0 // (mm) Z height of nozzle at leveling points
//#define LEVEL_CENTER_TOO // Move to the center after the last corner
#endif

/**

  • Commands to execute at the end of G29 probing.
  • Useful to retract or move the Z probe out of the way.
    */
    //#define Z_PROBE_END_SCRIPT “G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10”

// @section homing

// The center of the bed is at (X=0, Y=0)
//#define BED_CENTER_AT_0_0

// Manually set the home position. Leave these undefined for automatic settings.
// For DELTA this is the top-center of the Cartesian print volume.
//#define MANUAL_X_HOME_POS 0
//#define MANUAL_Y_HOME_POS 0
//#define MANUAL_Z_HOME_POS 0

// Use “Z Safe Homing” to avoid homing with a Z probe outside the bed area.
//
// With this feature enabled:
//
// - Allow Z homing only after X and Y homing AND stepper drivers still enabled.
// - If stepper drivers time out, it will need X and Y homing again before Z homing.
// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28).
// - Prevent Z homing when the Z probe is outside bed area.
//
#define Z_SAFE_HOMING

#if ENABLED(Z_SAFE_HOMING)
#define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28).
#define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28).
#endif

// Homing speeds (mm/m)
#define HOMING_FEEDRATE_XY (2060)
#define HOMING_FEEDRATE_Z (7
60)

// Validate that endstops are triggered on homing moves
#define VALIDATE_HOMING_ENDSTOPS

Any help would be amazing :slight_smile:

Have you tried a G29? The one touch is what it does when it probes for Z, which is different than the mesh.

Haven’t tried that yet! I though when I pressed home on my tft it would automatically assume to mesh bed level. Is there any way I can set this up? I will let you know the results…

I can only compare with my 3dprinter where I have 3DTouch.

Homing XYZ does only that.

Before each print the surface is checked with the mesh/dots
Then when the print starts it will adjust Z if/when needed.

I’m not sure it would be useful for milling?

If you’re making through cuts, it definitely doesn’t matter, just dig into the spoil board more. If you are doing pocketing, it usually doesn’t matter, because the eye can’t see errors in depth well, and any functional pockets can have some tolerance built in. If you are engraving using a v bit, then it will matter. because any error in Z will be an error in width. With a flatter bit (a 90 instead of a 60 degree bit) it will be worse. I have thought about just adding an endstop on a small bracket to do some mesh leveling, and just save the mesh. That would be similar to surfacing the spoil board.

Even better would be if I could easily define the area of a cut and have it do a mesh level before each project. That would make the top surface be the reference, and would be great for big carvings (like an american flag).

3 Likes

My bed wasn’t totally level and I was noticing one side on the engrave was deeper than the other so I thought a BL touch would help. Its working now with the G29 command just need to adjust the offest settings

1 Like

Cool, can you compensate with BLTouch or do you check with a dial gauge to verify surface?

I’m searching through mesh level threads looking for something just like that. I had the idea when I read about the pi sensing a change in acceleration when a bit touches the workpiece and my next thought was “if it’s a good idea, somebody else already had it!”

Someone just posted this a few weeks ago. There are parameters for G29 for size of the mesh. I have dreams of a cncjs plugin to read in the gcode min/max and create the right command for you with one button.

1 Like

All that is fine for a 3D printer where it is difficult to machine the bed flat, especially when it is glass, in milling though getting the bed flat is usually accomplished by facing the spoil board with an face cutter so the only thing you need to do, as Jeff says, is probe the height once with a G29 and then use G92 Zxxxx (whatever your probe height is), this will set your machine Z0.