Blog 2022/9/26
<- previous | index | next ->
The Marlin 3D printer firmware project has support for setting travel limits:
// The size of the printable area
#define X_BED_SIZE 235
#define Y_BED_SIZE 235
// Travel limits (linear=mm, rotational=°) after homing, corresponding to endstop positions.
#define X_MIN_POS 0
#define Y_MIN_POS 0
#define Z_MIN_POS 0
#define X_MAX_POS X_BED_SIZE
#define Y_MAX_POS Y_BED_SIZE
#define Z_MAX_POS 250
I tried to use these to create "keepout" areas (i.e. to avoid hitting the binder clips at the edges of my printer bed) but I found it difficult to understand how to use them properly, and kept triggering compiler errors:
In file included from Marlin/src/HAL/AVR/../../inc/MarlinConfig.h:49:0,
from Marlin/src/HAL/AVR/HAL.cpp:24:
Marlin/src/HAL/AVR/../../inc/SanityCheck.h:819:1: error: static assertion failed: Movement bounds (Y_MIN_POS, Y_MAX_POS) are too narrow to contain Y_BED_SIZE.
static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS) are too narrow to contain Y_BED_SIZE.");
After taking the time to understand these errors, I came up with the following constants and formulas which are easier (for me) to understand.
// @section geometry
// "EZOFF" bed geometry (offsets + keepouts).
// Note: Tell your slicer to use a bed size with all of your keepouts subtracted.
// For example, with a physical bed size of 235x235 and keepouts of (5,5,25,10),
// use a bed size 225x200 in your slicer to keep your prints centered.
#define EZOFF_X_PHYSICAL_BED_SIZE 235
#define EZOFF_Y_PHYSICAL_BED_SIZE 235
#define EZOFF_X_CENTER_OFFSET 0
#define EZOFF_Y_CENTER_OFFSET 0
#define EZOFF_X_LEFT_KEEPOUT 5
#define EZOFF_X_RIGHT_KEEPOUT 5
#define EZOFF_Y_FRONT_KEEPOUT 25
#define EZOFF_Y_REAR_KEEPOUT 10
// Don't edit these formulas:
#define X_MIN_POS (0 - EZOFF_X_CENTER_OFFSET - EZOFF_X_LEFT_KEEPOUT)
#define X_MAX_POS (EZOFF_X_PHYSICAL_BED_SIZE - EZOFF_X_LEFT_KEEPOUT - EZOFF_X_RIGHT_KEEPOUT - EZOFF_X_CENTER_OFFSET)
#define X_BED_SIZE (X_MAX_POS - X_MIN_POS)
#define Y_MIN_POS (0 - EZOFF_Y_CENTER_OFFSET - EZOFF_Y_FRONT_KEEPOUT)
#define Y_MAX_POS (EZOFF_Y_PHYSICAL_BED_SIZE - EZOFF_Y_FRONT_KEEPOUT - EZOFF_Y_REAR_KEEPOUT - EZOFF_Y_CENTER_OFFSET)
#define Y_BED_SIZE (Y_MAX_POS - Y_MIN_POS)
Enjoy!