Итак, принтер собран, подключение к сети настроено и переходим к настройке самого Duet 3. Повествование о настроке буду вести по блокам — так будет и нагляднее и удобнее.

К сожалению, Code Snippet через одно место форматирует комментарии, поэтому буду давать пояснения после каждого блока.

Геометрия и кинематика

M550 P"Voron3D"	

G21				; millimeter units
M669 K1                 	; corexy mode
M208 X0 Y0 Z-1.20 S1      	; S1 = set axes minima
M208 X340 Y350 Z300 S0  	; S0 = set axes maxima

;-- Endstops --------------------------------------------------------------------------------------
M574 X2 S1 P"!io0.in"		; configure active-low endstop for high end on X via pin io0.in
M574 Y2 S1 P"!io1.in"		; configure active-low endstop for high end on Y via pin io1.in
M574 Z1 S1 P"!io2.in"		; configure active-low endstop for low end on Z via pin io2.in
;-- Z drive positions -----------------------------------------------------------------------------
M671 X-72.0:-72.0:400.0:400.0 Y-10.0:410.0:411.0:-10.0 S10

M557 X30:310 Y50:310 S50	; configure z probing grid for mesh compensation

Начнём, конечно же, с задания имени принтера — команда M505. Можно оставить заданное по умолчанию — «Duet3», но я так не люблю. Для того, чтобы можно было подключиться по сети, введя в адресную строку «voron3d.local» необходимо также задать имя хоста. Для этого через SSH подклоючаемся к «Малине», вызываем меню настроек (sudo raspi-config).

Итак, команды:

  • G21 задаёт метрическую систему измерений. Мы тут дюймами не пользуемся, так что лучше так.
  • M669 K1 задаёт тип кинематики CoreXY
  • M208 X0 Y0 Z-1.05 S1 задаёт минимальное значение осей XYZ. Т.к. срабатывание концевика оси Z происходит при положении кончика сопла ниже поверхности стола, то значение отличается от нуля (значение, конечно же, было найдено эмпирическим путём).
  • M208 X340 Y350 Z320 S0 задаёт максимальное значение осей XYZ.
  • M574 задаёт тип концевиков осей и присваивает их портам контроллера. Цифра после буквенного обозначения оси определяет местонахождение концевика: 1 — в начале оси (значение, заданное командой M208 S1), 2 — в конце оси (значение, заданное командой M208 S0), 0 — концевик отсутствует. Параметр S задаёт тип концевика, 1 — обычный выключатель, нормально замкнутый. Параметр P задаёт порт микроконтроллера, символ «!» отвечает за инвертирование сигнала.
  • M671 задаёт координаты ремней оси Z относительно начала координат стола, которые нужны для автоматического выравнивания портала. Отступы необходимо измерить самостоятельно. И важная деталь — координаты должны идти в том же порядке, что и моторы оси Z. Т.е. в левом переднем углу у меня первый мотор, второй в левом дальнем углу, третий в правом дальнем углу и четвёртый в правом переднем. И координаты идут соответственно: по Х -75, -75, 405, 405, по Y -5, 415, 415, -5. Параметр S задаёт максимальный допуск отклонения. Значение отклонения должно быть не менее 5 мм, т.к. портал может быть сильно перекошен.
  • M557 задаёт координатную сетку для функции построения разницы высот стола. Параметры X и Y задают минимальную и максимальную координату по осям, а параметр S — шаг в мм.

Моторы

M569 P0.0 S0		; physical drive XA goes backwards
M569 P0.1 S1		; physical drive YB goes forwards
M569 P0.2 S1		; physical drive Z0 goes forwards
M569 P0.3 S0		; physical drive Z1 goes backwards
M569 P0.4 S1		; physical drive Z2 goes forwards
M569 P0.5 S0		; physical drive Z3 goes backwards
M569 P121.0 S1 		; physical drive TBE0 goes forwards
M584 X0.0 Y0.1		; assign XA motor to Duet3 MB Driver_0, assign YB motor to Duet 3 MB Driver_1
M584 Z0.2:0.3:0.4:0.5	; assign Z0, Z1, Z2 & Z3 motors to Duet3 MB Driver_2, _3, _4 & _5
M584 E121.0		; assign extruder to Duet 3 Tool board
M84 S60			; motor idle timeout
M906 I50		; motor idle current percentage
M350 X16 Y16 E16 I1	; set microstepping for XY-axis and extruder, interpolation enabled
M350 Z16 I0		; set microstepping for Z-axis, interpolation disabled
M92 X160.00 Y160.00 Z400 E416.00	; set steps per mm; set microsteps per mm for 1.8-degree steppers

; Velocity, acceleration, and current settings are in these macros

M98 P"/macros/Drive/xy_fullcurrent.g"
M98 P"/macros/Drive/z_fullcurrent.g"
M98 P"/macros/Drive/e_fullcurrent.g"

Далее идёт раздел, посвящённый моторам:

