3d проблема: розшарування й зупинка друку

| щоденник, 3d друк, гаджети

маю 3d принтер і трохи подрукував, але на білій нитці elegoo проявилася серйозна проблема: білий ящик для батарейок розшарувався посередині. пошук в тенетах найчастіше видає видає результати про недостатню температуру сопла, через що пластик витікає надто в’язкий і не чіпляється до попереднього шару (розшарування), або ж взагалі перестає витікати (зупинка друку). мені видалося дивним, що це проявилося лише на новій білій нитці elegoo, але не на залишках чорного і червоного пластику, яким я чудово друкував раніше.

пошук у тенетах найчастіше видає підказку: збільшити температуру сопла для друку. це простий рецепт, але… маю сумніви. невже біла нитка з тим самим номінальним діапазоном температур (190..220 °c) і в тому ж самому режимі на принтері (215 °c перший шар, 210 °c решта моделі) зненацька створює аж таку помітну проблему там, де її не було? і якщо різні нитки справді можуть аж так відрізнятися температурою плавлення, як знайти оптимальну температуру, витративши мінімальну кількість пластику?

так я надибав температурні вежі (temperature tower, heat tower), тобто моделі, в яких різні групи шарів по висоті друкуються різними температурами (як правило від вищої до нижчої); для pla це зазвичай 230..180° з кроком 5° або 10°. варіантів багато, ось мої знахідки в порядку зменшення кількості пластику й необхідного часу:

ось ця остання вежка мені підходить: економна й швидка, перевіряє відносно довгі (2 см) місточки (bridging), висячі залишки ниток (stringing), точність за рахунок конусних стовпчиків і віконець із арками. нема надрукованих цифр для зчитування температури? ну, зате швидко і економно. звідки інформація про кількість пластику й час на один поверх вежі? елементарно, ватсоне: програма-слайсер (prusaslicer в моєму випадку) дозволяє розтинати модель на фрагменти:

  • завантажити файл stl для pla в слайсер;
  • відітнути перший (нижній) поверх і видалити зайву горішню частину;
  • нарізати (згенерувати gcode) і поглянути статистику.

результат приблизний, але для оцінки годиться; зокрема, я всюди брав перший поверх, але вибрана швидка модель має підставку, інтегровану в перший поверх, тож наступні будуть ще економніші й швидші.

головне питання інше: як принтер знатиме, що різні шари треба друкувати з різною температурою? відповідь: а ніяк! якщо йому не вказати це явно; і більшість моделей цих веж мають в комплекті втулки (python) для cura… але ж у мене prusaslicer, тож довелося трохи розбиратися, як працює gcode. коротко: файли gcode на флешці містять набір команд, зрозумілих принтерам; більшість підказок з ручного налаштування температури в gcode зводяться до чогось такого:

M104 S230   ;Set hotend temp 230 °C

тут:

це анатомія однієї команди; щоби виставляти температуру декілька разів упродовж друку, для різних шарів, використовують умовний блок (приклад з опису до smart compact temperature calibration tower, для інших веж потребуватиме модифікації!):

{if layer_z == 1.6}     ;Layer height in mm, 1st floor
M104 S230               ;...230 °C
{elsif layer_z == 11.6} ;2nd floor
M104 S225               ;...225 °C
...
{endif}

інший варіант — вираховувати необхідну температуру одним рядком:

M104 S{230 - (layer_num - 7) / 50 * 5} {if layer_num > 7} ;Tower floor {(layer_num - 7) / 50 * 5 + 1} {endif}

це та сама команда, але замість блоку з кількома if..elseif, температура і номер поверху в коментарі обраховуються динамічно, одним рядком:

  • M104 — команда принтеру виставити темперутуру пічки;
  • S{…} — параметр, котрий задає температуру в °c, яка обраховується в блоці {…}:
    • 230 — температура першого поверху (найвища!), залежить від типу пластику;
    • (layer_num - 7) — номер поточного шару (не висота в мм, а саме номер!) мінус кількість шарів підставки;
    • …/50 — цілочислене ділення на товщину одного поверху в шарах (50 * 0,2 мм = 10 мм на поверх);
    • {if layer_num > 7} ;... {endif} — тут: опційний блок, котрий просто додає коментар з номером поверху, на друк взагалі ніяк на впливає.

що робить цей код?

  • рівні 1..7 (0..14 мм висоти з шаром 0,2 мм) — нічого;
  • рівні 8..∞ (16 мм і вище) — виставляємо температуру, вирахувану як 230 °C мінус 5 °С на кожен поверх починаючи з 2-го.

нічого складного нема, але якщо ви гадаєте, що автор моделі детально розписав цю примітивну арифметику в коментарях, щоби люди не гаяли час, здогадуючись, звідки взялися оті 7 та 50, то ви помиляєтеся; мені довелося відкрити і порізати модель трошки, щоби здогадатися. так само, як не одразу второпаєш, куди тулити цей код, бо більшість підказок орієнтовані на користувачів cura… в prusaslicer (і, мабуть, slic3r так само) — вкладка параметри принтеру (от грамотії, хай їм грець, має бути «принтера»!) > користувацький g-код > g-код перед зміною шару, і додати рядок після команди G92 E0.0 (див. зняток екрана):

;BEFORE_LAYER_CHANGE
G92 E0.0
;[layer_z]
M104 S{230 - (layer_num - 7) / 50 * 5} {if layer_num > 7} ;Tower floor {(layer_num - 7) / 50 * 5 + 1} {endif}

важливо! ще раз: код містить константи (230; 7; 50), котрі залежать від моделі й потребуватимуть модифікації залежно від типу пластику, товщини підставки, товщини поверху тощо. тому для мене було важливо розібратися, як працює g-код, щоби не робити дурниць наосліп. коли розібрався, зрозумів, що:

  • а) навіть «легку» модель я можу ще полегшити, залишивши мінімальну кількість кроків для діапазону температур 220..190 °c з кроком 10° (лише 4 поверхи!);
  • б) для такої короткої вежі можна не чіпати налаштування принтера (бо забудеш потім прибрати цей код для звичайного друку!), а краще вручну, просто в головному вікні слайсера на вертикальній лінійці шарів розставити потрібні команди на потрібні шари (див. зняток екрана).

проблема: розшарування і зупинка друку; підготовка температурної вежі

я надрукував одну таку вежку для 230..190°, спостерігаючи за температурою: принтер на екрані показує поточну/цільову температури для сопла і стола. результат мене не вдовольнив:

  • я не побачив помітної різниці в якості між поверхами;
  • коли в g-коді зустрічається команда пониження температури на 10 °c, принтер чомусь «провалює» її на 20-25°, і при цьому…
  • …не зупиняється, щоби дочекатися потрібної температури на пічці!

з’ясувалося, що це особливість команди M104 — принтер продовжує друкувати, не чекаючи. чому підказки не використовують M109 з параметром Rxxx, котра змушує принтер виставити нову температуру і дочекатися, щоби вона справді встановилася? я не знаю. отже, модифікую g-код «швидкої вежі»:

  • поверх 1 (шар 3) — M109 R230;
  • поверх 2 (шар 40) — M109 R220;
  • поверх 3 (шар 80) — M109 R210;
  • поверх 4 (шар 120) — M109 R200;
  • поверх 5 (шар 200) — M109 R190.

не певен на 100%, що фабрична прошивка anycubic i3 mega s розуміє M109, треба спробувати.

далі буде