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.
Еще больше интересных статей
Умная розетка Tasmota в Клиппер
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Когда то писал статью про подключение умной розетки Tuya (v3.5) в...
Переходники воздуховода
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Заказали с женой новую кухню в интернете.
После...
Тонкости 3D-печати. Часть 2. Теория и практика.
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Данная часть будет посвящена...








Комментарии и вопросы
поверхностного общения с ИИэто...
ибо при "совке" мы ждалиникто....
И что? Вы думаете, что алгорит...
Ещё первый слой печатается сли...
Why Vortex Web Innovate Is the...
Есть у кого нибудь распиновка...
Доброго времени суток. У меня...