Welcome! Log In Create A New Profile

Advanced

Kossel calibration

Posted by Phil Hopely 
Kossel calibration
October 05, 2016 11:36PM
Hello world of marlin friends!


Thank you for marlin! I love marlin, most awesome!


I have some changes for marlin 1.1.0-rc7 -- ease the delta-machine calibration process, saved me a lot of headache -- thought I would share, hope this assuages somebody's pain & suffering out there in the universe.


Note that all the really magic code was written by other people elsewhere, I mostly copied & pasted.


These changes expose 'delta-machine model parameters' via user-interface in a manner ~consistent with the rest of marlin.


While these changes work for me, likely there exist better ways to accomplish such activities (let me know where you see those, please).


Currently, for kossels, being as cluesless as I am, I found it necessary to recompile marlin, repeatedly, until all constants were tuned just perfect... That gets old, fast.


So, access to tweak relevant kossel-delicates thru marlin user-interface is useful- such that one may adjust, test, readjust, test, ... without recompiling.


Then, upon eventual arrival at blissful values, change marlin Configuration.h relevant constants (MANUAL_Z_HOME_POS, DELTA_DIAGONAL_ROD, DELTA_SMOOTH_ROD_OFFSET & related) appropriately, recompile, & you are going forward californiabrated into the promised land, amen!


I thought it sensical to put such kossel-relevant controls under the optional "Delta Configuration" menu?..


To that end, thus far, these changes include:


1. in Marlin_main.cpp:
. add a delta-scoped 'float delta_z_max_pos', & use it when ENABLED(DELTA)
. alter the delta G28 home code in order to enqueue a G92 Z____ g-code command for reset of printer axis-origins' after positioning to delta_clip_start_height.


$ diff --context Marlin_main.cpp ../../../Marlin-1.1.0-RC7/Marlin/Marlin_main.cpp
*** Marlin_main.cpp 2016-08-20 22:58:10.000000000 -0700
--- ../../../Marlin-1.1.0-RC7/Marlin/Marlin_main.cpp 2016-10-05 17:54:19.602275600 -0700
***************
*** 479,485 ****
float delta_diagonal_rod_2_tower_2 = sq(delta_diagonal_rod + delta_diagonal_rod_trim_tower_2);
float delta_diagonal_rod_2_tower_3 = sq(delta_diagonal_rod + delta_diagonal_rod_trim_tower_3);
float delta_segments_per_second = DELTA_SEGMENTS_PER_SECOND;
! float delta_clip_start_height = Z_MAX_POS;
#if ENABLED(AUTO_BED_LEVELING_FEATURE)
int delta_grid_spacing[2] = { 0, 0 };
float bed_level[AUTO_BED_LEVELING_GRID_POINTS][AUTO_BED_LEVELING_GRID_POINTS];
--- 479,486 ----
float delta_diagonal_rod_2_tower_2 = sq(delta_diagonal_rod + delta_diagonal_rod_trim_tower_2);
float delta_diagonal_rod_2_tower_3 = sq(delta_diagonal_rod + delta_diagonal_rod_trim_tower_3);
float delta_segments_per_second = DELTA_SEGMENTS_PER_SECOND;
! float delta_z_max_pos = Z_MAX_POS;
! float delta_clip_start_height = delta_z_max_pos;
#if ENABLED(AUTO_BED_LEVELING_FEATURE)
int delta_grid_spacing[2] = { 0, 0 };
float bed_level[AUTO_BED_LEVELING_GRID_POINTS][AUTO_BED_LEVELING_GRID_POINTS];
***************
*** 3180,3185 ****
--- 3181,3189 ----
#if ENABLED(DELTA)
// move to a height where we can use the full xy-area
do_blocking_move_to_z(delta_clip_start_height);
+ char commando[32];
+ sprintf(commando,"G92 Z%s",ftostr52sign(delta_clip_start_height+(delta_z_max_pos-MANUAL_Z_HOME_POS)));
+ enqueue_and_echo_command(commando);
#endif

clean_up_after_endstop_or_probe_move();
***************
*** 6278,6284 ****
--- 6282,6292 ----

if (z_lift > 0) {
destination[Z_AXIS] += z_lift;
+ #if ENABLED(DELTA)
+ NOMORE(destination[Z_AXIS], delta_z_max_pos);
+ #else
NOMORE(destination[Z_AXIS], Z_MAX_POS);
+ #endif
RUNPLAN(FILAMENT_CHANGE_Z_FEEDRATE);
}






