Implements a nozzle cleaning pattern generator (G12)

master
João Brázio 9 years ago
parent 4f77adddbe
commit b05a75655a

@ -211,6 +211,12 @@ script:
- opt_enable PRINTCOUNTER - opt_enable PRINTCOUNTER
- build_marlin - 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 ############## ######## 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_TEMP_BED 110
#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 #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 // Print job timer
// //

@ -106,8 +106,9 @@
* G3 - CCW ARC * G3 - CCW ARC
* G4 - Dwell S<seconds> or P<milliseconds> * G4 - Dwell S<seconds> or P<milliseconds>
* G5 - Cubic B-spline with XYZE destination and IJPQ offsets * G5 - Cubic B-spline with XYZE destination and IJPQ offsets
* G10 - retract filament according to settings of M207 * G10 - Retract filament according to settings of M207
* G11 - retract recover filament according to settings of M208 * G11 - Retract recover filament according to settings of M208
* G12 - Clean tool
* G20 - Set input units to inches * G20 - Set input units to inches
* G21 - Set input units to millimeters * G21 - Set input units to millimeters
* G28 - Home one or more axes * 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); 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) { 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); 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 #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) #if ENABLED(INCH_MODE_SUPPORT)
/** /**
* G20: Set input mode to inches * G20: Set input mode to inches
@ -6748,12 +6770,10 @@ void process_next_command() {
// G2, G3 // G2, G3
#if ENABLED(ARC_SUPPORT) && DISABLED(SCARA) #if ENABLED(ARC_SUPPORT) && DISABLED(SCARA)
case 2: // G2 - CW ARC case 2: // G2 - CW ARC
case 3: // G3 - CCW ARC case 3: // G3 - CCW ARC
gcode_G2_G3(codenum == 2); gcode_G2_G3(codenum == 2);
break; break;
#endif #endif
// G4 Dwell // G4 Dwell
@ -6762,23 +6782,25 @@ void process_next_command() {
break; break;
#if ENABLED(BEZIER_CURVE_SUPPORT) #if ENABLED(BEZIER_CURVE_SUPPORT)
// G5 // G5
case 5: // G5 - Cubic B_spline case 5: // G5 - Cubic B_spline
gcode_G5(); gcode_G5();
break; break;
#endif // BEZIER_CURVE_SUPPORT #endif // BEZIER_CURVE_SUPPORT
#if ENABLED(FWRETRACT) #if ENABLED(FWRETRACT)
case 10: // G10: retract case 10: // G10: retract
case 11: // G11: retract_recover case 11: // G11: retract_recover
gcode_G10_G11(codenum == 10); gcode_G10_G11(codenum == 10);
break; break;
#endif // FWRETRACT #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) #if ENABLED(INCH_MODE_SUPPORT)
case 20: //G20: Inch Mode case 20: //G20: Inch Mode
gcode_G20(); gcode_G20();
@ -6787,7 +6809,7 @@ void process_next_command() {
case 21: //G21: MM Mode case 21: //G21: MM Mode
gcode_G21(); gcode_G21();
break; break;
#endif #endif // INCH_MODE_SUPPORT
case 28: // G28: Home all axes, one at a time case 28: // G28: Home all axes, one at a time
gcode_G28(); gcode_G28();
@ -6797,7 +6819,7 @@ void process_next_command() {
case 29: // G29 Detailed Z probe, probes the bed at 3 or more points. case 29: // G29 Detailed Z probe, probes the bed at 3 or more points.
gcode_G29(); gcode_G29();
break; break;
#endif #endif // AUTO_BED_LEVELING_FEATURE
#if HAS_BED_PROBE #if HAS_BED_PROBE
@ -6816,7 +6838,6 @@ void process_next_command() {
break; break;
#endif // Z_PROBE_SLED #endif // Z_PROBE_SLED
#endif // HAS_BED_PROBE #endif // HAS_BED_PROBE
case 90: // G90 case 90: // G90
@ -6845,7 +6866,6 @@ void process_next_command() {
break; break;
#if ENABLED(SDSUPPORT) #if ENABLED(SDSUPPORT)
case 20: // M20 - list SD card case 20: // M20 - list SD card
gcode_M20(); break; gcode_M20(); break;
case 21: // M21 - init SD card case 21: // M21 - init SD card
@ -6878,7 +6898,6 @@ void process_next_command() {
case 928: //M928 - Start SD write case 928: //M928 - Start SD write
gcode_M928(); break; gcode_M928(); break;
#endif //SDSUPPORT #endif //SDSUPPORT
case 31: //M31 take time since the start of the SD print or an M109 command 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 #endif
#if ENABLED(HOST_KEEPALIVE_FEATURE) #if ENABLED(HOST_KEEPALIVE_FEATURE)
case 113: // M113: Set Host Keepalive interval case 113: // M113: Set Host Keepalive interval
gcode_M113(); gcode_M113();
break; break;
#endif #endif
case 140: // M140: Set bed temp 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." #error "ABS_PREHEAT_FAN_SPEED is now PREHEAT_2_FAN_SPEED. Please update your configuration."
#endif #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 #endif //SANITYCHECK_H

@ -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

@ -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…
Cancel
Save