Как я уже упоминал ранее, в качестве управляющей электроники для Ворона я выбрал связку Duet 3 + Duet 3 Toolboard + Raspberry Pi 4. Несмотря на высокую стоимость этого решения, мой выбор пал на него из-за моей любви к web-интерфейсу дуэта (во избежание споров сразу поясню, что имею хороший опыт с Marlin, Smoothieware и Lerdge; Klipper и Octoprint сам не пробовал, но увидел сильно позже «Дуэта», поэтому не впечатлили):

Конечно, любовь — любовью, но помимо интерфейса Duet поддерживает мета-команды и объектно-ориентированную модель, что позволяет вывести макросы на совершенной иной уровень. Вот пара примеров:

Калибровка высоты срабатывания BL Touch
;Calibrate BL Touch trigger height
 
; When we get variables we can define one here
; Uncomment when ready to use
; var RunningTotal=0
; var average=0
 
; If the printer hasn't been homed, home it
if !move.axes[0].homed || !move.axes[1].homed || !move.axes[2].homed
  G28
  
M564 S0 H0 ; Allow movement beyond limits
 
if move.axes[2].machinePosition < 6 ; make sure we have probe clearance
	G1 Z6
M280 P0 S160 I1 ; reset BL Touch
G4 S0.5
M98 P"0:/sys/retractprobe.g" ; Ensure probe is retracted & reset
G4 S0.5
M290 R0 S0 ; clear any baby stepping
M561 ; clear any bed transform
; Jog head to position
M291 P"Jog nozzle to touch bed" R"Set nozzle to zero" S3 Z1
G92 Z0
M291 P"Press OK to begin" R"Ready?" S3; 
; carry out 10 probes
while iterations <= 9
	G1 Z6
	M400
	if sensors.probes[0].value[0]=1000 ; if probe is in error state
		echo "Probe in error state- resetting"
		M280 P0 S160 I1 ; reset BL Touch
		G4 S0.5
		M98 P"0:/sys/retractprobe.g" ; Ensure probe is retracted & reset
		G4 S0.5
	G30 S-1
	M400
	; Uncomment when variables allowed
	; RunningTotal=RunningTotal + move.axes[2].machinePosition
	;average=RunningTotal/(iterations+1)
	G4 S0.5
 
; Until variables come use this
M291 P"Check console for results and enter average value in G31 Z parameter of config.g"  R"Finished" S3 
 
;When variables come uncomment this
;G31 Z{average}
;M291 P"Trigger height set to : " ^ sensors.probes[0].triggerHeight ^ " Press OK to save to config, cancel to use until restart" R"Finished" S2 
;M500
M564 S0 H1 ; Reset limits
Противопожарная безопасность 🙂
; daemon.g
; check temps every 10 seconds when not printing (i.e. Idle) and shut down if exceed max temps.  RRF checks when printing, but not when idle.
; not all commands are required.  e.g. shutting off power by dropping a relay negates need for M112, M81 - un-comment or adjust as required for your configuration
; assumes that the thermistor for each heater is monitor # zero as there is no way to do nested loops using "iterations" as identifier in both loops until variables are available in the object model
; no checking done for null values! - 
 
if state.status="idle"
	while iterations < #heat.heaters ; 
		;if heat.heaters[iterations].current > heat.heaters[iterations].monitors[0].limit ; un-comment when ready to go live
		if heat.heaters[iterations].current > 50 ; uncomment for testing, comment out when going live
			M291 P"Heater over max temp" R"Temp Error!" S1 T0 ; Display message for testing
			;M112 ; Do emergency stop
			;M81  ; Turn PS_ON (ATX) off
			;M42 P5 S1 ; Set GPIO 5 (output) high to activate alarm relay. GPIO pin must be configured using M950
			;M42 P6 S0 ; Set GPIO 6 (output) low to cut power. GPIO pin must be configured using M950
 