2. in ultralcd.cpp
. alter 'kossel calibration menu tower' G1-coordinates to use Z0.2 for paper-test calibration height
. add kossel-delicates delta_rod_length, delta_radius, segments_per_second, delta_z_max_pos, & tower trims 1-3 into marlin ui
. alter delta's axis reporting resolution
. add 0.01mm resolution controls for z-axis. (note that a new constant should be added by way of il8n; your country-mileage may vary, especially from city-driving)


$ diff --context ultralcd.cpp ../../../Marlin-1.1.0-RC7/Marlin/ultralcd.cpp
*** ultralcd.cpp 2016-08-20 22:58:10.000000000 -0700
--- ../../../Marlin-1.1.0-RC7/Marlin/ultralcd.cpp 2016-10-05 20:31:15.687878900 -0700
***************
*** 1260,1279 ****

#if ENABLED(DELTA_CALIBRATION_MENU)

static void lcd_delta_calibrate_menu() {
START_MENU();
MENU_ITEM(back, MSG_MAIN);
MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28"));
! MENU_ITEM(gcode, MSG_DELTA_CALIBRATE_X, PSTR("G0 F8000 X-77.94 Y-45 Z0"));
! MENU_ITEM(gcode, MSG_DELTA_CALIBRATE_Y, PSTR("G0 F8000 X77.94 Y-45 Z0"));
! MENU_ITEM(gcode, MSG_DELTA_CALIBRATE_Z, PSTR("G0 F8000 X0 Y90 Z0"));
! MENU_ITEM(gcode, MSG_DELTA_CALIBRATE_CENTER, PSTR("G0 F8000 X0 Y0 Z0"));
END_MENU();
}

#endif // DELTA_CALIBRATION_MENU

- float move_menu_scale;

