first_lay_cal.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. //! @file
  2. //! @date Jun 10, 2019
  3. //! @author Marek Bel
  4. //! @brief First layer (Z offset) calibration
  5. #include "first_lay_cal.h"
  6. #include "Configuration_prusa.h"
  7. #include "language.h"
  8. #include "Marlin.h"
  9. #include "mmu.h"
  10. #include <avr/pgmspace.h>
  11. static const char cmd_preheat_0[] PROGMEM = "M107";
  12. static const char cmd_preheat_1[] PROGMEM = "M104 S" STRINGIFY(PLA_PREHEAT_HOTEND_TEMP);
  13. static const char cmd_preheat_2[] PROGMEM = "M140 S" STRINGIFY(PLA_PREHEAT_HPB_TEMP);
  14. static const char cmd_preheat_3[] PROGMEM = "M190 S" STRINGIFY(PLA_PREHEAT_HPB_TEMP);
  15. static const char cmd_preheat_4[] PROGMEM = "M109 S" STRINGIFY(PLA_PREHEAT_HOTEND_TEMP);
  16. static const char cmd_preheat_5[] PROGMEM = "G28";
  17. static const char cmd_preheat_6[] PROGMEM = "G92 E0.0";
  18. static const char * const preheat_cmd[] PROGMEM =
  19. {
  20. cmd_preheat_0,
  21. cmd_preheat_1,
  22. cmd_preheat_2,
  23. cmd_preheat_3,
  24. cmd_preheat_4,
  25. cmd_preheat_5, //call MSG_M117_V2_CALIBRATION before
  26. cmd_preheat_6,
  27. };
  28. //! @brief Preheat
  29. void lay1cal_preheat()
  30. {
  31. for (uint8_t i = 0; i < (sizeof(preheat_cmd)/sizeof(preheat_cmd[0])); ++i)
  32. {
  33. if (5 == i) enquecommand_P(_T(MSG_M117_V2_CALIBRATION));
  34. enquecommand_P(static_cast<char*>(pgm_read_ptr(&preheat_cmd[i])));
  35. }
  36. }
  37. static const char cmd_intro_mmu_0[] PROGMEM = "M83";
  38. static const char cmd_intro_mmu_1[] PROGMEM = "G1 Y-3.0 F1000.0";
  39. static const char cmd_intro_mmu_2[] PROGMEM = "G1 Z0.4 F1000.0";
  40. static const char cmd_intro_mmu_3[] PROGMEM = "G1 X55.0 E32.0 F1073.0"; // call T code before
  41. static const char cmd_intro_mmu_4[] PROGMEM = "G1 X5.0 E32.0 F1800.0";
  42. static const char cmd_intro_mmu_5[] PROGMEM = "G1 X55.0 E8.0 F2000.0";
  43. static const char cmd_intro_mmu_6[] PROGMEM = "G1 Z0.3 F1000.0";
  44. static const char cmd_intro_mmu_7[] PROGMEM = "G92 E0.0";
  45. static const char cmd_intro_mmu_8[] PROGMEM = "G1 X240.0 E25.0 F2200.0";
  46. static const char cmd_intro_mmu_9[] PROGMEM = "G1 Y-2.0 F1000.0";
  47. static const char cmd_intro_mmu_10[] PROGMEM = "G1 X55.0 E25 F1400.0";
  48. static const char cmd_intro_mmu_11[] PROGMEM = "G1 Z0.20 F1000.0";
  49. static const char cmd_intro_mmu_12[] PROGMEM = "G1 X5.0 E4.0 F1000.0";
  50. static const char * const intro_mmu_cmd[] PROGMEM =
  51. {
  52. cmd_intro_mmu_0,
  53. cmd_intro_mmu_1,
  54. cmd_intro_mmu_2,
  55. cmd_intro_mmu_3, // call T code before
  56. cmd_intro_mmu_4,
  57. cmd_intro_mmu_5,
  58. cmd_intro_mmu_6,
  59. cmd_intro_mmu_7,
  60. cmd_intro_mmu_8,
  61. cmd_intro_mmu_9,
  62. cmd_intro_mmu_10,
  63. cmd_intro_mmu_11,
  64. cmd_intro_mmu_12,
  65. };
  66. //! @brief Print intro line
  67. //! @param cmd_buffer character buffer needed to format gcodes
  68. //! @param filament filament to use (applies for MMU only)
  69. void lay1cal_intro_line(char *cmd_buffer, uint8_t filament)
  70. {
  71. if (mmu_enabled)
  72. {
  73. for (uint8_t i = 0; i < (sizeof(intro_mmu_cmd)/sizeof(intro_mmu_cmd[0])); ++i)
  74. {
  75. if (3 == i)
  76. {
  77. sprintf_P(cmd_buffer, PSTR("T%d"), filament);
  78. enquecommand(cmd_buffer);
  79. }
  80. enquecommand_P(static_cast<char*>(pgm_read_ptr(&intro_mmu_cmd[i])));
  81. }
  82. }
  83. else
  84. {
  85. enquecommand_P(PSTR("G1 X60.0 E9.0 F1000.0"));
  86. enquecommand_P(PSTR("G1 X100.0 E12.5 F1000.0"));
  87. }
  88. }
  89. static const char cmd_pre_meander_0[] PROGMEM = "G92 E0.0";
  90. static const char cmd_pre_meander_1[] PROGMEM = "G21"; //set units to millimeters TODO unsupported command
  91. static const char cmd_pre_meander_2[] PROGMEM = "G90"; //use absolute coordinates
  92. static const char cmd_pre_meander_3[] PROGMEM = "M83"; //use relative distances for extrusion TODO: duplicate
  93. static const char cmd_pre_meander_4[] PROGMEM = "G1 E-1.50000 F2100.00000";
  94. static const char cmd_pre_meander_5[] PROGMEM = "G1 Z5 F7200.000";
  95. static const char cmd_pre_meander_6[] PROGMEM = "M204 S1000"; //set acceleration
  96. static const char cmd_pre_meander_7[] PROGMEM = "G1 F4000";
  97. static const char * const cmd_pre_meander[] PROGMEM =
  98. {
  99. cmd_pre_meander_0,
  100. cmd_pre_meander_1,
  101. cmd_pre_meander_2,
  102. cmd_pre_meander_3,
  103. cmd_pre_meander_4,
  104. cmd_pre_meander_5,
  105. cmd_pre_meander_6,
  106. cmd_pre_meander_7,
  107. };
  108. //! @brief Setup for printing meander
  109. void lay1cal_before_meander()
  110. {
  111. for (uint8_t i = 0; i < (sizeof(cmd_pre_meander)/sizeof(cmd_pre_meander[0])); ++i)
  112. {
  113. enquecommand_P(static_cast<char*>(pgm_read_ptr(&cmd_pre_meander[i])));
  114. }
  115. }
  116. static const char cmd_meander_0[] PROGMEM = "G1 X50 Y155";
  117. static const char cmd_meander_1[] PROGMEM = "G1 Z0.150 F7200.000";
  118. static const char cmd_meander_2[] PROGMEM = "G1 F1080";
  119. static const char cmd_meander_3[] PROGMEM = "G1 X75 Y155 E2.5";
  120. static const char cmd_meander_4[] PROGMEM = "G1 X100 Y155 E2";
  121. static const char cmd_meander_5[] PROGMEM = "G1 X200 Y155 E2.62773";
  122. static const char cmd_meander_6[] PROGMEM = "G1 X200 Y135 E0.66174";
  123. static const char cmd_meander_7[] PROGMEM = "G1 X50 Y135 E3.62773";
  124. static const char cmd_meander_8[] PROGMEM = "G1 X50 Y115 E0.49386";
  125. static const char cmd_meander_9[] PROGMEM = "G1 X200 Y115 E3.62773";
  126. static const char cmd_meander_10[] PROGMEM = "G1 X200 Y95 E0.49386";
  127. static const char cmd_meander_11[] PROGMEM = "G1 X50 Y95 E3.62773";
  128. static const char cmd_meander_12[] PROGMEM = "G1 X50 Y75 E0.49386";
  129. static const char cmd_meander_13[] PROGMEM = "G1 X200 Y75 E3.62773";
  130. static const char cmd_meander_14[] PROGMEM = "G1 X200 Y55 E0.49386";
  131. static const char cmd_meander_15[] PROGMEM = "G1 X50 Y55 E3.62773";
  132. static const char * const cmd_meander[] PROGMEM =
  133. {
  134. cmd_meander_0,
  135. cmd_meander_1,
  136. cmd_meander_2,
  137. cmd_meander_3,
  138. cmd_meander_4,
  139. cmd_meander_5,
  140. cmd_meander_6,
  141. cmd_meander_7,
  142. cmd_meander_8,
  143. cmd_meander_9,
  144. cmd_meander_10,
  145. cmd_meander_11,
  146. cmd_meander_12,
  147. cmd_meander_13,
  148. cmd_meander_14,
  149. cmd_meander_15,
  150. };
  151. //! @brief Count extrude length
  152. //!
  153. //! @param layer_heigth layer heigth in mm
  154. //! @param extrusion_width extrusion width in mm
  155. //! @param extrusion_length extrusion length in mm
  156. //! @return filament length in mm which needs to be extruded to form line
  157. static constexpr float count_e(float layer_heigth, float extrusion_width, float extrusion_length)
  158. {
  159. return (extrusion_length * layer_heigth * extrusion_width / (M_PI * pow(1.75, 2) / 4));
  160. }
  161. static const float width = 0.4; //!< line width
  162. static const float length = 20 - width; //!< line length
  163. static const float heigth = 0.2; //!< layer height TODO This is wrong, as current Z height is 0.15 mm
  164. static const float extr = count_e(heigth, width, length); //!< E axis movement needed to print line
  165. //! @brief Print meander
  166. //! @param cmd_buffer character buffer needed to format gcodes
  167. void lay1cal_meander(char *cmd_buffer)
  168. {
  169. for (uint8_t i = 0; i < (sizeof(cmd_meander)/sizeof(cmd_meander[0])); ++i)
  170. {
  171. enquecommand_P(static_cast<char*>(pgm_read_ptr(&cmd_meander[i])));
  172. }
  173. sprintf_P(cmd_buffer, PSTR("G1 X50 Y35 E%-.3f"), extr);
  174. enquecommand(cmd_buffer);
  175. }
  176. //! @brief Print square
  177. //!
  178. //! This function needs to be called 16 times for i from 0 to 15.
  179. //!
  180. //! @param cmd_buffer character buffer needed to format gcodes
  181. //! @param i iteration
  182. void lay1cal_square(char *cmd_buffer, uint8_t i)
  183. {
  184. const float extr_short_segment = count_e(heigth, width, width);
  185. static const char fmt1[] PROGMEM = "G1 X%d Y%-.2f E%-.3f";
  186. static const char fmt2[] PROGMEM = "G1 Y%-.2f E%-.3f";
  187. sprintf_P(cmd_buffer, fmt1, 70, (35 - i*width * 2), extr);
  188. enquecommand(cmd_buffer);
  189. sprintf_P(cmd_buffer, fmt2, (35 - (2 * i + 1)*width), extr_short_segment);
  190. enquecommand(cmd_buffer);
  191. sprintf_P(cmd_buffer, fmt1, 50, (35 - (2 * i + 1)*width), extr);
  192. enquecommand(cmd_buffer);
  193. sprintf_P(cmd_buffer, fmt2, (35 - (i + 1)*width * 2), extr_short_segment);
  194. enquecommand(cmd_buffer);
  195. }