Merge pull request #6054 from thinkyhead/rc_ubl_renewal

UBL for RCBugFix — cleanup, rebase, patch
2.0.x
Scott Lahteine 8 years ago committed by GitHub
commit 2c630a1b5c

2
.gitignore vendored

@ -42,7 +42,7 @@ applet/
*.i *.i
*.ii *.ii
*.swp *.swp
tags
# #
# C++ # C++

@ -117,6 +117,12 @@ script:
- opt_set ABL_GRID_POINTS_Y 16 - opt_set ABL_GRID_POINTS_Y 16
- build_marlin - build_marlin
# #
# Test a simple build of AUTO_BED_LEVELING_UBL
#
- restore_configs
- opt_enable AUTO_BED_LEVELING_UBL FIX_MOUNTED_PROBE EEPROM_SETTINGS G3D_PANEL
- build_marlin
#
# Test a Sled Z Probe # Test a Sled Z Probe
# #
- restore_configs - restore_configs

@ -667,7 +667,7 @@
*/ */
#define ABL_PLANAR (ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_3POINT)) #define ABL_PLANAR (ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_3POINT))
#define ABL_GRID (ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)) #define ABL_GRID (ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR))
#define HAS_ABL (ABL_PLANAR || ABL_GRID) #define HAS_ABL (ABL_PLANAR || ABL_GRID || ENABLED(AUTO_BED_LEVELING_UBL))
#define PLANNER_LEVELING (HAS_ABL || ENABLED(MESH_BED_LEVELING)) #define PLANNER_LEVELING (HAS_ABL || ENABLED(MESH_BED_LEVELING))
#define HAS_PROBING_PROCEDURE (HAS_ABL || ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST)) #define HAS_PROBING_PROCEDURE (HAS_ABL || ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST))

@ -231,6 +231,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -603,8 +604,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -742,34 +742,7 @@
#endif #endif
//=========================================================================== //===========================================================================
//============================ Mesh Bed Leveling ============================ //=============================== Bed Leveling ==============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//===========================================================================
//============================ Auto Bed Leveling ============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -793,10 +766,23 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -805,6 +791,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -825,11 +818,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -853,7 +841,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -631,6 +631,13 @@
#define MESH_MAX_Y (Y_MAX_POS - (MESH_INSET)) #define MESH_MAX_Y (Y_MAX_POS - (MESH_INSET))
#endif #endif
#if ENABLED(AUTO_BED_LEVELING_UBL)
#define UBL_MESH_MIN_X (X_MIN_POS + UBL_MESH_INSET)
#define UBL_MESH_MAX_X (X_MAX_POS - (UBL_MESH_INSET))
#define UBL_MESH_MIN_Y (Y_MIN_POS + UBL_MESH_INSET)
#define UBL_MESH_MAX_Y (Y_MAX_POS - (UBL_MESH_INSET))
#endif
// @section extras // @section extras
// Arc interpretation settings: // Arc interpretation settings:
@ -1036,7 +1043,7 @@
#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave #define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave
/** /**
* Add M43 command for pins info and testing * Add M43, M44 and M45 commands for pins info and testing
*/ */
//#define PINS_DEBUGGING //#define PINS_DEBUGGING

File diff suppressed because it is too large Load Diff