/**
* If the most recent manual move hasn't been fed to the planner yet,
--- 1260,1354 ----

#if ENABLED(DELTA_CALIBRATION_MENU)

+ extern float delta_tower1_x;
+ extern float delta_tower1_y;
+ extern float delta_tower2_x;
+ extern float delta_tower2_y;
+ extern float delta_tower3_x;
+ extern float delta_tower3_y;
+
+ static void _revaluate_radius() {
+ #define SIN_60 0.8660254037844386
+ #define COS_60 0.5
+
+ delta_tower1_x = -SIN_60 * (delta_radius + DELTA_RADIUS_TRIM_TOWER_1); // front left tower
+ delta_tower1_y = -COS_60 * (delta_radius + DELTA_RADIUS_TRIM_TOWER_1);
+ delta_tower2_x = SIN_60 * (delta_radius + DELTA_RADIUS_TRIM_TOWER_2); // front right tower
+ delta_tower2_y = -COS_60 * (delta_radius + DELTA_RADIUS_TRIM_TOWER_2);
+ delta_tower3_x = 0; // back middle tower
+ delta_tower3_y = (delta_radius + DELTA_RADIUS_TRIM_TOWER_3);
+ }
+
+ extern float delta_diagonal_rod_trim_tower_1;
+ extern float delta_diagonal_rod_trim_tower_2;
+ extern float delta_diagonal_rod_trim_tower_3;
+ extern float delta_diagonal_rod_2_tower_1;
+ extern float delta_diagonal_rod_2_tower_2;
+ extern float delta_diagonal_rod_2_tower_3;
+
+ static void _revaluate_diagonal_rod()
+ {
+ delta_diagonal_rod_2_tower_1 = sq(delta_diagonal_rod + delta_diagonal_rod_trim_tower_1);
+ delta_diagonal_rod_2_tower_2 = sq(delta_diagonal_rod + delta_diagonal_rod_trim_tower_2);
+ delta_diagonal_rod_2_tower_3 = sq(delta_diagonal_rod + delta_diagonal_rod_trim_tower_3);
+
+ }
+
+ extern float delta_clip_start_height;
+ extern float delta_z_max_pos;
+ extern float sw_endstop_max[3];
+ extern float delta_safe_distance_from_top();
+
+ static void _revaluate_zmaxpos()
+ {
+ char commando[32];
+ float deltadelta=sw_endstop_max[Z_AXIS]-delta_z_max_pos;
+
+ if (deltadelta>0) {
+ current_position[Z_AXIS]+=deltadelta;
+ }
+ else {
+ current_position[Z_AXIS]-=deltadelta;
+ }
+ sw_endstop_max[Z_AXIS]=delta_z_max_pos;
+
+ }
+
+
+ static void setZ0Position() {
+ current_position[Z_AXIS]=0;
+ enqueue_and_echo_command("G92 Z0");
+ }
+
+ float move_menu_scale;
+
+ static void lcd_move_z();
+
static void lcd_delta_calibrate_menu() {
START_MENU();
MENU_ITEM(back, MSG_MAIN);
MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28"));
! MENU_ITEM(gcode, MSG_DELTA_CALIBRATE_X, PSTR("G0 F8000 X-77.94 Y-45 Z0.2"));
! MENU_ITEM(gcode, MSG_DELTA_CALIBRATE_Y, PSTR("G0 F8000 X77.94 Y-45 Z0.2"));
! MENU_ITEM(gcode, MSG_DELTA_CALIBRATE_Z, PSTR("G0 F8000 X0 Y90 Z0.2"));
! MENU_ITEM(gcode, MSG_DELTA_CALIBRATE_CENTER, PSTR("G0 F8000 X0 Y0 Z0.2"));
! MENU_ITEM(function, "Set Z=0",setZ0Position);
! move_menu_scale = 0.01;
! MENU_ITEM(submenu, MSG_MOVE_Z, lcd_move_z);
!
! MENU_ITEM_EDIT_CALLBACK(float52, "dRodLen", &delta_diagonal_rod, 200, 2000, _revaluate_diagonal_rod);
! MENU_ITEM_EDIT_CALLBACK(float52, "dRadius", &delta_radius, 1, 2000, _revaluate_radius);
! MENU_ITEM_EDIT_CALLBACK(float51, "seg/Sec", &delta_segments_per_second, 1, 2000, _revaluate_zmaxpos); // phil: what needs to happen here?
! MENU_ITEM_EDIT_CALLBACK(float52, "ZMaxPos", &delta_z_max_pos, 200, 2000, _revaluate_zmaxpos);
! MENU_ITEM_EDIT_CALLBACK(float43, "Trim1", &delta_diagonal_rod_trim_tower_1, -360.0, 360.0, _revaluate_diagonal_rod);
! MENU_ITEM_EDIT_CALLBACK(float43, "Trim2", &delta_diagonal_rod_trim_tower_2, -360.0, 360.0, _revaluate_diagonal_rod);
! MENU_ITEM_EDIT_CALLBACK(float43, "Trim3", &delta_diagonal_rod_trim_tower_3, -360.0, 360.0, _revaluate_diagonal_rod);
!
END_MENU();
}

#endif // DELTA_CALIBRATION_MENU


/**
* If the most recent manual move hasn't been fed to the planner yet,
***************
*** 1325,1331 ****
--- 1400,1410 ----
manual_move_to_current(axis);
lcdDrawUpdate = LCDVIEW_REDRAW_NOW;
}
+ #if ENABLED(DELTA)
+ if (lcdDrawUpdate) lcd_implementation_drawedit(name, ftostr52sign(current_position[axis]));
+ #else
if (lcdDrawUpdate) lcd_implementation_drawedit(name, ftostr41sign(current_position[axis]));
+ #endif
}
#if ENABLED(DELTA)
static float delta_clip_radius_2 = (DELTA_PRINTABLE_RADIUS) * (DELTA_PRINTABLE_RADIUS);
***************
*** 1444,1449 ****
--- 1523,1534 ----
move_menu_scale = 0.1;
_lcd_move_menu_axis();
}
+ #if ENABLED(DELTA)
+ static void lcd_move_menu_001mm() {
+ move_menu_scale = 0.01;
+ _lcd_move_menu_axis();
+ }
+ #endif

/**
*
***************
*** 1460,1465 ****
--- 1545,1553 ----

MENU_ITEM(submenu, MSG_MOVE_1MM, lcd_move_menu_1mm);
MENU_ITEM(submenu, MSG_MOVE_01MM, lcd_move_menu_01mm);
+ #if ENABLED(DELTA)
+ MENU_ITEM(submenu, "Move 0.01mm", lcd_move_menu_001mm);
+ #endif
//TODOangry smiley,Y,Z,E
END_MENU();
}
Sorry, only registered users may post in this forum.

Click here to login