From 515ce82672d2da2665d3c029602377599a5c161e Mon Sep 17 00:00:00 2001 From: bdring Date: Tue, 15 Oct 2019 10:55:37 -0500 Subject: [PATCH 1/2] Added M62 & M63 (Digital I/O control) --- Grbl_Esp32/cpu_map.h | 9 +- Grbl_Esp32/gcode.cpp | 35 ++++++- Grbl_Esp32/gcode.h | 9 ++ Grbl_Esp32/grbl.h | 2 +- Grbl_Esp32/motion_control.cpp | 4 +- Grbl_Esp32/report.h | 1 + Grbl_Esp32/system.cpp | 159 ++++++++++++++++++++----------- Grbl_Esp32/system.h | 2 + doc/csv/error_codes_en_US.csv | 1 + doc/script/piecewise_example.png | Bin 0 -> 38812 bytes 10 files changed, 160 insertions(+), 62 deletions(-) create mode 100644 doc/script/piecewise_example.png diff --git a/Grbl_Esp32/cpu_map.h b/Grbl_Esp32/cpu_map.h index 9a0bd58a..3a89274e 100644 --- a/Grbl_Esp32/cpu_map.h +++ b/Grbl_Esp32/cpu_map.h @@ -85,7 +85,7 @@ #define X_DIRECTION_PIN GPIO_NUM_14 #define Y_STEP_PIN GPIO_NUM_26 #define Y_DIRECTION_PIN GPIO_NUM_15 - #define COOLANT_FLOOD_PIN GPIO_NUM_25 + //#define COOLANT_FLOOD_PIN GPIO_NUM_25 #define SPINDLE_PWM_PIN GPIO_NUM_2 #define X_LIMIT_PIN GPIO_NUM_17 #define Z_LIMIT_PIN GPIO_NUM_16 @@ -94,7 +94,7 @@ #define X_DIRECTION_PIN GPIO_NUM_26 #define Y_STEP_PIN GPIO_NUM_14 #define Y_DIRECTION_PIN GPIO_NUM_25 - #define COOLANT_FLOOD_PIN GPIO_NUM_16 + //#define COOLANT_FLOOD_PIN GPIO_NUM_16 #define SPINDLE_PWM_PIN GPIO_NUM_17 #define X_LIMIT_PIN GPIO_NUM_2 #define Z_LIMIT_PIN GPIO_NUM_15 @@ -114,8 +114,9 @@ // OK to comment out to use pin for other features #define STEPPERS_DISABLE_PIN GPIO_NUM_13 - #define COOLANT_MIST_PIN GPIO_NUM_21 - + //#define COOLANT_MIST_PIN GPIO_NUM_21 + #define USER_DIGITAL_PIN_1 GPIO_NUM_21 + #define USER_DIGITAL_PIN_2 GPIO_NUM_25 #define SPINDLE_PWM_CHANNEL 0 diff --git a/Grbl_Esp32/gcode.cpp b/Grbl_Esp32/gcode.cpp index 7128ca93..413bb3b0 100644 --- a/Grbl_Esp32/gcode.cpp +++ b/Grbl_Esp32/gcode.cpp @@ -368,7 +368,23 @@ uint8_t gc_execute_line(char *line, uint8_t client) FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND); // [Unsupported M command] } break; - default: + case 62: + case 63: + //grbl_sendf(CLIENT_SERIAL,"M%d...\r\n", int_value); + word_bit = MODAL_GROUP_M10; + switch (int_value) { + case 62: + gc_block.modal.io_control = NON_MODAL_IO_ENABLE; + break; + case 63: + gc_block.modal.io_control = NON_MODAL_IO_DISABLE; + break; + default: + break; + } + + break; + default: FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND); // [Unsupported M command] } @@ -618,6 +634,13 @@ uint8_t gc_execute_line(char *line, uint8_t client) } bit_false(value_words,bit(WORD_P)); } + + if ( (gc_block.modal.io_control == NON_MODAL_IO_ENABLE) || (gc_block.modal.io_control == NON_MODAL_IO_DISABLE)) { + if (bit_isfalse(value_words,bit(WORD_P))) { + FAIL(STATUS_GCODE_VALUE_WORD_MISSING); // [P word missing] + } + bit_false(value_words,bit(WORD_P)); + } // [11. Set active plane ]: N/A switch (gc_block.modal.plane_select) { @@ -1216,6 +1239,16 @@ uint8_t gc_execute_line(char *line, uint8_t client) } pl_data->condition |= gc_state.modal.coolant; // Set condition flag for planner use. + // turn on/off an i/o pin + if ( (gc_block.modal.io_control == NON_MODAL_IO_ENABLE) || (gc_block.modal.io_control == NON_MODAL_IO_DISABLE) ) { + if (gc_block.values.p <= MAX_USER_DIGITAL_PIN) { + sys_io_control(1<<(int)gc_block.values.p, (gc_block.modal.io_control == NON_MODAL_IO_ENABLE)); + } + else { + FAIL(STATUS_P_PARAM_MAX_EXCEEDED); + } + } + // [9. Enable/disable feed rate or spindle overrides ]: NOT SUPPORTED. Always enabled. // [10. Dwell ]: diff --git a/Grbl_Esp32/gcode.h b/Grbl_Esp32/gcode.h index b50f6b14..f3ddf3f0 100644 --- a/Grbl_Esp32/gcode.h +++ b/Grbl_Esp32/gcode.h @@ -46,6 +46,7 @@ #define MODAL_GROUP_M4 11 // [M0,M1,M2,M30] Stopping #define MODAL_GROUP_M7 12 // [M3,M4,M5] Spindle turning #define MODAL_GROUP_M8 13 // [M7,M8,M9] Coolant control +#define MODAL_GROUP_M10 14 // [M62, M63] User Defined http://linuxcnc.org/docs/html/gcode/overview.html#_modal_groups // #define OTHER_INPUT_F 14 // #define OTHER_INPUT_S 15 @@ -124,10 +125,17 @@ #define COOLANT_FLOOD_ENABLE PL_COND_FLAG_COOLANT_FLOOD // M8 (NOTE: Uses planner condition bit flag) #define COOLANT_MIST_ENABLE PL_COND_FLAG_COOLANT_MIST // M7 (NOTE: Uses planner condition bit flag) +// modal Group M10: User I/O control +#define NON_MODAL_IO_ENABLE 1 +#define NON_MODAL_IO_DISABLE 2 +#define MAX_USER_DIGITAL_PIN 4 + // Modal Group G8: Tool length offset #define TOOL_LENGTH_OFFSET_CANCEL 0 // G49 (Default: Must be zero) #define TOOL_LENGTH_OFFSET_ENABLE_DYNAMIC 1 // G43.1 + + // Modal Group G12: Active work coordinate system // N/A: Stores coordinate system value (54-59) to change to. @@ -192,6 +200,7 @@ typedef struct { uint8_t program_flow; // {M0,M1,M2,M30} uint8_t coolant; // {M7,M8,M9} uint8_t spindle; // {M3,M4,M5} + uint8_t io_control; // {M62, M63} } gc_modal_t; typedef struct { diff --git a/Grbl_Esp32/grbl.h b/Grbl_Esp32/grbl.h index 704fda23..c3503a10 100644 --- a/Grbl_Esp32/grbl.h +++ b/Grbl_Esp32/grbl.h @@ -20,7 +20,7 @@ // Grbl versioning system #define GRBL_VERSION "1.1f" -#define GRBL_VERSION_BUILD "20191011" +#define GRBL_VERSION_BUILD "20191015" //#include #include diff --git a/Grbl_Esp32/motion_control.cpp b/Grbl_Esp32/motion_control.cpp index 3e31e21c..64b952e8 100644 --- a/Grbl_Esp32/motion_control.cpp +++ b/Grbl_Esp32/motion_control.cpp @@ -418,7 +418,9 @@ void mc_reset() // Kill spindle and coolant. spindle_stop(); - coolant_stop(); + coolant_stop(); + // turn off all digital I/O + sys_io_control(0xFF, false); #ifdef ENABLE_SD_CARD // do we need to stop a running SD job? diff --git a/Grbl_Esp32/report.h b/Grbl_Esp32/report.h index 33115346..82cd68b0 100644 --- a/Grbl_Esp32/report.h +++ b/Grbl_Esp32/report.h @@ -62,6 +62,7 @@ #define STATUS_GCODE_UNUSED_WORDS 36 #define STATUS_GCODE_G43_DYNAMIC_AXIS_ERROR 37 #define STATUS_GCODE_MAX_VALUE_EXCEEDED 38 +#define STATUS_P_PARAM_MAX_EXCEEDED 39 #define STATUS_SD_FAILED_MOUNT 60 // SD Failed to mount #define STATUS_SD_FAILED_READ 61 // SD Failed to read file diff --git a/Grbl_Esp32/system.cpp b/Grbl_Esp32/system.cpp index fb7eab68..84d1b288 100644 --- a/Grbl_Esp32/system.cpp +++ b/Grbl_Esp32/system.cpp @@ -26,62 +26,82 @@ xQueueHandle control_sw_queue; // used by control switch debouncing void system_ini() // Renamed from system_init() due to conflict with esp32 files { // setup control inputs -#ifndef IGNORE_CONTROL_PINS - - #ifdef CONTROL_SAFETY_DOOR_PIN - pinMode(CONTROL_SAFETY_DOOR_PIN, INPUT); - attachInterrupt(digitalPinToInterrupt(CONTROL_SAFETY_DOOR_PIN), isr_control_inputs, CHANGE); - #endif - #ifdef CONTROL_RESET_PIN - pinMode(CONTROL_RESET_PIN, INPUT); - attachInterrupt(digitalPinToInterrupt(CONTROL_RESET_PIN), isr_control_inputs, CHANGE); - #endif - #ifdef CONTROL_FEED_HOLD_PIN - pinMode(CONTROL_FEED_HOLD_PIN, INPUT); - attachInterrupt(digitalPinToInterrupt(CONTROL_FEED_HOLD_PIN), isr_control_inputs, CHANGE); - #endif - #ifdef CONTROL_CYCLE_START_PIN - pinMode(CONTROL_CYCLE_START_PIN, INPUT); - attachInterrupt(digitalPinToInterrupt(CONTROL_CYCLE_START_PIN), isr_control_inputs, CHANGE); - #endif - - #ifdef MACRO_BUTTON_0_PIN - pinMode(MACRO_BUTTON_0_PIN, INPUT_PULLUP); - attachInterrupt(digitalPinToInterrupt(MACRO_BUTTON_0_PIN), isr_control_inputs, CHANGE); - #endif - - #ifdef MACRO_BUTTON_1_PIN - pinMode(MACRO_BUTTON_1_PIN, INPUT_PULLUP); - attachInterrupt(digitalPinToInterrupt(MACRO_BUTTON_1_PIN), isr_control_inputs, CHANGE); - #endif - - #ifdef MACRO_BUTTON_2_PIN - pinMode(MACRO_BUTTON_2_PIN, INPUT_PULLUP); - attachInterrupt(digitalPinToInterrupt(MACRO_BUTTON_2_PIN), isr_control_inputs, CHANGE); - #endif - - #ifdef MACRO_BUTTON_3_PIN - pinMode(MACRO_BUTTON_3_PIN, INPUT_PULLUP); - attachInterrupt(digitalPinToInterrupt(MACRO_BUTTON_3_PIN), isr_control_inputs, CHANGE); - #endif - - #ifdef ENABLE_CONTROL_SW_DEBOUNCE - // setup task used for debouncing - control_sw_queue = xQueueCreate(10, sizeof( int )); + #ifndef IGNORE_CONTROL_PINS - xTaskCreate(controlCheckTask, - "controlCheckTask", - 2048, - NULL, - 5, // priority - NULL); + #ifdef CONTROL_SAFETY_DOOR_PIN + pinMode(CONTROL_SAFETY_DOOR_PIN, INPUT); + attachInterrupt(digitalPinToInterrupt(CONTROL_SAFETY_DOOR_PIN), isr_control_inputs, CHANGE); + #endif + #ifdef CONTROL_RESET_PIN + pinMode(CONTROL_RESET_PIN, INPUT); + attachInterrupt(digitalPinToInterrupt(CONTROL_RESET_PIN), isr_control_inputs, CHANGE); + #endif + #ifdef CONTROL_FEED_HOLD_PIN + pinMode(CONTROL_FEED_HOLD_PIN, INPUT); + attachInterrupt(digitalPinToInterrupt(CONTROL_FEED_HOLD_PIN), isr_control_inputs, CHANGE); + #endif + #ifdef CONTROL_CYCLE_START_PIN + pinMode(CONTROL_CYCLE_START_PIN, INPUT); + attachInterrupt(digitalPinToInterrupt(CONTROL_CYCLE_START_PIN), isr_control_inputs, CHANGE); + #endif + + #ifdef MACRO_BUTTON_0_PIN + pinMode(MACRO_BUTTON_0_PIN, INPUT_PULLUP); + attachInterrupt(digitalPinToInterrupt(MACRO_BUTTON_0_PIN), isr_control_inputs, CHANGE); + #endif + + #ifdef MACRO_BUTTON_1_PIN + pinMode(MACRO_BUTTON_1_PIN, INPUT_PULLUP); + attachInterrupt(digitalPinToInterrupt(MACRO_BUTTON_1_PIN), isr_control_inputs, CHANGE); + #endif + + #ifdef MACRO_BUTTON_2_PIN + pinMode(MACRO_BUTTON_2_PIN, INPUT_PULLUP); + attachInterrupt(digitalPinToInterrupt(MACRO_BUTTON_2_PIN), isr_control_inputs, CHANGE); + #endif + + #ifdef MACRO_BUTTON_3_PIN + pinMode(MACRO_BUTTON_3_PIN, INPUT_PULLUP); + attachInterrupt(digitalPinToInterrupt(MACRO_BUTTON_3_PIN), isr_control_inputs, CHANGE); + #endif + + #ifdef ENABLE_CONTROL_SW_DEBOUNCE + // setup task used for debouncing + control_sw_queue = xQueueCreate(10, sizeof( int )); + + xTaskCreate(controlCheckTask, + "controlCheckTask", + 2048, + NULL, + 5, // priority + NULL); + #endif + #endif -#endif - //customize pin definition if needed -#if (GRBL_SPI_SS != -1) || (GRBL_SPI_MISO != -1) || (GRBL_SPI_MOSI != -1) || (GRBL_SPI_SCK != -1) - SPI.begin(GRBL_SPI_SCK, GRBL_SPI_MISO, GRBL_SPI_MOSI, GRBL_SPI_SS); -#endif + //customize pin definition if needed + #if (GRBL_SPI_SS != -1) || (GRBL_SPI_MISO != -1) || (GRBL_SPI_MOSI != -1) || (GRBL_SPI_SCK != -1) + SPI.begin(GRBL_SPI_SCK, GRBL_SPI_MISO, GRBL_SPI_MOSI, GRBL_SPI_SS); + #endif + + // Setup USER_DIGITAL_PINs controlled by M62 and M63 + #ifdef USER_DIGITAL_PIN_1 + pinMode(USER_DIGITAL_PIN_1, OUTPUT); + #endif + + #ifdef USER_DIGITAL_PIN_2 + pinMode(USER_DIGITAL_PIN_2, OUTPUT); + #endif + + #ifdef USER_DIGITAL_PIN_3 + pinMode(USER_DIGITAL_PIN_3, OUTPUT); + #endif + + #ifdef USER_DIGITAL_PIN_4 + pinMode(USER_DIGITAL_PIN_4, OUTPUT); + #endif + + sys_io_control(0xFF, false); // turn them all off } #ifdef ENABLE_CONTROL_SW_DEBOUNCE @@ -518,7 +538,7 @@ void system_exec_control_pin(uint8_t pin) { bit_true(sys_rt_exec_state, EXEC_FEED_HOLD); } else if (bit_istrue(pin,CONTROL_PIN_INDEX_SAFETY_DOOR)) { - bit_true(sys_rt_exec_state, EXEC_SAFETY_DOOR); + bit_true(sys_rt_exec_state, EXEC_SAFETY_DOOR); } #ifdef MACRO_BUTTON_0_PIN else if (pin == 96) { @@ -552,4 +572,33 @@ int32_t system_convert_corexy_to_y_axis_steps(int32_t *steps) return( (steps[A_MOTOR] - steps[B_MOTOR])/2 ); } - +// io_num is the virtual pin# and has nothing to do with the actual esp32 GPIO_NUM_xx +// It uses a mask so all can be turned of in ms_reset +void sys_io_control(uint8_t io_num_mask, bool turnOn) { + protocol_buffer_synchronize(); + #ifdef USER_DIGITAL_PIN_1 + if (io_num_mask & 1<<1) { + digitalWrite(USER_DIGITAL_PIN_1, turnOn); + return; + } + #endif + #ifdef USER_DIGITAL_PIN_2 + if (io_num_mask & 1<<2) { + digitalWrite(USER_DIGITAL_PIN_2, turnOn); + return; + } + #endif + #ifdef USER_DIGITAL_PIN_3 + if (io_num_mask & 1<<3) { + digitalWrite(USER_DIGITAL_PIN_3, turnOn); + return; + } + #endif + #ifdef USER_DIGITAL_PIN_4 + if (io_num_mask & 1<<4) { + digitalWrite(USER_DIGITAL_PIN_4, turnOn); + return; + } + #endif + grbl_sendf(CLIENT_SERIAL, "[MSG:Undefined IO pin...%d]\r\n", io_num_mask); +} \ No newline at end of file diff --git a/Grbl_Esp32/system.h b/Grbl_Esp32/system.h index 61677860..787a82c8 100644 --- a/Grbl_Esp32/system.h +++ b/Grbl_Esp32/system.h @@ -225,5 +225,7 @@ int32_t system_convert_corexy_to_y_axis_steps(int32_t *steps); void controlCheckTask(void *pvParameters); void system_exec_control_pin(uint8_t pin); +void sys_io_control(uint8_t io_num_mask, bool turnOn); + #endif diff --git a/doc/csv/error_codes_en_US.csv b/doc/csv/error_codes_en_US.csv index 43d0b984..b64832bf 100644 --- a/doc/csv/error_codes_en_US.csv +++ b/doc/csv/error_codes_en_US.csv @@ -35,6 +35,7 @@ "36","Invalid gcode ID:36","Unused value words found in block." "37","Invalid gcode ID:37","G43.1 dynamic tool length offset is not assigned to configured tool length axis." "38","Invalid gcode ID:38","Tool number greater than max supported value." +"39","Parameter P exceeded max ID:39","Parameter P exceeded max" "60","SD failed to mount" "61","SD card failed to open file for reading" "62","SD card failed to open directory" diff --git a/doc/script/piecewise_example.png b/doc/script/piecewise_example.png new file mode 100644 index 0000000000000000000000000000000000000000..83b24d653abe4dad01bee36376fb236af7e5f57a GIT binary patch literal 38812 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 literal 0 HcmV?d00001 From 68ec92fa962e0aa3c9971ec533516feb30e7f2de Mon Sep 17 00:00:00 2001 From: bdring Date: Tue, 15 Oct 2019 17:54:59 -0500 Subject: [PATCH 2/2] fix Spindle Issue 262 https://github.com/bdring/Grbl_Esp32/issues/252 --- Grbl_Esp32/spindle_control.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Grbl_Esp32/spindle_control.cpp b/Grbl_Esp32/spindle_control.cpp index 44c77e7f..3714b8c2 100644 --- a/Grbl_Esp32/spindle_control.cpp +++ b/Grbl_Esp32/spindle_control.cpp @@ -106,16 +106,10 @@ void spindle_set_speed(uint32_t pwm_value) #ifndef INVERT_SPINDLE_PWM grbl_analogWrite(SPINDLE_PWM_CHANNEL, pwm_value); #else - if (pwm_value == 0) { - grbl_analogWrite(SPINDLE_PWM_CHANNEL, (1<