Implements a nozzle cleaning pattern generator (G12)
This commit is contained in:
		
							parent
							
								
									4f77adddbe
								
							
						
					
					
						commit
						b05a75655a
					
				| @ -211,6 +211,12 @@ script: | ||||
|   - opt_enable PRINTCOUNTER | ||||
|   - build_marlin | ||||
|   # | ||||
|   # Test CLEAN_NOZZLE_FEATURE | ||||
|   # | ||||
|   - restore_configs | ||||
|   - opt_enable AUTO_BED_LEVELING_FEATURE CLEAN_NOZZLE_FEATURE FIX_MOUNTED_PROBE | ||||
|   - build_marlin | ||||
|   # | ||||
|   # | ||||
|   ######## STANDARD LCD/PANELS ############## | ||||
|   # | ||||
|  | ||||
| @ -787,6 +787,44 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l | ||||
| #define PREHEAT_2_TEMP_BED    110 | ||||
| #define PREHEAT_2_FAN_SPEED     0 // Value from 0 to 255
 | ||||
| 
 | ||||
| //
 | ||||
| // Clean Nozzle Feature -- EXPERIMENTAL
 | ||||
| //
 | ||||
| // When enabled allows the user to send G12 to start the nozzle cleaning
 | ||||
| // process, the G-Code accepts two parameters:
 | ||||
| //   "P" for pattern selection
 | ||||
| //   "S" for defining the number of strokes/repetitions
 | ||||
| //
 | ||||
| // Available list of patterns:
 | ||||
| //   P0: This is the default pattern, this process requires a sponge type
 | ||||
| //       material at a fixed bed location, the cleaning process is based on
 | ||||
| //       "strokes" i.e. back-and-forth movements between the starting and end
 | ||||
| //       points.
 | ||||
| //
 | ||||
| //   P1: This starts a zig-zag pattern between (Xs, Ys) and (Xe, Ye), "S"
 | ||||
| //       defines the number of zig-zag triangles to be done. Each "side"
 | ||||
| //       cannot be less than 5mm. As an example "G12 P1 S3" will execute:
 | ||||
| //
 | ||||
| //                                                /|   /|   /| (Xe, Ye)
 | ||||
| //                                               / |  / |  / |
 | ||||
| //                                              /  | /  | /  |
 | ||||
| //                                    (Xs, Ys) /   |/   |/   |
 | ||||
| //
 | ||||
| //
 | ||||
| // Caveats: End point Z should use the same value as Start point Z.
 | ||||
| //
 | ||||
| // Attention: This is an EXPERIMENTAL feature, in the future the G-code arguments
 | ||||
| // may change to add new functionality like different wipe patterns.
 | ||||
| //
 | ||||
| //#define CLEAN_NOZZLE_FEATURE
 | ||||
| 
 | ||||
| #if ENABLED(CLEAN_NOZZLE_FEATURE) | ||||
|   #define CLEAN_NOZZLE_STROKES  12 | ||||
|   #define CLEAN_NOZZLE_START_PT { 30, 30, (Z_MIN_POS + 1), 0} | ||||
|   #define CLEAN_NOZZLE_END_PT   {100, 60, (Z_MIN_POS + 1), 0} | ||||
|   //                            {  X,  Y,               Z, E}
 | ||||
| #endif | ||||
| 
 | ||||
| //
 | ||||
| // Print job timer
 | ||||
| //
 | ||||
|  | ||||
| @ -106,8 +106,9 @@ | ||||
|  * G3  - CCW ARC | ||||
|  * G4  - Dwell S<seconds> or P<milliseconds> | ||||
|  * G5  - Cubic B-spline with XYZE destination and IJPQ offsets | ||||
|  * G10 - retract filament according to settings of M207 | ||||
|  * G11 - retract recover filament according to settings of M208 | ||||
|  * G10 - Retract filament according to settings of M207 | ||||
|  * G11 - Retract recover filament according to settings of M208 | ||||
|  * G12 - Clean tool | ||||
|  * G20 - Set input units to inches | ||||
|  * G21 - Set input units to millimeters | ||||
|  * G28 - Home one or more axes | ||||
| @ -1703,6 +1704,10 @@ static void clean_up_after_endstop_or_probe_move() { | ||||
|     do_blocking_move_to(x, current_position[Y_AXIS], current_position[Z_AXIS], feed_rate); | ||||
|   } | ||||
| 
 | ||||
