Add the socalled "Babystepping" feature.
It is a realtime control over the head position via the LCD menu system that works _while_ printing. Using it, one can e.g. tune the z-position in realtime, while printing the first layer. Also, lost steps can be manually added/removed, but thats not the prime feature. Stuff is placed into the Tune->Babystep * It is not possible to have realtime control via gcode sending due to the buffering, so I did not include a gcode yet. However, it could be added, but it movements will not be realtime then. Historically, a very similar thing was implemented for the "Kaamermaker" project, while Joris was babysitting his offspring, hence the name. say goodby to fuddling around with the z-axis.
This commit is contained in:
		| @@ -270,6 +270,17 @@ | |||||||
| // Enable the option to stop SD printing when hitting and endstops, needs to be enabled from the LCD menu when this option is enabled. | // Enable the option to stop SD printing when hitting and endstops, needs to be enabled from the LCD menu when this option is enabled. | ||||||
| //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED | //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED | ||||||
|  |  | ||||||
|  | // Babystepping enables the user to control the axis in tiny amounts, independently from the normal printing process | ||||||
|  | // it can e.g. be used to change z-positions in the print startup phase in realtime | ||||||
|  | // does not respect endstops! | ||||||
|  |  | ||||||
|  | //#define BABYSTEPPING | ||||||
|  | //#define BABYSTEP_XY  //not only z, but also XY | ||||||
|  |  | ||||||
|  | #ifdef COREXY | ||||||
|  |     #error BABYSTEPPING not implemented for COREXY yet. | ||||||
|  | #endif | ||||||
|  |  | ||||||
| // extruder advance constant (s2/mm3) | // extruder advance constant (s2/mm3) | ||||||
| // | // | ||||||
| // advance (steps) = STEPS_PER_CUBIC_MM_E * EXTUDER_ADVANCE_K * cubic mm per second ^ 2 | // advance (steps) = STEPS_PER_CUBIC_MM_E * EXTUDER_ADVANCE_K * cubic mm per second ^ 2 | ||||||
|   | |||||||
| @@ -997,6 +997,116 @@ void quickStop() | |||||||
|   ENABLE_STEPPER_DRIVER_INTERRUPT(); |   ENABLE_STEPPER_DRIVER_INTERRUPT(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #ifdef BABYSTEPPING | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void babystep(const uint8_t axis,const bool direction) | ||||||
|  | { | ||||||
|  |   //MUST ONLY BE CALLED BY A ISR, it depends on that no other ISR interrupts this | ||||||
|  |     //store initial pin states | ||||||
|  |   switch(axis) | ||||||
|  |   { | ||||||
|  |   case X_AXIS: | ||||||
|  |   { | ||||||
|  |     enable_x();    | ||||||
|  |     uint8_t old_x_dir_pin= READ(X_DIR_PIN);  //if dualzstepper, both point to same direction. | ||||||
|  |     | ||||||
|  |     //setup new step | ||||||
|  |     WRITE(X_DIR_PIN,(INVERT_X_DIR)^direction); | ||||||
|  |     #ifdef DUAL_X_CARRIAGE | ||||||
|  |       WRITE(X2_DIR_PIN,(INVERT_X_DIR)^direction); | ||||||
|  |     #endif | ||||||
|  |      | ||||||
|  |     //perform step  | ||||||
|  |     WRITE(X_STEP_PIN, !INVERT_X_STEP_PIN);  | ||||||
|  |     #ifdef DUAL_X_CARRIAGE | ||||||
|  |       WRITE(X2_STEP_PIN, !INVERT_X_STEP_PIN); | ||||||
|  |     #endif | ||||||
|  |     { | ||||||
|  |     float x=1./float(axis+1)/float(axis+2); //wait a tiny bit | ||||||
|  |     } | ||||||
|  |     WRITE(X_STEP_PIN, INVERT_X_STEP_PIN); | ||||||
|  |     #ifdef DUAL_X_CARRIAGE | ||||||
|  |       WRITE(X2_STEP_PIN, INVERT_X_STEP_PIN); | ||||||
|  |     #endif | ||||||
|  |  | ||||||
|  |     //get old pin state back. | ||||||
|  |     WRITE(X_DIR_PIN,old_x_dir_pin); | ||||||
|  |     #ifdef DUAL_X_CARRIAGE | ||||||
|  |       WRITE(X2_DIR_PIN,old_x_dir_pin); | ||||||
|  |     #endif | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |   break; | ||||||
|  |   case Y_AXIS: | ||||||
|  |   { | ||||||
|  |     enable_y();    | ||||||
|  |     uint8_t old_y_dir_pin= READ(Y_DIR_PIN);  //if dualzstepper, both point to same direction. | ||||||
|  |     | ||||||
|  |     //setup new step | ||||||
|  |     WRITE(Y_DIR_PIN,(INVERT_Y_DIR)^direction); | ||||||
|  |     #ifdef DUAL_Y_CARRIAGE | ||||||
|  |       WRITE(Y2_DIR_PIN,(INVERT_Y_DIR)^direction); | ||||||
|  |     #endif | ||||||
|  |      | ||||||
|  |     //perform step  | ||||||
|  |     WRITE(Y_STEP_PIN, !INVERT_Y_STEP_PIN);  | ||||||
|  |     #ifdef DUAL_Y_CARRIAGE | ||||||
|  |       WRITE(Y2_STEP_PIN, !INVERT_Y_STEP_PIN); | ||||||
|  |     #endif | ||||||
|  |     { | ||||||
|  |     float x=1./float(axis+1)/float(axis+2); //wait a tiny bit | ||||||
|  |     } | ||||||
|  |     WRITE(Y_STEP_PIN, INVERT_Y_STEP_PIN); | ||||||
|  |     #ifdef DUAL_Y_CARRIAGE | ||||||
|  |       WRITE(Y2_STEP_PIN, INVERT_Y_STEP_PIN); | ||||||
|  |     #endif | ||||||
|  |  | ||||||
|  |     //get old pin state back. | ||||||
|  |     WRITE(Y_DIR_PIN,old_y_dir_pin); | ||||||
|  |     #ifdef DUAL_Y_CARRIAGE | ||||||
|  |       WRITE(Y2_DIR_PIN,old_y_dir_pin); | ||||||
|  |     #endif | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |   break;  | ||||||
|  |   case Z_AXIS: | ||||||
|  |   { | ||||||
|  |     enable_z(); | ||||||
|  |     uint8_t old_z_dir_pin= READ(Z_DIR_PIN);  //if dualzstepper, both point to same direction. | ||||||
|  |     //setup new step | ||||||
|  |     WRITE(Z_DIR_PIN,(INVERT_Z_DIR)^direction); | ||||||
|  |     #ifdef Z_DUAL_STEPPER_DRIVERS | ||||||
|  |       WRITE(Z2_DIR_PIN,(INVERT_Z_DIR)^direction); | ||||||
|  |     #endif | ||||||
|  |     //perform step  | ||||||
|  |     WRITE(Z_STEP_PIN, !INVERT_Z_STEP_PIN);  | ||||||
|  |     #ifdef Z_DUAL_STEPPER_DRIVERS | ||||||
|  |       WRITE(Z2_STEP_PIN, !INVERT_Z_STEP_PIN); | ||||||
|  |     #endif | ||||||
|  |     //wait a tiny bit | ||||||
|  |     { | ||||||
|  |     float x=1./float(axis+1); //absolutely useless | ||||||
|  |     } | ||||||
|  |     WRITE(Z_STEP_PIN, INVERT_Z_STEP_PIN); | ||||||
|  |     #ifdef Z_DUAL_STEPPER_DRIVERS | ||||||
|  |       WRITE(Z2_STEP_PIN, INVERT_Z_STEP_PIN); | ||||||
|  |     #endif | ||||||
|  |  | ||||||
|  |     //get old pin state back. | ||||||
|  |     WRITE(Z_DIR_PIN,old_z_dir_pin); | ||||||
|  |     #ifdef Z_DUAL_STEPPER_DRIVERS | ||||||
|  |       WRITE(Z2_DIR_PIN,old_z_dir_pin); | ||||||
|  |     #endif | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |   break; | ||||||
|  |   | ||||||
|  |   default:    break; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | #endif //BABYSTEPPING | ||||||
|  |  | ||||||
| void digitalPotWrite(int address, int value) // From Arduino DigitalPotControl example | void digitalPotWrite(int address, int value) // From Arduino DigitalPotControl example | ||||||
| { | { | ||||||
|   #if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1 |   #if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1 | ||||||
|   | |||||||
| @@ -92,4 +92,10 @@ void digipot_current(uint8_t driver, int current); | |||||||
| void microstep_init(); | void microstep_init(); | ||||||
| void microstep_readings(); | void microstep_readings(); | ||||||
|  |  | ||||||
|  | #ifdef BABYSTEPPING | ||||||
|  |   void babystep(const uint8_t axis,const bool direction); // perform a short step with a single stepper motor, outside of any convention | ||||||
|  | #endif | ||||||
|  |       | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -66,6 +66,10 @@ float current_temperature_bed = 0.0; | |||||||
|   unsigned char fanSpeedSoftPwm; |   unsigned char fanSpeedSoftPwm; | ||||||
| #endif | #endif | ||||||
|    |    | ||||||
|  | #ifdef BABYSTEPPING | ||||||
|  |   volatile int babystepsTodo[3]={0,0,0}; | ||||||
|  | #endif | ||||||
|  |    | ||||||
| //=========================================================================== | //=========================================================================== | ||||||
| //=============================private variables============================ | //=============================private variables============================ | ||||||
| //=========================================================================== | //=========================================================================== | ||||||
| @@ -1253,6 +1257,25 @@ ISR(TIMER0_COMPB_vect) | |||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
|   } |   } | ||||||
|  |    | ||||||
|  | #ifdef BABYSTEPPING | ||||||
|  |   for(uint8_t axis=0;axis<3;axis++) | ||||||
|  |   { | ||||||
|  |     int curTodo=babystepsTodo[axis]; //get rid of volatile for performance | ||||||
|  |     | ||||||
|  |     if(curTodo>0) | ||||||
|  |     { | ||||||
|  |       babystep(axis,/*fwd*/true); | ||||||
|  |       babystepsTodo[axis]--; //less to do next time | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     if(curTodo<0) | ||||||
|  |     { | ||||||
|  |       babystep(axis,/*fwd*/false); | ||||||
|  |       babystepsTodo[axis]++; //less to do next time | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | #endif //BABYSTEPPING | ||||||
| } | } | ||||||
|  |  | ||||||
| #ifdef PIDTEMP | #ifdef PIDTEMP | ||||||
|   | |||||||
| @@ -53,6 +53,11 @@ extern float current_temperature_bed; | |||||||
|   extern float bedKp,bedKi,bedKd; |   extern float bedKp,bedKi,bedKd; | ||||||
| #endif | #endif | ||||||
|    |    | ||||||
|  |    | ||||||
|  | #ifdef BABYSTEPPING | ||||||
|  |   extern volatile int babystepsTodo[3]; | ||||||
|  | #endif | ||||||
|  |    | ||||||
| //high level conversion routines, for use outside of temperature.cpp | //high level conversion routines, for use outside of temperature.cpp | ||||||
| //inline so that there is no performance decrease. | //inline so that there is no performance decrease. | ||||||
| //deg=degreeCelsius | //deg=degreeCelsius | ||||||
|   | |||||||
| @@ -322,6 +322,68 @@ static void lcd_cooldown() | |||||||
|     lcd_return_to_status(); |     lcd_return_to_status(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #ifdef BABYSTEPPING | ||||||
|  | static void lcd_babystep_x() | ||||||
|  | { | ||||||
|  |     if (encoderPosition != 0) | ||||||
|  |     { | ||||||
|  |         babystepsTodo[X_AXIS]+=(int)encoderPosition; | ||||||
|  |         encoderPosition=0; | ||||||
|  |         lcdDrawUpdate = 1; | ||||||
|  |     } | ||||||
|  |     if (lcdDrawUpdate) | ||||||
|  |     { | ||||||
|  |         lcd_implementation_drawedit(PSTR("Babystepping X"),""); | ||||||
|  |     } | ||||||
|  |     if (LCD_CLICKED) | ||||||
|  |     { | ||||||
|  |         lcd_quick_feedback(); | ||||||
|  |         currentMenu = lcd_tune_menu; | ||||||
|  |         encoderPosition = 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void lcd_babystep_y() | ||||||
|  | { | ||||||
|  |     if (encoderPosition != 0) | ||||||
|  |     { | ||||||
|  |         babystepsTodo[Y_AXIS]+=(int)encoderPosition; | ||||||
|  |         encoderPosition=0; | ||||||
|  |         lcdDrawUpdate = 1; | ||||||
|  |     } | ||||||
|  |     if (lcdDrawUpdate) | ||||||
|  |     { | ||||||
|  |         lcd_implementation_drawedit(PSTR("Babystepping Y"),""); | ||||||
|  |     } | ||||||
|  |     if (LCD_CLICKED) | ||||||
|  |     { | ||||||
|  |         lcd_quick_feedback(); | ||||||
|  |         currentMenu = lcd_tune_menu; | ||||||
|  |         encoderPosition = 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void lcd_babystep_z() | ||||||
|  | { | ||||||
|  |     if (encoderPosition != 0) | ||||||
|  |     { | ||||||
|  |         babystepsTodo[Z_AXIS]+=(int)encoderPosition; | ||||||
|  |         encoderPosition=0; | ||||||
|  |         lcdDrawUpdate = 1; | ||||||
|  |     } | ||||||
|  |     if (lcdDrawUpdate) | ||||||
|  |     { | ||||||
|  |         lcd_implementation_drawedit(PSTR("Babystepping Z"),""); | ||||||
|  |     } | ||||||
|  |     if (LCD_CLICKED) | ||||||
|  |     { | ||||||
|  |         lcd_quick_feedback(); | ||||||
|  |         currentMenu = lcd_tune_menu; | ||||||
|  |         encoderPosition = 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | #endif //BABYSTEPPING | ||||||
|  |  | ||||||
| static void lcd_tune_menu() | static void lcd_tune_menu() | ||||||
| { | { | ||||||
|     START_MENU(); |     START_MENU(); | ||||||
| @@ -339,6 +401,14 @@ static void lcd_tune_menu() | |||||||
| #endif | #endif | ||||||
|     MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255); |     MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255); | ||||||
|     MENU_ITEM_EDIT(int3, MSG_FLOW, &extrudemultiply, 10, 999); |     MENU_ITEM_EDIT(int3, MSG_FLOW, &extrudemultiply, 10, 999); | ||||||
|  |      | ||||||
|  | #ifdef BABYSTEPPING | ||||||
|  |     #ifdef BABYSTEP_XY | ||||||
|  |       MENU_ITEM(submenu, "Babystep X", lcd_babystep_x); | ||||||
|  |       MENU_ITEM(submenu, "Babystep Y", lcd_babystep_y); | ||||||
|  |     #endif //BABYSTEP_XY | ||||||
|  |     MENU_ITEM(submenu, "Babystep Z", lcd_babystep_z); | ||||||
|  | #endif | ||||||
| #ifdef FILAMENTCHANGEENABLE | #ifdef FILAMENTCHANGEENABLE | ||||||
|      MENU_ITEM(gcode, MSG_FILAMENTCHANGE, PSTR("M600")); |      MENU_ITEM(gcode, MSG_FILAMENTCHANGE, PSTR("M600")); | ||||||
| #endif | #endif | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user