1
0
mirror of https://github.com/bdring/Grbl_Esp32.git synced 2025-08-25 15:31:06 +02:00

Merge branch 'main' of https://github.com/bdring/Grbl_Esp32 into master

This commit is contained in:
Jens Hauser
2020-10-17 00:50:07 +02:00
16 changed files with 111 additions and 87 deletions

View File

@@ -7,6 +7,8 @@ assignees: ''
--- ---
Please only submit bugs for **latest** main or devt branches. You can check the version number in the startup messgaes and compare it to the version in [grbl.h](https://github.com/bdring/Grbl_Esp32/blob/main/Grbl_Esp32/src/Grbl.h)
Please answer the following questions. Please answer the following questions.
What version of the firmware are you using? What version of the firmware are you using?

View File

@@ -118,6 +118,30 @@
# define DEFAULT_HOMING_SQUARED_AXES 0 # define DEFAULT_HOMING_SQUARED_AXES 0
#endif #endif
#ifndef DEFAULT_HOMING_CYCLE_0
# define DEFAULT_HOMING_CYCLE_0 bit(Z_AXIS)
#endif
#ifndef DEFAULT_HOMING_CYCLE_1
# define DEFAULT_HOMING_CYCLE_1 (bit(X_AXIS) | bit(Y_AXIS))
#endif
#ifndef DEFAULT_HOMING_CYCLE_2
# define DEFAULT_HOMING_CYCLE_2 0
#endif
#ifndef DEFAULT_HOMING_CYCLE_3
# define DEFAULT_HOMING_CYCLE_3 0
#endif
#ifndef DEFAULT_HOMING_CYCLE_4
# define DEFAULT_HOMING_CYCLE_4 0
#endif
#ifndef DEFAULT_HOMING_CYCLE_5
# define DEFAULT_HOMING_CYCLE_5 0
#endif
// ======== SPINDLE STUFF ==================== // ======== SPINDLE STUFF ====================
#ifndef SPINDLE_TYPE #ifndef SPINDLE_TYPE
# define SPINDLE_TYPE SpindleType::NONE # define SPINDLE_TYPE SpindleType::NONE
@@ -575,6 +599,10 @@
# define USER_ANALOG_PIN_3 UNDEFINED_PIN # define USER_ANALOG_PIN_3 UNDEFINED_PIN
#endif #endif
#ifndef PROBE_PIN
# define PROBE_PIN UNDEFINED_PIN
#endif
#ifndef USER_ANALOG_PIN_0_FREQ #ifndef USER_ANALOG_PIN_0_FREQ
# define USER_ANALOG_PIN_0_FREQ 5000 # define USER_ANALOG_PIN_0_FREQ 5000
#endif #endif

View File

@@ -271,10 +271,11 @@ Error gc_execute_line(char* line, uint8_t client) {
mg_word_bit = ModalGroup::MG1; mg_word_bit = ModalGroup::MG1;
break; break;
case 38: // G38 - probe case 38: // G38 - probe
#ifndef PROBE_PIN //only allow G38 "Probe" commands if a probe pin is defined. //only allow G38 "Probe" commands if a probe pin is defined.
if (PROBE_PIN == UNDEFINED_PIN) {
grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "No probe pin defined"); grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "No probe pin defined");
FAIL(Error::GcodeUnsupportedCommand); // [Unsupported G command] FAIL(Error::GcodeUnsupportedCommand); // [Unsupported G command]
#endif }
// Check for G0/1/2/3/38 being called with G10/28/30/92 on same block. // Check for G0/1/2/3/38 being called with G10/28/30/92 on same block.
// * G43.1 is also an axis command but is not explicitly defined this way. // * G43.1 is also an axis command but is not explicitly defined this way.
if (axis_command != AxisCommand::None) { if (axis_command != AxisCommand::None) {

View File

@@ -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 = "20200929"; const char* const GRBL_VERSION_BUILD = "20201004";
//#include <sdkconfig.h> //#include <sdkconfig.h>
#include <Arduino.h> #include <Arduino.h>

View File

@@ -47,29 +47,27 @@
#define STEPPER_RESET GPIO_NUM_19 #define STEPPER_RESET GPIO_NUM_19
// Mosor Socket #1 // Motor Socket #1
#define X_DISABLE_PIN I2SO(0) #define X_DISABLE_PIN I2SO(0)
#define X_DIRECTION_PIN I2SO(1) #define X_DIRECTION_PIN I2SO(1)
#define X_STEP_PIN I2SO(2) #define X_STEP_PIN I2SO(2)
#define X_AXIS_SQUARING
// Mosor Socket #2 // Motor Socket #2
#define Y_DIRECTION_PIN I2SO(4) #define Y_DIRECTION_PIN I2SO(4)
#define Y_STEP_PIN I2SO(5) #define Y_STEP_PIN I2SO(5)
#define Y_DISABLE_PIN I2SO(7) #define Y_DISABLE_PIN I2SO(7)
#define Y_AXIS_SQUARING
// Mosor Socket #3 // Motor Socket #3
#define Y2_DISABLE_PIN I2SO(8) #define Y2_DISABLE_PIN I2SO(8)
#define Y2_DIRECTION_PIN I2SO(9) #define Y2_DIRECTION_PIN I2SO(9)
#define Y2_STEP_PIN I2SO(10) #define Y2_STEP_PIN I2SO(10)
// Mosor Socket #4 // Motor Socket #4
#define Z_DIRECTION_PIN I2SO(12) #define Z_DIRECTION_PIN I2SO(12)
#define Z_STEP_PIN I2SO(13) #define Z_STEP_PIN I2SO(13)
#define Z_DISABLE_PIN I2SO(15) #define Z_DISABLE_PIN I2SO(15)
// Mosor Socket #5 // Motor Socket #5
#define Z2_DISABLE_PIN I2SO(16) #define Z2_DISABLE_PIN I2SO(16)
#define Z2_DIRECTION_PIN I2SO(17) #define Z2_DIRECTION_PIN I2SO(17)
#define Z2_STEP_PIN I2SO(18) #define Z2_STEP_PIN I2SO(18)

View File

@@ -47,29 +47,27 @@
#define STEPPER_RESET GPIO_NUM_19 #define STEPPER_RESET GPIO_NUM_19
// Mosor Socket #1 // Motor Socket #1
#define X_DISABLE_PIN I2SO(0) #define X_DISABLE_PIN I2SO(0)
#define X_DIRECTION_PIN I2SO(1) #define X_DIRECTION_PIN I2SO(1)
#define X_STEP_PIN I2SO(2) #define X_STEP_PIN I2SO(2)
#define X_AXIS_SQUARING
// Mosor Socket #2 // Motor Socket #2
#define Y_DIRECTION_PIN I2SO(4) #define Y_DIRECTION_PIN I2SO(4)
#define Y_STEP_PIN I2SO(5) #define Y_STEP_PIN I2SO(5)
#define Y_DISABLE_PIN I2SO(7) #define Y_DISABLE_PIN I2SO(7)
#define Y_AXIS_SQUARING
// Mosor Socket #3 // Motor Socket #3
#define Z_DISABLE_PIN I2SO(8) #define Z_DISABLE_PIN I2SO(8)
#define Z_DIRECTION_PIN I2SO(9) #define Z_DIRECTION_PIN I2SO(9)
#define Z_STEP_PIN I2SO(10) #define Z_STEP_PIN I2SO(10)
// Mosor Socket #4 // Motor Socket #4
#define X2_DIRECTION_PIN I2SO(12) #define X2_DIRECTION_PIN I2SO(12)
#define X2_STEP_PIN I2SO(13) #define X2_STEP_PIN I2SO(13)
#define X2_DISABLE_PIN I2SO(15) #define X2_DISABLE_PIN I2SO(15)
// Mosor Socket #5 // Motor Socket #5
#define Y2_DISABLE_PIN I2SO(16) #define Y2_DISABLE_PIN I2SO(16)
#define Y2_DIRECTION_PIN I2SO(17) #define Y2_DIRECTION_PIN I2SO(17)
#define Y2_STEP_PIN I2SO(18) #define Y2_STEP_PIN I2SO(18)

View File

@@ -26,16 +26,6 @@
#define N_AXIS 3 #define N_AXIS 3
#ifdef HOMING_CYCLE_0
#undef HOMING_CYCLE_0
#endif
#define HOMING_CYCLE_0 bit(Z_AXIS) // Z first
#ifdef HOMING_CYCLE_1
#undef HOMING_CYCLE_1
#endif
#define HOMING_CYCLE_1 (bit(X_AXIS)|bit(Y_AXIS))
// === Special Features // === Special Features
// I2S (steppers & other output-only pins) // I2S (steppers & other output-only pins)
@@ -110,27 +100,27 @@ Socket #5
*/ */
/*
// 4x Input Module in Socket #1 // 4x Input Module in Socket #1
// https://github.com/bdring/6-Pack_CNC_Controller/wiki/4x-Switch-Input-module // https://github.com/bdring/6-Pack_CNC_Controller/wiki/4x-Switch-Input-module
#define X_LIMIT_PIN GPIO_NUM_33 #define X_LIMIT_PIN GPIO_NUM_33
#define Y_LIMIT_PIN GPIO_NUM_32 #define Y_LIMIT_PIN GPIO_NUM_32
#define Z_LIMIT_PIN GPIO_NUM_35 #define Z_LIMIT_PIN GPIO_NUM_35
*/
// 4x Input Module in Socket #2
// https://github.com/bdring/6-Pack_CNC_Controller/wiki/4x-Switch-Input-module
#define X_LIMIT_PIN GPIO_NUM_2
#define Y_LIMIT_PIN GPIO_NUM_25
#define Z_LIMIT_PIN GPIO_NUM_39
// 4x Input Module in Socket #3 // // 4x Input Module in Socket #2
// https://github.com/bdring/6-Pack_CNC_Controller/wiki/4x-Switch-Input-module // // https://github.com/bdring/6-Pack_CNC_Controller/wiki/4x-Switch-Input-module
#define CONTROL_CYCLE_START_PIN GPIO_NUM_26 // #define X_LIMIT_PIN GPIO_NUM_2
#define CONTROL_FEED_HOLD_PIN GPIO_NUM_4 // #define Y_LIMIT_PIN GPIO_NUM_25
#define CONTROL_RESET_PIN GPIO_NUM_16 // #define Z_LIMIT_PIN GPIO_NUM_39
#define CONTROL_SAFETY_DOOR_PIN GPIO_NUM_27
//#define INVERT_CONTROL_PIN_MASK B0000 // // 4x Input Module in Socket #3
// // https://github.com/bdring/6-Pack_CNC_Controller/wiki/4x-Switch-Input-module
// #define CONTROL_CYCLE_START_PIN GPIO_NUM_26
// #define CONTROL_FEED_HOLD_PIN GPIO_NUM_4
// #define CONTROL_RESET_PIN GPIO_NUM_16
// #define CONTROL_SAFETY_DOOR_PIN GPIO_NUM_27
// //#define INVERT_CONTROL_PIN_MASK B0000
// ================= Setting Defaults ========================== // ================= Setting Defaults ==========================

View File

@@ -54,6 +54,9 @@
#define SPINDLE_TYPE SpindleType::NONE #define SPINDLE_TYPE SpindleType::NONE
// defaults // defaults
#define DEFAULT_HOMING_CYCLE_0 bit(Y_AXIS)
#define DEFAULT_HOMING_CYCLE_1 bit(X_AXIS)
#define DEFAULT_STEP_PULSE_MICROSECONDS 3 #define DEFAULT_STEP_PULSE_MICROSECONDS 3
#define DEFAULT_STEPPER_IDLE_LOCK_TIME 255 // stay on #define DEFAULT_STEPPER_IDLE_LOCK_TIME 255 // stay on

View File

@@ -37,6 +37,15 @@
#define MACHINE_NAME "Test Drive - Demo Only No I/O!" #define MACHINE_NAME "Test Drive - Demo Only No I/O!"
// This cannot use homing because there are no switches
#ifdef DEFAULT_HOMING_CYCLE_0
#undef DEFAULT_HOMING_CYCLE_0
#endif
#ifdef DEFAULT_HOMING_CYCLE_1
#undef DEFAULT_HOMING_CYCLE_1
#endif
#define SPINDLE_TYPE SpindleType::NONE #define SPINDLE_TYPE SpindleType::NONE
#ifdef USE_RMT_STEPS #ifdef USE_RMT_STEPS

View File

@@ -375,13 +375,12 @@ GCUpdatePos mc_probe_cycle(float* target, plan_line_data_t* pl_data, uint8_t par
uint8_t is_probe_away = bit_istrue(parser_flags, GCParserProbeIsAway); uint8_t is_probe_away = bit_istrue(parser_flags, GCParserProbeIsAway);
uint8_t is_no_error = bit_istrue(parser_flags, GCParserProbeIsNoError); uint8_t is_no_error = bit_istrue(parser_flags, GCParserProbeIsNoError);
sys.probe_succeeded = false; // Re-initialize probe history before beginning cycle. sys.probe_succeeded = false; // Re-initialize probe history before beginning cycle.
probe_configure_invert_mask(is_probe_away); set_probe_direction(is_probe_away);
// After syncing, check if probe is already triggered. If so, halt and issue alarm. // After syncing, check if probe is already triggered. If so, halt and issue alarm.
// NOTE: This probe initialization error applies to all probing cycles. // NOTE: This probe initialization error applies to all probing cycles.
if (probe_get_state()) { // Check probe pin state. if (probe_get_state() ^ is_probe_away) { // Check probe pin state.
system_set_exec_alarm(ExecAlarm::ProbeFailInitial); system_set_exec_alarm(ExecAlarm::ProbeFailInitial);
protocol_execute_realtime(); protocol_execute_realtime();
probe_configure_invert_mask(false); // Re-initialize invert mask before returning.
return GCUpdatePos::None; // Nothing else to do but bail. return GCUpdatePos::None; // Nothing else to do but bail.
} }
// Setup and queue probing motion. Auto cycle-start should not start the cycle. // Setup and queue probing motion. Auto cycle-start should not start the cycle.
@@ -408,7 +407,6 @@ GCUpdatePos mc_probe_cycle(float* target, plan_line_data_t* pl_data, uint8_t par
sys.probe_succeeded = true; // Indicate to system the probing cycle completed successfully. sys.probe_succeeded = true; // Indicate to system the probing cycle completed successfully.
} }
sys_probe_state = PROBE_OFF; // Ensure probe state monitor is disabled. sys_probe_state = PROBE_OFF; // Ensure probe state monitor is disabled.
probe_configure_invert_mask(false); // Re-initialize invert mask.
protocol_execute_realtime(); // Check and execute run-time commands protocol_execute_realtime(); // Check and execute run-time commands
// Reset the stepper and planner buffers to remove the remainder of the probe motion. // Reset the stepper and planner buffers to remove the remainder of the probe motion.
st_reset(); // Reset step segment buffer. st_reset(); // Reset step segment buffer.

View File

@@ -24,47 +24,40 @@
#include "Grbl.h" #include "Grbl.h"
// Inverts the probe pin state depending on user settings and probing cycle mode. // Inverts the probe pin state depending on user settings and probing cycle mode.
uint8_t probe_invert_mask; static bool is_probe_away;
// Probe pin initialization routine. // Probe pin initialization routine.
void probe_init() { void probe_init() {
#ifdef PROBE_PIN static bool show_init_msg = true; // used to show message only once.
if (PROBE_PIN != UNDEFINED_PIN) {
#ifdef DISABLE_PROBE_PIN_PULL_UP #ifdef DISABLE_PROBE_PIN_PULL_UP
pinMode(PROBE_PIN, INPUT); pinMode(PROBE_PIN, INPUT);
#else #else
pinMode(PROBE_PIN, INPUT_PULLUP); // Enable internal pull-up resistors. Normal high operation. pinMode(PROBE_PIN, INPUT_PULLUP); // Enable internal pull-up resistors. Normal high operation.
#endif #endif
probe_configure_invert_mask(false); // Initialize invert mask.
#endif if (show_init_msg) {
grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Probe on pin %s", pinName(PROBE_PIN).c_str());
show_init_msg = false;
}
}
} }
// Called by probe_init() and the mc_probe() routines. Sets up the probe pin invert mask to void set_probe_direction(bool is_away) {
// appropriately set the pin logic according to setting for normal-high/normal-low operation is_probe_away = is_away;
// and the probing cycle modes for toward-workpiece/away-from-workpiece.
void probe_configure_invert_mask(uint8_t is_probe_away) {
probe_invert_mask = 0; // Initialize as zero.
if (probe_invert->get()) {
probe_invert_mask ^= PROBE_MASK;
}
if (is_probe_away) {
probe_invert_mask ^= PROBE_MASK;
}
} }
// Returns the probe pin state. Triggered = true. Called by gcode parser and probe state monitor. // Returns the probe pin state. Triggered = true. Called by gcode parser and probe state monitor.
uint8_t probe_get_state() { bool probe_get_state() {
#ifdef PROBE_PIN return digitalRead(PROBE_PIN) ^ probe_invert->get();
return digitalRead(PROBE_PIN) ^ probe_invert_mask;
#else
return false;
#endif
} }
// Monitors probe pin state and records the system position when detected. Called by the // Monitors probe pin state and records the system position when detected. Called by the
// stepper ISR per ISR tick. // stepper ISR per ISR tick.
// NOTE: This function must be extremely efficient as to not bog down the stepper ISR. // NOTE: This function must be extremely efficient as to not bog down the stepper ISR.
void probe_state_monitor() { void probe_state_monitor() {
if (probe_get_state()) { if (probe_get_state() ^ is_probe_away) {
sys_probe_state = PROBE_OFF; sys_probe_state = PROBE_OFF;
memcpy(sys_probe_position, sys_position, sizeof(sys_position)); memcpy(sys_probe_position, sys_position, sizeof(sys_position));
bit_true(sys_rt_exec_state, EXEC_MOTION_CANCEL); bit_true(sys_rt_exec_state, EXEC_MOTION_CANCEL);

View File

@@ -30,13 +30,11 @@ const int PROBE_ACTIVE = 1; // Actively watching the input pin.
// Probe pin initialization routine. // Probe pin initialization routine.
void probe_init(); void probe_init();
// Called by probe_init() and the mc_probe() routines. Sets up the probe pin invert mask to // setup probing direction G38.2 vs. G38.4
// appropriately set the pin logic according to setting for normal-high/normal-low operation void set_probe_direction(bool is_away);
// and the probing cycle modes for toward-workpiece/away-from-workpiece.
void probe_configure_invert_mask(uint8_t is_probe_away);
// Returns probe pin state. Triggered = true. Called by gcode parser and probe state monitor. // Returns probe pin state. Triggered = true. Called by gcode parser and probe state monitor.
uint8_t probe_get_state(); bool probe_get_state();
// Monitors probe pin state and records the system position when detected. Called by the // Monitors probe pin state and records the system position when detected. Called by the
// stepper ISR per ISR tick. // stepper ISR per ISR tick.

View File

@@ -537,6 +537,10 @@ void FlagSetting::setDefault() {
Error FlagSetting::setStringValue(char* s) { Error FlagSetting::setStringValue(char* s) {
s = trim(s); s = trim(s);
Error err = check(s);
if (err != Error::Ok) {
return err;
}
_currentValue = (strcasecmp(s, "on") == 0) || (strcasecmp(s, "true") == 0) || (strcasecmp(s, "enabled") == 0) || _currentValue = (strcasecmp(s, "on") == 0) || (strcasecmp(s, "true") == 0) || (strcasecmp(s, "enabled") == 0) ||
(strcasecmp(s, "yes") == 0) || (strcasecmp(s, "1") == 0); (strcasecmp(s, "yes") == 0) || (strcasecmp(s, "1") == 0);
// _storedValue is -1, 0, or 1 // _storedValue is -1, 0, or 1

View File

@@ -375,9 +375,10 @@ void make_settings() {
spindle_type = new EnumSetting(NULL, EXTENDED, WG, NULL, "Spindle/Type", static_cast<int8_t>(SPINDLE_TYPE), &spindleTypes); spindle_type = new EnumSetting(NULL, EXTENDED, WG, NULL, "Spindle/Type", static_cast<int8_t>(SPINDLE_TYPE), &spindleTypes);
stallguard_debug_mask = new AxisMaskSetting(EXTENDED, WG, NULL, "Report/StallGuard", 0, checkStallguardDebugMask); stallguard_debug_mask = new AxisMaskSetting(EXTENDED, WG, NULL, "Report/StallGuard", 0, checkStallguardDebugMask);
const char* homing_names[] = { "Homing/Cycle0", "Homing/Cycle1", "Homing/Cycle2", homing_cycle[0] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle0", DEFAULT_HOMING_CYCLE_0);
"Homing/Cycle3", "Homing/Cycle4", "Homing/Cycle5" }; homing_cycle[1] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle1", DEFAULT_HOMING_CYCLE_1);
for (uint8_t i = 0; i < MAX_N_AXIS; i++) { homing_cycle[2] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle2", DEFAULT_HOMING_CYCLE_2);
homing_cycle[i] = new AxisMaskSetting(EXTENDED, WG, NULL, homing_names[i], 0); homing_cycle[3] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle3", DEFAULT_HOMING_CYCLE_3);
} homing_cycle[4] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle4", DEFAULT_HOMING_CYCLE_4);
homing_cycle[5] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle5", DEFAULT_HOMING_CYCLE_5);
} }

View File

@@ -44,7 +44,7 @@ namespace Spindles {
#endif #endif
if (_output_pin == UNDEFINED_PIN) { if (_output_pin == UNDEFINED_PIN) {
grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Warning: BESC output pin not defined"); grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Warning: Spindle output pin not defined");
return; // We cannot continue without the output pin return; // We cannot continue without the output pin
} }

View File

@@ -16,6 +16,7 @@
"15","Travel exceeded","Jog target exceeds machine travel. Jog command has been ignored." "15","Travel exceeded","Jog target exceeds machine travel. Jog command has been ignored."
"16","Invalid jog command","Jog command has no '=' or contains prohibited g-code." "16","Invalid jog command","Jog command has no '=' or contains prohibited g-code."
"17","Setting disabled","Laser mode requires PWM output." "17","Setting disabled","Laser mode requires PWM output."
"18","No Homing/Cycle defined in settings","Set some $homing/CycleX= Settings"
"20","Unsupported command","Unsupported or invalid g-code command found in block." "20","Unsupported command","Unsupported or invalid g-code command found in block."
"21","Modal group violation","More than one g-code command from same modal group found in block." "21","Modal group violation","More than one g-code command from same modal group found in block."
"22","Undefined feed rate","Feed rate has not yet been set or is undefined." "22","Undefined feed rate","Feed rate has not yet been set or is undefined."
1 Error Code in v1.1+ Error Message in v1.0- Error Description
16 15 Travel exceeded Jog target exceeds machine travel. Jog command has been ignored.
17 16 Invalid jog command Jog command has no '=' or contains prohibited g-code.
18 17 Setting disabled Laser mode requires PWM output.
19 18 No Homing/Cycle defined in settings Set some $homing/CycleX= Settings
20 20 Unsupported command Unsupported or invalid g-code command found in block.
21 21 Modal group violation More than one g-code command from same modal group found in block.
22 22 Undefined feed rate Feed rate has not yet been set or is undefined.