@ -35,7 +35,7 @@
* M100 C x Corrupts x locations within the free memory block. This is useful to check the * M100 C x Corrupts x locations within the free memory block. This is useful to check the
* correctness of the M100 F and M100 D commands. * correctness of the M100 F and M100 D commands.
* *
* Initial version by Roxy-3DPrintBoard * Initial version by Roxy-3D
*/ */
#define M100_FREE_MEMORY_DUMPER // Comment out to remove Dump sub-command #define M100_FREE_MEMORY_DUMPER // Comment out to remove Dump sub-command
#define M100_FREE_MEMORY_CORRUPTOR // Comment out to remove Corrupt sub-command #define M100_FREE_MEMORY_CORRUPTOR // Comment out to remove Corrupt sub-command
@ -51,10 +51,9 @@ extern char __bss_end;
// Utility functions used by M100 to get its work done. // Utility functions used by M100 to get its work done.
// //
#include "hex_print_routines.h"
char* top_of_stack(); char* top_of_stack();
void prt_hex_nibble(unsigned int);
void prt_hex_byte(unsigned int);
void prt_hex_word(unsigned int);
int how_many_E5s_are_here(char*); int how_many_E5s_are_here(char*);
void gcode_M100() { void gcode_M100() {
@ -211,27 +210,6 @@ char* top_of_stack() {
return &x + 1; // x is pulled on return; return &x + 1; // x is pulled on return;
} }
//
// 3 support routines to print hex numbers. We can print a nibble, byte and word
//
void prt_hex_nibble(unsigned int n) {
if (n <= 9)
SERIAL_ECHO(n);
else
SERIAL_ECHO((char)('A' + n - 10));
}
void prt_hex_byte(unsigned int b) {
prt_hex_nibble((b & 0xf0) >> 4);
prt_hex_nibble(b & 0x0f);
}
void prt_hex_word(unsigned int w) {
prt_hex_byte((w & 0xff00) >> 8);
prt_hex_byte(w & 0x0ff);
}
// how_many_E5s_are_here() is a utility function to easily find out how many 0xE5's are // how_many_E5s_are_here() is a utility function to easily find out how many 0xE5's are
// at the specified location. Having this logic as a function simplifies the search code. // at the specified location. Having this logic as a function simplifies the search code.
// //

@ -40,6 +40,7 @@
#include "fastio.h" #include "fastio.h"
#include "utility.h" #include "utility.h"
#ifdef USBCON #ifdef USBCON
#include "HardwareSerial.h" #include "HardwareSerial.h"
#if ENABLED(BLUETOOTH) #if ENABLED(BLUETOOTH)
@ -82,6 +83,7 @@ extern const char errormagic[] PROGMEM;
#define SERIAL_ECHOLNPGM(x) SERIAL_PROTOCOLLNPGM(x) #define SERIAL_ECHOLNPGM(x) SERIAL_PROTOCOLLNPGM(x)
#define SERIAL_ECHOPAIR(name,value) SERIAL_PROTOCOLPAIR(name, value) #define SERIAL_ECHOPAIR(name,value) SERIAL_PROTOCOLPAIR(name, value)
#define SERIAL_ECHOLNPAIR(name, value) SERIAL_PROTOCOLLNPAIR(name, value) #define SERIAL_ECHOLNPAIR(name, value) SERIAL_PROTOCOLLNPAIR(name, value)
#define SERIAL_ECHO_F(x,y) SERIAL_PROTOCOL_F(x,y)
#define SERIAL_ERROR_START (serialprintPGM(errormagic)) #define SERIAL_ERROR_START (serialprintPGM(errormagic))
#define SERIAL_ERROR(x) SERIAL_PROTOCOL(x) #define SERIAL_ERROR(x) SERIAL_PROTOCOL(x)
@ -95,6 +97,7 @@ void serial_echopair_P(const char* s_P, int v);
void serial_echopair_P(const char* s_P, long v); void serial_echopair_P(const char* s_P, long v);
void serial_echopair_P(const char* s_P, float v); void serial_echopair_P(const char* s_P, float v);
void serial_echopair_P(const char* s_P, double v); void serial_echopair_P(const char* s_P, double v);
void serial_echopair_P(const char* s_P, unsigned int v);
void serial_echopair_P(const char* s_P, unsigned long v); void serial_echopair_P(const char* s_P, unsigned long v);
FORCE_INLINE void serial_echopair_P(const char* s_P, uint8_t v) { serial_echopair_P(s_P, (int)v); } FORCE_INLINE void serial_echopair_P(const char* s_P, uint8_t v) { serial_echopair_P(s_P, (int)v); }
FORCE_INLINE void serial_echopair_P(const char* s_P, uint16_t v) { serial_echopair_P(s_P, (int)v); } FORCE_INLINE void serial_echopair_P(const char* s_P, uint16_t v) { serial_echopair_P(s_P, (int)v); }

@ -1,6 +1,6 @@
/** /**
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
* *
* Based on Sprinter and grbl. * Based on Sprinter and grbl.
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
@ -234,6 +234,10 @@
#include "duration_t.h" #include "duration_t.h"
#include "types.h" #include "types.h"
#if ENABLED(AUTO_BED_LEVELING_UBL)
#include "UBL.h"
#endif
#if HAS_ABL #if HAS_ABL
#include "vector_3.h" #include "vector_3.h"
#if ENABLED(AUTO_BED_LEVELING_LINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR)
@ -297,6 +301,10 @@
G38_endstop_hit = false; G38_endstop_hit = false;
#endif #endif
#if ENABLED(AUTO_BED_LEVELING_UBL)
bed_leveling blm;
#endif
bool Running = true; bool Running = true;
uint8_t marlin_debug_flags = DEBUG_NONE; uint8_t marlin_debug_flags = DEBUG_NONE;
@ -315,7 +323,7 @@ float current_position[XYZE] = { 0.0 };
* Set with 'gcode_get_destination' or 'set_destination_to_current'. * Set with 'gcode_get_destination' or 'set_destination_to_current'.
* 'line_to_destination' sets 'current_position' to 'destination'. * 'line_to_destination' sets 'current_position' to 'destination'.
*/ */
static float destination[XYZE] = { 0.0 }; float destination[XYZE] = { 0.0 };
/** /**
* axis_homed * axis_homed
@ -706,7 +714,7 @@ static void report_current_position();
SERIAL_ECHOPAIR("(", x); SERIAL_ECHOPAIR("(", x);
SERIAL_ECHOPAIR(", ", y); SERIAL_ECHOPAIR(", ", y);
SERIAL_ECHOPAIR(", ", z); SERIAL_ECHOPAIR(", ", z);
SERIAL_ECHOPGM(")"); SERIAL_CHAR(')');
if (suffix) serialprintPGM(suffix); if (suffix) serialprintPGM(suffix);
else SERIAL_EOL; else SERIAL_EOL;
@ -1760,7 +1768,7 @@ static void clean_up_after_endstop_or_probe_move() {
#endif //HAS_BED_PROBE #endif //HAS_BED_PROBE
#if ENABLED(Z_PROBE_ALLEN_KEY) || ENABLED(Z_PROBE_SLED) || HAS_PROBING_PROCEDURE || HOTENDS > 1 || ENABLED(NOZZLE_CLEAN_FEATURE) || ENABLED(NOZZLE_PARK_FEATURE) #if ENABLED(Z_PROBE_ALLEN_KEY) || ENABLED(Z_PROBE_SLED) || HAS_PROBING_PROCEDURE || HOTENDS > 1 || ENABLED(NOZZLE_CLEAN_FEATURE) || ENABLED(NOZZLE_PARK_FEATURE)
static bool axis_unhomed_error(const bool x, const bool y, const bool z) { bool axis_unhomed_error(const bool x, const bool y, const bool z) {
const bool xx = x && !axis_homed[X_AXIS], const bool xx = x && !axis_homed[X_AXIS],
yy = y && !axis_homed[Y_AXIS], yy = y && !axis_homed[Y_AXIS],
zz = z && !axis_homed[Z_AXIS]; zz = z && !axis_homed[Z_AXIS];
@ -2009,7 +2017,7 @@ static void clean_up_after_endstop_or_probe_move() {
#endif #endif
// returns false for ok and true for failure // returns false for ok and true for failure
static bool set_probe_deployed(bool deploy) { bool set_probe_deployed(bool deploy) {
#if ENABLED(DEBUG_LEVELING_FEATURE) #if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) { if (DEBUGGING(LEVELING)) {
@ -2196,7 +2204,8 @@ static void clean_up_after_endstop_or_probe_move() {
// - Raise to the BETWEEN height // - Raise to the BETWEEN height
// - Return the probed Z position // - Return the probed Z position
// //
static float probe_pt(const float &x, const float &y, const bool stow = true, const int verbose_level = 1) { //float probe_pt(const float &x, const float &y, const bool stow = true, const int verbose_level = 1) {
float probe_pt(const float x, const float y, const bool stow, const int verbose_level) {
#if ENABLED(DEBUG_LEVELING_FEATURE) #if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) { if (DEBUGGING(LEVELING)) {
SERIAL_ECHOPAIR(">>> probe_pt(", x); SERIAL_ECHOPAIR(">>> probe_pt(", x);
@ -3291,10 +3300,12 @@ inline void gcode_G4() {
SERIAL_ECHOPGM("BILINEAR"); SERIAL_ECHOPGM("BILINEAR");
#elif ENABLED(AUTO_BED_LEVELING_3POINT) #elif ENABLED(AUTO_BED_LEVELING_3POINT)
SERIAL_ECHOPGM("3POINT"); SERIAL_ECHOPGM("3POINT");
#elif ENABLED(AUTO_BED_LEVELING_UBL)
SERIAL_ECHOPGM("UBL");
#endif #endif
if (planner.abl_enabled) { if (planner.abl_enabled) {
SERIAL_ECHOLNPGM(" (enabled)"); SERIAL_ECHOLNPGM(" (enabled)");
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_3POINT) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL)
float diff[XYZ] = { float diff[XYZ] = {
stepper.get_axis_position_mm(X_AXIS) - current_position[X_AXIS], stepper.get_axis_position_mm(X_AXIS) - current_position[X_AXIS],
stepper.get_axis_position_mm(Y_AXIS) - current_position[Y_AXIS], stepper.get_axis_position_mm(Y_AXIS) - current_position[Y_AXIS],
@ -3842,7 +3853,7 @@ inline void gcode_G28() {
report_current_position(); report_current_position();
} }
#elif HAS_ABL #elif HAS_ABL && DISABLED(AUTO_BED_LEVELING_UBL)
/** /**
* G29: Detailed Z probe, probes the bed at 3 or more points. * G29: Detailed Z probe, probes the bed at 3 or more points.
@ -4395,7 +4406,7 @@ inline void gcode_G28() {
SYNC_PLAN_POSITION_KINEMATIC(); SYNC_PLAN_POSITION_KINEMATIC();
} }
#endif // HAS_ABL #endif // HAS_ABL && DISABLED(AUTO_BED_LEVELING_UBL)
#if HAS_BED_PROBE #if HAS_BED_PROBE
@ -7005,6 +7016,8 @@ void quickstop_stepper() {
bed_level_virt_print(); bed_level_virt_print();
#endif #endif
} }
#elif ENABLED(AUTO_BED_LEVELING_UBL)
blm.display_map(0); // Right now, we only support one type of map
#elif ENABLED(MESH_BED_LEVELING) #elif ENABLED(MESH_BED_LEVELING)
if (mbl.has_mesh()) { if (mbl.has_mesh()) {
SERIAL_ECHOLNPGM("Mesh Bed Level data:"); SERIAL_ECHOLNPGM("Mesh Bed Level data:");
@ -8315,6 +8328,12 @@ void process_next_command() {
break; break;
#endif // INCH_MODE_SUPPORT #endif // INCH_MODE_SUPPORT
#if ENABLED(AUTO_BED_LEVELING_UBL)
case 26: // G26: Mesh Validation Pattern generation
gcode_G26();
break;
#endif // AUTO_BED_LEVELING_UBL
#if ENABLED(NOZZLE_PARK_FEATURE) #if ENABLED(NOZZLE_PARK_FEATURE)
case 27: // G27: Nozzle Park case 27: // G27: Nozzle Park
gcode_G27(); gcode_G27();
@ -8326,7 +8345,8 @@ void process_next_command() {
break; break;
#if PLANNER_LEVELING #if PLANNER_LEVELING
case 29: // G29 Detailed Z probe, probes the bed at 3 or more points. case 29: // G29 Detailed Z probe, probes the bed at 3 or more points,
// or provides access to the UBL System if enabled.
gcode_G29(); gcode_G29();
break; break;
#endif // PLANNER_LEVELING #endif // PLANNER_LEVELING
@ -8433,12 +8453,24 @@ void process_next_command() {
gcode_M43(); break; gcode_M43(); break;
#endif #endif
#if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST)
case 48: // M48: Z probe repeatability test case 48: // M48: Z probe repeatability test
gcode_M48(); gcode_M48();
break; break;
#endif // Z_MIN_PROBE_REPEATABILITY_TEST #endif // Z_MIN_PROBE_REPEATABILITY_TEST
#if ENABLED(AUTO_BED_LEVELING_UBL)
case 49: // M49: Turn on or off G26_Debug_flag for verbose output
if (G26_Debug_flag) {
SERIAL_PROTOCOLPGM("UBL Debug Flag turned off.\n");
G26_Debug_flag = 0; }
else {
SERIAL_PROTOCOLPGM("UBL Debug Flag turned on.\n");
G26_Debug_flag++; }
break;
#endif // Z_MIN_PROBE_REPEATABILITY_TEST
case 75: // M75: Start print timer case 75: // M75: Start print timer
gcode_M75(); break; gcode_M75(); break;
case 76: // M76: Pause print timer case 76: // M76: Pause print timer
@ -9078,7 +9110,7 @@ void ok_to_send() {
SERIAL_ECHOLNPAIR(" offset=", offset); SERIAL_ECHOLNPAIR(" offset=", offset);
} }
last_offset = offset; last_offset = offset;
//*/ */
return offset; return offset;
} }
@ -9564,6 +9596,18 @@ void set_current_from_steppers_for_axis(const AxisEnum axis) {
return false; return false;
} }
else else
#elif ENABLED(AUTO_BED_LEVELING_UBL)
if (blm.state.active) {
// UBL_line_to_destination(MMS_SCALED(feedrate_mm_s));
UBL_line_to_destination(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS],
// (feedrate*(1.0/60.0))*(feedrate_percentage*(1.0/100.0) ), active_extruder);
MMS_SCALED(feedrate_mm_s), active_extruder);
return false;
}
else
#elif ENABLED(AUTO_BED_LEVELING_BILINEAR) #elif ENABLED(AUTO_BED_LEVELING_BILINEAR)
if (planner.abl_enabled) { if (planner.abl_enabled) {
bilinear_line_to_destination(MMS_SCALED(feedrate_mm_s)); bilinear_line_to_destination(MMS_SCALED(feedrate_mm_s));
@ -10565,9 +10609,9 @@ void setup() {
#endif #endif
#if ENABLED(RGB_LED) #if ENABLED(RGB_LED)
pinMode(RGB_LED_R_PIN, OUTPUT); SET_OUTPUT(RGB_LED_R_PIN);
pinMode(RGB_LED_G_PIN, OUTPUT); SET_OUTPUT(RGB_LED_G_PIN);
pinMode(RGB_LED_B_PIN, OUTPUT); SET_OUTPUT(RGB_LED_B_PIN);
#endif #endif
lcd_init(); lcd_init();

@ -388,10 +388,13 @@ static_assert(1 >= 0
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
+ 1 + 1
#endif #endif
#if ENABLED(AUTO_BED_LEVELING_UBL)
+ 1
#endif
#if ENABLED(MESH_BED_LEVELING) #if ENABLED(MESH_BED_LEVELING)
+ 1 + 1
#endif #endif
, "Select only one of: MESH_BED_LEVELING, AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT, or AUTO_BED_LEVELING_BILINEAR." , "Select only one of: MESH_BED_LEVELING, AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_BILINEAR or AUTO_BED_LEVELING_UBL."
); );
/** /**
@ -403,6 +406,21 @@ static_assert(1 >= 0
#elif MESH_NUM_X_POINTS > 9 || MESH_NUM_Y_POINTS > 9 #elif MESH_NUM_X_POINTS > 9 || MESH_NUM_Y_POINTS > 9
#error "MESH_NUM_X_POINTS and MESH_NUM_Y_POINTS must be less than 10." #error "MESH_NUM_X_POINTS and MESH_NUM_Y_POINTS must be less than 10."
#endif #endif
#elif ENABLED(MANUAL_BED_LEVELING)
#error "MANUAL_BED_LEVELING only applies to MESH_BED_LEVELING."
#endif
/**
* Unified Bed Leveling
*/
#if ENABLED(AUTO_BED_LEVELING_UBL)
#if ENABLED(DELTA)
#error "AUTO_BED_LEVELING_UBL does not yet support DELTA printers."
#elif DISABLED(NEWPANEL)
#error "AUTO_BED_LEVELING_UBL requires an LCD controller."
#elif UBL_MESH_NUM_X_POINTS > 15 || UBL_MESH_NUM_Y_POINTS > 15
#error "UBL_MESH_NUM_X_POINTS and UBL_MESH_NUM_Y_POINTS must be less than 16."
#endif
#endif #endif
/** /**
@ -434,6 +452,7 @@ static_assert(1 >= 0
, "Please enable only one probe: PROBE_MANUALLY, FIX_MOUNTED_PROBE, Z Servo, BLTOUCH, Z_PROBE_ALLEN_KEY, or Z_PROBE_SLED." , "Please enable only one probe: PROBE_MANUALLY, FIX_MOUNTED_PROBE, Z Servo, BLTOUCH, Z_PROBE_ALLEN_KEY, or Z_PROBE_SLED."
); );
#if PROBE_SELECTED #if PROBE_SELECTED
/** /**
@ -577,21 +596,26 @@ static_assert(1 >= 0
#endif #endif
#endif #endif
#else // !ABL_GRID #else // !ABL_GRID
#if ENABLED(AUTO_BED_LEVELING_UBL)
// Check the triangulation points #ifndef EEPROM_SETTINGS
#if ABL_PROBE_PT_1_X < MIN_PROBE_X || ABL_PROBE_PT_1_X > MAX_PROBE_X #error "AUTO_BED_LEVELING_UBL requires EEPROM_SETTINGS. Please update your configuration."
#error "The given ABL_PROBE_PT_1_X can't be reached by the Z probe." #endif
#elif ABL_PROBE_PT_2_X < MIN_PROBE_X || ABL_PROBE_PT_2_X > MAX_PROBE_X #else // !UBL
#error "The given ABL_PROBE_PT_2_X can't be reached by the Z probe." // Check the triangulation points
#elif ABL_PROBE_PT_3_X < MIN_PROBE_X || ABL_PROBE_PT_3_X > MAX_PROBE_X #if ABL_PROBE_PT_1_X < MIN_PROBE_X || ABL_PROBE_PT_1_X > MAX_PROBE_X
#error "The given ABL_PROBE_PT_3_X can't be reached by the Z probe." #error "The given ABL_PROBE_PT_1_X can't be reached by the Z probe."
#elif ABL_PROBE_PT_1_Y < MIN_PROBE_Y || ABL_PROBE_PT_1_Y > MAX_PROBE_Y #elif ABL_PROBE_PT_2_X < MIN_PROBE_X || ABL_PROBE_PT_2_X > MAX_PROBE_X
#error "The given ABL_PROBE_PT_1_Y can't be reached by the Z probe." #error "The given ABL_PROBE_PT_2_X can't be reached by the Z probe."
#elif ABL_PROBE_PT_2_Y < MIN_PROBE_Y || ABL_PROBE_PT_2_Y > MAX_PROBE_Y #elif ABL_PROBE_PT_3_X < MIN_PROBE_X || ABL_PROBE_PT_3_X > MAX_PROBE_X
#error "The given ABL_PROBE_PT_2_Y can't be reached by the Z probe." #error "The given ABL_PROBE_PT_3_X can't be reached by the Z probe."
#elif ABL_PROBE_PT_3_Y < MIN_PROBE_Y || ABL_PROBE_PT_3_Y > MAX_PROBE_Y #elif ABL_PROBE_PT_1_Y < MIN_PROBE_Y || ABL_PROBE_PT_1_Y > MAX_PROBE_Y
#error "The given ABL_PROBE_PT_3_Y can't be reached by the Z probe." #error "The given ABL_PROBE_PT_1_Y can't be reached by the Z probe."
#endif #elif ABL_PROBE_PT_2_Y < MIN_PROBE_Y || ABL_PROBE_PT_2_Y > MAX_PROBE_Y
#error "The given ABL_PROBE_PT_2_Y can't be reached by the Z probe."
#elif ABL_PROBE_PT_3_Y < MIN_PROBE_Y || ABL_PROBE_PT_3_Y > MAX_PROBE_Y
#error "The given ABL_PROBE_PT_3_Y can't be reached by the Z probe."
#endif
#endif // !AUTO_BED_LEVEING_UBL
#endif // !ABL_GRID #endif // !ABL_GRID

@ -0,0 +1,331 @@
/**
* Marlin 3D Printer Firmware
* Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "Marlin.h"
#include "math.h"
#ifndef UNIFIED_BED_LEVELING_H
#define UNIFIED_BED_LEVELING_H
#if ENABLED(AUTO_BED_LEVELING_UBL)
#define UBL_OK false
#define UBL_ERR true
typedef struct {
int x_index, y_index;
float distance; // Not always used. But when populated, it is the distance
// from the search location
} mesh_index_pair;
struct vector { double dx, dy, dz; };
enum Mesh_Point_Type { INVALID, REAL, SET_IN_BITMAP };
bool axis_unhomed_error(bool, bool, bool);
void dump(char *str, float f);
bool G29_lcd_clicked();
void probe_entire_mesh(float, float, bool, bool);
void UBL_line_to_destination(const float&, const float&, const float&, const float&, const float&, uint8_t);
void manually_probe_remaining_mesh(float, float, float, float, bool);
struct vector tilt_mesh_based_on_3pts(float, float, float);
void new_set_bed_level_equation_3pts(float, float, float);
float measure_business_card_thickness(float);
mesh_index_pair find_closest_mesh_point_of_type(Mesh_Point_Type, float, float, bool, unsigned int[16]);
void Find_Mean_Mesh_Height();
void Shift_Mesh_Height();
bool G29_Parameter_Parsing();
void G29_What_Command();
void G29_EEPROM_Dump();
void G29_Kompare_Current_Mesh_to_Stored_Mesh();
void fine_tune_mesh(float, float, float, bool);
void bit_clear(uint16_t bits[16], uint8_t x, uint8_t y);
void bit_set(uint16_t bits[16], uint8_t x, uint8_t y);
bool is_bit_set(uint16_t bits[16], uint8_t x, uint8_t y);
char *ftostr43sign(const float&, char);
void gcode_G26();
void gcode_G28();
void gcode_G29();
extern char conv[9];
void save_UBL_active_state_and_disable();
void restore_UBL_active_state_and_leave();
///////////////////////////////////////////////////////////////////////////////////////////////////////
#if ENABLED(ULTRA_LCD)
extern char lcd_status_message[];
void lcd_quick_feedback();
#endif
enum MBLStatus { MBL_STATUS_NONE = 0, MBL_STATUS_HAS_MESH_BIT = 0, MBL_STATUS_ACTIVE_BIT = 1 };
#define MESH_X_DIST ((float(UBL_MESH_MAX_X) - float(UBL_MESH_MIN_X)) / (float(UBL_MESH_NUM_X_POINTS) - 1.0))
#define MESH_Y_DIST ((float(UBL_MESH_MAX_Y) - float(UBL_MESH_MIN_Y)) / (float(UBL_MESH_NUM_Y_POINTS) - 1.0))
extern bool G26_Debug_flag;
extern float last_specified_z;
extern float fade_scaling_factor_for_current_height;
extern float z_values[UBL_MESH_NUM_X_POINTS][UBL_MESH_NUM_Y_POINTS];
extern float mesh_index_to_X_location[UBL_MESH_NUM_X_POINTS + 1]; // +1 just because of paranoia that we might end up on the
extern float mesh_index_to_Y_location[UBL_MESH_NUM_Y_POINTS + 1]; // the last Mesh Line and that is the start of a whole new cell
class bed_leveling {
public:
struct ubl_state {
bool active = false;
float z_offset = 0.0;
int EEPROM_storage_slot = -1,
n_x = UBL_MESH_NUM_X_POINTS,
n_y = UBL_MESH_NUM_Y_POINTS;
float mesh_x_min = UBL_MESH_MIN_X,
mesh_y_min = UBL_MESH_MIN_Y,
mesh_x_max = UBL_MESH_MAX_X,
mesh_y_max = UBL_MESH_MAX_Y,
mesh_x_dist = MESH_X_DIST,
mesh_y_dist = MESH_Y_DIST,
G29_Correction_Fade_Height = 10.0,
G29_Fade_Height_Multiplier = 1.0 / 10.0; // It is cheaper to do a floating point multiply than a floating
// point divide. So, we keep this number in both forms. The first
// is for the user. The second one is the one that is actually used
// again and again and again during the correction calculations.
unsigned char padding[24]; // This is just to allow room to add state variables without
// changing the location of data structures in the EEPROM.
// This is for compatability with future versions to keep
// people from having to regenerate thier mesh data.
//
// If you change the contents of this struct, please adjust
// the padding[] to keep the size the same!
} state, pre_initialized;
bed_leveling();
// ~bed_leveling(); // No destructor because this object never goes away!
void display_map(int);
void reset();
void invalidate();
void store_state();
void load_state();
void store_mesh(int);
void load_mesh(int);
bool sanity_check();
FORCE_INLINE float map_x_index_to_bed_location(int8_t i){ return ((float) UBL_MESH_MIN_X) + (((float) MESH_X_DIST) * (float) i); };
FORCE_INLINE float map_y_index_to_bed_location(int8_t i){ return ((float) UBL_MESH_MIN_Y) + (((float) MESH_Y_DIST) * (float) i); };
void set_z(const int8_t px, const int8_t py, const float z) { z_values[px][py] = z; }
int8_t get_cell_index_x(float x) {
int8_t cx = (x - (UBL_MESH_MIN_X)) * (1.0 / (MESH_X_DIST));
return constrain(cx, 0, (UBL_MESH_NUM_X_POINTS) - 1); // -1 is appropriate if we want all movement to the X_MAX
} // position. But with this defined this way, it is possible
// to extrapolate off of this point even further out. Probably
// that is OK because something else should be keeping that from
// happening and should not be worried about at this level.
int8_t get_cell_index_y(float y) {
int8_t cy = (y - (UBL_MESH_MIN_Y)) * (1.0 / (MESH_Y_DIST));
return constrain(cy, 0, (UBL_MESH_NUM_Y_POINTS) - 1); // -1 is appropriate if we want all movement to the Y_MAX
} // position. But with this defined this way, it is possible
// to extrapolate off of this point even further out. Probably
// that is OK because something else should be keeping that from
// happening and should not be worried about at this level.
int8_t find_closest_x_index(float x) {
int8_t px = (x - (UBL_MESH_MIN_X) + (MESH_X_DIST) * 0.5) * (1.0 / (MESH_X_DIST));
return (px >= 0 && px < (UBL_MESH_NUM_X_POINTS)) ? px : -1;
}
int8_t find_closest_y_index(float y) {
int8_t py = (y - (UBL_MESH_MIN_Y) + (MESH_Y_DIST) * 0.5) * (1.0 / (MESH_Y_DIST));
return (py >= 0 && py < (UBL_MESH_NUM_Y_POINTS)) ? py : -1;
}
/**
* z2 --|
* z0 | |
* | | + (z2-z1)
* z1 | | |
* ---+-------------+--------+-- --|
* a1 a0 a2
* |<---delta_a---------->|
*
* calc_z0 is the basis for all the Mesh Based correction. It is used to
* find the expected Z Height at a position between two known Z-Height locations
*
* It is farly expensive with its 4 floating point additions and 2 floating point
* multiplications.
*/
inline float calc_z0(float a0, float a1, float z1, float a2, float z2) {
float delta_z = (z2 - z1);
float delta_a = (a0 - a1) / (a2 - a1);
return z1 + delta_a * delta_z;
}
/**
* get_z_correction_at_Y_intercept(float x0, int x1_i, int yi) only takes
* three parameters. It assumes the x0 point is on a Mesh line denoted by yi. In theory
* we could use get_cell_index_x(float x) to obtain the 2nd parameter x1_i but any code calling
* the get_z_correction_along_vertical_mesh_line_at_specific_X routine will already have
* the X index of the x0 intersection available and we don't want to perform any extra floating
* point operations.
*/
inline float get_z_correction_along_horizontal_mesh_line_at_specific_X(float x0, int x1_i, int yi) {
if (x1_i < 0 || yi < 0 || x1_i >= UBL_MESH_NUM_X_POINTS || yi >= UBL_MESH_NUM_Y_POINTS) {
SERIAL_ECHOPAIR("? in get_z_correction_along_horizontal_mesh_line_at_specific_X(x0=", x0);
SERIAL_ECHOPAIR(",x1_i=", x1_i);
SERIAL_ECHOPAIR(",yi=", yi);
SERIAL_CHAR(')');
SERIAL_EOL;
return NAN;
}
const float a0ma1diva2ma1 = (x0 - mesh_index_to_X_location[x1_i]) * (1.0 / (MESH_X_DIST)),
z1 = z_values[x1_i][yi],
z2 = z_values[x1_i + 1][yi],
dz = (z2 - z1);
return z1 + a0ma1diva2ma1 * dz;
}
//
// See comments above for get_z_correction_along_horizontal_mesh_line_at_specific_X
//
inline float get_z_correction_along_vertical_mesh_line_at_specific_Y(float y0, int xi, int y1_i) {
if (xi < 0 || y1_i < 0 || xi >= UBL_MESH_NUM_X_POINTS || y1_i >= UBL_MESH_NUM_Y_POINTS) {
SERIAL_ECHOPAIR("? in get_z_correction_along_vertical_mesh_line_at_specific_X(y0=", y0);
SERIAL_ECHOPAIR(", x1_i=", xi);
SERIAL_ECHOPAIR(", yi=", y1_i);
SERIAL_CHAR(')');
SERIAL_EOL;
return NAN;
}
const float a0ma1diva2ma1 = (y0 - mesh_index_to_Y_location[y1_i]) * (1.0 / (MESH_Y_DIST)),
z1 = z_values[xi][y1_i],
z2 = z_values[xi][y1_i + 1],
dz = (z2 - z1);
return z1 + a0ma1diva2ma1 * dz;
}
/**
* This is the generic Z-Correction. It works anywhere within a Mesh Cell. It first
* does a linear interpolation along both of the bounding X-Mesh-Lines to find the
* Z-Height at both ends. Then it does a linear interpolation of these heights based
* on the Y position within the cell.
*/
float get_z_correction(float x0, float y0) {
int8_t cx = get_cell_index_x(x0),
cy = get_cell_index_y(y0);
if (cx < 0 || cy < 0 || cx >= UBL_MESH_NUM_X_POINTS || cy >= UBL_MESH_NUM_Y_POINTS) {
SERIAL_ECHOPAIR("? in get_z_correction(x0=", x0);
SERIAL_ECHOPAIR(", y0=", y0);
SERIAL_CHAR(')');
SERIAL_EOL;
#if ENABLED(ULTRA_LCD)
strcpy(lcd_status_message, "get_z_correction() indexes out of range.");
lcd_quick_feedback();
#endif
return 0.0; // this used to return state.z_offset
}
float z1 = calc_z0(x0,
map_x_index_to_bed_location(cx), z_values[cx][cy],
map_x_index_to_bed_location(cx + 1), z_values[cx + 1][cy]);
float z2 = calc_z0(x0,
map_x_index_to_bed_location(cx), z_values[cx][cy + 1],
map_x_index_to_bed_location(cx + 1), z_values[cx + 1][cy + 1]);
float z0 = calc_z0(y0,
map_y_index_to_bed_location(cy), z1,
map_y_index_to_bed_location(cy + 1), z2);
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(MESH_ADJUST)) {
SERIAL_ECHOPAIR(" raw get_z_correction(", x0);
SERIAL_ECHOPAIR(",", y0);
SERIAL_ECHOPGM(")=");
SERIAL_PROTOCOL_F(z0, 6);
}
#endif
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(MESH_ADJUST)) {
SERIAL_ECHOPGM(" >>>---> ");
SERIAL_PROTOCOL_F(z0, 6);
SERIAL_EOL;
}
#endif
if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN
z0 = 0.0; // in blm.z_values[][] and propagate through the
// calculations. If our correction is NAN, we throw it out
// because part of the Mesh is undefined and we don't have the
// information we need to complete the height correction.
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(MESH_ADJUST)) {
SERIAL_ECHOPGM("??? Yikes! NAN in get_z_correction( ");
SERIAL_ECHO(x0);
SERIAL_ECHOPGM(", ");
SERIAL_ECHO(y0);
SERIAL_ECHOLNPGM(" )");
}
#endif
}
return z0; // there used to be a +state.z_offset on this line
}
/**
* This routine is used to scale the Z correction depending upon the current nozzle height. It is
* optimized for speed. It avoids floating point operations by checking if the requested scaling
* factor is going to be the same as the last time the function calculated a value. If so, it just
* returns it.
*
* If it must do a calcuation, it will return a scaling factor of 0.0 if the UBL System is not active
* or if the current Z Height is past the specified 'Fade Height'
*/
FORCE_INLINE float fade_scaling_factor_for_Z(float current_z) {
if (last_specified_z == current_z)
return fade_scaling_factor_for_current_height;
last_specified_z = current_z;
fade_scaling_factor_for_current_height =
state.active && current_z < state.G29_Correction_Fade_Height
? 1.0 - (current_z * state.G29_Fade_Height_Multiplier)
: 0.0;
return fade_scaling_factor_for_current_height;
}
};
extern bed_leveling blm;
extern int Unified_Bed_Leveling_EEPROM_start;
#endif // AUTO_BED_LEVELING_UBL
#endif // UNIFIED_BED_LEVELING_H

