
16
Klipper на Two Trees Sapphire Plus
Случилось то, что давно назревало - штатная прошивка Marlin перестала меня устраивать.
Последний апгрейд принтера (самодельный корпус директ хотенда на базе Biqu h2 v2s) привел к значительному повышению скорости печати (ранее был штатный боуден). На этой скорости Marlin с штатной платой MKS Robin Nano провоцировал дефекты на углах деталей, которые полностью исчезали при понижении скорости. При этом также наблюдалась сильная вибрация.
Вот такая картина наблюдалась на "углах" - на самом деле дефект проявляется на всех небольших изменениях направления движения при высокой скорости (~100 мм/с), из показательного также печать окружностей (которые являются по сути многоугольниками). При этом на небольшой скорости все ок (~30мм/с).
Изначально у меня была Orange Pi PC PLUS, на которой все и было настроено, но у неё из-за старости умерла MMC, а затем и отвалилась карта памяти.
Поэтому была приобретена Raspberry Pi 4B 4Gb RAM (немного на вырост для записи 4к таймлапсов), инструкция по настройке будет для неё.
Raspberry PI
Установка OS
Ставим Raspberry OS Lite (серверная сборка без GUI) через Raspberry Pi Imager, при записи образа на флешку заодно можно сразу установить логин/пароль и параметры подключения к WiFi, чтобы не мучаться с ethernet-подключением платы.
Вставляем sd карту с записанным образом в плату, подключаем через Type C достаточный по мощности источник питания (хотя бы 5В 3А) - ждем пока плата подключится к wifi и в роутере появится наш клиент.
Далее подключаемся по ssh к выделенному IP адресу (заодно в интерфейсе роутера делаем адрес статическим).
ssh user@192.168.0.101
Klipper
Здесь все по мануалу через kiauh:
sudo apt update && sudo apt upgrade -y
sudo apt install git -y
git clone https://github.com/th33xitus/kiauh.git
cd kiauh
./kiauh.sh
Дальше нужно установить через интерфейс компоненты. У меня это:
- Klipper (условно, программа управления принтером)
- Moonraker (API надстройка над Klipper)
- Fluidd (Web UI)
- Mainsail (Web UI - хочу попробовать все новое)
Klipper на принтере
Подключаем принтер по USB, проверяем что устройство распозналось:
user@raspberrypi:~$ ls /dev/serial/by-id/
usb-1a86_USB_Serial-if00-port0
Прописываем в printer.cfg наше устройство (я через web ui редактировал):
[mcu]
serial: /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0
Принтер при этом все еще не видится, т.к. у него нет прошивки.
Прошивка принтера
Ориентироваться нужно на официальный конфиг - в верху есть описание дополнительных действий (рядом лежат конфиги для всех поддерживаемых принтеров - https://github.com/Klipper3d/klipper/blob/master/config/printer-twotrees-sapphire-plus-sp-5-v1-2020.cfg).
cd ~/klipper
make menuconfig
Здесь нужно указать параметры прошивки. У меня принтер на MKS Robin Nano v1.2:
enable "extra low-level configuration setup"
Micro-controller Architecture: STMicroelectronics STM32
Processor model: STM32F103
Bootloader offset: 28KiB bootloader
Communication interface: Serial (on USART3 PB11/PB10)
GPIO pins to set at micro-controller startup: !PC6,!PD13
Далее собираем прошивку и подготавливаем её для Robin Nano (обязательно через скрипт):
make
./scripts/update_mks_robin.py out/klipper.bin out/Robin_nano35.bin
Бинарник прошивки создается в out/Robin_nano35.bin, дальше нужно его скачать. Я переместил в папку, доступную в web ui и скачал через fluidd:
cp out/Robin_nano35.bin ~/printer_data/config/
Далее записываем на sd карту под именем Robin_nano35.bin
, вставляем в выключенные принтер, ждем - на экране сначала должен появиться надпись "Booting...", после - TFT Updating 0..100% с прогрессбаром и после успешной прошивки экран потухнет - это нормально, клипперу он не нужен.
Экран не потух
Проверьте что в make menuconfig вы выставили extra low-level configuration setup
и GPIO pins to set at micro-controller startup: !PC6,!PD13
.
Также проверьте флешку - файл должен переименоваться в *.CUR - это признак того, что прошивка успешна.
Klipper не видит mcu
Убедитесь что вы верно подключили usb, что ваш кабель - не кабель зарядки у которого только питание, что апельсинка видит ваш USB как серийный порт.
Также убедитесь, что в make menuconfig указали Communication interface: Serial (on USART3 PB11/PB10)
- Robin Nano использует usb-uart, поэтому указывать нужно не USB.
Конфигурация Klipper
Конфиг Sapphire Plus
За основу я взял конфиг из официального репозитория. Т.к. у меня не родной экструдер (стоит Biqu H2 V2S с E3D соплом) - пришлось еще откалибровать подачу пластика.
Еще из отличий от конфига из репы - инвертированные пины направления dir_pin для z/z1 шаговиков и экструдера (крутили не в ту сторону), инвертинованный пин включения шаговика enable_pin экструдера, а еще почему-то все шаговики направления ровно в 2 раза меньше катались чем должны (т.е. вместо 300мм проезжали 150мм), хотя драйвера TMC 2225 стоят с 3 перемычками, что дает 16 микрошагов. Пришлось всем прописать rotation_distance в 2 раза меньше.
Итоговый конфиг для моего Saphire Plus с Biqu H2 V2S таков (отметил все изменения комментарием #modified):
[stepper_x]
step_pin: PE3
dir_pin: !PE2
enable_pin: !PE4
microsteps: 16
rotation_distance: 20
endstop_pin: !PA15
position_endstop: 0
position_max: 300
homing_speed: 50
[stepper_y]
step_pin: PE0
dir_pin: !PB9
enable_pin: !PE1
microsteps: 16
rotation_distance: 20
endstop_pin: !PA12
position_endstop: 300
position_max: 300
homing_speed: 50
[stepper_z]
step_pin: PB5
dir_pin: !PB4
enable_pin: !PB8
microsteps: 16
rotation_distance: 4
endstop_pin: !PA11
position_endstop: 0
position_max: 340
[stepper_z1]
step_pin: PA6
dir_pin: !PA1
enable_pin: !PA3
microsteps: 16
rotation_distance: 4
[extruder]
step_pin: PD6
dir_pin: PD3
enable_pin: !PB3
microsteps: 16
rotation_distance: 3.5
nozzle_diameter: 0.400
filament_diameter: 1.750
heater_pin: PC3
sensor_type: EPCOS 100K B57560G104F # Stock
sensor_pin: PC1
min_temp: 0
max_temp: 250
control: pid
pid_Kp: 17.48
pid_Ki: 1.32
pid_Kd: 57.81
max_extrude_cross_section: 999999
[heater_bed]
heater_pin: PA0
sensor_type: EPCOS 100K B57560G104F # Stock
sensor_pin: PC0
min_temp: 0
max_temp: 130
control: pid
pid_Kp: 325.10
pid_Ki: 63.35
pid_Kd: 417.10
[heater_fan extruder]
pin: PB0
[fan]
pin: PB1
[mcu]
serial: /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0
restart_method: command
[printer]
kinematics: corexy
max_velocity: 250
max_accel: 4500
max_z_velocity: 15
max_z_accel: 100
[bed_screws]
screw1: 35,35
screw2: 275,35
screw3: 275,275
screw4: 35,275
[static_digital_output reset_display]
pins: !PC6, !PD13
[virtual_sdcard]
path: ~/printer_data/gcodes
[pause_resume]
[display_status]
[gcode_macro CANCEL_PRINT]
description: Cancel the actual running print
rename_existing: CANCEL_PRINT_BASE
gcode:
TURN_OFF_HEATERS
CANCEL_PRINT_BASE
Конфиг просто вставляем в Fluidd в интерфейсе, сохраняем и перезапускаем.
Подключение камеры
У меня в качестве камеры смартфон на андроиде с установленным приложением Ip Webcam - оно запускает сервер стрима видео с камеры. Также он предоставляет различные протоколы для получения картинки. Добавляем камеру в mainsail.conf:
[webcam phone]
stream_url: http://192.168.0.54:8080/video
snapshot_url: http://192.168.0.54:8080/photo.jpg
enabled: true
После сохранения и перезагрузки на домашнем экране fluidd должно появиться окно с картинкой с камеры.
Обратите внимание на snapshot_timeout - если у вас туповатая wifi камера (или телефон, подключенный по wifi, как у меня) - есть смысл поднять значение до 5-6 секунд, иначе будут пропуски кадров и ошибка "Error taking timelapse frame" в интерфейсе Fluidd.
Timelapse
Из коробки ничего нет, нужно настроить через сторонний плагин от moonraker-crew:
cd ~
git clone https://github.com/mainsail-crew/moonraker-timelapse.git
cd moonraker-timelapse
make install
Добавляем секцию в moonraker.cfg, чтобы иметь доступ к обновлениям из интерфейса:
[update_manager timelapse]
type: git_repo
primary_branch: main
path: ~/moonraker-timelapse
origin: https://github.com/mainsail-crew/moonraker-timelapse.git
managed_services: klipper moonraker
Подключаем в конфиг принтера (printer.cfg):
[include timelapse.cfg]
Запись таймлапса завязывается на gcode, генерируемый слайсером, так что нам нужно разместить в нем как-то команду записи фрейма (TIMELAPSE_TAKE_FRAME). В официальной инструкции есть примеры для Prusa, Ultimaker и Ideamaker. Я использую Orca Slicer, в нем команда при смене слоя вставляется следующим образом:
Далее нужно активировать компонент в moonraker.conf, вставляем:
[timelapse]
## Following basic configuration is default to most images and don't need
## to be changed in most scenarios. Only uncomment and change it if your
## Image differ from standart installations. In most common scenarios
## a User only need [timelapse] in their configuration.
#output_path: ~/timelapse/
## Directory where the generated video will be saved
#frame_path: /tmp/timelapse/
## Directory where the temporary frames are saved
#ffmpeg_binary_path: /usr/bin/ffmpeg
## Directory where ffmpeg is installed
Теперь можно посмотреть конфигурацию таймлапса по ссылке http://192.168.0.101/machine/timelapse/settings:
{
"result": {
"enabled": true,
"mode": "layermacro",
"camera": "",
"snapshoturl": "http://192.168.0.54:8080/photo.jpg",
"stream_delay_compensation": 0.05,
"gcode_verbose": false,
"parkhead": false,
"parkpos": "back_left",
"park_custom_pos_x": 10,
"park_custom_pos_y": 10,
"park_custom_pos_dz": 0,
"park_travel_speed": 100,
"park_retract_speed": 15,
"park_extrude_speed": 15,
"park_retract_distance": 1,
"park_extrude_distance": 1,
"park_time": 0.1,
"fw_retract": false,
"hyperlapse_cycle": 30,
"autorender": true,
"constant_rate_factor": 23,
"output_framerate": 30,
"pixelformat": "yuv420p",
"time_format_code": "%Y%m%d_%H%M",
"extraoutputparams": "",
"variable_fps": false,
"targetlength": 10,
"variable_fps_min": 5,
"variable_fps_max": 60,
"rotation": 0,
"flip_x": false,
"flip_y": false,
"duplicatelastframe": 5,
"previewimage": true,
"saveframes": false,
"blockedsettings": []
}
}
В доке в гитхабе есть описание основных параметров. Если вам нужно что-то изменить - сделать это нужно опять через конфиг в moonraker.conf. Например, установив parkhead: True вы получите таймлапсы без висящей над изделием головы принтера (она будет парковаться перед фото, куда именно парковать - указываете в parkpos). Парковка увеличит время печати, а также может добавить проблем с качеством, если не настроить ретракты, так что включайте на своё усмотрение. Я настроил парковку в дальний угол, чтобы голова была видна на таймлапсах, но не мешала.
[timelapse]
#enabled: True
#mode: layermacro
#snapshoturl: http://localhost:8080/?action=snapshot
#gcode_verbose: True
#parkhead: False
#parkpos: back_left
#park_custom_pos_x: 0.0
#park_custom_pos_y: 0.0
#park_custom_pos_dz: 0.0
#park_travel_speed: 100
#park_retract_speed: 15
#park_extrude_speed: 15
#park_retract_distance: 1.0
#park_extrude_distance: 1.0
#hyperlapse_cycle: 30
#autorender: True
#constant_rate_factor: 23
#output_framerate: 30
#pixelformat: yuv420p
#time_format_code: %Y%m%d_%H%M
#extraoutputparams:
#variable_fps: False
#targetlength: 10
#variable_fps_min: 5
#variable_fps_max: 60
#flip_x: False
#flip_y: False
#duplicatelastframe: 0
#previewimage: True
#saveframes: False
#wget_skip_cert_check: False
На этом все, таймлапсы должны создаваться после успешной печати в ~/timelapse/
, также их можно просмотреть / скачать в соответствующей вкладке в fluidd. Отдельные фото хранятся в /tmp/timelapse/
до момента окончания печати и генерации видео.
Правда без проблем не обошлось - некоторые кадры в таймлапсе пропускались с ошибкой. Нашлась issue на гитхабе с той же проблемой и даже похожим стеком - народ тоже использовал Ip Webcam на телефоне в качестве камеры.
Все это навело меня на мысль, что все упирается в таймаут времени ожидания скачивания фото. Об этом я и отписал там же комментарий.
Далее появилось немного времени - попробовал разобраться с ошибкой сам. Скачал репозиторий, открыл его в cursor (IDE с AI), прислал текст из issue и попросил исправить. С первого промпта получил готовые правки. Все оказалось тривиально - были захардкожены 2 секунды таймаута, поэтому был добавлен отдельный параметр.
Установил 5 секунд и сделал тестовую печать на 80 слоев - ни одного пропуска.
Проблема решена, поэтому оформил Pull Request в репозиторий. Жаль что вряд ли его примут, т.к. проект судя по коммитам заброшен уже как пару лет.
Видео в 4k:
-
Codex написал WASD управление для Смотрителя
В комментариях к ролику с демонстрацией Смотрителя меня давно просили добавиьт… -
Klipper на Two Trees Sapphire Plus
Случилось то, что давно назревало - штатная прошивка Marlin перестала меня устр… -
Проект смотритель. Часть 11. Home assistant
Проект в том числе позиционируется как удаленный мониторинг, но как его сделать… -
Вайб-кодим серии статей в BoltCMS
Делаем поддержку серий постов Cursor с Sonnet 3.7 -
Проект смотритель. Часть 10. Bluetooth
Подключаем Radiomaster TX12 в роли BT-джойстика через ELRS-модуль. -
Проект смотритель. Часть 9. Зарядная станция
Раз уж одна из целей - удалённое управление - стоит озаботиться вопросом питани…
* * * Claim Free iPhone 16: http://tanakass-web.com/index.php?z28e4p * * * hs=faee7790c930805a52bf9106bd3dc930* ххх* 11.06.2025 20:16
msnjy8* * * <a href="http://tanakass-web.com/index.php?z28e4p">Unlock Free Spins Today</a> * * * hs=faee7790c930805a52bf9106bd3dc930* ххх* 11.06.2025 20:16
msnjy8