|   inline void do_blocking_move_to_y(float y) { | ||||
|     do_blocking_move_to(current_position[X_AXIS], y, current_position[Z_AXIS]); | ||||
|   } | ||||
| 
 | ||||
|   inline void do_blocking_move_to_z(float z, float feed_rate = 0.0) { | ||||
|     do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], z, feed_rate); | ||||
|   } | ||||
| @ -2712,6 +2717,23 @@ inline void gcode_G4() { | ||||
| 
 | ||||
| #endif //FWRETRACT
 | ||||
| 
 | ||||
| #if ENABLED(CLEAN_NOZZLE_FEATURE) && ENABLED(AUTO_BED_LEVELING_FEATURE) | ||||
|   #include "clean_nozzle.h" | ||||
| 
 | ||||
|   inline void gcode_G12() { | ||||
|     // Don't allow nozzle cleaning without homing first
 | ||||
|     if (!axis_homed[X_AXIS] || !axis_homed[Y_AXIS] || !axis_homed[Z_AXIS]) { | ||||
|       axis_unhomed_error(true); | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     uint8_t const pattern = code_seen('P') ? code_value_ushort() : 0; | ||||
|     uint8_t const strokes = code_seen('S') ? code_value_ushort() : CLEAN_NOZZLE_STROKES; | ||||
| 
 | ||||
|     CleanNozzle::start(pattern, strokes); | ||||
|   } | ||||
| #endif | ||||
| 
 | ||||
| #if ENABLED(INCH_MODE_SUPPORT) | ||||
|   /**
 | ||||
|    * G20: Set input mode to inches | ||||
| @ -6748,12 +6770,10 @@ void process_next_command() { | ||||
| 
 | ||||
|       // G2, G3
 | ||||
|       #if ENABLED(ARC_SUPPORT) && DISABLED(SCARA) | ||||
| 
 | ||||
|         case 2: // G2  - CW ARC
 | ||||
|         case 3: // G3  - CCW ARC
 | ||||
|           gcode_G2_G3(codenum == 2); | ||||
|           break; | ||||
| 
 | ||||
|       #endif | ||||
| 
 | ||||
|       // G4 Dwell
 | ||||
| @ -6762,23 +6782,25 @@ void process_next_command() { | ||||
|         break; | ||||
| 
 | ||||
|       #if ENABLED(BEZIER_CURVE_SUPPORT) | ||||
| 
 | ||||
|         // G5
 | ||||
|         case 5: // G5  - Cubic B_spline
 | ||||
|           gcode_G5(); | ||||
|           break; | ||||
| 
 | ||||
|       #endif // BEZIER_CURVE_SUPPORT
 | ||||
| 
 | ||||
|       #if ENABLED(FWRETRACT) | ||||
| 
 | ||||
|         case 10: // G10: retract
 | ||||
|         case 11: // G11: retract_recover
 | ||||
|           gcode_G10_G11(codenum == 10); | ||||
|           break; | ||||
| 
 | ||||
|       #endif // FWRETRACT
 | ||||
| 
 | ||||
|       #if ENABLED(CLEAN_NOZZLE_FEATURE) && ENABLED(AUTO_BED_LEVELING_FEATURE) | ||||
|         case 12: | ||||
|           gcode_G12(); // G12: Clean Nozzle
 | ||||
|           break; | ||||
|       #endif // CLEAN_NOZZLE_FEATURE
 | ||||
| 
 | ||||
|       #if ENABLED(INCH_MODE_SUPPORT) | ||||
|         case 20: //G20: Inch Mode
 | ||||
|           gcode_G20(); | ||||
| @ -6787,7 +6809,7 @@ void process_next_command() { | ||||
|         case 21: //G21: MM Mode
 | ||||
|           gcode_G21(); | ||||
|           break; | ||||
|       #endif | ||||
|       #endif // INCH_MODE_SUPPORT
 | ||||
| 
 | ||||
|       case 28: // G28: Home all axes, one at a time
 | ||||
|         gcode_G28(); | ||||
| @ -6797,7 +6819,7 @@ void process_next_command() { | ||||
|         case 29: // G29 Detailed Z probe, probes the bed at 3 or more points.
 | ||||
|           gcode_G29(); | ||||
|           break; | ||||
|       #endif | ||||
|       #endif // AUTO_BED_LEVELING_FEATURE
 | ||||
| 
 | ||||
|       #if HAS_BED_PROBE | ||||
| 
 | ||||
| @ -6816,7 +6838,6 @@ void process_next_command() { | ||||
|               break; | ||||
| 
 | ||||
|         #endif // Z_PROBE_SLED
 | ||||
| 
 | ||||
|       #endif // HAS_BED_PROBE
 | ||||
| 
 | ||||
|       case 90: // G90
 | ||||
| @ -6845,7 +6866,6 @@ void process_next_command() { | ||||
|         break; | ||||
| 
 | ||||
|       #if ENABLED(SDSUPPORT) | ||||
| 
 | ||||
|         case 20: // M20 - list SD card
 | ||||
|           gcode_M20(); break; | ||||
|         case 21: // M21 - init SD card
 | ||||
| @ -6878,7 +6898,6 @@ void process_next_command() { | ||||
| 
 | ||||
|         case 928: //M928 - Start SD write
 | ||||
|           gcode_M928(); break; | ||||
| 
 | ||||
|       #endif //SDSUPPORT
 | ||||
| 
 | ||||
|       case 31: //M31 take time since the start of the SD print or an M109 command
 | ||||
| @ -6948,11 +6967,9 @@ void process_next_command() { | ||||
|       #endif | ||||
| 
 | ||||
|       #if ENABLED(HOST_KEEPALIVE_FEATURE) | ||||
| 
 | ||||
|         case 113: // M113: Set Host Keepalive interval
 | ||||
|           gcode_M113(); | ||||
|           break; | ||||
| 
 | ||||
|       #endif | ||||
| 
 | ||||
|       case 140: // M140: Set bed temp
 | ||||
|  | ||||
| @ -646,4 +646,11 @@ | ||||
|   #error "ABS_PREHEAT_FAN_SPEED is now PREHEAT_2_FAN_SPEED. Please update your configuration." | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * Nozzle cleaning | ||||
|  */ | ||||
| #if ENABLED(CLEAN_NOZZLE_FEATURE) && DISABLED(AUTO_BED_LEVELING_FEATURE) | ||||
|   #error You must enable AUTO_BED_LEVELING_FEATURE for CLEAN_NOZZLE_FEATURE to work | ||||
| #endif | ||||
| 
 | ||||
| #endif //SANITYCHECK_H
 | ||||
|  | ||||
							
								
								
									
										112
									
								
								Marlin/clean_nozzle.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								Marlin/clean_nozzle.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,112 @@ | ||||
| /*
 | ||||
|  * Marlin 3D Printer Firmware | ||||
|  * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
 | ||||
|  * | ||||
|  * Based on Sprinter and grbl. | ||||
|  * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #ifndef __CLEAN_NOZZLE_H__ | ||||
| #define __CLEAN_NOZZLE_H__ | ||||
| 
 | ||||
| #include "Marlin.h" | ||||
| #include "point_t.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief CleanNozzle class | ||||
|  * | ||||
|  * @todo: Do not ignore the end.z value and allow XYZ movements | ||||
|  * @todo: Currently this feature needs AUTO_BED_LEVELING_FEATURE to be active | ||||
|  *  due to the do_blocking_move_to*() functions. | ||||
|  */ | ||||
| class CleanNozzle { | ||||
|   private: | ||||
|     /**
 | ||||
|      * @brief Stroke clean pattern | ||||
|      * @details Wipes the nozzle back and forth in a linear movement | ||||
|      * | ||||
|      * @param start point_t defining the starting point | ||||
|      * @param end point_t defining the ending point | ||||
|      * @param strokes number of strokes to execute | ||||
|      */ | ||||
|     static void stroke(point_t const &start, point_t const &end, uint8_t const &strokes) | ||||
|     __attribute__ ((optimize ("Os"))) { | ||||
|       // Move to the starting point
 | ||||
|       do_blocking_move_to_xy(start.x, start.y); | ||||
|       do_blocking_move_to_z(start.z); | ||||
| 
 | ||||
|       // Start the stroke pattern
 | ||||
|       for (uint8_t i = 0; i < (strokes >>1); i++) { | ||||
|         do_blocking_move_to_xy(end.x, end.y); | ||||
|         do_blocking_move_to_xy(start.x, start.y); | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     /**
 | ||||
|      * @brief Zig-zag clean pattern | ||||
|      * @details Apply a zig-zag cleanning pattern | ||||
|      * | ||||
|      * @param start point_t defining the starting point | ||||
|      * @param end point_t defining the ending point | ||||
|      * @param triangles number of triangles to execute | ||||
|      */ | ||||
|     static void zigzag(point_t const &start, point_t const &end, uint8_t const &triangles) | ||||
|     __attribute__ ((optimize ("Os"))) { | ||||
|       // Move to the starting point
 | ||||
|       do_blocking_move_to_xy(start.x, start.y); | ||||
|       do_blocking_move_to_z(start.z); | ||||
| 
 | ||||
|       // Calculate the triangle side
 | ||||
|       float const a = fabs(end.x - start.x) / triangles; | ||||
| 
 | ||||
|       // Don't allow the sides (a, b) to be smaller than 5mm
 | ||||
|       if (a < 5 || fabs(end.y - start.y) < 5) return; | ||||
| 
 | ||||
|       // Start the zig-zag pattern
 | ||||
|       for (uint8_t i = 0; i < triangles; i++) { | ||||
|         float const x = start.x + (a * (i + 1)); | ||||
|         do_blocking_move_to_xy(x, end.y); | ||||
|         do_blocking_move_to_y(start.y); | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|   public: | ||||
|     /**
 | ||||
|      * @brief Clean the nozzle | ||||
|      * @details Starts the selected clean procedure pattern | ||||
|      * | ||||
|      * @param pattern one of the available patterns | ||||
|      * @param argument depends on the cleaning pattern | ||||
|      */ | ||||
|     static void start(uint8_t const &pattern, uint8_t const &argument) | ||||
|     __attribute__ ((optimize ("Os"))) { | ||||
|       switch (pattern) { | ||||
|         case 1: | ||||
|           CleanNozzle::zigzag( | ||||
|             CLEAN_NOZZLE_START_PT, | ||||
|             CLEAN_NOZZLE_END_PT, argument); | ||||
|           break; | ||||
| 
 | ||||
|         default: | ||||
|           CleanNozzle::stroke( | ||||
|             CLEAN_NOZZLE_START_PT, | ||||
|             CLEAN_NOZZLE_END_PT, argument); | ||||
|       } | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										33
									
								
								Marlin/point_t.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								Marlin/point_t.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| /**
 | ||||
|  * Marlin 3D Printer Firmware | ||||
|  * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
 | ||||
|  * | ||||
|  * Based on Sprinter and grbl. | ||||
|  * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #ifndef __POINT_T__ | ||||
| #define __POINT_T__ | ||||
| 
 | ||||
| struct point_t { | ||||
|   float x; | ||||
|   float y; | ||||
|   float z; | ||||
|   float e; | ||||
| }; | ||||
| 
 | ||||
| #endif | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user