M569 задаёт режим работы шагового мотора. С помощью параметра P идёт выбор физического мотора, первое число перед точкой — это адрес платы, в моём случае 0 — это Duet 3, а 121 — TLC1 (я не менял адрес по умолчанию). Параметр D3 устанавливает режим StealthChop2, S — направление вращения.

M584 присваивает осям моторы. Как и для предыдущей команды, первое число — адрес платы. Если необходимо назначить несколько моторов на одну ось, то они перечисляются через двоеточие, в моём случае моторы 2, 3, 4 и 5 двигают портал вдоль оси Z.

М84 задаёт таймаут перевода моторов в режим ожидания (idle), чтобы не жрали попусту ток и не грелись.

M906 задаёт силу тока, протекающего через моторы в режиме ожидания, в процентном отношении. В моём случае — 50%.

M350 задаёт деление шага (микрошаг), X, Y, Z и т.п. — оси, числовое значение, собственно, одна эннадцатая шага. В моём случае это 1/16. Параметр I включает и отключает интерполяцию — в случае с драйверами TMC это 1/256.

M92 задаёт количество шагов на мм, т.е. сколько импульсов должен подать контроллер на мотор оси, чтобы эта ось переместилась на 1 мм. Для расчёта можно использовать калькулятор.

Настройки скоростей, ускорений и рывков (jerk) находятся в отдельных макросах, для запуска которых используется команда M98. О макросах чуть позднее напишу.

Скорость, ускорение и рывки

M913 X100 Y100          ; restore motor current percentage to 100%
M906 X1600 Y1600        ; motor drive current

M203 X18000 Y18000      ; maximum speed (mm/min)
M201 X3000 Y3000        ; maximum acceleration (mm/min/s)
M566 X900 Y900          ; instantaneous speed change (mm/min)

Это код моего макроса, задающего полную скорость осей XY, под названием «xy_fullcurrent». Команды:

M913 задаёт ток моторов осей, указываемый числом в процентах. Изначально, по умолчанию, и так установлено 100%, но т.к. в других макросах я управляю этими значениями, тут приходится выставлять 100%.

M906 задаёт максимальный ток моторов осей в миллиамперах.

M203 задаёт максимальную скорость осей в мм/мин. Для пересчёта в мм/с надо делить на 60. 🙂

M201 задаёт максимальное ускорение моторов осей в мм/мин/сек. 

M566 задаёт так называемые рывки (jerks) — минимальное изменение скорости для которой используется ускорение. Если разница меньше — то изменение скорости производится моментально. Важный параметр, влияющий как на общую скорость печати, так и на качество. Рассчитывается также опытным путём.

В принципе, приведённые выше команды можно (и нужно) сразу вписать в конфиг, но т.к. я в процессе подготовки принтера к печати использую разные скорости и токи моторов, то у меня вот так вот. Об этом тоже расскажу позднее.

Стол

M308 S0 P"temp0" Y"thermistor" T100000 B4267		; configure sensor 0 as thermistor on pin temp0
M950 H0 C"out0" T0                          		; create bed heater output on out0 and map it to sensor 0
M307 H0 A180.3 C257.4 D6.9 S0.95 V24.2 B0    		; disable bang-bang mode for the bed heater and set PWM limit 
M140 H0                                     		; map heated bed to heater 0
M143 H0 S120                                		; set temperature limit for heater 0 to 120C
M570 H0 T10 S180                            ; heater fault timeout

Переходим в раздел настройки температурных контроллеров. Первый из них — стол. Итак, команды:

M308 задаёт датчик (сенсор). Параметр S определяет индекс сенсора. Индексы задаются по порядку (честно говоря, не знаю, можно ли назначить 1 если не был назначен 0) в моём случае — 0.  Параметр P задаёт имя пина платы (со списком имён можно ознакомиться тут). Параметр Y отвечает за тип термодатчика и задаётся он словом в кавычках. У моей грелки в качестве термодатчика используется обычный терморезистор NTC на 100 кОм и задаётся он словом «thermistor». Далее идут необязательные, но желательныйе параметры: T — это сопротивление термистера при 25 градусах Цельсия, B — так называемый коэффициент уравнения Стейнхарта-Харта. Обычно указывается в характеристиках термистора.

M950 создаёт управляемый элемент (нагреватель H, вентилятор F, шпиндель ЧПУ-станка R, сервопривод P/S и т.п.) и присваивает ему пин платы. В моём случае создаю нагреватель с индексом 0 — H0. Парамет С определяет имя пина (список тут). Параметр T присваивает датчик нагревателю, который создан уже командой M308. В моём случае — это датчик с индексом 0.

M307 задаёт параметры нагревателя, такие как усиление, доминантное время и т.п. Задаётся не вручную, а после калибровки нагревателя командой M303

M140 в данном случае используется для присвоения нагревателя H0 нагревательному столу.

M143 задаёт максимально допустимую температуру нагревателя.

M570 задаёт параметры обнаружения сбоя нагревателя. Параметр T задаёт максимальное отклонение температуры от заданной. S задаёт задержку остановки печати от обнаружения сбоя в секундах.