Flashforge Adventurer 5M. Увеличение стабильности KlipperMod
Я уже давненько владею принтером Flashforge Adventurer 5m и он вполне неплох, но не без изъяна, как говорится. Производитель устанавливает на него закрытую прошивку, которая делает его менее удобным в использовании, поэтому сообщество сколотило свою "открытую" KlipperMod (есть ещё другая - ZMod, но в тот момент она показалась мне менее привлекательной). Устанавливается она просто, но тут вылезает новый нюанс: на борту у принтера всего 128Мб оперативки, которых порой не хватает для всех свистоперделок и на долгих печатях принтер попросту может остановиться в рандомном месте, задумавшись навсегда.
Чтобы хоть как-то добавить стабильности, я в своем принтере слазил под капот и вынес панели управления "наружу", а качество камеры подубавил. И, думаю, нужно оговориться, что изначально я использовал прошивку без экранного интерфейса, т.к. управляю принтером всегда с ПК, что позволяет сэкономить ещё несколько драгоценных мегабайт оперативной памяти.
Вчера меня попросили об этом рассказать, поэтому буду рад, если смогу своей информацией помочь кому-нибудь печатать с кайфом на AD5M.
Кстати, перенос панели управления может быть полезен для любых других принтеров на Klipper в качестве, например, централизации управления.
Чего ожидать?
Чтобы не давать ложных надежд, опишу результаты эксперимента перед инструкцией, а не после. Далее уже каждый сам должен решить стоит ли эта игра свеч.
Как уже писал, заявлено в принтере 128Мб ОЗУ, которые в системе определяются, как примерно 110Мб. KlipperMod со всеми стандартными настройками сервисами и экраном у меня употребляет в пищу около 95Мб на постоянной основе. Описываемые мною манипуляции дают следующие эффекты:
- Использование прошивки без экранного интерфейса — +5Мб ОЗУ
- Вынос web-панелей на внешний сервер — +5Мб ОЗУ
- Изменение настроек камеры — +10МБ ОЗУ
Итого получается 75Мб из 110Мб доступной постоянно задействовано. Безусловно, это не густо, но тоже играет свою роль таких ограниченных объемах.
Внешняя панель
Итак, чтобы всё это провернуть, понадобится что угодно вне принтера, на чём установлен Linux, в моем случае это виртуальная машина с Ubuntu, но может быть и старый ноутбук или комп, или даже малинка, апельсинка и прочие ягодо-фрукты, куда можно поставить Linux.
На этапе установки софта, опять таки, все вариативно и зависит от скиллов и задач. Я в качестве web-интерфеса использую Mainsail, т.к. мне он кажется более информативным и удобным, к тому же потенциально умеет рулить несколькими принтерами. И даже у него есть несколько способов установки:
Я использовал последний, так как на ВМ установлено ещё n-ное количество софта, а контейнерный тип работает сам в себе и не мешает остальным.
На этом этапе главное, к чему стоит приготовиться - это то, что все дальнейшие действия будут происходить в терминале Linux.
Установка Docker Compose
Конечно, первое, что требуется - это установить сам Docker, а именно Docker Compose.
Для его работы нужны следующие зависимости:
Чтобы их установить нужно обновить список доступных пакетов
apt update
И, непосредственно, дать команду на скачивание и установку
apt install ca-certificates curl apt-transport-https software-properties-common
Далее для работы Docker нужен GPG-ключ для проверки подлинности пакетов Docker.
Нужно создать для него директорию с правами изменения только для владельца
install -m 0755 -d /etc/apt/keyrings
Скачать сам ключ и положить его в файл docker.asc
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
И разрешить всем пользователям его чтение
chmod a+r /etc/apt/keyrings/docker.asc
Когда ключ готов, нужно добавить в систему официальный репозиторий Docker, указав версию системы и полученный ключи для подписи
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/nullА теперь нужно снова обновить список пакетов уже с учетом нового репозитория
apt update
И, наконец-то, можно установить Docker
apt install docker-compose-plugin
По окончании установки можно убедиться, что все прошло успешно, введя
docker compose version
Если сервер покажет версию, значит установка успешна
Docker Compose version v5.1.1
Запуск Mainsail в контейнере Docker
Первым делом, для запуска Mainsail нужно определить и создать папку, в которой она будет работать, например, /opt/3dprint
mkdir /opt/3dprint/
Теперь в этой папке необходимо создать файл-инструкцию для Docker и сразу внести в него содержимое
nano /opt/3dprint/docker-compose.yml
version: '3.8'
services:
mainsail:
image: ghcr.io/mainsail-crew/mainsail:latest
container_name: mainsail
restart: always
ports:
- "8081:80"
volumes:
- ./mainsail_config.json:/usr/share/nginx/html/config.jsonЗдесь в секции "ports" указывается порт в системе, на котором будет жить web-панель, в данном случае это 8081. А в "volumes" - соответствие папок и файлов снаружи контейнера и внутри, где нужно указать соответствие файл конфигурации Mainsail, который будет расположен в той же папке, что и docker-compose.yml
Для сохранения файла используется комбинация клавиш Ctrl+O, где следует подтвердить сохранение нажатием Enter, после чего выйти из редактора, нажав Ctrl+X.
Теперь, поскольку путь к конфигурации определен, нужно создать и её
nano /opt/3dprint/mainsail_config.json
В файле нужно указать язык, тему и путь к Moonraker (он выполняется на принтере рядом с Klipper)
{
"defaultLocale": "ru",
"defaultMode": "dark",
"defaultTheme": "mainsail",
"hostname": "<3D_printer_IP>",
"port": "7125",
"path": "/",
"instancesDB": "moonraker",
"instances": []
}Здесь нужно заменить <3D_printer_IP> на IP адрес принтера в сети, который нужно закрепить за ним статически при помощи роутера.
Такая конфигурация позволит не выбирать нужный принтер каждый раз при загрузке Mainsail, а подключаться сразу к тому, который выдает Moonraker.
Если же принтеров несколько и нужно между ними переключаться, то файл нужно заполнить иначе
{
"defaultLocale": "ru",
"defaultMode": "dark",
"defaultTheme": "mainsail",
"instancesDB": "json",
"instances": [
{ "hostname": "<3D_printer_1_IP>", "port": 7125 },
{ "hostname": "<3D_printer_2_IP>", "port": 7125 },
{ "hostname": "<3D_printer_3_IP>", "port": 7125 }
]
}В файле нужно, соответственно, указать <3D_printer_1_IP>, <3D_printer_2_IP>, <3D_printer_3_IP>, или любое другое количество принтеров по необходимости.
Сохранить и закрыть файл при помощи Ctrl+O, Enter, Ctrl+X.
Теперь нужно открыть созданную директорию
cd /opt/3dprint/
И можно запускать контейнер Docker Compose
docker compose up -d
Когда контейнер запустится, web-интерфейс станет доступен по пути <linux_IP>:8081 и управлять он будет принтером или принтерами, которые указаны в конфигурации.
Отключение Mainsail и Fluidd на принтере
В стандартной поставке KlipperMod внутри принтера установлены на выбор сразу две панели. Они потребляют не так много памяти, но, покуда используется внешние решение, имеет смысл их выключить.
Чтобы работать с ОС принтера, необходимо подключиться к нему по SSH
Внутри системы все запускаемые дополнительно модули расположены в папке /etc/init.d/, посмотреть их можно при помощи команды ls
ls /etc/init.d/
Имена всех модулей состоят из флага S или K, числа приоритета и названия, например, S40network.
- Флаг
Sговорит о том, что запуск модуля включен и он будет запускаться при старте системы. Тогда какK- выключен. - Приоритет запуска считается от меньшего к большему, т.е. сначала запускается модуль, где число меньше, а только после, где больше
- Название использовано для удобства и отличия модулей с одинаковым приоритетом и флагами
С web-панелями нет ничего выбивающегося из шаблона и в данной папке их модули названы, как S70fluidd и S70mainsail. Соответственно, чтобы запуск не происходил, нужно просто переименовать файлы, заменив флаг на K.
mv /etc/init.d/S70fluidd /etc/init.d/K70fluidd
mv /etc/init.d/S70mainsail /etc/init.d/K70mainsail
Изменения будут заметны при следующем перезапуске принтера. Если же нужно остановить сервисы прямо сейчас, то нужно дополнительно это сделать в явном виде.
/etc/init.d/K70fluidd stop
/etc/init.d/K70mainsail stop
Бонус контент. Spoolman
Раз уж для всех манипуляций был поднят внешний сервер, а тем более Doker, то можно не ограничиваться лишь Mainsail на нем, а сразу путем мелких доработок установить еще и Spoolman.
Spoolman - это ни что иное, как менеджер катушек и филаментов, который ещё, помимо всего прочего, интегрирован в Mainsail и позволяет на лету менять катушки прямо из интерфейса, что здорово помогает для учета филамента.
Чтобы запустить сие чудо, нужно всего лишь отредактировать файл инструкций Docker на сервере.
nano /opt/3dprint/docker-compose.yml
В сам файл добавить новый сервис.
spoolman:
image: ghcr.io/donkie/spoolman:latest
container_name: spoolman
restart: always
ports:
- "7912:8000"
volumes:
- ./spoolman_data:/home/spoolman/.local/share/spoolmanЧтобы в итоге содержимое файла стало выглядеть так:
version: '3.8'
services:
mainsail:
image: ghcr.io/mainsail-crew/mainsail:latest
container_name: mainsail
restart: always
ports:
- "8081:80"
volumes:
- ./mainsail_config.json:/usr/share/nginx/html/config.json
spoolman:
image: ghcr.io/donkie/spoolman:latest
container_name: spoolman
restart: always
ports:
- "7912:8000"
volumes:
- ./spoolman_data:/home/spoolman/.local/share/spoolmanИ создать папку, где Spoolman будет хранить свои пожитки
mkdir /opt/3dprint/spoolman_data
Теперь нужно перезапустить контейнер из папки.
cd /opt/3dprint/
docker compose down
Обновить и докачать нужные образы
docker compose pull
docker compose up -d
После запуска интерфейс станет доступен по адресу <linux_IP>:7912.
Для того чтобы интегрировать Spoolman в Mainsail нужно просто добавить его секцию в файл конфигурации Moonraker, сделать это можно прямо через сам Mainsail, найдя файл moonraker.conf во вкладке "Система".
[spoolman] server: <linux_IP>:7912 sync_rate: 5
Здесь server - это путь к интерфейсу Spoolman, а sync_rate - это частота обновления в секундах.
После сохранения конфигурации с перезапуском Moonraker, Spoolman займет свое почетное место в интерфейсе.
Изменение настроек камеры
По умолчанию в заводской прошивке или прошивках от сообщества используются такие настройки камеры внутри принтера, которые нацелены на получение максимально качественной картинки с упором на съемку таймлапсов. К сожалению, при том качестве камеры, которую предлагает нам Adventurer 5M добиться фантастических результатов съемки почти невозможно, потому для себя я не увидел никакого смысла в выжимании всех соков из железа и применил менее качественный, но более щадящий для железа, а главное ОЗУ, пресет.
Базово камера пытается снимать и отправлять видео в 1920х1080px при 30к/с и хорошем качестве, что, конечно похвально, но эта картинка все равно имеет много шумов от самой матрицы камеры и при отказе от таймлапсов (или снижении требований к ним) избыточна для простого наблюдения за процессом печати. Более того, визуальной разницы по итогу почти нет.
Чтобы снизить нагрузку вполне себе можно изменить разрешение потока на 1280х720px, частоту кадров на 15к/с, а качество видео на 75, вместо стандартных 90.
Внутри KlipperMod за запуск стримера камеры отвечает модуль S75camera в уже знакомой папке /etc/init.d/. Но этот модуль не дает напрямую команду для стримера, а вызывает его исполняемый файл camera-autostart.sh, который уже находится в папке /usr/libexec/.
Перед изменениями лучше всего сделать бэкап этого файла, на случай поломки или внезапного желания вернуть все, как было.
cp /usr/libexec/camera-autostart.sh /usr/libexec/camera-autostart.sh.bak
Когда бэкап создан, можно изменить содержимое файла, заставив его играть по нужным правилам.
nano /usr/libexec/camera-autostart.sh
В открывшемся файле нужно заменить всего 2 строки:
CAMERA_MIN_X_RES=1920
CAMERA_MIN_X_RES=1280
start-stop-daemon -S -b -m -p $PID_FILE --exec ustreamer — -d /dev/$DEVNAME -r $resolution -m MJPEG --device-timeout=2 -w 1 -I MMAP -c HW -s* -p 8080 -q 90 --desired-fps 30
start-stop-daemon -S -b -m -p $PID_FILE --exec ustreamer — -d /dev/$DEVNAME -r $resolution -m MJPEG --device-timeout=2 -w 1 -I MMAP -c HW -s* -p 8080 -q 75 --desired-fps 15
Для сохранения Ctrl+O, Enter, Ctrl+X.
Чтобы увидеть применить изменения в системе, нужно перезапустить модуль.
/etc/init.d/S75camera restart
Теперь камера обновится и будет показывать 720p в 15к/с, а потребление ОЗУ снизится на ~10Мб.
Другие эксперименты
Помимо описанных возымевших эффект изменений, я экспериментировал еще и с другими частями ПО принтера, но они не дали стабильно хороших результатов. Вероятно, напишу позже и о них. Если это может быть интересно, то дайте знать в комментариях или проявлением активности на этой статье.