diff --git a/Marlin/AnycubicTFT.cpp b/Marlin/AnycubicTFT.cpp index 46bd506..f2766ab 100644 --- a/Marlin/AnycubicTFT.cpp +++ b/Marlin/AnycubicTFT.cpp @@ -115,6 +115,13 @@ void AnycubicTFTClass::Setup() { SelectedDirectory[0]=0; SpecialMenu=false; + + #ifdef STARTUP_CHIME + buzzer.tone(250, 554); // C#5 + buzzer.tone(250, 740); // F#5 + buzzer.tone(250, 554); // C#5 + buzzer.tone(500, 831); // G#5 + #endif } void AnycubicTFTClass::WriteOutageEEPromData() { diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 6b0f912..84a9d33 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -381,10 +381,10 @@ // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it - // i3 Mega - #define DEFAULT_Kp 15.94 - #define DEFAULT_Ki 1.17 - #define DEFAULT_Kd 54.19 + // i3 Mega stock v5 hotend, 40W heater cartridge (3.6Ω @ 22°C) + #define DEFAULT_Kp 18.58 + #define DEFAULT_Ki 1.38 + #define DEFAULT_Kd 62.40 // Ultimaker //#define DEFAULT_Kp 22.2 @@ -438,10 +438,10 @@ //#define PID_BED_DEBUG // Sends debug data to the serial port. - //Anycubic i3 Mega 160W Ultrabase - #define DEFAULT_bedKp 251.78 - #define DEFAULT_bedKi 49.57 - #define DEFAULT_bedKd 319.73 + //Anycubic i3 Mega Ultrabase (0.9Ω @ 22°C) + #define DEFAULT_bedKp 187.45 + #define DEFAULT_bedKi 35.75 + #define DEFAULT_bedKd 245.71 //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune @@ -1520,6 +1520,21 @@ // #define SPEAKER +// +// STARTUP CHIME +// +// Play a (non-earpiercing) startup chime on startup/serial connection +// of the Trigorilla board +// +//#define STARTUP_CHIME + +// +// ENDSTOP BEEP +// +// Short 2KHz beep when endstops are hit +// +//#define ENDSTOP_BEEP + // // The duration and frequency for the UI feedback sound. // Set these to 0 to disable audio feedback in the LCD menus. @@ -1821,13 +1836,13 @@ // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency // which is not as annoying as with the hardware PWM. On the other hand, if this frequency // is too low, you should also increment SOFT_PWM_SCALE. -//#define FAN_SOFT_PWM +#define FAN_SOFT_PWM // Incrementing this by 1 will double the software PWM frequency, // affecting heaters, and the fan if FAN_SOFT_PWM is enabled. // However, control resolution will be halved for each increment; // at zero value, there are 128 effective control positions. -#define SOFT_PWM_SCALE 0 +#define SOFT_PWM_SCALE 2 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can // be used to mitigate the associated resolution loss. If enabled, diff --git a/Marlin/G26_Mesh_Validation_Tool.cpp b/Marlin/G26_Mesh_Validation_Tool.cpp index ea8b601..ef898f9 100644 --- a/Marlin/G26_Mesh_Validation_Tool.cpp +++ b/Marlin/G26_Mesh_Validation_Tool.cpp @@ -44,8 +44,9 @@ #endif #define EXTRUSION_MULTIPLIER 1.0 - #define RETRACTION_MULTIPLIER 6 - #define PRIME_LENGTH 25.0 + #define RETRACTION_LENGTH 1 + #define UNRETRACTION_LENGTH 1.2 + #define PRIME_LENGTH 5 #define OOZE_AMOUNT 2.25 #define INTERSECTION_CIRCLE_RADIUS 5 @@ -107,8 +108,9 @@ * pliers while holding the LCD Click wheel in a depressed state. If you do not have * an LCD, you must specify a value if you use P. * - * Q # Multiplier Retraction Multiplier. Normally not needed. Retraction defaults to 1.0mm and - * un-retraction is at 1.2mm These numbers will be scaled by the specified amount + * Q # Retract Retraction length. Defaults to 1mm if not specified. + * Z # Unretract Unretraction length. Defaults to 1.2mm if not specified. + * Note: If Q is specified but Z isn't, Z defaults to Q * 1.2. * * R # Repeat Prints the number of patterns given as a parameter, starting at the current location. * If a parameter isn't given, every point will be printed unless G26 is interrupted. @@ -145,7 +147,8 @@ // retracts/recovers won't result in a bad state. static float g26_extrusion_multiplier, - g26_retraction_multiplier, + g26_retraction_length, + g26_unretraction_length, g26_layer_height, g26_prime_length, g26_x_pos, g26_y_pos; @@ -223,13 +226,13 @@ void retract_filament(const float where[XYZE]) { if (!g26_retracted) { // Only retract if we are not already retracted! g26_retracted = true; - move_to(where, -1.0 * g26_retraction_multiplier); + move_to(where, -1.0 * g26_retraction_length); } } void recover_filament(const float where[XYZE]) { if (g26_retracted) { // Only un-retract if we are retracted. - move_to(where, 1.2 * g26_retraction_multiplier); + move_to(where, g26_unretraction_length); g26_retracted = false; } } @@ -564,7 +567,8 @@ if (axis_unhomed_error()) return; g26_extrusion_multiplier = EXTRUSION_MULTIPLIER; - g26_retraction_multiplier = RETRACTION_MULTIPLIER; + g26_retraction_length = RETRACTION_LENGTH; + g26_unretraction_length = UNRETRACTION_LENGTH; g26_layer_height = MESH_TEST_LAYER_HEIGHT; g26_prime_length = PRIME_LENGTH; g26_bed_temp = MESH_TEST_BED_TEMP; @@ -596,14 +600,44 @@ if (parser.seen('Q')) { if (parser.has_value()) { - g26_retraction_multiplier = parser.value_float(); - if (!WITHIN(g26_retraction_multiplier, 0.05, 15.0)) { - SERIAL_PROTOCOLLNPGM("?Specified Retraction Multiplier not plausible."); + g26_retraction_length = parser.value_float(); + if (!WITHIN(g26_retraction_length, 0.05, 15.0)) { + SERIAL_PROTOCOLLNPGM("?Specified Retraction length not plausible."); return; } } else { - SERIAL_PROTOCOLLNPGM("?Retraction Multiplier must be specified."); + SERIAL_PROTOCOLLNPGM("?Retraction length must be specified."); + return; + } + } + + if (parser.seen('Z')) { + if (parser.has_value()) { + g26_unretraction_length = parser.value_float(); + if (!WITHIN(g26_unretraction_length, 0.05, 15.0)) { + SERIAL_PROTOCOLLNPGM("?Specified Unretraction length not plausible."); + return; + } + } + else { + SERIAL_PROTOCOLLNPGM("?Unretraction length must be specified."); + return; + } + } + + if (!parser.seen('Z') && parser.seen('Q')) { + // retraction without unretraction specified, use 1.2 multiplier (preserve Gcode spec) + g26_unretraction_length = g26_retraction_length * 1.2; + SERIAL_ECHOPAIR(" Unretraction amount automatically set to ", g26_unretraction_length); + SERIAL_EOL(); + } + + if (parser.seen('Z') && parser.seen('Q')) { + // consider typos or unreasonable retract/unretract ratios + float g26_retract_unretract_delta = g26_unretraction_length - g26_retraction_length; + if (!WITHIN(g26_retract_unretract_delta, -5, 5)) { + SERIAL_PROTOCOLLNPGM("?Invalid Retraction/Unretraction ratio. Must be within 5mm."); return; } } diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 6611bc9..1192126 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -14815,6 +14815,25 @@ void disable_all_steppers() { disable_e_steppers(); } +#ifdef ENDSTOP_BEEP + void EndstopBeep() { + static char last_status=((READ(X_MIN_PIN)<<2)|(READ(Y_MIN_PIN)<<1)|READ(X_MAX_PIN)); + static unsigned char now_status; + + now_status=((READ(X_MIN_PIN)<<2)|(READ(Y_MIN_PIN)<<1)|READ(X_MAX_PIN))&0xff; + + if(now_status