@ -0,0 +1,296 @@
/**
* Marlin 3D Printer Firmware
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "Marlin.h"
#include "math.h"
#if ENABLED(AUTO_BED_LEVELING_UBL)
#include "UBL.h"
#include "hex_print_routines.h"
/**
* These variables used to be declared inside the bed_leveling class. We are going to still declare
* them within the .cpp file for bed leveling. But there is only one instance of the bed leveling
* object and we can get rid of a level of inderection by not making them 'member data'. So, in the
* interest of speed, we do it this way. When we move to a 32-Bit processor, they can be moved
* back inside the bed leveling class.
*/
float last_specified_z,
fade_scaling_factor_for_current_height,
z_values[UBL_MESH_NUM_X_POINTS][UBL_MESH_NUM_Y_POINTS],
mesh_index_to_X_location[UBL_MESH_NUM_X_POINTS + 1], // +1 just because of paranoia that we might end up on the
mesh_index_to_Y_location[UBL_MESH_NUM_Y_POINTS + 1]; // the last Mesh Line and that is the start of a whole new cell
bed_leveling::bed_leveling() {
for (uint8_t i = 0; i <= UBL_MESH_NUM_X_POINTS; i++) // We go one past what we expect to ever need for safety
mesh_index_to_X_location[i] = double(UBL_MESH_MIN_X) + double(MESH_X_DIST) * double(i);
for (uint8_t i = 0; i <= UBL_MESH_NUM_Y_POINTS; i++) // We go one past what we expect to ever need for safety
mesh_index_to_Y_location[i] = double(UBL_MESH_MIN_Y) + double(MESH_Y_DIST) * double(i);
reset();
}
void bed_leveling::store_state() {
int k = E2END - sizeof(blm.state);
eeprom_write_block((void *)&blm.state, (void *)k, sizeof(blm.state));
}
void bed_leveling::load_state() {
int k = E2END - sizeof(blm.state);
eeprom_read_block((void *)&blm.state, (void *)k, sizeof(blm.state));
if (sanity_check())
SERIAL_PROTOCOLLNPGM("?In load_state() sanity_check() failed.\n");
// These lines can go away in a few weeks. They are just
// to make sure people updating thier firmware won't be using
if (blm.state.G29_Fade_Height_Multiplier != 1.0 / blm.state.G29_Correction_Fade_Height) { // an incomplete Bed_Leveling.state structure. For speed
blm.state.G29_Fade_Height_Multiplier = 1.0 / blm.state.G29_Correction_Fade_Height; // we now multiply by the inverse of the Fade Height instead of
store_state(); // dividing by it. Soon... all of the old structures will be
} // updated, but until then, we try to ease the transition
// for our Beta testers.
}
void bed_leveling::load_mesh(int m) {
int k = E2END - sizeof(blm.state),
j = (k - Unified_Bed_Leveling_EEPROM_start) / sizeof(z_values);
if (m == -1) {
SERIAL_PROTOCOLLNPGM("?No mesh saved in EEPROM. Zeroing mesh in memory.\n");
reset();
return;
}
if (m < 0 || m >= j || Unified_Bed_Leveling_EEPROM_start <= 0) {
SERIAL_PROTOCOLLNPGM("?EEPROM storage not available to load mesh.\n");
return;
}
j = k - (m + 1) * sizeof(z_values);
eeprom_read_block((void *)&z_values , (void *)j, sizeof(z_values));
SERIAL_PROTOCOLPGM("Mesh loaded from slot ");
SERIAL_PROTOCOL(m);
SERIAL_PROTOCOLPGM(" at offset 0x");
prt_hex_word(j);
SERIAL_EOL;
}
void bed_leveling:: store_mesh(int m) {
int k = E2END - sizeof(state),
j = (k - Unified_Bed_Leveling_EEPROM_start) / sizeof(z_values);
if (m < 0 || m >= j || Unified_Bed_Leveling_EEPROM_start <= 0) {
SERIAL_PROTOCOLLNPGM("?EEPROM storage not available to load mesh.\n");
SERIAL_PROTOCOL(m);
SERIAL_PROTOCOLLNPGM(" mesh slots available.\n");
SERIAL_PROTOCOLLNPAIR("E2END : ", E2END);
SERIAL_PROTOCOLLNPAIR("k : ", k);
SERIAL_PROTOCOLLNPAIR("j : ", j);
SERIAL_PROTOCOLLNPAIR("m : ", m);
SERIAL_EOL;
return;
}
j = k - (m + 1) * sizeof(z_values);
eeprom_write_block((const void *)&z_values, (void *)j, sizeof(z_values));
SERIAL_PROTOCOLPGM("Mesh saved in slot ");
SERIAL_PROTOCOL(m);
SERIAL_PROTOCOLPGM(" at offset 0x");
prt_hex_word(j);
SERIAL_EOL;
}
void bed_leveling::reset() {
state.active = false;
state.z_offset = 0;
state.EEPROM_storage_slot = -1;
ZERO(z_values);
last_specified_z = -999.9; // We can't pre-initialize these values in the declaration
fade_scaling_factor_for_current_height = 0.0; // due to C++11 constraints
}
void bed_leveling::invalidate() {
prt_hex_word((unsigned int)this);
SERIAL_EOL;
state.active = false;
state.z_offset = 0;
for (int x = 0; x < UBL_MESH_NUM_X_POINTS; x++)
for (int y = 0; y < UBL_MESH_NUM_Y_POINTS; y++)
z_values[x][y] = NAN;
}
void bed_leveling::display_map(int map_type) {
float f, current_xi, current_yi;
int8_t i, j;
UNUSED(map_type);
SERIAL_PROTOCOLLNPGM("\nBed Topography Report:\n");
SERIAL_ECHOPAIR("(", 0);
SERIAL_ECHOPAIR(", ", UBL_MESH_NUM_Y_POINTS - 1);
SERIAL_ECHOPGM(") ");
current_xi = blm.get_cell_index_x(current_position[X_AXIS] + (MESH_X_DIST) / 2.0);
current_yi = blm.get_cell_index_y(current_position[Y_AXIS] + (MESH_Y_DIST) / 2.0);
for (i = 0; i < UBL_MESH_NUM_X_POINTS - 1; i++)
SERIAL_ECHOPGM(" ");
SERIAL_ECHOPAIR("(", UBL_MESH_NUM_X_POINTS - 1);
SERIAL_ECHOPAIR(",", UBL_MESH_NUM_Y_POINTS - 1);
SERIAL_ECHOLNPGM(")");
// if (map_type || 1) {
SERIAL_ECHOPAIR("(", UBL_MESH_MIN_X);
SERIAL_ECHOPAIR(",", UBL_MESH_MAX_Y);
SERIAL_CHAR(')');
for (i = 0; i < UBL_MESH_NUM_X_POINTS - 1; i++)
SERIAL_ECHOPGM(" ");
SERIAL_ECHOPAIR("(", UBL_MESH_MAX_X);
SERIAL_ECHOPAIR(",", UBL_MESH_MAX_Y);
SERIAL_ECHOLNPGM(")");
// }
for (j = UBL_MESH_NUM_Y_POINTS - 1; j >= 0; j--) {
for (i = 0; i < UBL_MESH_NUM_X_POINTS; i++) {
f = z_values[i][j];
// is the nozzle here? if so, mark the number
SERIAL_CHAR(i == current_xi && j == current_yi ? '[' : ' ');
if (isnan(f))
SERIAL_PROTOCOLPGM(" . ");
else {
// if we don't do this, the columns won't line up nicely
if (f >= 0.0) SERIAL_CHAR(' ');
SERIAL_PROTOCOL_F(f, 5);
idle();
}
if (i == current_xi && j == current_yi) // is the nozzle here? if so, finish marking the number
SERIAL_CHAR(']');
else
SERIAL_PROTOCOL(" ");
SERIAL_CHAR(' ');
}
SERIAL_EOL;
if (j) { // we want the (0,0) up tight against the block of numbers
SERIAL_CHAR(' ');
SERIAL_EOL;
}
}
// if (map_type) {
SERIAL_ECHOPAIR("(", int(UBL_MESH_MIN_X));
SERIAL_ECHOPAIR(",", int(UBL_MESH_MIN_Y));
SERIAL_ECHOPGM(") ");
for (i = 0; i < UBL_MESH_NUM_X_POINTS - 1; i++)
SERIAL_ECHOPGM(" ");
SERIAL_ECHOPAIR("(", int(UBL_MESH_MAX_X));
SERIAL_ECHOPAIR(",", int(UBL_MESH_MIN_Y));
SERIAL_CHAR(')');
// }
SERIAL_ECHOPAIR("(", 0);
SERIAL_ECHOPAIR(",", 0);
SERIAL_ECHOPGM(") ");
for (i = 0; i < UBL_MESH_NUM_X_POINTS - 1; i++)
SERIAL_ECHOPGM(" ");
SERIAL_ECHOPAIR("(", UBL_MESH_NUM_X_POINTS-1);
SERIAL_ECHOPAIR(",", 0);
SERIAL_CHAR(')');
SERIAL_CHAR(' ');
SERIAL_EOL;
}
bool bed_leveling::sanity_check() {
uint8_t error_flag = 0;
if (state.n_x != UBL_MESH_NUM_X_POINTS) {
SERIAL_PROTOCOLLNPGM("?UBL_MESH_NUM_X_POINTS set wrong\n");
error_flag++;
}
if (state.n_y != UBL_MESH_NUM_Y_POINTS) {
SERIAL_PROTOCOLLNPGM("?UBL_MESH_NUM_Y_POINTS set wrong\n");
error_flag++;
}
if (state.mesh_x_min != UBL_MESH_MIN_X) {
SERIAL_PROTOCOLLNPGM("?UBL_MESH_MIN_X set wrong\n");
error_flag++;
}
if (state.mesh_y_min != UBL_MESH_MIN_Y) {
SERIAL_PROTOCOLLNPGM("?UBL_MESH_MIN_Y set wrong\n");
error_flag++;
}
if (state.mesh_x_max != UBL_MESH_MAX_X) {
SERIAL_PROTOCOLLNPGM("?UBL_MESH_MAX_X set wrong\n");
error_flag++;
}
if (state.mesh_y_max != UBL_MESH_MAX_Y) {
SERIAL_PROTOCOLLNPGM("?UBL_MESH_MAX_Y set wrong\n");
error_flag++;
}
if (state.mesh_x_dist != MESH_X_DIST) {
SERIAL_PROTOCOLLNPGM("?MESH_X_DIST set wrong\n");
error_flag++;
}
if (state.mesh_y_dist != MESH_Y_DIST) {
SERIAL_PROTOCOLLNPGM("?MESH_Y_DIST set wrong\n");
error_flag++;
}
int k = E2END - sizeof(blm.state),
j = (k - Unified_Bed_Leveling_EEPROM_start) / sizeof(z_values);
if (j < 1) {
SERIAL_PROTOCOLLNPGM("?No EEPROM storage available for a mesh of this size.\n");
error_flag++;
}
// SERIAL_PROTOCOLPGM("?sanity_check() return value: ");
// SERIAL_PROTOCOL(error_flag);
// SERIAL_EOL;
return !!error_flag;
}
#endif // AUTO_BED_LEVELING_UBL

