RPMachine: Большой помощник малого офиса, часть 2. A maximis ad minima. Модернизация принтера для печати в режиме 2х независимых экструдеров
'Я — твой слуга, я — твой работник...' (Kraftwerk, 1978)
Минуло уже 3 года с момента сборки и запуска моего 3D принтера RPMachine. Первый год, в основном, подчищал некоторые косяки, допущенные при проектировании и устранял "детские" болезни (из самого существенного пришлось заменить дешевые китайские муфты на уже более-менее серьезные вот такие, добавить экран MKS TFT28 с модулем MKS DET power для нештатных ситуаций с отключением питания, заменить ШД 4401 на самые мощные в линейке Nema 17 - 17HS6401 c 0,73 Нм, перейти на черные ремни GT2 10-ки, а также перевести ШД на драйверы TMC2208, что очень благотворно сказалось на снижении шума - это был самый актуальный вопрос, на самом деле), зато последние 2 года принтер отработал на полную катушку, словом, настоящий помощник :)
Единственное, что постоянно меня "грызло" изнутри и не давало покоя, что полноценно печатать двумя соплами так и не получилось. Изначально за основу была взята система 2-х сопел как у Makerbot Replicator 2X, т.е. два статичных сопла, отстоящих др.от др. на 40 мм. Причина - банальна, так проще всего на тот момент было реализовать печать 2-мя материалами. Для принтеров с небольшой рабочей зоной, возможно, это не является проблематичным, но для моего принтера это оказалось достаточно критичным недостатком - как бы ни калибровал и не подгонял сопла по высоте, нет-нет а второе сопло цепляло/срывало/пачкало модель, результаты не удовлетворяли. В итоге, эксплуатация велась в режиме одного материала, просто поставил сопла разного диаметра (0,4 и 0,8 мм) на оба экструдера, чтобы не менять постоянно и печатать в двух, наиболее часто используемых режимах.
Безусловно, все эти годы я внимательно отслеживал информацию о том, кто и как внедряет и использует печать в режиме двух сопел. Для меня, как и для большинства, наиболее актуальной была возможность печати водорастворимой PVA поддержкой. Переключение сопел в виде "качелей" выглядело не столь убедительно в плане точности и надежности, вертикальное же переключение второго сопла с помощью сервопривода (как у профессиаональных FDM машин), требовало определенных знаний и серьезной компетенции и казалось мне сложным в реализации. Конечно же, почти сразу в поле зрения попал 3D принтер от испанской BCN3D c режимом печати двумя независимыми эксирудерами - IDEX. Такая схема переключения экструдеров показалась мне оригинальной и интересной, но в тоже время достаточно замороченной в плане ее применения на своем принтере, до поры...(как говорится, нужда заставила). Спустя некоторое время, обратил внимание на схему IDEX снова, т.к. ее не только активно внедрили и пропиарили BCN3D, но применили также и голландцы из Leapfrog на принтерах Bolt/Bolt Pro, некоторые китайские фирмы (FlashForge, Vivedino, XTLW), а также отечественные производители (Dragon3D).
В итоге, после анализа всех "за" и "против", схема IDEX была признана мной самой перпективной в целях будущей модернизации RPMachine (относительно простая и недорогая реализация при ожидаемо стабильной работе на крупноформатном принтере) и надлежащей к незамедлительному исполнению "в железе".
Безусловно, ничего идеального не бывает, и у IDEX-режима наверняка есть свои слабые стороны. Думаю, это можно будет обсудить в комментариях. Для себя же я отметил следующие преимущества IDEX по сравнению с другими способами двухэкструдерной печати:
1. В каждый момент времени формирования слоя (модель, поддержка) печатает только одно сопло, второго рядом нет, соответственно, ничего не цепляется и т.п. В случае проектирования осей IDEX "с нуля" достаточно легко реализовать различные варианты промежуточной очистки сопел (purge), установить пеналы для сброса пластика, чистящие щеточки и т.п.
2. Относительная простота технической реализации данной схемы. "Программная" часть по-умолчанию уже присутствует в последней версии прошивки Marlin (необходимо только внести соответствующие правки, см. ниже), добавить же дополнительную ось X для второго экструдера тоже вполне посильная задача, особенно, если начинать проектирования "с нуля", а не переделывать как в моем случае.
3. Высокая универсальность двухэкструдерной схемы IDEX. Т.к. несущие каретки независимы по X, можно комбинировать как сам тип экструдеров (боуден-боуден, директ-директ или боуден-директ), так и отдельно для каждого предусмотреть свои конструктивные особенности, режим работы и вариант охлаждения/обдува (обычный, высокотемпетатурный и т.п.). Плюс вес на каждую несущую каретку по X cнижен вдвое по сравнению со стандартным вариантом.
4. Высокая точность позиционирования сопел (каждое сопло позиционируется со стандартной для оси X точностью и повторяемостью).
5. Относительная простота калибровки сопел, оффсет второго экструдера можно потом вписать в подготовительный gcode, генерируемый слайсером ( M218 T1 X... Y...). Конечно, печать калибровочных шаблонов тоже понадобится, после каждой смены сопел, но без этого в двухэкструдерных схемах пока никуда. Зато по Z настраивать зазор достаточно у одного сопла, а второй можно просто выставить, подогнав платформу встык к уже откалиброванному (в моем случае я просто винтом ослабляю второй хотенд, который упирается в стекло платформы вровень с первым соплом). Т.к. принтер предназначен для габаритных деталей, то при слоях 0,3-0,4 мм это работает нормально.
6. Возможны специальные режимы работы (одновременное дублирование, зеркальная печать), позволяющие значительно повысить общую производительность печати.
В общем, очевидные плюсы явно были, чтобы попробовать все это в работе.
Ниже попытаюсь описать свой опыт переделки принтера под режим IDEX.
В принципе, всего 2 основных этапа - установка дополнительной оси X и корректировка прошивки для дальнейшего управления процессом печати.
Тут, как говорится, кто на что горазд, у каждого может быть свой вариант расширения оси X. В моем случае в верхней части принтера оказалось свободное пространство, в котором я закрепил ось X2 в виде отдельного готового модуля.
Этап 1. Создание дополнительной оси X для перемещения второго экструдера.
Да-да, я использовал белые ремни GT2 с металлокордом, просто они уже были под рукой :). В будущем, при необходимости, заменю на черные. После сборки это выглядит следующим образом.
Ну, и немного тюнинга
Общий вид двух независимых осей X
Этап 2. Настройка прошивки (актуально для версии Marlin 1.1.9) под печать в режиме IDEX.
Исходные положения концевых оптических датчиков (когда ось X была одинарной) следующие:
по оси X - Xmax (Xmin - программный), по Y - Ymax (Ymin - программный), по Z - Zmin (Zmax - программный)
Cоответственно, после появления дополнительной оси по X у нас получаются следующие крайние положения оптических датчиков:
Ось X1 (экструдер 1, левый) - Xmin, крайнее левое положение (X1max - программный).
Ось X2 (экструдер 2, правый) - Xmax, крайнее правое положение (X2min - программный)
Ymax и Zmin - без изменений
во вкладке configuration.h:
// The following define selects which electronics board you have.
// Please choose the name from boards.h that matches your setup
#ifndef MOTHERBOARD
#define MOTHERBOARD BOARD_RAMPS_14_EEB
#endif
Указывается тип управляющей платы (у меня прижилась BIGTREETECH KFB 2,0, с учетом, что печать в основном соплами 0,5 и 0,8 мм и толстыми слоями на данный момент мне достаточно).
--
// This defines the number of extruders
// :[1, 2, 3, 4, 5]
#define EXTRUDERS 2
--
// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing).
// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder).
// For the other hotends it is their distance from the extruder 0 hotend.
//#define HOTEND_OFFSET_X {0.0, 0.00} // (in mm) for each extruder, offset of the hotend on the X axis
//#define HOTEND_OFFSET_Y {0.0, 0.00} // (in mm) for each extruder, offset of the hotend on the Y axis
(Ничего не трогал, т.к. оффсеты между соплами экструдеров будут задаваться потом через слайсер)
--
// @section homing
// Specify here all the endstop connectors that are connected to any endstop or probe.
// Almost all printers will be using one per axis. Probes will use one or more of the
// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
#define USE_XMIN_PLUG
//#define USE_YMIN_PLUG
#define USE_ZMIN_PLUG
#define USE_XMAX_PLUG
#define USE_YMAX_PLUG
//#define USE_ZMAX_PLUG
--
// Enable pullup for all endstops to prevent a floating state
#define ENDSTOPPULLUPS
#if DISABLED(ENDSTOPPULLUPS)
// Disable ENDSTOPPULLUPS to set pullups individually
#define ENDSTOPPULLUP_XMAX
#define ENDSTOPPULLUP_YMAX
//#define ENDSTOPPULLUP_ZMAX
#define ENDSTOPPULLUP_XMIN
//#define ENDSTOPPULLUP_YMIN
#define ENDSTOPPULLUP_ZMIN
//#define ENDSTOPPULLUP_ZMIN_PROBE
#endif
--
// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup).
#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe.
--
// Direction of endstops when homing; 1=MAX, -1=MIN
// :[-1,1]
#define X_HOME_DIR -1
#define Y_HOME_DIR 1
#define Z_HOME_DIR -1
--
// Travel limits after homing (units are in mm)
// The size of the print bed
#define X_BED_SIZE 425 // рабочий ход блока экструдера 1 до безопасного сближения с блоком экструдера 2
#define Y_BED_SIZE 405
--
// Travel limits (mm) after homing, corresponding to endstop positions.
#define X_MIN_POS 0
#define Y_MIN_POS 0
#define Z_MIN_POS 0
#define X_MAX_POS X_BED_SIZE
#define Y_MAX_POS Y_BED_SIZE
#define Z_MAX_POS 505
--
во вкладке configuration_adv.h:
#define DUAL_X_CARRIAGE
#if ENABLED(DUAL_X_CARRIAGE)
#define X1_MIN_POS X_MIN_POS // крайнее левое (нулевое) положение сопла экструдера 1 - к датчику Xmin
#define X1_MAX_POS X_BED_SIZE // максимальное положение сопла экструдера 1 до безопасного сближения с экструдером 2
#define X2_MIN_POS 90 // нулевое положение сопла экструдера 2 до безопасного сближения с экструдером 1 #define X2_MAX_POS 505 // расстояние между соплами, когда экструдеры 1 и 2 разведены по своим крайним положениям
#define X2_HOME_DIR 1 // указание крайнего положения сопла экструдера 2 - к датчику Xmax
#define X2_HOME_POS X2_MAX_POS // крайнее правое (максимальное) положение сопла экструдера 2
// However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software
// override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops
// without modifying the firmware (through the "M218 T1 X???" command).
// Remember: you should set the second extruder x-offset to 0 in your slicer.
// There are a few selectable movement modes for dual x-carriages using M605 S
// Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results
// as long as it supports dual x-carriages. (M605 S0)
// Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so
// that additional slicer support is not required. (M605 S1)
// Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all
// actions of the first x-carriage. This allows the printer to print 2 arbitrary items at
// once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm])
// This is the default power-up mode which can be later using M605.
#define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE
(Выбираем полный контроль слайсера за перемещением экструдеров. В слайсере оффсет второго сопла будет задаваться через M218 T1 X... Y...)
// Default settings in "Auto-park Mode"
#define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder
#define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder
// Default x offset in duplication mode (typically set to half print bed width)
#define DEFAULT_DUPLICATION_X_OFFSET 100
#endif // DUAL_X_CARRIAGE
--
во вкладке PINS.h :
// The X2 axis, if any, should be the next open extruder port
#if ENABLED(DUAL_X_CARRIAGE) || ENABLED(X_DUAL_STEPPER_DRIVERS)
#ifndef X2_STEP_PIN
#define X2_STEP_PIN D42_EPIN(X2_E_INDEX, STEP)
#define X2_DIR_PIN D40_EPIN(X2_E_INDEX, DIR)
#define X2_ENABLE_PIN D44_EPIN(X2_E_INDEX, ENABLE)
(указать, на какие свободные пины будет перенаправляться управление шаговым двигателем второй оси X, я использовал свободные D40, D42 и D44)
--
во вкладке pins_RAMPS.h :
// Steppers
//
#define X_STEP_PIN 54
#define X_DIR_PIN 55
#define X_ENABLE_PIN 38
#ifndef X_CS_PIN
#define X_CS_PIN -1
#endif
#define X2_STEP_PIN 42
#define X2_DIR_PIN 40
#define X2_ENABLE_PIN 44
#ifndef X2_CS_PIN
#define X2_CS_PIN -1
#endif
(прописываем пины D40, D42, D44 управления ШД дополнительной (новой) оси X)
С прошивкой все. Далее строим калибровочные шаблоны, калибруем и печатаем.
Для примера привожу коды для управления работой экструдеров во вкладке Scripts Simplify3D (режим Both Extruders):
пример Starting Script
G21 ; set units to millimetres
G90 ; set to absolute positioning
M107 ; start with the fan off
G28 X0 Y0 ; move to the X/Y origin (home)
G28 Z0 ; move to the Z origin (home)
G1 Z15.0 F600 ; move Z to safety position 15.0 mm
M218 T1 X506.55 Y-1.05 ; X2 offset - прописывается итоговое расстояние между двумя соплами, измерянное после построения серии калибровочных шаблонов
пример Tool Change Script
{IF NEWTOOL=0}G1 X505 F4800; travel X2 to home X2max - сопло 1 рабочее, сопло 2 уезжает на парковку вправо
{IF NEWTOOL=0}G1 Y2 F4800; travel Y to Y=2 - общее перемещение по Y для механической чистки сопел
{IF NEWTOOL=0}G1 Y[[current_position_y]] F4800; travel Y to previous - возврат сопла 1 в прежнюю координату по Y
{IF NEWTOOL=1}G1 X0 F4800; travel X1 to home Xmin - cопло 2 рабочее, сопло 1 уезжает на парковку влево
{IF NEWTOOL=1}G1 Y2 F4800; travel Y to home Y=2 - общее перемещение по Y для механической чистки сопел
{IF NEWTOOL=1}G1 Y[current_position_y] F4800; travel Y to previous - возврат сопла 2 в прежнюю координату по Y
(Из-за того, что платформа в данной версии принтера занимает почти все пространство по XY, уже нет возможности устанавливать пеналы для сплевывания пластика и чистящие щеточки. Поэтому на уровне Y2 у меня просто стоят тонкие пластины/лезвия, через которые сопла проезжают и чиркают, это позволяет сбросить часть подтекающего пластика у неактивного сопла).
Также можно настроить температурный режим работы сопел до и после переключения, например:
{IF NEWTOOL=0}M104 S170 T1;
{IF NEWTOOL=0}M109 S[extruder0_temperature] T0;
{IF NEWTOOL=1}M104 S170 T0;
{IF NEWTOOL=1}M109 S[extruder1_temperature] T1;
а также режим "сплевывания" (purge) определенного количества пластика из сопла в отдельный контейнер. Я пока не настраивал данные функции, использую чистящую башенку.
пример Ending Script
M104 S0 T0 ; left extruder off
M104 S0 T1 ; right extruder off
M140 S0 ; heated bed off
G28 X0 Y0 ; move XY to min endstops
M84 ; steppers off
Собственно, сам момент переключения экструдера 1
Переключение экструдера 2
Теперь о результатах тестовой печати в режиме IDEX. В данный момент у меня нет PVA пластика, поэтому на этапе начального тестирования пришлось двухэкструдерную печать имитировать.
Красный PLA - основной (сопло 0,8 мм), серый PLA - имитирует PVA поддержку (сопло 0,5 мм).
Синий PLA - основной (сопло 0,5 мм), оранжевый PLA - имитирует PVA поддержку (сопло 0,8 мм).
Контрольная деталь:
На работе был небольшой остаток пластика Stratasys SR35, это специализированный, растворимый в щелочном растворе материал поддержки для группы пластиков ABS/ASA Stratasys. Конечно, он не разрабатывался для использования c PLA пластиком, но в отстутствие PVA руки чесались попробовать что-то растворимое :)
Могу сказать, что PLA пластик оказался стоек к едкому натру. Результат ниже, после выдержки в ванне с NaOH и растворения SR35 (единственное, что после переключения ванны с 60 С на 70С деталь из PLA повело в нижней части).
Деталь с растворимой поддержкой:
После удаления растворимой поддержки:
Считаю поставленную задачу в первом приближении решенной :) И, конечно, по-прежнему удобно принтер использовать и при печати одним соплом, благо, теперь нагрузка на несущую каретку по X снизилась вдвое.
В общем, вот такая вот история. Как только разживусь PVA пластиком (может, кто-нибудь подскажет, какой наиболее качественный и стабильный сейчас), обязательно сделаю тестовую печать и выложу результат.
P.S.: В заключение, хочу поблагодарить Анатолия Рыжика (StrannikZet) за ценные советы при модификации прошивки Marlin и настройке режима переключения экструдеров в Simplify3D.
Еще больше интересных статей
Ender 3 V3 SE опыт использования и доработка
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Долгое время я был читателем, но сейчас решил вставить свои пять центо...
В ТЕХНО 3D создали копию Республики Адыгея
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Халявный пластик 4 (печатаем пэт бутылками)
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
С хорошими и радостными новостями.
Но прежде хочу...
Комментарии и вопросы
Жесткость влияет на гибкость.....
95м. Пытался прокладку делать.
Для работы УЗО не требуется за...
Помогите с 3D принтером. Creal...
Помогите с 3D принтером. Creal...
Всем доброго дня! Столкну...
Господа, тем кто пользуется ор...