From 6a0e3a73354cb0e2a3d801150871707c79e23748 Mon Sep 17 00:00:00 2001 From: bdring Date: Sun, 13 Dec 2020 13:29:47 -0600 Subject: [PATCH] Fixes to homing (#706) * Fixes to homing * Update Grbl.h * Clean up after code review. --- Grbl_Esp32/Custom/CoreXY.cpp | 32 ++++++++++++++++------- Grbl_Esp32/src/Grbl.h | 2 +- Grbl_Esp32/src/Motors/StandardStepper.cpp | 6 ++++- Grbl_Esp32/src/Motors/StandardStepper.h | 1 + Grbl_Esp32/src/Motors/TrinamicDriver.cpp | 5 ++-- Grbl_Esp32/src/SettingsDefinitions.cpp | 16 ++++++------ 6 files changed, 40 insertions(+), 22 deletions(-) diff --git a/Grbl_Esp32/Custom/CoreXY.cpp b/Grbl_Esp32/Custom/CoreXY.cpp index cefab842..238a46df 100644 --- a/Grbl_Esp32/Custom/CoreXY.cpp +++ b/Grbl_Esp32/Custom/CoreXY.cpp @@ -51,9 +51,15 @@ float three_axis_dist(float* point1, float* point2); void machine_init() { // 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"); +#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 bool user_defined_homing(uint8_t cycle_mask) { 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; 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 bool setting_error = false; 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.noFeedOverride = 1; - for (int cycle = 0; cycle < 3; cycle++) { - AxisMask mask = homing_cycle[cycle]->get(); + 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 = 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 + for (uint8_t axis = X_AXIS; axis <= Z_AXIS; axis++) { if (bit(axis) == mask) { // setup for the homing of this axis @@ -190,7 +202,7 @@ bool user_defined_homing(uint8_t cycle_mask) { } while (n_cycle-- > 0); } } - } + } // for // 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[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[1] = motors[1]; diff --git a/Grbl_Esp32/src/Grbl.h b/Grbl_Esp32/src/Grbl.h index 31413e8a..93c3f1e6 100644 --- a/Grbl_Esp32/src/Grbl.h +++ b/Grbl_Esp32/src/Grbl.h @@ -23,7 +23,7 @@ // Grbl versioning system const char* const GRBL_VERSION = "1.3a"; -const char* const GRBL_VERSION_BUILD = "20201207"; +const char* const GRBL_VERSION_BUILD = "20201212"; //#include #include diff --git a/Grbl_Esp32/src/Motors/StandardStepper.cpp b/Grbl_Esp32/src/Motors/StandardStepper.cpp index d2a2e51a..8e782ba4 100644 --- a/Grbl_Esp32/src/Motors/StandardStepper.cpp +++ b/Grbl_Esp32/src/Motors/StandardStepper.cpp @@ -44,10 +44,14 @@ namespace Motors { } void StandardStepper::init() { - init_step_dir_pins(); + read_settings(); config_message(); } + void StandardStepper::read_settings() { + init_step_dir_pins(); + } + void StandardStepper::init_step_dir_pins() { _invert_step_pin = bitnum_istrue(step_invert_mask->get(), _axis_index); _invert_dir_pin = bitnum_istrue(dir_invert_mask->get(), _axis_index); diff --git a/Grbl_Esp32/src/Motors/StandardStepper.h b/Grbl_Esp32/src/Motors/StandardStepper.h index efc72f66..269e5b2f 100644 --- a/Grbl_Esp32/src/Motors/StandardStepper.h +++ b/Grbl_Esp32/src/Motors/StandardStepper.h @@ -15,6 +15,7 @@ namespace Motors { void set_direction(bool) override; void step() override; void unstep() override; + void read_settings() override; void init_step_dir_pins(); diff --git a/Grbl_Esp32/src/Motors/TrinamicDriver.cpp b/Grbl_Esp32/src/Motors/TrinamicDriver.cpp index 2a7c9f4f..26229dd2 100644 --- a/Grbl_Esp32/src/Motors/TrinamicDriver.cpp +++ b/Grbl_Esp32/src/Motors/TrinamicDriver.cpp @@ -67,8 +67,7 @@ namespace Motors { return; } - _has_errors = false; - init_step_dir_pins(); // from StandardStepper + _has_errors = false; digitalWrite(_cs_pin, HIGH); pinMode(_cs_pin, OUTPUT); @@ -211,6 +210,8 @@ namespace Motors { } tmcstepper->microsteps(axis_settings[_axis_index]->microsteps->get()); tmcstepper->rms_current(run_i_ma, hold_i_percent); + + init_step_dir_pins(); } bool TrinamicDriver::set_homing_mode(bool isHoming) { diff --git a/Grbl_Esp32/src/SettingsDefinitions.cpp b/Grbl_Esp32/src/SettingsDefinitions.cpp index 2c0ac6c4..02115c00 100644 --- a/Grbl_Esp32/src/SettingsDefinitions.cpp +++ b/Grbl_Esp32/src/SettingsDefinitions.cpp @@ -179,7 +179,7 @@ static bool checkStartupLine(char* value) { return gc_execute_line(value, CLIENT_SERIAL) == Error::Ok; } -static bool postTMC(char* value) { +static bool postMotorSetting(char* value) { if (!value) { motors_read_settings(); } @@ -258,28 +258,28 @@ void make_settings() { for (axis = MAX_N_AXIS - 1; axis >= 0; axis--) { def = &axis_defaults[axis]; 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); axis_settings[axis]->stallguard = setting; } for (axis = MAX_N_AXIS - 1; axis >= 0; axis--) { def = &axis_defaults[axis]; 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); axis_settings[axis]->microsteps = setting; } for (axis = MAX_N_AXIS - 1; axis >= 0; axis--) { def = &axis_defaults[axis]; 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); axis_settings[axis]->hold_current = setting; } for (axis = MAX_N_AXIS - 1; axis >= 0; axis--) { def = &axis_defaults[axis]; 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); 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); 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); - dir_invert_mask = new AxisMaskSetting(GRBL, WG, "3", "Stepper/DirInvert", DEFAULT_DIRECTION_INVERT_MASK); - step_invert_mask = new AxisMaskSetting(GRBL, WG, "2", "Stepper/StepInvert", DEFAULT_STEPPING_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, postMotorSetting); 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); - 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[4] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle4", DEFAULT_HOMING_CYCLE_4);