File diff suppressed because it is too large Load Diff

@ -0,0 +1,553 @@
/**
* Marlin 3D Printer Firmware
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "Marlin.h"
#if ENABLED(AUTO_BED_LEVELING_UBL)
#include "UBL.h"
#include "planner.h"
#include <avr/io.h>
#include <math.h>
extern void set_current_to_destination();
extern bool G26_Debug_flag;
void debug_current_and_destination(char *title);
void wait_for_button_press();
void UBL_line_to_destination(const float &x_end, const float &y_end, const float &z_end, const float &e_end, const float &feed_rate, uint8_t extruder) {
int cell_start_xi, cell_start_yi, cell_dest_xi, cell_dest_yi;
int left_flag, down_flag;
int current_xi, current_yi;
int dxi, dyi, xi_cnt, yi_cnt;
bool use_X_dist, inf_normalized_flag, inf_m_flag;
float x_start, y_start;
float x, y, z1, z2, z0 /*, z_optimized */;
float next_mesh_line_x, next_mesh_line_y, a0ma1diva2ma1;
float on_axis_distance, e_normalized_dist, e_position, e_start, z_normalized_dist, z_position, z_start;
float dx, dy, adx, ady, m, c;
//
// Much of the nozzle movement will be within the same cell. So we will do as little computation
// as possible to determine if this is the case. If this move is within the same cell, we will
// just do the required Z-Height correction, call the Planner's buffer_line() routine, and leave
//
x_start = current_position[X_AXIS];
y_start = current_position[Y_AXIS];
z_start = current_position[Z_AXIS];
e_start = current_position[E_AXIS];
cell_start_xi = blm.get_cell_index_x(x_start);
cell_start_yi = blm.get_cell_index_y(y_start);
cell_dest_xi = blm.get_cell_index_x(x_end);
cell_dest_yi = blm.get_cell_index_y(y_end);
if (G26_Debug_flag!=0) {
SERIAL_ECHOPGM(" UBL_line_to_destination(xe=");
SERIAL_ECHO(x_end);
SERIAL_ECHOPGM(",ye=");
SERIAL_ECHO(y_end);
SERIAL_ECHOPGM(",ze=");
SERIAL_ECHO(z_end);
SERIAL_ECHOPGM(",ee=");
SERIAL_ECHO(e_end);
SERIAL_ECHOPGM(")\n");
debug_current_and_destination( (char *) "Start of UBL_line_to_destination()");
}
if ((cell_start_xi == cell_dest_xi) && (cell_start_yi == cell_dest_yi)) { // if the whole move is within the same cell,
// we don't need to break up the move
//
// If we are moving off the print bed, we are going to allow the move at this level.
// But we detect it and isolate it. For now, we just pass along the request.
//
if (cell_dest_xi<0 || cell_dest_yi<0 || cell_dest_xi >= UBL_MESH_NUM_X_POINTS || cell_dest_yi >= UBL_MESH_NUM_Y_POINTS) {
// Note: There is no Z Correction in this case. We are off the grid and don't know what
// a reasonable correction would be.
planner.buffer_line(x_end, y_end, z_end + blm.state.z_offset, e_end, feed_rate, extruder);
set_current_to_destination();
if (G26_Debug_flag!=0) {
debug_current_and_destination( (char *) "out of bounds in UBL_line_to_destination()");
}
return;
}
// we can optimize some floating point operations here. We could call float get_z_correction(float x0, float y0) to
// generate the correction for us. But we can lighten the load on the CPU by doing a modified version of the function.
// We are going to only calculate the amount we are from the first mesh line towards the second mesh line once.
// We will use this fraction in both of the original two Z Height calculations for the bi-linear interpolation. And,
// instead of doing a generic divide of the distance, we know the distance is MESH_X_DIST so we can use the preprocessor
// to create a 1-over number for us. That will allow us to do a floating point multiply instead of a floating point divide.
FINAL_MOVE:
a0ma1diva2ma1 = (x_end - mesh_index_to_X_location[cell_dest_xi]) * (float) (1.0 / MESH_X_DIST);
z1 = z_values[cell_dest_xi][cell_dest_yi] +
(z_values[cell_dest_xi + 1][cell_dest_yi] - z_values[cell_dest_xi][cell_dest_yi]) * a0ma1diva2ma1;
z2 = z_values[cell_dest_xi][cell_dest_yi+1] +
(z_values[cell_dest_xi+1][cell_dest_yi+1] - z_values[cell_dest_xi][cell_dest_yi+1]) * a0ma1diva2ma1;
// we are done with the fractional X distance into the cell. Now with the two Z-Heights we have calculated, we
// are going to apply the Y-Distance into the cell to interpolate the final Z correction.
a0ma1diva2ma1 = (y_end - mesh_index_to_Y_location[cell_dest_yi]) * (float) (1.0 / MESH_Y_DIST);
z0 = z1 + (z2 - z1) * a0ma1diva2ma1;
// debug code to use non-optimized get_z_correction() and to do a sanity check
// that the correct value is being passed to planner.buffer_line()
//
/*
z_optimized = z0;
z0 = blm.get_z_correction( x_end, y_end);
if ( fabs(z_optimized - z0) > .01 || isnan(z0) || isnan(z_optimized) ) {
debug_current_and_destination( (char *) "FINAL_MOVE: z_correction()");
if ( isnan(z0) ) SERIAL_ECHO(" z0==NAN ");
if ( isnan(z_optimized) ) SERIAL_ECHO(" z_optimized==NAN ");
SERIAL_ECHOPAIR(" x_end=", x_end);
SERIAL_ECHOPAIR(" y_end=", y_end);
SERIAL_ECHOPAIR(" z0=", z0);
SERIAL_ECHOPAIR(" z_optimized=", z_optimized);
SERIAL_ECHOPAIR(" err=",fabs(z_optimized - z0));
SERIAL_EOL;
}
*/
z0 = z0 * blm.fade_scaling_factor_for_Z( z_end );
if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN
z0 = 0.0; // in z_values[][] and propagate through the
// calculations. If our correction is NAN, we throw it out
// because part of the Mesh is undefined and we don't have the
// information we need to complete the height correction.
}
planner.buffer_line(x_end, y_end, z_end + z0 + blm.state.z_offset, e_end, feed_rate, extruder);
if (G26_Debug_flag!=0) {
debug_current_and_destination( (char *) "FINAL_MOVE in UBL_line_to_destination()");
}
set_current_to_destination();
return;
}
//
// If we get here, we are processing a move that crosses at least one Mesh Line. We will check
// for the simple case of just crossing X or just crossing Y Mesh Lines after we get all the details
// of the move figured out. We can process the easy case of just crossing an X or Y Mesh Line with less
// computation and in fact most lines are of this nature. We will check for that in the following
// blocks of code:
left_flag = 0;
down_flag = 0;
inf_m_flag = false;
inf_normalized_flag = false;
dx = x_end - x_start;
dy = y_end - y_start;
if (dx<0.0) { // figure out which way we need to move to get to the next cell
dxi = -1;
adx = -dx; // absolute value of dx. We already need to check if dx and dy are negative.
}
else { // We may as well generate the appropriate values for adx and ady right now
dxi = 1; // to save setting up the abs() function call and actually doing the call.
adx = dx;
}
if (dy<0.0) {
dyi = -1;
ady = -dy; // absolute value of dy
}
else {
dyi = 1;
ady = dy;
}
if (dx<0.0) left_flag = 1;
if (dy<0.0) down_flag = 1;
if (cell_start_xi == cell_dest_xi) dxi = 0;
if (cell_start_yi == cell_dest_yi) dyi = 0;
//
// Compute the scaling factor for the extruder for each partial move.
// We need to watch out for zero length moves because it will cause us to
// have an infinate scaling factor. We are stuck doing a floating point
// divide to get our scaling factor, but after that, we just multiply by this
// number. We also pick our scaling factor based on whether the X or Y
// component is larger. We use the biggest of the two to preserve precision.
//
if ( adx > ady ) {
use_X_dist = true;
on_axis_distance = x_end-x_start;
}
else {
use_X_dist = false;
on_axis_distance = y_end-y_start;
}
e_position = e_end - e_start;
e_normalized_dist = e_position / on_axis_distance;
z_position = z_end - z_start;
z_normalized_dist = z_position / on_axis_distance;
if (e_normalized_dist==INFINITY || e_normalized_dist==-INFINITY) {
inf_normalized_flag = true;
}
current_xi = cell_start_xi;
current_yi = cell_start_yi;
m = dy / dx;
c = y_start - m*x_start;
if (m == INFINITY || m == -INFINITY) {
inf_m_flag = true;
}
//
// This block handles vertical lines. These are lines that stay within the same
// X Cell column. They do not need to be perfectly vertical. They just can
// not cross into another X Cell column.
//
if (dxi == 0) { // Check for a vertical line
current_yi += down_flag; // Line is heading down, we just want to go to the bottom
while (current_yi != cell_dest_yi + down_flag) {
current_yi += dyi;
next_mesh_line_y = mesh_index_to_Y_location[current_yi];
if (inf_m_flag) {
x = x_start; // if the slope of the line is infinite, we won't do the calculations
}
// we know the next X is the same so we can recover and continue!
else {
x = (next_mesh_line_y - c) / m; // Calculate X at the next Y mesh line
}
z0 = blm.get_z_correction_along_horizontal_mesh_line_at_specific_X(x, current_xi, current_yi);
//
// debug code to use non-optimized get_z_correction() and to do a sanity check
// that the correct value is being passed to planner.buffer_line()
//
/*
z_optimized = z0;
z0 = blm.get_z_correction( x, next_mesh_line_y);
if ( fabs(z_optimized - z0) > .01 || isnan(z0) || isnan(z_optimized) ) {
debug_current_and_destination( (char *) "VERTICAL z_correction()");
if ( isnan(z0) ) SERIAL_ECHO(" z0==NAN ");
if ( isnan(z_optimized) ) SERIAL_ECHO(" z_optimized==NAN ");
SERIAL_ECHOPAIR(" x=", x);
SERIAL_ECHOPAIR(" next_mesh_line_y=", next_mesh_line_y);
SERIAL_ECHOPAIR(" z0=", z0);
SERIAL_ECHOPAIR(" z_optimized=", z_optimized);
SERIAL_ECHOPAIR(" err=",fabs(z_optimized-z0));
SERIAL_ECHO("\n");
}
*/
z0 = z0 * blm.fade_scaling_factor_for_Z( z_end );
if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN
z0 = 0.0; // in z_values[][] and propagate through the
// calculations. If our correction is NAN, we throw it out
// because part of the Mesh is undefined and we don't have the
// information we need to complete the height correction.
}
y = mesh_index_to_Y_location[current_yi];
// Without this check, it is possible for the algorythm to generate a zero length move in the case
// where the line is heading down and it is starting right on a Mesh Line boundary. For how often that
// happens, it might be best to remove the check and always 'schedule' the move because
// the planner.buffer_line() routine will filter it if that happens.
if ( y!=y_start) {
if ( inf_normalized_flag == false ) {
on_axis_distance = y - y_start; // we don't need to check if the extruder position
e_position = e_start + on_axis_distance * e_normalized_dist; // is based on X or Y because this is a vertical move
z_position = z_start + on_axis_distance * z_normalized_dist;
}
else {
e_position = e_start;
z_position = z_start;
}
planner.buffer_line(x, y, z_position + z0 + blm.state.z_offset, e_position, feed_rate, extruder);
} //else printf("FIRST MOVE PRUNED ");
}
//
// Check if we are at the final destination. Usually, we won't be, but if it is on a Y Mesh Line, we are done.
//
if (G26_Debug_flag!=0) {
debug_current_and_destination( (char *) "vertical move done in UBL_line_to_destination()");
}
if (current_position[X_AXIS] != x_end || current_position[Y_AXIS] != y_end) {
goto FINAL_MOVE;
}
set_current_to_destination();
return;
}
//
// This block handles horizontal lines. These are lines that stay within the same
// Y Cell row. They do not need to be perfectly horizontal. They just can
// not cross into another Y Cell row.
//
if (dyi == 0) { // Check for a horiziontal line
current_xi += left_flag; // Line is heading left, we just want to go to the left
// edge of this cell for the first move.
while (current_xi != cell_dest_xi + left_flag) {
current_xi += dxi;
next_mesh_line_x = mesh_index_to_X_location[current_xi];
y = m * next_mesh_line_x + c; // Calculate X at the next Y mesh line
z0 = blm.get_z_correction_along_vertical_mesh_line_at_specific_Y(y, current_xi, current_yi);
//
// debug code to use non-optimized get_z_correction() and to do a sanity check
// that the correct value is being passed to planner.buffer_line()
//
/*
z_optimized = z0;
z0 = blm.get_z_correction( next_mesh_line_x, y);
if ( fabs(z_optimized - z0) > .01 || isnan(z0) || isnan(z_optimized) ) {
debug_current_and_destination( (char *) "HORIZONTAL z_correction()");
if ( isnan(z0) ) SERIAL_ECHO(" z0==NAN ");
if ( isnan(z_optimized) ) SERIAL_ECHO(" z_optimized==NAN ");
SERIAL_ECHOPAIR(" next_mesh_line_x=", next_mesh_line_x);
SERIAL_ECHOPAIR(" y=", y);
SERIAL_ECHOPAIR(" z0=", z0);
SERIAL_ECHOPAIR(" z_optimized=", z_optimized);
SERIAL_ECHOPAIR(" err=",fabs(z_optimized-z0));
SERIAL_ECHO("\n");
}
*/
z0 = z0 * blm.fade_scaling_factor_for_Z( z_end );
if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN
z0 = 0.0; // in z_values[][] and propagate through the
// calculations. If our correction is NAN, we throw it out
// because part of the Mesh is undefined and we don't have the
// information we need to complete the height correction.
}
x = mesh_index_to_X_location[current_xi];
// Without this check, it is possible for the algorythm to generate a zero length move in the case
// where the line is heading left and it is starting right on a Mesh Line boundary. For how often
// that happens, it might be best to remove the check and always 'schedule' the move because
// the planner.buffer_line() routine will filter it if that happens.
if ( x!=x_start) {
if ( inf_normalized_flag == false ) {
on_axis_distance = x - x_start; // we don't need to check if the extruder position
e_position = e_start + on_axis_distance * e_normalized_dist; // is based on X or Y because this is a horizontal move
z_position = z_start + on_axis_distance * z_normalized_dist;
}
else {
e_position = e_start;
z_position = z_start;
}
planner.buffer_line(x, y, z_position + z0 + blm.state.z_offset, e_position, feed_rate, extruder);
} //else printf("FIRST MOVE PRUNED ");
}
if (G26_Debug_flag!=0) {
debug_current_and_destination( (char *) "horizontal move done in UBL_line_to_destination()");
}
if (current_position[X_AXIS] != x_end || current_position[Y_AXIS] != y_end) {
goto FINAL_MOVE;
}
set_current_to_destination();
return;
}
//
//
//
//
// This block handles the generic case of a line crossing both X and Y
// Mesh lines.
//
//
//
//
xi_cnt = cell_start_xi - cell_dest_xi;
if ( xi_cnt < 0 ) {
xi_cnt = -xi_cnt;
}
yi_cnt = cell_start_yi - cell_dest_yi;
if ( yi_cnt < 0 ) {
yi_cnt = -yi_cnt;
}
current_xi += left_flag;
current_yi += down_flag;
while ( xi_cnt>0 || yi_cnt>0 ) {
next_mesh_line_x = mesh_index_to_X_location[current_xi + dxi];
next_mesh_line_y = mesh_index_to_Y_location[current_yi + dyi];
y = m * next_mesh_line_x + c; // Calculate Y at the next X mesh line
x = (next_mesh_line_y-c) / m; // Calculate X at the next Y mesh line (we don't have to worry
// about m being equal to 0.0 If this was the case, we would have
// detected this as a vertical line move up above and we wouldn't
// be down here doing a generic type of move.
if ((left_flag && (x>next_mesh_line_x)) || (!left_flag && (x<next_mesh_line_x))) { // Check if we hit the Y line first
//
// Yes! Crossing a Y Mesh Line next
//
z0 = blm.get_z_correction_along_horizontal_mesh_line_at_specific_X(x, current_xi-left_flag, current_yi+dyi);
//
// debug code to use non-optimized get_z_correction() and to do a sanity check
// that the correct value is being passed to planner.buffer_line()
//
/*
z_optimized = z0;
z0 = blm.get_z_correction( x, next_mesh_line_y);
if ( fabs(z_optimized - z0) > .01 || isnan(z0) || isnan(z_optimized) ) {
debug_current_and_destination( (char *) "General_1: z_correction()");
if ( isnan(z0) ) SERIAL_ECHO(" z0==NAN ");
if ( isnan(z_optimized) ) SERIAL_ECHO(" z_optimized==NAN "); {
SERIAL_ECHOPAIR(" x=", x);
}
SERIAL_ECHOPAIR(" next_mesh_line_y=", next_mesh_line_y);
SERIAL_ECHOPAIR(" z0=", z0);
SERIAL_ECHOPAIR(" z_optimized=", z_optimized);
SERIAL_ECHOPAIR(" err=",fabs(z_optimized-z0));
SERIAL_ECHO("\n");
}
*/
z0 = z0 * blm.fade_scaling_factor_for_Z( z_end );
if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN
z0 = 0.0; // in z_values[][] and propagate through the
// calculations. If our correction is NAN, we throw it out
// because part of the Mesh is undefined and we don't have the
// information we need to complete the height correction.
}
if ( inf_normalized_flag == false ) {
if ( use_X_dist ) {
on_axis_distance = x - x_start;
}
else {
on_axis_distance = next_mesh_line_y - y_start;
}
e_position = e_start + on_axis_distance * e_normalized_dist;
z_position = z_start + on_axis_distance * z_normalized_dist;
}
else {
e_position = e_start;
z_position = z_start;
}
planner.buffer_line(x, next_mesh_line_y, z_position + z0 + blm.state.z_offset, e_position, feed_rate, extruder);
current_yi += dyi;
yi_cnt--;
}
else {
//
// Yes! Crossing a X Mesh Line next
//
z0 = blm.get_z_correction_along_vertical_mesh_line_at_specific_Y(y, current_xi+dxi, current_yi-down_flag);
//
// debug code to use non-optimized get_z_correction() and to do a sanity check
// that the correct value is being passed to planner.buffer_line()
//
/*
z_optimized = z0;
z0 = blm.get_z_correction( next_mesh_line_x, y);
if ( fabs(z_optimized - z0) > .01 || isnan(z0) || isnan(z_optimized) ) {
debug_current_and_destination( (char *) "General_2: z_correction()");
if ( isnan(z0) ) SERIAL_ECHO(" z0==NAN ");
if ( isnan(z_optimized) ) SERIAL_ECHO(" z_optimized==NAN ");
SERIAL_ECHOPAIR(" next_mesh_line_x=", next_mesh_line_x);
SERIAL_ECHOPAIR(" y=", y);
SERIAL_ECHOPAIR(" z0=", z0);
SERIAL_ECHOPAIR(" z_optimized=", z_optimized);
SERIAL_ECHOPAIR(" err=",fabs(z_optimized-z0));
SERIAL_ECHO("\n");
}
*/
z0 = z0 * blm.fade_scaling_factor_for_Z( z_end );
if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN
z0 = 0.0; // in z_values[][] and propagate through the
// calculations. If our correction is NAN, we throw it out
// because part of the Mesh is undefined and we don't have the
// information we need to complete the height correction.
}
if ( inf_normalized_flag == false ) {
if ( use_X_dist ) {
on_axis_distance = next_mesh_line_x - x_start;
}
else {
on_axis_distance = y - y_start;
}
e_position = e_start + on_axis_distance * e_normalized_dist;
z_position = z_start + on_axis_distance * z_normalized_dist;
}
else {
e_position = e_start;
z_position = z_start;
}
planner.buffer_line(next_mesh_line_x, y, z_position + z0 + blm.state.z_offset, e_position, feed_rate, extruder);
current_xi += dxi;
xi_cnt--;
}
}
if (G26_Debug_flag) {
debug_current_and_destination( (char *) "generic move done in UBL_line_to_destination()");
}
if (current_position[0] != x_end || current_position[1] != y_end) {
goto FINAL_MOVE;
}
set_current_to_destination();
return;
}
void wait_for_button_press() {
// if ( !been_to_2_6 )
//return; // bob - I think this should be commented out
SET_INPUT_PULLUP(66); // Roxy's Left Switch is on pin 66. Right Switch is on pin 65
SET_OUTPUT(64);
while (READ(66) & 0x01) idle();
delay(50);
while (!(READ(66) & 0x01)) idle();
delay(50);
}
#endif

