mirror of
https://github.com/bdring/Grbl_Esp32.git
synced 2025-08-30 09:39:49 +02:00
Fixes to homing (#706)
* Fixes to homing * Update Grbl.h * Clean up after code review.
This commit is contained in:
@@ -51,9 +51,15 @@ float three_axis_dist(float* point1, float* point2);
|
|||||||
|
|
||||||
void machine_init() {
|
void machine_init() {
|
||||||
// print a startup message to show the kinematics are enable
|
// print a startup message to show the kinematics are enable
|
||||||
|
|
||||||
|
#ifdef MIDTBOT
|
||||||
|
grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "CoreXY (midTbot) Kinematics Init");
|
||||||
|
#else
|
||||||
grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "CoreXY Kinematics Init");
|
grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "CoreXY Kinematics Init");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cycle mask is 0 unless the user sends a single axis command like $HZ
|
||||||
// This will always return true to prevent the normal Grbl homing cycle
|
// This will always return true to prevent the normal Grbl homing cycle
|
||||||
bool user_defined_homing(uint8_t cycle_mask) {
|
bool user_defined_homing(uint8_t cycle_mask) {
|
||||||
uint8_t n_cycle; // each home is a multi cycle operation approach, pulloff, approach.....
|
uint8_t n_cycle; // each home is a multi cycle operation approach, pulloff, approach.....
|
||||||
@@ -61,12 +67,6 @@ bool user_defined_homing(uint8_t cycle_mask) {
|
|||||||
float max_travel;
|
float max_travel;
|
||||||
uint8_t axis;
|
uint8_t axis;
|
||||||
|
|
||||||
// check for single axis homing
|
|
||||||
if (cycle_mask != 0) {
|
|
||||||
grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "CoreXY Single axis homing not allowed. Use $H only");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check for multi axis homing per cycle ($Homing/Cycle0=XY type)...not allowed in CoreXY
|
// check for multi axis homing per cycle ($Homing/Cycle0=XY type)...not allowed in CoreXY
|
||||||
bool setting_error = false;
|
bool setting_error = false;
|
||||||
for (int cycle = 0; cycle < 3; cycle++) {
|
for (int cycle = 0; cycle < 3; cycle++) {
|
||||||
@@ -90,9 +90,21 @@ bool user_defined_homing(uint8_t cycle_mask) {
|
|||||||
pl_data->motion.systemMotion = 1;
|
pl_data->motion.systemMotion = 1;
|
||||||
pl_data->motion.noFeedOverride = 1;
|
pl_data->motion.noFeedOverride = 1;
|
||||||
|
|
||||||
for (int cycle = 0; cycle < 3; cycle++) {
|
uint8_t cycle_count = (cycle_mask == 0) ? 3 : 1; // if we have a cycle_mask, we are only going to do one axis
|
||||||
AxisMask mask = homing_cycle[cycle]->get();
|
|
||||||
|
AxisMask mask = 0;
|
||||||
|
for (int cycle = 0; cycle < cycle_count; cycle++) {
|
||||||
|
// if we have a cycle_mask, do that. Otherwise get the cycle from the settings
|
||||||
|
mask = cycle_mask ? cycle_mask : homing_cycle[cycle]->get();
|
||||||
|
|
||||||
|
// If not X or Y do a normal home
|
||||||
|
if (!(bitnum_istrue(mask, X_AXIS) || bitnum_istrue(mask, Y_AXIS))) {
|
||||||
|
limits_go_home(mask); // Homing cycle 0
|
||||||
|
continue; // continue to next item in for loop
|
||||||
|
}
|
||||||
|
|
||||||
mask = motors_set_homing_mode(mask, true); // non standard homing motors will do their own thing and get removed from the mask
|
mask = motors_set_homing_mode(mask, true); // non standard homing motors will do their own thing and get removed from the mask
|
||||||
|
|
||||||
for (uint8_t axis = X_AXIS; axis <= Z_AXIS; axis++) {
|
for (uint8_t axis = X_AXIS; axis <= Z_AXIS; axis++) {
|
||||||
if (bit(axis) == mask) {
|
if (bit(axis) == mask) {
|
||||||
// setup for the homing of this axis
|
// setup for the homing of this axis
|
||||||
@@ -190,7 +202,7 @@ bool user_defined_homing(uint8_t cycle_mask) {
|
|||||||
} while (n_cycle-- > 0);
|
} while (n_cycle-- > 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} // for
|
||||||
|
|
||||||
// after sussefully setting X & Y axes, we set the current positions
|
// after sussefully setting X & Y axes, we set the current positions
|
||||||
|
|
||||||
@@ -231,7 +243,7 @@ void inverse_kinematics(float* position) {
|
|||||||
|
|
||||||
motors[X_AXIS] = geometry_factor * position[X_AXIS] + position[Y_AXIS];
|
motors[X_AXIS] = geometry_factor * position[X_AXIS] + position[Y_AXIS];
|
||||||
motors[Y_AXIS] = geometry_factor * position[X_AXIS] - position[Y_AXIS];
|
motors[Y_AXIS] = geometry_factor * position[X_AXIS] - position[Y_AXIS];
|
||||||
motors[Z_AXIS] = position[Z_AXIS];
|
motors[Z_AXIS] = position[Z_AXIS];
|
||||||
|
|
||||||
position[0] = motors[0];
|
position[0] = motors[0];
|
||||||
position[1] = motors[1];
|
position[1] = motors[1];
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
// Grbl versioning system
|
// Grbl versioning system
|
||||||
|
|
||||||
const char* const GRBL_VERSION = "1.3a";
|
const char* const GRBL_VERSION = "1.3a";
|
||||||
const char* const GRBL_VERSION_BUILD = "20201207";
|
const char* const GRBL_VERSION_BUILD = "20201212";
|
||||||
|
|
||||||
//#include <sdkconfig.h>
|
//#include <sdkconfig.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
@@ -44,10 +44,14 @@ namespace Motors {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void StandardStepper::init() {
|
void StandardStepper::init() {
|
||||||
init_step_dir_pins();
|
read_settings();
|
||||||
config_message();
|
config_message();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StandardStepper::read_settings() {
|
||||||
|
init_step_dir_pins();
|
||||||
|
}
|
||||||
|
|
||||||
void StandardStepper::init_step_dir_pins() {
|
void StandardStepper::init_step_dir_pins() {
|
||||||
_invert_step_pin = bitnum_istrue(step_invert_mask->get(), _axis_index);
|
_invert_step_pin = bitnum_istrue(step_invert_mask->get(), _axis_index);
|
||||||
_invert_dir_pin = bitnum_istrue(dir_invert_mask->get(), _axis_index);
|
_invert_dir_pin = bitnum_istrue(dir_invert_mask->get(), _axis_index);
|
||||||
|
@@ -15,6 +15,7 @@ namespace Motors {
|
|||||||
void set_direction(bool) override;
|
void set_direction(bool) override;
|
||||||
void step() override;
|
void step() override;
|
||||||
void unstep() override;
|
void unstep() override;
|
||||||
|
void read_settings() override;
|
||||||
|
|
||||||
void init_step_dir_pins();
|
void init_step_dir_pins();
|
||||||
|
|
||||||
|
@@ -67,8 +67,7 @@ namespace Motors {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_has_errors = false;
|
_has_errors = false;
|
||||||
init_step_dir_pins(); // from StandardStepper
|
|
||||||
|
|
||||||
digitalWrite(_cs_pin, HIGH);
|
digitalWrite(_cs_pin, HIGH);
|
||||||
pinMode(_cs_pin, OUTPUT);
|
pinMode(_cs_pin, OUTPUT);
|
||||||
@@ -211,6 +210,8 @@ namespace Motors {
|
|||||||
}
|
}
|
||||||
tmcstepper->microsteps(axis_settings[_axis_index]->microsteps->get());
|
tmcstepper->microsteps(axis_settings[_axis_index]->microsteps->get());
|
||||||
tmcstepper->rms_current(run_i_ma, hold_i_percent);
|
tmcstepper->rms_current(run_i_ma, hold_i_percent);
|
||||||
|
|
||||||
|
init_step_dir_pins();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TrinamicDriver::set_homing_mode(bool isHoming) {
|
bool TrinamicDriver::set_homing_mode(bool isHoming) {
|
||||||
|
@@ -179,7 +179,7 @@ static bool checkStartupLine(char* value) {
|
|||||||
return gc_execute_line(value, CLIENT_SERIAL) == Error::Ok;
|
return gc_execute_line(value, CLIENT_SERIAL) == Error::Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool postTMC(char* value) {
|
static bool postMotorSetting(char* value) {
|
||||||
if (!value) {
|
if (!value) {
|
||||||
motors_read_settings();
|
motors_read_settings();
|
||||||
}
|
}
|
||||||
@@ -258,28 +258,28 @@ void make_settings() {
|
|||||||
for (axis = MAX_N_AXIS - 1; axis >= 0; axis--) {
|
for (axis = MAX_N_AXIS - 1; axis >= 0; axis--) {
|
||||||
def = &axis_defaults[axis];
|
def = &axis_defaults[axis];
|
||||||
auto setting =
|
auto setting =
|
||||||
new IntSetting(EXTENDED, WG, makeGrblName(axis, 170), makename(def->name, "StallGuard"), def->stallguard, -64, 63, postTMC);
|
new IntSetting(EXTENDED, WG, makeGrblName(axis, 170), makename(def->name, "StallGuard"), def->stallguard, -64, 63, postMotorSetting);
|
||||||
setting->setAxis(axis);
|
setting->setAxis(axis);
|
||||||
axis_settings[axis]->stallguard = setting;
|
axis_settings[axis]->stallguard = setting;
|
||||||
}
|
}
|
||||||
for (axis = MAX_N_AXIS - 1; axis >= 0; axis--) {
|
for (axis = MAX_N_AXIS - 1; axis >= 0; axis--) {
|
||||||
def = &axis_defaults[axis];
|
def = &axis_defaults[axis];
|
||||||
auto setting =
|
auto setting =
|
||||||
new IntSetting(EXTENDED, WG, makeGrblName(axis, 160), makename(def->name, "Microsteps"), def->microsteps, 0, 256, postTMC);
|
new IntSetting(EXTENDED, WG, makeGrblName(axis, 160), makename(def->name, "Microsteps"), def->microsteps, 0, 256, postMotorSetting);
|
||||||
setting->setAxis(axis);
|
setting->setAxis(axis);
|
||||||
axis_settings[axis]->microsteps = setting;
|
axis_settings[axis]->microsteps = setting;
|
||||||
}
|
}
|
||||||
for (axis = MAX_N_AXIS - 1; axis >= 0; axis--) {
|
for (axis = MAX_N_AXIS - 1; axis >= 0; axis--) {
|
||||||
def = &axis_defaults[axis];
|
def = &axis_defaults[axis];
|
||||||
auto setting = new FloatSetting(
|
auto setting = new FloatSetting(
|
||||||
EXTENDED, WG, makeGrblName(axis, 150), makename(def->name, "Current/Hold"), def->hold_current, 0.05, 20.0, postTMC); // Amps
|
EXTENDED, WG, makeGrblName(axis, 150), makename(def->name, "Current/Hold"), def->hold_current, 0.05, 20.0, postMotorSetting); // Amps
|
||||||
setting->setAxis(axis);
|
setting->setAxis(axis);
|
||||||
axis_settings[axis]->hold_current = setting;
|
axis_settings[axis]->hold_current = setting;
|
||||||
}
|
}
|
||||||
for (axis = MAX_N_AXIS - 1; axis >= 0; axis--) {
|
for (axis = MAX_N_AXIS - 1; axis >= 0; axis--) {
|
||||||
def = &axis_defaults[axis];
|
def = &axis_defaults[axis];
|
||||||
auto setting = new FloatSetting(
|
auto setting = new FloatSetting(
|
||||||
EXTENDED, WG, makeGrblName(axis, 140), makename(def->name, "Current/Run"), def->run_current, 0.0, 20.0, postTMC); // Amps
|
EXTENDED, WG, makeGrblName(axis, 140), makename(def->name, "Current/Run"), def->run_current, 0.0, 20.0, postMotorSetting); // Amps
|
||||||
setting->setAxis(axis);
|
setting->setAxis(axis);
|
||||||
axis_settings[axis]->run_current = setting;
|
axis_settings[axis]->run_current = setting;
|
||||||
}
|
}
|
||||||
@@ -377,12 +377,12 @@ void make_settings() {
|
|||||||
probe_invert = new FlagSetting(GRBL, WG, "6", "Probe/Invert", DEFAULT_INVERT_PROBE_PIN);
|
probe_invert = new FlagSetting(GRBL, WG, "6", "Probe/Invert", DEFAULT_INVERT_PROBE_PIN);
|
||||||
limit_invert = new FlagSetting(GRBL, WG, "5", "Limits/Invert", DEFAULT_INVERT_LIMIT_PINS);
|
limit_invert = new FlagSetting(GRBL, WG, "5", "Limits/Invert", DEFAULT_INVERT_LIMIT_PINS);
|
||||||
step_enable_invert = new FlagSetting(GRBL, WG, "4", "Stepper/EnableInvert", DEFAULT_INVERT_ST_ENABLE);
|
step_enable_invert = new FlagSetting(GRBL, WG, "4", "Stepper/EnableInvert", DEFAULT_INVERT_ST_ENABLE);
|
||||||
dir_invert_mask = new AxisMaskSetting(GRBL, WG, "3", "Stepper/DirInvert", DEFAULT_DIRECTION_INVERT_MASK);
|
dir_invert_mask = new AxisMaskSetting(GRBL, WG, "3", "Stepper/DirInvert", DEFAULT_DIRECTION_INVERT_MASK, postMotorSetting);
|
||||||
step_invert_mask = new AxisMaskSetting(GRBL, WG, "2", "Stepper/StepInvert", DEFAULT_STEPPING_INVERT_MASK);
|
step_invert_mask = new AxisMaskSetting(GRBL, WG, "2", "Stepper/StepInvert", DEFAULT_STEPPING_INVERT_MASK, postMotorSetting);
|
||||||
stepper_idle_lock_time = new IntSetting(GRBL, WG, "1", "Stepper/IdleTime", DEFAULT_STEPPER_IDLE_LOCK_TIME, 0, 255);
|
stepper_idle_lock_time = new IntSetting(GRBL, WG, "1", "Stepper/IdleTime", DEFAULT_STEPPER_IDLE_LOCK_TIME, 0, 255);
|
||||||
pulse_microseconds = new IntSetting(GRBL, WG, "0", "Stepper/Pulse", DEFAULT_STEP_PULSE_MICROSECONDS, 3, 1000);
|
pulse_microseconds = new IntSetting(GRBL, WG, "0", "Stepper/Pulse", DEFAULT_STEP_PULSE_MICROSECONDS, 3, 1000);
|
||||||
|
|
||||||
stallguard_debug_mask = new AxisMaskSetting(EXTENDED, WG, NULL, "Report/StallGuard", 0, postTMC);
|
stallguard_debug_mask = new AxisMaskSetting(EXTENDED, WG, NULL, "Report/StallGuard", 0, postMotorSetting);
|
||||||
|
|
||||||
homing_cycle[5] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle5", DEFAULT_HOMING_CYCLE_5);
|
homing_cycle[5] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle5", DEFAULT_HOMING_CYCLE_5);
|
||||||
homing_cycle[4] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle4", DEFAULT_HOMING_CYCLE_4);
|
homing_cycle[4] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle4", DEFAULT_HOMING_CYCLE_4);
|
||||||
|
Reference in New Issue
Block a user