;if sensors.gpIn[6].value=1 ; check state of connected smoke detector - GPIO pin must be configured using M950
	;M291 P"Smoke detector active!" R"I'm on fire!" S1 T0 ; Display Nikki Lauder message for testing
	;M112 ; Do emergency stop
	;M81  ; Turn PS_ON (ATX) off
	;M42 P5 S1 ; Set GPIO 5 (output) high to activate alarm relay
	;M42 P6 S0 ; Set GPIO 6 (output) low to cut power	
		
G4 S10 ; wait 10 seconds before next check	(adjust S parameter as you see fit)

Всё это, конечно, упрощает многие процедуры, позволяет сэкономить время, избавиться от рутинных ошибок, но остаётся самая главная причина, по которой я остановил свой выбор на «Дуэте» — ненавижу провода! Паять их, обжимать. Ненавижу!

В данный момент мой Uni 3D оснащён Duet 2 WiFi, я доволен этой платой и её вэб-интерфейсом . Это раз. А два — это то, что Voron требует минимум 7 драйверов шаговых моторов! Да, сами разработчики «Ворона» рекомендуют использовать 2 платы SKR 1.3 под управлением Klipper на Raspberry P, но мне хочется немного другого и бóльшего.

Материнская плата Duet 3 оснащена 6 драйверами шаговых моторов TMC5160, которые настраиваются произвольным образом и я хочу назначить первые два на оси XY, а оставшиеся 4 на ось Z. А вот экструдер подключить с помощью платы расширения Duet 3 Toolboard, которая (та-даааам!) подключается к материнке по CAN-шине.

Чем полезно такое подключение? А тем, что, например, на печатающей голове моего Uni есть вот такие компоненты:

  • нагреватель — 2 провода;
  • термодатчик — 2 провода;
  • вентилятор охлаждения хотэнда — 2 провода;
  • вентилятор охлаждения печатаемой модели — 2 провода;
  • шаговый мотор — 4 провода;
  • датчик BLTouch — 5 проводов;

Итого — 17 проводов (на самом деле больше — ещё 6 для второго хотэнда). А вот плата Toolboard 1LC, которая монтируется на печатающую голову и оснащена она следующими интерфейсами:

  • один драйвер TMC2209 для шагового мотора;
  • один разъём (Out 0) для подключения нагревателя, 5А максимум;
  • один 4-контактный разъём (Out 1) для подключения 12-вольтного вентилятора обдува модели (PWM, Tacho);
  • один 3-контактный разъём (Out 2) для подключения 12-вольтного вентилятора охлаждения модели;
  • два разъёма (Temp 0 и Temp 1) для подключения датчиков температуры;
  • один 4-контактный разъём (IO 0) и два 3-контактных разъёма (IO 1 и IO 2) ввода-вывода для подключения различной периферии, например, BLTouch, датчика филамента и пр.
  • 2 кнопки и 2 светодиода, функции которых можно настроить.

И эта плата подключается к материнской всего лишь одним кабелем с двумя витыми парами и двумя проводами питания — итого 6 проводов, а если расширение не планируется, то вместо двух витых пар достаточно одной. Питание 12 — 36 вольт, причём на самой плате стоят регуляторы на 12, 5 и 3,3 вольт. Так что теперь не надо использовать преобразователь 24 → 12 В для вентиляторов Noctua.

Более того, если я захочу навесить на печатающую голову какие-то другие компоненты, типа второго экструдера, системы смены самой печатной головы, дополнительные механизмы — не надо тянуть дополнительные провода, т.к. все платы расширения подключаются по шине CAN в режиме daisy-chain. Таким образом, есть и избавление от пучка проводов и хороший запас для дальнейших апгрейдов.

Но, как я уже упоминал, придётся помучиться, т.к. платформа новая, документация тоже не совсем всеобъемлющая, видео по подключению и настройке практически отсутствуют. В русскоязычном сегменте не нашёл информации вообще. Придётся делать всё методом научного тыка. Вот по результатам этого «тыка» и буду тут выкладывать полевые заметки. Надеюсь, что всё получится.