@ -164,6 +164,10 @@
#include "stepper_indirection.h" #include "stepper_indirection.h"
#endif #endif
#if ENABLED(AUTO_BED_LEVELING_UBL)
#include "UBL.h"
#endif
#if ENABLED(ABL_BILINEAR_SUBDIVISION) #if ENABLED(ABL_BILINEAR_SUBDIVISION)
extern void bed_level_virt_interpolate(); extern void bed_level_virt_interpolate();
#endif #endif
@ -534,6 +538,11 @@ void Config_Postprocess() {
SERIAL_ECHOPAIR("Settings Stored (", eeprom_size - (EEPROM_OFFSET)); SERIAL_ECHOPAIR("Settings Stored (", eeprom_size - (EEPROM_OFFSET));
SERIAL_ECHOLNPGM(" bytes)"); SERIAL_ECHOLNPGM(" bytes)");
} }
#if ENABLED(AUTO_BED_LEVELING_UBL)
blm.store_state();
if (blm.state.EEPROM_storage_slot >= 0)
blm.store_mesh(blm.state.EEPROM_storage_slot);
#endif
} }
/** /**
@ -832,8 +841,45 @@ void Config_Postprocess() {
SERIAL_ERRORLNPGM("EEPROM checksum mismatch"); SERIAL_ERRORLNPGM("EEPROM checksum mismatch");
Config_ResetDefault(); Config_ResetDefault();
} }
}
#if ENABLED(AUTO_BED_LEVELING_UBL)
Unified_Bed_Leveling_EEPROM_start = (eeprom_index + 32) & 0xFFF8; // Pad the end of configuration data so it
// can float up or down a little bit without
// disrupting the Unified Bed Leveling data
blm.load_state();
SERIAL_ECHOPGM(" UBL ");
if (!blm.state.active) SERIAL_ECHO("not ");
SERIAL_ECHOLNPGM("active!");
if (!blm.sanity_check()) {
int tmp_mesh; // We want to preserve whether the UBL System is Active
bool tmp_active; // If it is, we want to preserve the Mesh that is being used.
tmp_mesh = blm.state.EEPROM_storage_slot;
tmp_active = blm.state.active;
SERIAL_ECHOLNPGM("\nInitializing Bed Leveling State to current firmware settings.\n");
blm.state = blm.pre_initialized; // Initialize with the pre_initialized data structure
blm.state.EEPROM_storage_slot = tmp_mesh; // But then restore some data we don't want mangled
blm.state.active = tmp_active;
}
else {
SERIAL_PROTOCOLPGM("?Unable to enable Unified Bed Leveling.\n");
blm.state = blm.pre_initialized;
blm.reset();
blm.store_state();
}
if (blm.state.EEPROM_storage_slot >= 0) {
blm.load_mesh(blm.state.EEPROM_storage_slot);
SERIAL_ECHOPAIR("Mesh ", blm.state.EEPROM_storage_slot);
SERIAL_ECHOLNPGM(" loaded from storage.");
}
else {
blm.reset();
SERIAL_ECHOPGM("UBL System reset() \n");
}
#endif
}
#if ENABLED(EEPROM_CHITCHAT) #if ENABLED(EEPROM_CHITCHAT)
Config_PrintSettings(); Config_PrintSettings();
#endif #endif
@ -1126,6 +1172,42 @@ void Config_ResetDefault() {
SERIAL_ECHOPAIR(" Z", home_offset[Z_AXIS]); SERIAL_ECHOPAIR(" Z", home_offset[Z_AXIS]);
SERIAL_EOL; SERIAL_EOL;
#endif #endif
#if ENABLED(AUTO_BED_LEVELING_UBL)
SERIAL_ECHOLNPGM("Unified Bed Leveling:");
CONFIG_ECHO_START;
SERIAL_ECHOPGM("System is: ");
if (blm.state.active)
SERIAL_ECHOLNPGM("Active\n");
else
SERIAL_ECHOLNPGM("Deactive\n");
SERIAL_ECHOPAIR("Active Mesh Slot: ", blm.state.EEPROM_storage_slot);
SERIAL_EOL;
SERIAL_ECHOPGM("z_offset: ");
SERIAL_ECHO_F(blm.state.z_offset, 6);
SERIAL_EOL;
SERIAL_ECHOPAIR("EEPROM can hold ", (int)((E2END - sizeof(blm.state) - Unified_Bed_Leveling_EEPROM_start) / sizeof(z_values)));
SERIAL_ECHOLNPGM(" meshes. \n");
SERIAL_ECHOPAIR("\nUBL_MESH_NUM_X_POINTS ", UBL_MESH_NUM_X_POINTS);
SERIAL_ECHOPAIR("\nUBL_MESH_NUM_Y_POINTS ", UBL_MESH_NUM_Y_POINTS);
SERIAL_ECHOPAIR("\nUBL_MESH_MIN_X ", UBL_MESH_MIN_X);
SERIAL_ECHOPAIR("\nUBL_MESH_MIN_Y ", UBL_MESH_MIN_Y);
SERIAL_ECHOPAIR("\nUBL_MESH_MAX_X ", UBL_MESH_MAX_X);
SERIAL_ECHOPAIR("\nUBL_MESH_MAX_Y ", UBL_MESH_MAX_Y);
SERIAL_ECHOPGM("\nMESH_X_DIST ");
SERIAL_ECHO_F(MESH_X_DIST, 6);
SERIAL_ECHOPGM("\nMESH_Y_DIST ");
SERIAL_ECHO_F(MESH_Y_DIST, 6);
SERIAL_EOL;
SERIAL_EOL;
#endif
#if HOTENDS > 1 #if HOTENDS > 1
CONFIG_ECHO_START; CONFIG_ECHO_START;

@ -232,6 +232,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -603,8 +604,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -741,35 +741,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -793,10 +767,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -805,6 +791,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -825,11 +818,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -853,7 +841,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -231,6 +231,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -586,8 +587,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -724,35 +724,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -776,10 +750,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -788,6 +774,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -808,11 +801,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.

@ -231,6 +231,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -586,8 +587,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -724,35 +724,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -776,10 +750,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -788,6 +774,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -808,11 +801,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -836,7 +824,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -234,6 +234,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -595,8 +596,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -733,35 +733,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -785,10 +759,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -797,6 +783,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -817,11 +810,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -845,7 +833,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -231,6 +231,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -597,8 +598,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -735,35 +735,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -787,10 +761,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -799,6 +785,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -819,11 +812,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -847,7 +835,42 @@
#define ABL_PROBE_PT_3_X ((X_MIN_POS + X_MAX_POS) / 2) #define ABL_PROBE_PT_3_X ((X_MIN_POS + X_MAX_POS) / 2)
#define ABL_PROBE_PT_3_Y Y_MAX_POS - (Y_PROBE_OFFSET_FROM_EXTRUDER) #define ABL_PROBE_PT_3_Y Y_MAX_POS - (Y_PROBE_OFFSET_FROM_EXTRUDER)
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -251,6 +251,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -632,8 +633,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -770,35 +770,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -822,10 +796,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -834,6 +820,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -854,11 +847,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -882,7 +870,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -231,6 +231,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -603,8 +604,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -741,35 +741,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -793,10 +767,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -805,6 +791,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -825,11 +818,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -853,7 +841,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -231,6 +231,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -603,8 +604,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -741,35 +741,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -793,10 +767,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -805,6 +791,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -825,11 +818,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -853,7 +841,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -231,6 +231,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -603,8 +604,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -741,35 +741,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -793,10 +767,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -805,6 +791,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -825,11 +818,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -853,7 +841,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -234,6 +234,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -602,8 +603,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -740,35 +740,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -792,10 +766,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -804,6 +790,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -824,11 +817,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -852,7 +840,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.
@ -1434,7 +1457,7 @@
// leaving it undefined or defining as 0 will disable the servo subsystem // leaving it undefined or defining as 0 will disable the servo subsystem
// If unsure, leave commented / disabled // If unsure, leave commented / disabled
// //
#define NUM_SERVOS 0 // DGlass3D - Servo index starts with 0 for M280 command //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. // Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle.
// 300ms is a good value but you can try less delay. // 300ms is a good value but you can try less delay.

@ -263,6 +263,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -618,8 +619,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -756,35 +756,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -808,10 +782,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -820,6 +806,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -840,11 +833,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -868,7 +856,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -231,6 +231,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -624,8 +625,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -762,35 +762,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -814,10 +788,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -826,6 +812,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -846,11 +839,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -874,7 +862,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -234,6 +234,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -595,8 +596,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -733,35 +733,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -785,10 +759,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -797,6 +783,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -817,11 +810,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -845,7 +833,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -231,6 +231,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -603,8 +604,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -741,35 +741,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -793,10 +767,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -805,6 +791,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -825,11 +818,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -853,7 +841,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -231,6 +231,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -705,8 +706,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -844,35 +844,7 @@
#endif #endif
//=========================================================================== //===========================================================================
//============================ Mesh Bed Leveling ============================ //=============================== Bed Leveling ==============================
//===========================================================================
//
// MESH_BED_LEVELING does not yet support DELTA printers.
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//===========================================================================
//============================ Auto Bed Leveling ============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -896,10 +868,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT // Only AUTO_BED_LEVELING_BILINEAR is supported for DELTA bed leveling. //#define AUTO_BED_LEVELING_3POINT // Only AUTO_BED_LEVELING_BILINEAR is supported for DELTA bed leveling.
//#define AUTO_BED_LEVELING_LINEAR // Only AUTO_BED_LEVELING_BILINEAR is supported for DELTA bed leveling. //#define AUTO_BED_LEVELING_LINEAR // Only AUTO_BED_LEVELING_BILINEAR is supported for DELTA bed leveling.
#define AUTO_BED_LEVELING_BILINEAR // Only AUTO_BED_LEVELING_BILINEAR is supported for DELTA bed leveling. #define AUTO_BED_LEVELING_BILINEAR // Only AUTO_BED_LEVELING_BILINEAR is supported for DELTA bed leveling.
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -908,6 +892,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
//#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -928,12 +919,6 @@
//#define PROBE_Y_FIRST //#define PROBE_Y_FIRST
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
//#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -957,7 +942,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -231,6 +231,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -689,8 +690,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -827,35 +827,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -879,10 +853,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -891,6 +877,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
//#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -912,12 +905,6 @@
//#define PROBE_Y_FIRST //#define PROBE_Y_FIRST
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
//#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -941,7 +928,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -231,6 +231,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -692,8 +693,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -830,35 +830,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -882,10 +856,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -894,6 +880,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
//#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -916,11 +909,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -944,7 +932,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -235,6 +235,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -691,8 +692,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -829,35 +829,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -881,10 +855,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -893,6 +879,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
//#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -915,11 +908,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
//#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -943,7 +931,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -74,6 +74,13 @@
// example_configurations/delta directory. // example_configurations/delta directory.
// //
//===========================================================================
//============================= SCARA Printer ===============================
//===========================================================================
// For a Scara printer replace the configuration files with the files in the
// example_configurations/SCARA directory.
//
// @section info // @section info
// User-specified version info of this build to display in [Pronterface, etc] terminal window during // User-specified version info of this build to display in [Pronterface, etc] terminal window during
@ -224,6 +231,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -695,8 +703,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -833,35 +840,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -885,10 +866,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -897,6 +890,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
//#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -918,12 +918,6 @@
//#define PROBE_Y_FIRST //#define PROBE_Y_FIRST
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
//#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -947,7 +941,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -231,6 +231,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -606,8 +607,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -744,35 +744,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -796,10 +770,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -808,6 +794,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -828,11 +821,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -856,7 +844,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -231,6 +231,7 @@
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 66 : 4.7M High Temperature thermistor from Dyze Design * 66 : 4.7M High Temperature thermistor from Dyze Design
* 70 : the 100K thermistor found in the bq Hephestos 2 * 70 : the 100K thermistor found in the bq Hephestos 2
* 75 : 100k Generic Silicon Heat Pad typically a NTC 100K MGB18-104F39050L32 thermistor
* *
* 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
* (but gives greater accuracy and more stable PID) * (but gives greater accuracy and more stable PID)
@ -599,8 +600,7 @@
// //
// To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN. // To use a separate Z probe, your board must define a Z_MIN_PROBE_PIN.
// //
// For a servo-based Z probe, you must set up servo support below, including // For a servo-based Z probe, just set Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES above.
// NUM_SERVOS, Z_ENDSTOP_SERVO_NR and Z_SERVO_ANGLES.
// //
// - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin. // - RAMPS 1.3/1.4 boards may be able to use the 5V, GND, and Aux4->D32 pin.
// - Use 5V for powered (usu. inductive) sensors. // - Use 5V for powered (usu. inductive) sensors.
@ -737,35 +737,9 @@
#define FILAMENT_RUNOUT_SCRIPT "M600" #define FILAMENT_RUNOUT_SCRIPT "M600"
#endif #endif
//===========================================================================
//============================ Mesh Bed Leveling ============================
//===========================================================================
//#define MESH_BED_LEVELING // Enable mesh bed leveling.
#if ENABLED(MESH_BED_LEVELING)
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
#define MANUAL_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif // MESH_BED_LEVELING
//=========================================================================== //===========================================================================
//============================ Auto Bed Leveling ============================ //=============================== Bed Leveling ==============================
//=========================================================================== //===========================================================================
// @section bedlevel // @section bedlevel
@ -789,10 +763,22 @@
* Probe several points in a grid. * Probe several points in a grid.
* You specify the rectangle and the density of sample points. * You specify the rectangle and the density of sample points.
* The result is a mesh, best for large or uneven beds. * The result is a mesh, best for large or uneven beds.
*
* - UBL Unified Bed Leveling
* A comprehensive bed leveling system that combines features and benefits from previous
* bed leveling system. The UBL Bed Leveling System also includes an integrated and easy to use
* Mesh Generation, Mesh Validation and Mesh Editing system.
* - Currently, the UBL Bed Leveling System is only checked out for Cartesian Printers. But with
* that said, it was primarily designed to handle poor quality Delta Printers. If you feel
* adventurous and have a Delta, please post an issue if something doesn't work correctly.
* Initially, you will need to reduce your declared bed size so you have a rectangular area to
* test on.
*/ */
//#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR //#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_BILINEAR
//#define MESH_BED_LEVELING
//#define AUTO_BED_LEVELING_UBL
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
@ -801,6 +787,13 @@
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
#endif
#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Set the number of grid points per dimension. // Set the number of grid points per dimension.
@ -821,11 +814,6 @@
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// 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<height>
#define ENABLE_LEVELING_FADE_HEIGHT
// //
// Experimental Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
@ -849,7 +837,42 @@
#define ABL_PROBE_PT_3_X 170 #define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20 #define ABL_PROBE_PT_3_Y 20
#endif #elif ENABLED(MESH_BED_LEVELING)
//===========================================================================
//=================================== Mesh ==================================
//===========================================================================
#define MANUAL_PROBE_Z_RANGE 4 // Z after Home, bed somewhere below but above 0.0.
#define MESH_INSET 10 // Mesh inset margin on print area
#define MESH_NUM_X_POINTS 3 // Don't use more than 7 points per axis, implementation limited.
#define MESH_NUM_Y_POINTS 3
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest at origin [0,0,0]
//#define MANUAL_BED_LEVELING // Add display menu option for bed leveling.
#if ENABLED(MANUAL_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
#endif // MANUAL_BED_LEVELING
#elif ENABLED(AUTO_BED_LEVELING_UBL)
//===========================================================================
//========================= Unified Bed Leveling ============================
//===========================================================================
#define UBL_MESH_INSET 1 // Mesh inset margin on print area
#define UBL_MESH_NUM_X_POINTS 10 // Don't use more than 15 points per axis, implementation limited.
#define UBL_MESH_NUM_Y_POINTS 10
#define UBL_PROBE_PT_1_X 39 // These set the probe locations for when UBL does a 3-Point leveling
#define UBL_PROBE_PT_1_Y 180 // of the mesh.
#define UBL_PROBE_PT_2_X 39
#define UBL_PROBE_PT_2_Y 20
#define UBL_PROBE_PT_3_X 180
#define UBL_PROBE_PT_3_Y 20
#endif // BED_LEVELING
/** /**
* Commands to execute at the end of G29 probing. * Commands to execute at the end of G29 probing.

@ -0,0 +1,47 @@
/**
* Marlin 3D Printer Firmware
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "Marlin.h"
#if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(M100_FREE_MEMORY_WATCHER)
#include "hex_print_routines.h"
void prt_hex_nibble(uint8_t n) {
if (n <= 9)
SERIAL_ECHO(n);
else
SERIAL_ECHO((char)('A' + n - 10));
delay(3);
}
void prt_hex_byte(uint8_t b) {
prt_hex_nibble((b & 0xF0) >> 4);
prt_hex_nibble(b & 0x0F);
}
void prt_hex_word(uint16_t w) {
prt_hex_byte((w & 0xFF00) >> 8);
prt_hex_byte(w & 0x0FF);
}
#endif // AUTO_BED_LEVELING_UBL || M100_FREE_MEMORY_WATCHER

@ -0,0 +1,33 @@
/**
* Marlin 3D Printer Firmware
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef HEX_PRINT_ROUTINES_H
#define HEX_PRINT_ROUTINES_H
//
// 3 support routines to print hex numbers. We can print a nibble, byte and word
//
void prt_hex_nibble(uint8_t n);
void prt_hex_byte(uint8_t b);
void prt_hex_word(uint16_t w);
#endif // HEX_PRINT_ROUTINES_H

@ -120,7 +120,7 @@ void PrintCounter::showStats() {
#if ENABLED(DEBUG_PRINTCOUNTER) #if ENABLED(DEBUG_PRINTCOUNTER)
SERIAL_ECHOPGM(" ("); SERIAL_ECHOPGM(" (");
SERIAL_ECHO(this->data.printTime); SERIAL_ECHO(this->data.printTime);
SERIAL_ECHOPGM(")"); SERIAL_CHAR(')');
#endif #endif
elapsed = this->data.longestPrint; elapsed = this->data.longestPrint;
@ -132,7 +132,7 @@ void PrintCounter::showStats() {
#if ENABLED(DEBUG_PRINTCOUNTER) #if ENABLED(DEBUG_PRINTCOUNTER)
SERIAL_ECHOPGM(" ("); SERIAL_ECHOPGM(" (");
SERIAL_ECHO(this->data.longestPrint); SERIAL_ECHO(this->data.longestPrint);
SERIAL_ECHOPGM(")"); SERIAL_CHAR(')');
#endif #endif
SERIAL_EOL; SERIAL_EOL;

@ -24,6 +24,8 @@
* temperature.cpp - temperature control * temperature.cpp - temperature control
*/ */
#include "Marlin.h" #include "Marlin.h"
#include "ultralcd.h" #include "ultralcd.h"
#include "temperature.h" #include "temperature.h"
@ -666,6 +668,17 @@ float Temperature::get_pid_output(int e) {
* - Apply filament width to the extrusion rate (may move) * - Apply filament width to the extrusion rate (may move)
* - Update the heated bed PID output value * - Update the heated bed PID output value
*/ */
/**
* The following line SOMETIMES results in the dreaded "unable to find a register to spill in class 'POINTER_REGS'"
* compile error.
* thermal_runaway_protection(&thermal_runaway_state_machine[e], &thermal_runaway_timer[e], current_temperature[e], target_temperature[e], e, THERMAL_PROTECTION_PERIOD, THERMAL_PROTECTION_HYSTERESIS);
*
* This is due to a bug in the C++ compiler used by the Arduino IDE from 1.6.10 to at least 1.8.1.
*
* The work around is to add the compiler flag "__attribute__((__optimize__("O2")))" to the declaration for manage_heater()
*/
//void Temperature::manage_heater() __attribute__((__optimize__("O2")));
void Temperature::manage_heater() { void Temperature::manage_heater() {
if (!temp_meas_ready) return; if (!temp_meas_ready) return;

@ -241,7 +241,8 @@ class Temperature {
/** /**
* Call periodically to manage heaters * Call periodically to manage heaters
*/ */
static void manage_heater(); //static void manage_heater(); // changed to address compiler error
static void manage_heater() __attribute__((__optimize__("O2")));
/** /**
* Preheating hotends * Preheating hotends

@ -65,6 +65,8 @@
#define THERMISTOR_NAME "Makers Tool" #define THERMISTOR_NAME "Makers Tool"
#elif THERMISTOR_ID == 70 #elif THERMISTOR_ID == 70
#define THERMISTOR_NAME "Hephestos 2" #define THERMISTOR_NAME "Hephestos 2"
#elif THERMISTOR_ID == 75
#define THERMISTOR_NAME "MGB18"
// Modified thermistors // Modified thermistors
#elif THERMISTOR_ID == 51 #elif THERMISTOR_ID == 51

@ -0,0 +1,69 @@
/**
* Marlin 3D Printer Firmware
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
// Generic Silicon Heat Pad with NTC 100K thermistor ( Beta 25/50 3950K)
//
// Many of the generic silicon heat pads use the MGB18-104F39050L32 Thermistor It is used for various
// wattage and voltage heat pads. This table is correct if this part is used. It has been
// optimized to provide good granularity around the 60 C. and 110 C. which corrisponds to bed temperatures
// for PLA and ABS. If you are printing higher temperature filament such as nylon you can uncomment
// the higher earlier entries in the table to give better accuracy. But for speed reasons, if these
// temperatures are not going to be used, it is better to leave them commented out.
const short temptable_75[][2] PROGMEM = { // Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor
{ (short) ( 111.06 * OVERSAMPLENR ), 200 }, // v=0.542 r=571.747 res=0.501 degC/count
// { (short) ( 174.87 * OVERSAMPLENR ), 175 }, // v=0.854 r=967.950 res=0.311 degC/count These values are valid. But they serve no
// { (short) ( 191.64 * OVERSAMPLENR ), 170 }, // v=0.936 r=1082.139 res=0.284 degC/count purpose. It is better to delete them so
// { (short) ( 209.99 * OVERSAMPLENR ), 165 }, // v=1.025 r=1212.472 res=0.260 degC/count the search is quicker and get to the meaningful
// { (short) ( 230.02 * OVERSAMPLENR ), 160 }, // v=1.123 r=1361.590 res=0.239 degC/count part of the table sooner.
// { (short) ( 251.80 * OVERSAMPLENR ), 155 }, // v=1.230 r=1532.621 res=0.220 degC/count
{ (short) ( 275.43 * OVERSAMPLENR ), 150 }, // v=1.345 r=1729.283 res=0.203 degC/count
// { (short) ( 300.92 * OVERSAMPLENR ), 145 }, // v=1.469 r=1956.004 res=0.189 degC/coun
{ (short) ( 328.32 * OVERSAMPLENR ), 140 }, // v=1.603 r=2218.081 res=0.176 degC/count
{ (short) ( 388.65 * OVERSAMPLENR ), 130 }, // v=1.898 r=2874.980 res=0.156 degC/count
{ (short) ( 421.39 * OVERSAMPLENR ), 125 }, // v=2.058 r=3286.644 res=0.149 degC/count
{ (short) ( 455.65 * OVERSAMPLENR ), 120 }, // v=2.225 r=3768.002 res=0.143 degC/count
{ (short) ( 491.17 * OVERSAMPLENR ), 115 }, // v=2.398 r=4332.590 res=0.139 degC/count
{ (short) ( 527.68 * OVERSAMPLENR ), 110 }, // v=2.577 r=4996.905 res=0.136 degC/count
{ (short) ( 564.81 * OVERSAMPLENR ), 105 }, // v=2.758 r=5781.120 res=0.134 degC/count
{ (short) ( 602.19 * OVERSAMPLENR ), 100 }, // v=2.940 r=6710.000 res=0.134 degC/count
{ (short) ( 676.03 * OVERSAMPLENR ), 90 }, // v=3.301 r=9131.018 res=0.138 degC/count
{ (short) ( 745.85 * OVERSAMPLENR ), 80 }, // v=3.642 r=12602.693 res=0.150 degC/count
{ (short) ( 778.31 * OVERSAMPLENR ), 75 }, // v=3.800 r=14889.001 res=0.159 degC/count
{ (short) ( 808.75 * OVERSAMPLENR ), 70 }, // v=3.949 r=17658.700 res=0.171 degC/count
{ (short) ( 836.94 * OVERSAMPLENR ), 65 }, // v=4.087 r=21028.040 res=0.185 degC/count
{ (short) ( 862.74 * OVERSAMPLENR ), 60 }, // v=4.213 r=25144.568 res=0.204 degC/count
{ (short) ( 886.08 * OVERSAMPLENR ), 55 }, // v=4.327 r=30196.449 res=0.227 degC/count
{ (short) ( 906.97 * OVERSAMPLENR ), 50 }, // v=4.429 r=36424.838 res=0.255 degC/count
{ (short) ( 941.65 * OVERSAMPLENR ), 40 }, // v=4.598 r=53745.337 res=0.333 degC/count
{ (short) ( 967.76 * OVERSAMPLENR ), 30 }, // v=4.725 r=80880.630 res=0.452 degC/count
{ (short) ( 978.03 * OVERSAMPLENR ), 25 }, // v=4.776 r=100000.000 res=0.535 degC/count
{ (short) ( 981.68 * OVERSAMPLENR ), 23 }, // v=4.793 r=109024.395 res=0.573 degC/count
{ (short) ( 983.41 * OVERSAMPLENR ), 22 }, // v=4.802 r=113875.430 res=0.594 degC/count
{ (short) ( 985.08 * OVERSAMPLENR ), 21 }, // v=4.810 r=118968.955 res=0.616 degC/count
{ (short) ( 986.70 * OVERSAMPLENR ), 20 }, // v=4.818 r=124318.354 res=0.638 degC/count
{ (short) ( 993.94 * OVERSAMPLENR ), 15 }, // v=4.853 r=155431.302 res=0.768 degC/count
{ (short) ( 999.96 * OVERSAMPLENR ), 10 }, // v=4.883 r=195480.023 res=0.934 degC/count
{ (short) (1008.95 * OVERSAMPLENR ), 0 } // v=4.926 r=314997.575 res=1.418 degC/count
};

@ -103,6 +103,9 @@
#if ANY_THERMISTOR_IS(70) // bqh2 stock thermistor #if ANY_THERMISTOR_IS(70) // bqh2 stock thermistor
#include "thermistortable_70.h" #include "thermistortable_70.h"
#endif #endif
#if ANY_THERMISTOR_IS(75) // Many of the generic silicon heat pads use the MGB18-104F39050L32 Thermistor
#include "thermistortable_75.h"
#endif
#if ANY_THERMISTOR_IS(110) // Pt100 with 1k0 pullup #if ANY_THERMISTOR_IS(110) // Pt100 with 1k0 pullup
#include "thermistortable_110.h" #include "thermistortable_110.h"
#endif #endif

@ -30,6 +30,8 @@
#include "configuration_store.h" #include "configuration_store.h"
#include "utility.h" #include "utility.h"
extern float zprobe_zoffset;
#if HAS_BUZZER && DISABLED(LCD_USE_I2C_BUZZER) #if HAS_BUZZER && DISABLED(LCD_USE_I2C_BUZZER)
#include "buzzer.h" #include "buzzer.h"
#endif #endif
@ -121,6 +123,11 @@ uint16_t max_display_update_time = 0;
bool encoderRateMultiplierEnabled; bool encoderRateMultiplierEnabled;
int32_t lastEncoderMovementMillis; int32_t lastEncoderMovementMillis;
#if ENABLED(AUTO_BED_LEVELING_UBL)
extern int UBL_has_control_of_LCD_Panel;
extern int G29_encoderDiff;
#endif
#if HAS_POWER_SWITCH #if HAS_POWER_SWITCH
extern bool powersupply; extern bool powersupply;
#endif #endif
@ -801,6 +808,89 @@ void kill_screen(const char* lcd_msg) {
#endif //BABYSTEPPING #endif //BABYSTEPPING
#if ENABLED(AUTO_BED_LEVELING_UBL)
float Mesh_Edit_Value, Mesh_Edit_Accumulator; // We round Mesh_Edit_Value to 2.5 decimal places. So we keep a
// seperate value that doesn't lose precision.
static int loop_cnt=0, last_seen_bits;
static void _lcd_mesh_fine_tune( const char* msg) {
static unsigned long last_click=0;
int last_digit, movement;
long int rounded;
defer_return_to_status = true;
if (encoderPosition) { // If moving the Encoder wheel very slowly, we just go
if ( (millis() - last_click) > 500L) { // up or down by 1 position
if ( ((int32_t)encoderPosition) > 0 ) {
encoderPosition = 1;
}
else {
encoderPosition = (uint32_t) -1;
}
}
last_click = millis();
Mesh_Edit_Accumulator += ( (float) ((int32_t)encoderPosition)) * .005 / 2.0 ;
Mesh_Edit_Value = Mesh_Edit_Accumulator;
encoderPosition = 0;
lcdDrawUpdate = LCDVIEW_REDRAW_NOW;
rounded = (long int) (Mesh_Edit_Value * 1000.0);
last_digit = rounded % 5L; //10L;
rounded = rounded - last_digit;
last_digit = rounded % 5L; //10L;
Mesh_Edit_Value = ((float) rounded) / 1000.0;
}
if (lcdDrawUpdate) {
lcd_implementation_drawedit(msg, ftostr43sign( (float) Mesh_Edit_Value ));
}
if ( !UBL_has_control_of_LCD_Panel && LCD_CLICKED ) {
UBL_has_control_of_LCD_Panel=1; // We need to lock the normal LCD Panel System outbecause G29 (and G26) are looking for
lcd_return_to_status(); // long presses of the Encoder Wheel and the LCD System goes spastic when that happens.
// We will give back control from those routines when the switch is debounced.
}
}
void _lcd_mesh_edit() {
_lcd_mesh_fine_tune( PSTR("Mesh Editor: "));
}
float lcd_mesh_edit() {
lcd_goto_screen(_lcd_mesh_edit);
return Mesh_Edit_Value;
}
void lcd_mesh_edit_setup(float inital) {
Mesh_Edit_Value = inital;
Mesh_Edit_Accumulator = inital;
lcd_goto_screen(_lcd_mesh_edit);
return ;
}
void _lcd_z_offset_edit() {
_lcd_mesh_fine_tune( PSTR("Z-Offset: "));
}
float lcd_z_offset_edit() {
lcd_goto_screen(_lcd_z_offset_edit);
return Mesh_Edit_Value;
}
void lcd_z_offset_edit_setup(float inital) {
Mesh_Edit_Value = inital;
Mesh_Edit_Accumulator = inital;
lcd_goto_screen(_lcd_z_offset_edit);
return ;
}
#endif // AUTO_BED_LEVELING_UBL
/** /**
* Watch temperature callbacks * Watch temperature callbacks
*/ */
@ -1307,7 +1397,11 @@ KeepDrawing:
void _lcd_level_bed_moving() { void _lcd_level_bed_moving() {
if (lcdDrawUpdate) { if (lcdDrawUpdate) {
char msg[10]; char msg[10];
sprintf_P(msg, PSTR("%i / %u"), (int)(manual_probe_index + 1), (MESH_NUM_X_POINTS) * (MESH_NUM_Y_POINTS)); #if ENABLED(MESH_BED_LEVELING)
sprintf_P(msg, PSTR("%i / %u"), (int)(manual_probe_index + 1), (MESH_NUM_X_POINTS) * (MESH_NUM_Y_POINTS));
#elif ENABLED(AUTO_BED_LEVELING_UBL)
sprintf_P(msg, PSTR("%i / %u"), (int)(manual_probe_index + 1), (UBL_MESH_NUM_X_POINTS) * (UBL_MESH_NUM_Y_POINTS));
#endif
lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_NEXT_POINT), msg); lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_NEXT_POINT), msg);
} }
@ -3110,8 +3204,14 @@ void lcd_update() {
lcd_buttons_update(); lcd_buttons_update();
#if ENABLED(AUTO_BED_LEVELING_UBL)
const bool UBL_CONDITION = !UBL_has_control_of_LCD_Panel;
#else
constexpr bool UBL_CONDITION = true;
#endif
// If the action button is pressed... // If the action button is pressed...
if (LCD_CLICKED) { if (UBL_CONDITION && LCD_CLICKED) {
if (!wait_for_unclick) { // If not waiting for a debounce release: if (!wait_for_unclick) { // If not waiting for a debounce release:
wait_for_unclick = true; // Set debounce flag to ignore continous clicks wait_for_unclick = true; // Set debounce flag to ignore continous clicks
lcd_clicked = !wait_for_user; // Keep the click if not waiting for a user-click lcd_clicked = !wait_for_user; // Keep the click if not waiting for a user-click
@ -3520,8 +3620,15 @@ void lcd_reset_alert_level() { lcd_status_message_level = 0; }
case encrot2: ENCODER_SPIN(encrot1, encrot3); break; case encrot2: ENCODER_SPIN(encrot1, encrot3); break;
case encrot3: ENCODER_SPIN(encrot2, encrot0); break; case encrot3: ENCODER_SPIN(encrot2, encrot0); break;
} }
#if ENABLED(AUTO_BED_LEVELING_UBL)
if (UBL_has_control_of_LCD_Panel) {
G29_encoderDiff = encoderDiff; // Make the encoder's rotation available to G29's Mesh Editor
encoderDiff = 0; // We are going to lie to the LCD Panel and claim the encoder
// wheel has not turned.
}
#endif
lastEncoderBits = enc;
} }
lastEncoderBits = enc;
} }
#if (ENABLED(LCD_I2C_TYPE_MCP23017) || ENABLED(LCD_I2C_TYPE_MCP23008)) && ENABLED(DETECT_DEVICE) #if (ENABLED(LCD_I2C_TYPE_MCP23017) || ENABLED(LCD_I2C_TYPE_MCP23008)) && ENABLED(DETECT_DEVICE)
@ -3530,6 +3637,19 @@ void lcd_reset_alert_level() { lcd_status_message_level = 0; }
bool lcd_detected() { return true; } bool lcd_detected() { return true; }
#endif #endif
#if ENABLED(AUTO_BED_LEVELING_UBL)
void chirp_at_user() {
#if ENABLED(LCD_USE_I2C_BUZZER)
lcd.buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS, LCD_FEEDBACK_FREQUENCY_HZ);
#elif PIN_EXISTS(BEEPER)
buzzer.tone(LCD_FEEDBACK_FREQUENCY_DURATION_MS, LCD_FEEDBACK_FREQUENCY_HZ);
#endif
}
bool G29_lcd_clicked() { return LCD_CLICKED; }
#endif
#endif // ULTIPANEL #endif // ULTIPANEL
#endif // ULTRA_LCD #endif // ULTRA_LCD

@ -320,7 +320,7 @@ void lcd_kill_screen() {
lcd_printPGM(PSTR(MSG_PLEASE_RESET)); lcd_printPGM(PSTR(MSG_PLEASE_RESET));
} }
static void lcd_implementation_clear() { } // Automatically cleared by Picture Loop void lcd_implementation_clear() { } // Automatically cleared by Picture Loop
// //
// Status Screen // Status Screen

@ -378,7 +378,7 @@ static void lcd_implementation_init(
lcd.clear(); lcd.clear();
} }
static void lcd_implementation_clear() { lcd.clear(); } void lcd_implementation_clear() { lcd.clear(); }
/* Arduino < 1.0.0 is missing a function to print PROGMEM strings, so we need to implement our own */ /* Arduino < 1.0.0 is missing a function to print PROGMEM strings, so we need to implement our own */
void lcd_printPGM(const char *str) { void lcd_printPGM(const char *str) {

Loading…
Cancel
Save