From 3c64bad1cbce97d661ce2352f3da74ebe7b77370 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 21 Dec 2018 17:12:16 +0100 Subject: [PATCH] initial version which works on old and new hw, initial version of idler sensor detection --- Firmware/mmu.cpp | 150 ++++++++++-------- Firmware/mmu.h | 2 + Firmware/pins_Einsy_1_0.h | 1 + Firmware/pins_Rambo_1_0.h | 2 +- Firmware/pins_Rambo_1_3.h | 2 +- Firmware/ultralcd.cpp | 6 +- .../variants/1_75mm_MK3-EINSy10a-E3Dv6full.h | 2 +- 7 files changed, 91 insertions(+), 74 deletions(-) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index a7341655..f1cc840b 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -38,9 +38,10 @@ static int8_t mmu_state = 0; uint8_t mmu_cmd = 0; -#ifdef MMU_IDLER_SENSOR_PIN +//idler ir sensor uint8_t mmu_idl_sens = 0; -#endif //MMU_IDLER_SENSOR_PIN +bool mmu_idler_sensor_detected = false; + uint8_t mmu_extruder = MMU_FILAMENT_UNKNOWN; @@ -111,10 +112,25 @@ void mmu_init(void) _delay_ms(10); //wait 10ms for sure mmu_reset(); //reset mmu (HW or SW), do not wait for response mmu_state = -1; -#ifdef MMU_IDLER_SENSOR_PIN PIN_INP(MMU_IDLER_SENSOR_PIN); //input mode PIN_SET(MMU_IDLER_SENSOR_PIN); //pullup -#endif //MMU_IDLER_SENSOR_PIN +} + +//returns true if idler IR sensor was detected, otherwise returns false +bool check_for_idler_sensor() +{ + bool detected = false; + //if MMU_IDLER_SENSOR_PIN input is low and pat9125sensor is not present we detected idler sensor + if ((PIN_GET(MMU_IDLER_SENSOR_PIN) == 0) && fsensor_not_responding) + { + detected = true; + //printf_P(PSTR("Idler IR sensor detected\n")); + } + else + { + //printf_P(PSTR("Idler IR sensor not detected\n")); + } + return detected; } //mmu main loop - state machine processing @@ -167,9 +183,9 @@ void mmu_loop(void) if ((PRINTER_TYPE == PRINTER_MK3) || (PRINTER_TYPE == PRINTER_MK3_SNMM)) { -#ifdef MMU_DEBUG +#if defined MMU_DEBUG && defined MMU_FINDA_DEBUG puts_P(PSTR("MMU <= 'P0'")); -#endif //MMU_DEBUG +#endif //MMU_DEBUG && MMU_FINDA_DEBUG mmu_puts_P(PSTR("P0\n")); //send 'read finda' request mmu_state = -4; } @@ -187,9 +203,9 @@ void mmu_loop(void) case -5: if (mmu_rx_ok() > 0) { -#ifdef MMU_DEBUG +#if defined MMU_DEBUG && defined MMU_FINDA_DEBUG puts_P(PSTR("MMU <= 'P0'")); -#endif //MMU_DEBUG +#endif //MMU_DEBUG && MMU_FINDA_DEBUG mmu_puts_P(PSTR("P0\n")); //send 'read finda' request mmu_state = -4; } @@ -198,11 +214,13 @@ void mmu_loop(void) if (mmu_rx_ok() > 0) { fscanf_P(uart2io, PSTR("%hhu"), &mmu_finda); //scan finda from buffer -#ifdef MMU_DEBUG +#if defined MMU_DEBUG && defined MMU_FINDA_DEBUG printf_P(PSTR("MMU => '%dok'\n"), mmu_finda); -#endif //MMU_DEBUG +#endif //MMU_DEBUG && MMU_FINDA_DEBUG puts_P(PSTR("MMU - ENABLED")); mmu_enabled = true; + //if we have filament loaded into the nozzle, we can decide if printer has idler sensor right now; otherwise we will will wait till start of T-code so it will be detected on beginning of second T-code + if(check_for_idler_sensor()) mmu_idler_sensor_detected = true; mmu_state = 1; } return; @@ -218,9 +236,7 @@ void mmu_loop(void) mmu_printf_P(PSTR("T%d\n"), filament); mmu_state = 3; // wait for response mmu_fil_loaded = true; -#ifdef MMU_IDLER_SENSOR_PIN - mmu_idl_sens = 1; //enable idler sensor -#endif //MMU_IDLER_SENSOR_PIN + if(mmu_idler_sensor_detected) mmu_idl_sens = 1; //if idler sensor detected, use it for T-code } else if ((mmu_cmd >= MMU_CMD_L0) && (mmu_cmd <= MMU_CMD_L4)) { @@ -238,9 +254,7 @@ void mmu_loop(void) #endif //MMU_DEBUG mmu_puts_P(PSTR("C0\n")); //send 'continue loading' mmu_state = 3; -#ifdef MMU_IDLER_SENSOR_PIN - mmu_idl_sens = 1; //enable idler sensor -#endif //MMU_IDLER_SENSOR_PIN + if(mmu_idler_sensor_detected) mmu_idl_sens = 1; //if idler sensor detected use it for C0 code } else if (mmu_cmd == MMU_CMD_U0) { @@ -273,9 +287,10 @@ void mmu_loop(void) } else if ((mmu_last_response + 300) < millis()) //request every 300ms { -#ifdef MMU_DEBUG + if(check_for_idler_sensor()) mmu_idler_sensor_detected = true; +#if defined MMU_DEBUG && defined MMU_FINDA_DEBUG puts_P(PSTR("MMU <= 'P0'")); -#endif //MMU_DEBUG +#endif //MMU_DEBUG && MMU_FINDA_DEBUG mmu_puts_P(PSTR("P0\n")); //send 'read finda' request mmu_state = 2; } @@ -284,9 +299,9 @@ void mmu_loop(void) if (mmu_rx_ok() > 0) { fscanf_P(uart2io, PSTR("%hhu"), &mmu_finda); //scan finda from buffer -#ifdef MMU_DEBUG +#if defined MMU_DEBUG && MMU_FINDA_DEBUG printf_P(PSTR("MMU => '%dok'\n"), mmu_finda); -#endif //MMU_DEBUG +#endif //MMU_DEBUG && MMU_FINDA_DEBUG //printf_P(PSTR("Eact: %d\n"), int(e_active())); if (!mmu_finda && CHECK_FINDA && fsensor_enabled) { fsensor_stop_and_save_print(); @@ -304,22 +319,22 @@ void mmu_loop(void) } return; case 3: //response to mmu commands -#ifdef MMU_IDLER_SENSOR_PIN - if (mmu_idl_sens) - { - if (PIN_GET(MMU_IDLER_SENSOR_PIN) == 0) + if (mmu_idler_sensor_detected) { + if (mmu_idl_sens) { + if (PIN_GET(MMU_IDLER_SENSOR_PIN) == 0) + { #ifdef MMU_DEBUG - printf_P(PSTR("MMU <= 'A'\n")); + printf_P(PSTR("MMU <= 'A'\n")); #endif //MMU_DEBUG - mmu_puts_P(PSTR("A\n")); //send 'abort' request - mmu_idl_sens = 0; - //printf_P(PSTR("MMU IDLER_SENSOR = 0 - ABORT\n")); + mmu_puts_P(PSTR("A\n")); //send 'abort' request + mmu_idl_sens = 0; + //printf_P(PSTR("MMU IDLER_SENSOR = 0 - ABORT\n")); + } + //else + //printf_P(PSTR("MMU IDLER_SENSOR = 1 - WAIT\n")); } - //else - //printf_P(PSTR("MMU IDLER_SENSOR = 1 - WAIT\n")); } -#endif //MMU_IDLER_SENSOR_PIN if (mmu_rx_ok() > 0) { #ifdef MMU_DEBUG @@ -379,6 +394,8 @@ void mmu_load_step() { } bool mmu_get_response(uint8_t move) { + if (!mmu_idler_sensor_detected) move = MMU_NO_MOVE; + printf_P(PSTR("mmu_get_response - begin move:%d\n"), move); KEEPALIVE_STATE(IN_PROCESS); while (mmu_cmd != 0) @@ -399,7 +416,6 @@ bool mmu_get_response(uint8_t move) mmu_load_step(); break; case MMU_UNLOAD_MOVE: -#ifdef MMU_IDLER_SENSOR_PIN if (PIN_GET(MMU_IDLER_SENSOR_PIN) == 0) //filament is still detected by idler sensor, printer helps with unlading { printf_P(PSTR("Unload 1\n")); @@ -408,7 +424,6 @@ bool mmu_get_response(uint8_t move) st_synchronize(); } else //filament was unloaded from idler, no additional movements needed -#endif //MMU_IDLER_SENSOR_PIN { printf_P(PSTR("Unloading finished 1\n")); disable_e0(); //turn off E-stepper to prevent overheating and alow filament pull-out if necessary @@ -417,7 +432,6 @@ bool mmu_get_response(uint8_t move) break; case MMU_TCODE_MOVE: //first do unload and then continue with infinite loading movements -#ifdef MMU_IDLER_SENSOR_PIN if (PIN_GET(MMU_IDLER_SENSOR_PIN) == 0) //filament detected by idler sensor, we must unload first { printf_P(PSTR("Unload 2\n")); @@ -426,7 +440,6 @@ bool mmu_get_response(uint8_t move) st_synchronize(); } else //delay to allow mmu unit to pull out filament from bondtech gears and then start with infinite loading -#endif //MMU_IDLER_SENSOR_PIN { printf_P(PSTR("Unloading finished 2\n")); disable_e0(); //turn off E-stepper to prevent overheating and alow filament pull-out if necessary @@ -1243,41 +1256,42 @@ void mmu_eject_filament(uint8_t filament, bool recover) void mmu_continue_loading() { -#ifdef MMU_IDLER_SENSOR_PIN - for (uint8_t i = 0; i < MMU_IDLER_SENSOR_ATTEMPTS_NR; i++) { - if (PIN_GET(MMU_IDLER_SENSOR_PIN) == 0) return; + if (mmu_idler_sensor_detected) { + for (uint8_t i = 0; i < MMU_IDLER_SENSOR_ATTEMPTS_NR; i++) { + if (PIN_GET(MMU_IDLER_SENSOR_PIN) == 0) return; #ifdef MMU_DEBUG - printf_P(PSTR("Additional load attempt nr. %d\n"), i); + printf_P(PSTR("Additional load attempt nr. %d\n"), i); #endif // MMU_DEBUG - mmu_command(MMU_CMD_C0); - manage_response(true, true, MMU_LOAD_MOVE); - } - if (PIN_GET(MMU_IDLER_SENSOR_PIN) != 0) { - eeprom_update_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL, eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL) + 1); - eeprom_update_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT, eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT) + 1); - char cmd[3]; - //pause print, show error message and then repeat last T-code - stop_and_save_print_to_ram(0, 0); + mmu_command(MMU_CMD_C0); + manage_response(true, true, MMU_LOAD_MOVE); + } + if (PIN_GET(MMU_IDLER_SENSOR_PIN) != 0) { + eeprom_update_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL, eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL) + 1); + eeprom_update_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT, eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT) + 1); + char cmd[3]; + //pause print, show error message and then repeat last T-code + stop_and_save_print_to_ram(0, 0); - //lift z - current_position[Z_AXIS] += Z_PAUSE_LIFT; - if (current_position[Z_AXIS] > Z_MAX_POS) current_position[Z_AXIS] = Z_MAX_POS; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 15, active_extruder); - st_synchronize(); - - //Move XY to side - current_position[X_AXIS] = X_PAUSE_POS; - current_position[Y_AXIS] = Y_PAUSE_POS; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 50, active_extruder); - st_synchronize(); - //set nozzle target temperature to 0 - setAllTargetHotends(0); - lcd_show_fullscreen_message_and_wait_P(_i("MMU load failed, fix the issue and press the knob.")); - mmu_fil_loaded = false; //so we can retry same T-code again - restore_print_from_ram_and_continue(0); - } -#else - mmu_command(MMU_CMD_C0); -#endif //MMU_IDLER_SENSOR_PIN + //lift z + current_position[Z_AXIS] += Z_PAUSE_LIFT; + if (current_position[Z_AXIS] > Z_MAX_POS) current_position[Z_AXIS] = Z_MAX_POS; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 15, active_extruder); + st_synchronize(); + + //Move XY to side + current_position[X_AXIS] = X_PAUSE_POS; + current_position[Y_AXIS] = Y_PAUSE_POS; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 50, active_extruder); + st_synchronize(); + //set nozzle target temperature to 0 + setAllTargetHotends(0); + lcd_show_fullscreen_message_and_wait_P(_i("MMU load failed, fix the issue and press the knob.")); + mmu_fil_loaded = false; //so we can retry same T-code again + restore_print_from_ram_and_continue(0); + } + } + else { //mmu_idler_sensor_detected == false + mmu_command(MMU_CMD_C0); + } } diff --git a/Firmware/mmu.h b/Firmware/mmu.h index b6fbaaa6..c3416cbc 100644 --- a/Firmware/mmu.h +++ b/Firmware/mmu.h @@ -11,6 +11,7 @@ extern uint8_t mmu_extruder; extern uint8_t tmp_extruder; extern int8_t mmu_finda; +extern bool mmu_idler_sensor_detected; extern int16_t mmu_version; extern int16_t mmu_buildnr; @@ -52,6 +53,7 @@ extern int mmu_printf_P(const char* format, ...); extern int8_t mmu_rx_ok(void); +extern bool check_for_idler_sensor(); extern void mmu_init(void); diff --git a/Firmware/pins_Einsy_1_0.h b/Firmware/pins_Einsy_1_0.h index eabdb4ab..4ef8f9ba 100644 --- a/Firmware/pins_Einsy_1_0.h +++ b/Firmware/pins_Einsy_1_0.h @@ -121,6 +121,7 @@ #define TACH_0 79 // !!! changed from 81 (EINY03) #define TACH_1 80 +#define MMU_IDLER_SENSOR_PIN 62 //idler sensor @PK0 (digital pin 62/A8) // Support for an 8 bit logic analyzer, for example the Saleae. // Channels 0-2 are fast, they could generate 2.667Mhz waveform with a software loop. diff --git a/Firmware/pins_Rambo_1_0.h b/Firmware/pins_Rambo_1_0.h index 1e3a142c..b37ab641 100644 --- a/Firmware/pins_Rambo_1_0.h +++ b/Firmware/pins_Rambo_1_0.h @@ -102,7 +102,7 @@ #define SDCARDDETECT 72 - +#define MMU_IDLER_SENSOR_PIN 62 //idler sensor @PK0 (digital pin 62/A8) // Support for an 8 bit logic analyzer, for example the Saleae. // Channels 0-2 are fast, they could generate 2.667Mhz waveform with a software loop. diff --git a/Firmware/pins_Rambo_1_3.h b/Firmware/pins_Rambo_1_3.h index a9a6b390..297735c1 100644 --- a/Firmware/pins_Rambo_1_3.h +++ b/Firmware/pins_Rambo_1_3.h @@ -102,7 +102,7 @@ #define SDCARDDETECT 15 - +#define MMU_IDLER_SENSOR_PIN 62 //idler sensor @PK0 (digital pin 62/A8) // Support for an 8 bit logic analyzer, for example the Saleae. // Channels 0-2 are fast, they could generate 2.667Mhz waveform with a software loop. diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 72f34459..cff7a1f1 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -3653,9 +3653,9 @@ static void lcd_show_sensors_state() if (mmu_enabled) { finda_state = mmu_finda; } -#ifdef MMU_IDLER_SENSOR_PIN - idler_state = !PIN_GET(MMU_IDLER_SENSOR_PIN); -#endif + if (mmu_idler_sensor_detected) { + idler_state = !PIN_GET(MMU_IDLER_SENSOR_PIN); + } lcd_puts_at_P(0, 0, _i("Sensors state")); lcd_puts_at_P(1, 1, _i("PINDA:")); lcd_set_cursor(LCD_WIDTH - 4, 1); diff --git a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h index 1e79a89d..eaa9fc24 100644 --- a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h @@ -614,7 +614,7 @@ #define MMU_REQUIRED_FW_BUILDNR 83 #define MMU_HWRESET //#define MMU_DEBUG //print communication between MMU2 and printer on serial -#define MMU_IDLER_SENSOR_PIN 62 //idler sensor @PK0 (digital pin 62/A8) + #define MMU_IDLER_SENSOR_ATTEMPTS_NR 21 //max. number of attempts to load filament if first load failed; value for max bowden length and case when loading fails right at the beginning #endif //__CONFIGURATION_PRUSA_H