Товары из Китая

Orange Pi 3 LTS: Klipper – это очень просто.


Orange Pi 3 LTS: Klipper – это очень просто.

Ссылка — 4050 ₽. Сегодня я расскажу о переводе 3Д-принтера Anet ET5X на прошивку Klipper. На текущий момент этот принтер можно уже считать устаревшим, поэтому описанный ниже материал не стоит воспринимать как актуальную модернизацию, а скорее как справочную информацию для перевода практически любого принтера на Klipper, так как этот процесс во многом похож для разных моделей.

Если интересно, то садитесь поудобнее и поехали.

Что такое Klipper

Чтобы напечатать любую модель, на «вход» 3Д-принтера подается G-code — набор простых команд вроде «переместись туда», «выдави филамент» и т.д. Для того, чтобы интерпретировать команды и превратить их в управляющие сигналы для своих электрических узлов, в принтер устанавливается микроконтроллер, в который загружается специально написанная программа – прошивка. На текущий момент существует две наиболее популярные прошивки для принтеров — Marlin и Klipper. Обе эти прошивки Open Source, то есть, имеют открытый исходный код, что позволяет абсолютно любому человеку или организации взять этот код и модернизировать или адаптировать его под свое железо и свои задачи (там есть нюанс с лицензиями, но в рамках данной статьи он нам не интересен). Применение данных прошивок также удобно тем, что у обоих проектов есть достаточно развитые сообщества в интернете, где можно найти ответы на большинство вопросов и, таким образом, не остаться «один на один» со своей проблемой.

К сожалению, на линейке Anet ET производитель почему-то решил не использовать стандартные прошивки, а установить на принтер что-то свое. Я не стану говорить, что на их прошивке совершенно невозможно печатать – нет, я печатал на ней порядка двух лет, и вполне себе успешно, но она серьезно уступает по возможностям Марлину или Клипперу, а также просто глючит. Однако, менять что-то в работающем принтере мне не хотелось, так как при модернизации всегда есть риск сломать устройство и остаться ни с чем, особенно если предыдущего опыта в таких доработках нет. Поэтому я мирился с багами и терпел. Но настал момент, когда ET5X был обновлен на более современный FDM-принтер, и я, наконец, решился на апгрейд.

Но вернемся к теме – почему именно Клиппер? Несмотря на то, что и Марлин, и Клиппер выполняют одну и ту же задачу, внутри они очень разные. Марлин написан целиком на С/С++, компилируется в один двоичный файл, которым прошивается непосредственно микроконтроллер принтера. Далее принтер продолжает функционировать как и ранее – файлы для печати помещаются на ту же карту памяти, для управления печатью используется тот же экран и тач-скрин принтера и т.д. Если необходимо внести какие-либо изменения в параметры прошивки, Марлин необходимо пересобрать и заново запрограммировать в микроконтроллер. Установить Марлин на ET5X вполне возможно, и в интернете есть уже реализованные примеры. Также вынесу отдельной ссылкой репозиторий Marlin for ET4/5 series 3D printers.

С другой стороны, Клиппер – ПО совсем другого формата. Он состоит из двух частей – относительно небольшой программы для микроконтроллера принтера, написанной на С и умеющей выполнять лишь простые команды (даже проще, чем G-code), и основной управляющей программы, написанной, в основном, на Питоне, которая работает на отдельном компьютере под управлением ОС Линукс. Чаще всего в качестве такого Линукс-компьютера выступает SBC — одноплатный компьютер небольшого размера, построенный на каком-либо процессоре архитектуры AArch64 (64-битный ARM, как в телефоне). Однако, при сильном желании Клиппер можно запустить и на обычной Линукс-машине.

При использовании Клиппера кардинально меняется и управление принтером – все действия, включая и отправку файлов на печать теперь осуществляется из веб-интерфейса через обычный браузер. А если необходимо каким-либо образом изменить настройки Клиппера, в большинстве случаев достаточно лишь внести изменения в конфигурационные файлы, после чего просто перезапустить управляющую программу. Никаких перепрошивок микроконтроллера принтера производить не надо. Также, до недавнего времени, отдельной killer-фичей Клиппера являлся алгоритм Input Shaping — изменение параметров перемещения головки принтера для компенсации механического резонанса, возникающего в системе на определенной частоте. Однако, по последним данным, его в каком-то виде прикрутили и в Марлин. В общем, Input Shaping позволяет повысить скорость печати без серьезного ущерба для качества получаемых деталей, поэтому на таких старых принтерах как ЕТ5Х он однозначно полезен. Также в Клиппере есть и другие современные возможности, которых нет в Марлине, такие как поддержка телеграмм-бота, OctoEverywhere и т.д.

Прочитав всё сказанное выше, становится понятно, что если перед вами в каком-либо виде стоит вопрос выбора прошивки для 3Д-принтера и нет принципиальных ограничений, предпочтение следует отдать Клипперу. Производительность среднего одноплатного компьютера в разы выше производительности даже самой топовой платы управления принтером, что позволяет реализовать в Клиппере гораздо больше всяких функциональных возможностей. [Мне кажется, правильным подходом было бы вообще интегрировать Клиппер в слайсер, оставив в принтере лишь простейшую программу, но это уже совсем другая тема для разговора.]

Также, лично для меня важным моментом является возможность удаленной отправки файлов на печать по сети WiFi – ну, набегался я уже с флешками, особенно когда печатаешь каким-нибудь гибким TPU, нормально напечатать которым получается далеко не с первого раза, и приходится носиться туда-сюда, изменяя различные параметры в слайсере и повторяя печать.

И, наконец, перевод ЕТ5Х на Клиппер выглядит интересным челленджем – здесь необходимо разобраться с SBC, установить на него Линукс (о чем я многократно везде читал, но никогда сам не делал), перепрошить принтер, установить Клиппер, собрать правильный конфигурационный файл и запустить печать. Этим будет явно интересно заниматься, тем более, ведь Линукс – это система будущего: если когда-либо искусственный интеллект и решит совершить восстание против человечества, он определенно будет работать под управлением ОС Линукс. [Правда, восстание будет быстро подавлено – на большинстве других машин libc6 окажется не той версии.]

Orange Pi 3 LTS

Когда решение с выбором прошивки было принято, возник вопрос выбора одноплатного компьютера – какой лучше взять, ведь их сейчас целая куча? Мне кажется, основным моментом, на который необходимо обращать внимание при выборе SBC, является популярность платы и размер её интернет-сообщества: ведь если вдруг при настройке или работе с ней вы столкнетесь с какими-либо проблемами, интернет будет чуть ли не единственным местом, где вам смогут помочь. Если сообщество у SBC небольшое, не исключен вариант, что проблему вам придется решать самостоятельно. А это нервы, много кофе, бессонные ночи и красные глаза. Мне этого совсем не хотелось, ведь сплю последнее время я и так не очень.

По сообществу, конечно же, на первом месте «малина» — серия SBC Raspberry Pi. Но цены на малину высокие, да и задача у меня не сверхсложная, поэтому был выбран и приобретен, на мой взгляд, очень неплохой по соотношению цена/качество вариант SBC – Orange Pi 3 LTS или «апельсинка».

Уверен, данный SBC уже многократно обозревался в интернетах вдоль и поперек, поэтому остановлюсь лишь на основных его характеристиках:

  • Процессор Allwinner H6 64bit, 4 ядра Cortex™-A53, 1.8 ГГц
  • 2 ГБ ОЗУ
  • 8 ГБ встроенного ПЗУ, плюс слот для micro-SD карты памяти
  • WiFi + BT5.0
  • HDMI с поддержкой 4К
  • USB 2.0 + 2xUSB 3.0
  • Цена 3800 рублей на 11.11.2023

Кстати, уже после покупки узнал, что у нас есть и отечественные одноплатные компьютеры — Repka Pi. Интересно, хотя и дороже аналогов.

В принципе, Orange Pi 3 LTS – это overkill для Клиппера, ему для работы хватило бы и 256 МБ ОЗУ. Но если уж приобретать SBC, зачем покупать что-то из low end-сегмента, мало ли, каким будет окончательное будущее данной платы? А еще тут есть 8 ГБ встроенной памяти – это значит, что можно будет обойтись совсем без флеш-карты, что положительно скажется на надежности системы.

Приходит плата вот в такой красивой коробочке:

Orange Pi 3 LTS: Klipper – это очень просто.

Внутри инструкция и, собственно, плата в антистатическом пакете (пакет я уже снял):

Orange Pi 3 LTS: Klipper – это очень просто.

Лишь после того, как получил плату, я вспомнил, что процессору, ОЗУ и модулю управления питанием неплохо бы прикрутить радиаторы. Но купить-то я их забыл! Поэтому пришлось по-быстрому колхозить самодельные – из какого-то старого радиатора от чипсета материнской платы ПК выпилил прямоугольники размерами примерно 16х16, 16х12 и 7х7 миллиметров, после чего приклеил их на обычный тонкий двухсторонний скотч к микросхемам «апельсинки». Да, теплопроводность двухстороннего скотча остается под вопросом, но у меня не планируется больших нагрузок. Зато, при необходимости, радиаторы можно будет легко снять и заменить на нормальные.

Теперь плата стала выглядеть так:

Orange Pi 3 LTS: Klipper – это очень просто.

Раз у платы есть HDMI, первым делом решил подключить её к телевизору, чтобы посмотреть, что это вообще такое. Там оказалась установлена какая-то версия андроида, демонстрирующая основные возможности платы и позволяющая убедиться, что она работает исправно. Фото, к сожалению, не сделал, но этот андроид вполне себе запускался и работал. Но нам андроид сейчас не нужен, поэтому выключаем плату и идем дальше.

Установка ОС

Из всего зоопарка Линуксов мне привычней работать с Ubuntu – на ней я даже поднимал парочку серверов, один из которых, вроде как, работает и по сей день. Но в памяти почему-то отложилась рекомендация, что в качестве ОС для Клиппера рекомендовали Debian Bullseye. Что ж, Дебиан, так Дебиан, поэтому идем на сайт SBC и скачиваем последнюю доступную версию Дебиана без поддержки десктопа. Ради интереса, когда-нибудь можно будет скачать и вариант ОС с графическим рабочим столом, чтобы просто посмотреть, что это вообще такое, графическая ось на одноплатнике, но сейчас это не нужно.

Кстати, на этой же странице можно найти и другие варианты операционных систем, среди которых есть и MainsailOS — испанская версия Линукс для моряков операционная система с заранее предустановленным Клиппером и веб-интерфейсом Mainsail. То есть, по сути, если вам нужно по-быстрому клипперизировать какой-то принтер, это может оказаться хорошим выбором. Но это не так интересно, да и Fluidd (другой вариант веб-интерфейса) мне больше по душе.

Теперь, когда у нас есть скачанный образ, для установки операционной системы понадобится SD-карта на 8 или более гигабайт и утилита Balena Etcher, которую можно взять отсюда. Кстати, Balena Etcher – прекрасный пример современного стиля программирования: простая программа записи образа занимает целых 150 МБ, ImageUSB нервно курит в сторонке. Хотя, кого это сейчас волнует.

Процесс записи образа прост до невозможности – выбираем образ (его надо предварительно распаковать), выбираем, куда будем записывать и нажимаем кнопку «Flash!»:

Orange Pi 3 LTS: Klipper – это очень просто.

Теперь, по идее, можно вставить SD-карту в SBC и начать работу с компьютером. Но есть один нюанс – если вы хотите работать с платой удаленно по ssh, её нужно подключить к какой-либо сети. Обычно SBC подключают к беспроводным сетям, поэтому плате необходимо как-то указать имя сети и пароль. Сделать это можно тремя способами. Первый и наиболее простой – подключить к плате монитор и клавиатуру, дать ей загрузиться, после чего настроить WiFi руками. Второй, чуть посложнее – подключить плату к проводной сети, дать ей загрузиться, найти её IP в маршрутизаторе, зайти туда удаленно и снова настроить WiFi руками. Третий, наиболее сложный для типового Windows-пользователя – указать подключение к WiFi непосредственно на загрузочной флешке, тогда плата подключиться к беспроводной сети сразу же после первой загрузки.

Чем же последний способ так сложен, спросите вы? А тем, что Линукс использует для работы файловую систему ext4, в которую мы только что и отформатировали нашу SD-карту; но вот Windows умеет работать с этой файловой системой чуть менее, чем никак. То есть, Windows прочитать карту не сможет, соответственно, просто так взять и изменить на ней файл тоже не выйдет.

Это не станет проблемой, если у вас в доступности есть какое-либо другое устройство с Линуксом – вы можете просто воткнуть карту туда и отредактировать файл любимым Vim’ом. Но что делать, если такого устройства нет? Как обычно, ищем решение в интернете.

Варианты мне попадались разные, парочка из них просто не заработала (их приводить не стану), поэтому, в итоге, выбор пал на Linux File Systems for Windows от Paragon Software. Программа устанавливается, запускается и просто работает в фоне. Как только в систему вставляется флешка с ext4, программа создает дополнительный виртуальный диск, отображающий реальное содержимое флешки в понятном для Windows формате. Если на виртуальный диск вносятся изменения, они автоматически транслируются в ext4 и отправляются храниться на флешку. То есть, это именно то, что нужно! Единственный минус – программа платная.

Конечно, можно попробовать разные варианты, но, в данном случае, это просто не нужно – программа работает в пробном режиме 10 дней, чего вполне хватит для изменения одного единственного файла на флешке. Поэтому устанавливаем, запускаем, вставляем карту и видим следующую картину:

Orange Pi 3 LTS: Klipper – это очень просто.

Виртуальный диск появился, теперь можно и параметры WiFi указать. Для этого находим на карте файл /boot/orangepi_first_run.txt.template, переименовываем его в /boot/orangepi_first_run.txt, после чего вносим в файл следующие изменения (выделены красным):

Orange Pi 3 LTS: Klipper – это очень просто.

В параметрах FR_net_wifi_ssid и FR_net_wifi_key следует указать имя вашей сети и её пароль. В параметре FR_net_wifi_countrycode можно указать код нашей страны. А можно не указывать.

Теперь отключаем карту от ПК (не забывая о безопасном извлечении), вставляем в SBC и дрожащими руками подключаем питание. Тот самый момент настал!

Тут я не выдержал и всё-таки подключил SBC еще и к телевизору, чтобы просто посмотреть, что же там будет происходить. SBC успешно увидел монитор и даже поддержал 4К-разрешение:

Orange Pi 3 LTS: Klipper – это очень просто.

Процесс начальной загрузки длился порядка 9 минут, т.к. SBC увидел, что записанный на карту образ не соответствует её реальному размеру, и решил, что диск необходимо расширить. Вот этот процесс расширения и занял основную часть загрузочного времени. Затем плата завершила начальную инициализацию и приветливо замигала курсором терминала в ожидании дальнейших команд. Всё, вот он, наш Линукс.

Сейчас, если бы к плате была подключена клавиатура, можно было бы уже начать работать. Но нам нужен удаленный доступ, поэтому идем в маршрутизатор, находим IP платы и подключаемся к ней по ssh любым доступным терминалом. Если никакого терминала нет, можно начать с MobaXterm — во-первых, он даже не требует установки (а я люблю portable-программы), а, во-вторых, в нем есть не только ssh-клиент, но и удобный графический клиент sftp, позволяющий привычными движениями мыши перекидывать файлы на устройство и обратно.

Настройка SBC

Создаем сессию, вводим IP, подключаемся. Для начального подключения используем имя пользователя root и пароль orangepi

Orange Pi 3 LTS: Klipper – это очень просто.

Отлично. Теперь вкратце перечислю, что нужно сделать с платой. Прежде всего, удаляем китайские сервера пакетов и прописываем «нормальные»:

nano /etc/apt/sources.list

Содержимое файла удаляем и указываем следующее:

deb http://deb.debian.org/debian bullseye main contrib non-free

#deb-src http://deb.debian.org/debian bullseye main contrib non-free
deb http://deb.debian.org/debian bullseye-updates main contrib non-free
#deb-src http://deb.debian.org/debian bullseye-updates main contrib non-free
deb http://deb.debian.org/debian bullseye-backports main contrib non-free
#deb-src http://deb.debian.org/debian bullseye-backports main contrib non-free
deb http://security.debian.org/ bullseye-security main contrib non-free
#deb-src http://security.debian.org/ bullseye-security main contrib non-free

Запись файла в nano – Ctrl-O, выход – Ctrl-X. Теперь обновляем индексы пакетов и, собственно, сами установленные пакеты:

apt update && apt upgrade

Установим временную зону:

timedatectl set-timezone Europe/Moscow

[Кстати, плата не имеет RTC, поэтому получает текущее время из интернета при каждой загрузке. То есть, для нормальной работы ей или нужен интернет, или внутренний NTP-сервер, или внешняя плата RTC.]

Для совместимости (да и хватит уже под рутом работать) создадим пользователя pi с паролем pi:

adduser pi

Чтобы pi мог выполнять серьезные задачи, разрешим ему sudo:

usermod -aG sudo pi

Поскольку я искренне верю в то, что в моей локальной сети безопасно, отключим запрос пароля для sudo:

visudo

После чего открывается специальный текстовый редактор nano, идем в конец файла и дописываем строчку:

pi ALL=(ALL) NOPASSWD: ALL

Orange Pi 3 LTS: Klipper – это очень просто.

В принципе, на данном этапе общую настройку SBC можно считать завершенной – подключайтесь под пользователем pi и делайте то, что вам нужно. Но мне не хватает любимых «синих панелей» — файлового менеджера Far.

Far Manager на SBC

За клавиатурой сидел большой темнокожий детина, беспрерывно нажимавший TAB, F6, Enter, TAB, F6, Enter, напевая: «I like to move it, move it», «I like to move it, move it».

Возможно, среди вас есть олдфаги, которые слышали про Нортон-коммандер. Возможно, кто-то из вас даже работал в нем. Возможно, кому-то концепция двух панелей на синем фоне так понравилась, что позже он перешел на DOS Navigator, а еще позже – на Far Manager. Это всё вполне возможно, поэтому поделюсь с вами рецептом, как устанавливать Far везде, в том числе и на армовом SBC.

Вообще, изначально Far Manager сделал Евгений Рошал, более известный как автор винрарного архиватора WinRAR. Far тогда был ANSI-приложением, а Windows внезапно начала переходить на юникод, вследствие чего Far оказался неспособен работать с некоторыми файлами. Евгений расстроился и забросил проект. Православный Far начал вытесняться бесовским Windows Commander’ом. Но Евгений не закопал Far, предварительно он отдал его исходники «в хорошие руки» сообщества и завещал выпускать новые версии. Так родилась Far Group. Чуть позже MS наехала на Ghisler Software GmbH и Windows Commander пришлось переименовать в Total Commander, а сообщество таки за 7 лет перевело Far на юникод. Вот так Far Manager и стал Open Source, но это не точно.

Оригинальный Far Manager работает только под Windows, но идея синих панелей не давала покоя и людям с красными глазами. Так появился проект far2l — порт Far под ОС Линукс. Кстати, проект активно развивается, за что хочется выразить огромную благодарность его авторам.

Итак, если Far под Линукс существует, почему бы не запустить его на Arm? Опущу часик неудачных попыток установки Far и его зависимостей из разных репозиториев и перейду сразу к результату – есть другой проект, который называется far2l portable. Как видно из названия, это портабельная версия Far Manager для Линукс. Ого, даже без установки? Дайте две! Или даже три, ведь автор проекта – огромный молодец и выложил сборки под разные архитектуры, в том числе и под aarch64. Кстати, релиз состоялся всего два дня назад, поэтому страшно и представить, что бы я делал, если бы решил установить Клиппер неделей раньше.

Итак, идем в наш SBC и выполняем команду:

wget https://github.com/spvkgn/far2l-portable/releases/download/latest/far2l_aarch64.run.tar

Теперь остается распаковать tar-архив (вы же умеете распаковывать tar-архивы под Линукс?)

tar -xvf far2l_aarch64.run.tar

И, собственно, запустить сам менеджер (не забываем проверить атрибуты файла). И, о, чудо – вот они, наши синие панели:

Orange Pi 3 LTS: Klipper – это очень просто.

[Примечание: если панели не очень-то и синие, как в MobaXterm, вам необходимо настроить цветовую схему терминала:

Orange Pi 3 LTS: Klipper – это очень просто.

или использовать другой терминал, например, даже ssh из wsl.]

По сути, портабельная версия Far при каждом старте распаковывается из «себя» во временный каталог, после чего запускается оттуда, что может оказаться неудобным. Поэтому можно запустить Far, найти распакованные файлы во временном каталоге, перенести их на постоянное место (например, в /var/opt/far2l), после чего создать скрипт /usr/bin/far2l, который будет запускать Far:

#!/bin/sh

(cd /var/opt/far2l && ./far2l)

При создании скрипта не забываем, что мы работаем под Линукс, и чтобы файл «запускался», это надо явно разрешить:

chmod +x /usr/bin/far2l

Вот теперь общую настройку SBC точно можно считать завершенной.

Подключение через WSL

В современной ОС Windows есть WSL, в которую входит, в том числе, и ssh-клиент, так что для подключения к Линукс-машинам сейчас даже не нужен сторонний терминал. Его можно тоже настроить, а, заодно, перейти на авторизацию по ключу.

Первое, что надо сделать, это сгенерировать ключ авторизации. Делается это так (в командной строке ПК):

ssh-keygen

Утилита спросит, куда положить ключ (вариант по умолчанию C:Users<user>/.ssh/id_rsa вполне подойдет), пароль для защиты ключа (я оставил пустым, что означает «без пароля»), после чего сгенерирует ключ и выведет небольшой text-art:

Orange Pi 3 LTS: Klipper – это очень просто.

Теперь открываем файл C:Users<user>.sshid_rsa.pub, копируем имеющуюся там строчку в буфер обмена целиком, переходим на SBC в наш домашний каталог, создаем каталог .ssh, а в нем новый файл с именем authorized_keys (путь целиком: ~/.ssh/authorized_keys), куда и вставляем содержимое буфера обмена. После чего сохраняем файл и возвращаемся на ПК, где создаем файл C:Users<user>.sshconfig со следующим содержимым:

C:UsersSD.sshconfig 

Host <alias_name>
User pi
Hostname <orange_pi_ip>
IdentityFile C:Users<user>.sshid_rsa

Например:

Host opi

User pi
Hostname 192.168.7.12
IdentityFile C:UsersSD.sshid_rsa

Теперь подключиться к SBC можно одной командой из командной строки:

ssh opi

Установка Клиппера

Некоторое время назад установить и настроить Клиппер было достаточно сложно. К счастью, эти времена прошли. Умные люди создали просто отличный скрипт KIAUH (Klipper Installation And Update Helper), который сделает всё за вас. Открываем терминал SBC и просто вводим команды (гит, кстати, в бычьем глазе уже имеется):

cd ~

git clone https://github.com/dw-0/kiauh.git
./kiauh/kiauh.sh

На экран будет выведено интерактивное текстовое меню (да, такие тоже бывают), скрин которого сделать я забыл, но там просто необходимо выбрать пункт 1 [Install] (клавиши «1, Enter»). Далее появится меню выбора устанавливаемых компонентов:

Orange Pi 3 LTS: Klipper – это очень просто.

В этом меню надо последовательно установить Klipper (1), Moonraker (2) и Fluidd (4). Klipper, собственно – это основной код Клиппера, Moonraker – его API для взаимодействия со внешними системами, а Fluidd – удобный веб-интерфейс для управления принтером (тут альтернативно можно установить Mainsail). При установке Клиппера следует выбрать версию Питона 3.х и один устанавливаемый экземпляр. Установка компонентов производится по очереди и может занять некоторое время.

После этого главное меню KIAUH у вас будет выглядеть примерно так:

Orange Pi 3 LTS: Klipper – это очень просто.

Всё, Клиппер установлен и можно переходить к следующему шагу – его настройке. Если интересно, то уже можно набрать в браузере IP-адрес принтера и посмотреть на веб-интерфейс Fluidd. Однако, на данном этапе он должен лишь выводить ошибку, что Клиппер не может подключиться к MCU.

Отдельно отмечу еще одну деталь – начиная с текущего момента все манипуляции с Клиппером (обновление, удаление, переустановка) следует делать только через KIAUH, который будет доступен по тому же самому пути, что и раньше (~/kiauh/kiauh.sh).

Прошивка МК принтера

Настало время прошить МК принтера микропрограммой от Клиппера. Но для начала эту микропрограмму необходимо скомпилировать именно под нашу плату. Поэтому идем в терминал SBC и запускаем конфигуратор:

cd ~/klipper

make menuconfig

На экране у нас появится еще одно текстовое интерактивное меню, в котором необходимо указать следующие параметры для компиляции прошивки:

Orange Pi 3 LTS: Klipper – это очень просто.

Забегая немного вперед, скажу, что плата принтеров Anet ET спроектирована таким образом, что для перепрошивки микроконтроллера необходимо физически подключиться к ней с помощью программатора ST-Link. Так что, по-хорошему, нам бы очень не помешал bootloader. Но пару часов попыток совместить OpenBlt с Клиппером у меня успехом не увенчались, поэтому отложим эту задачу на будущее, а сейчас выбираем «No bootloader» в меню Клиппера. После ввода всех параметров нажимаем Esc и подтверждаем сохранение изменений. Теперь осталось физически собрать прошивку:

make

После этого по пути ~/klipper/out/klipper.bin появится готовый двоичный файл прошивки, который можно зашивать в МК принтера. Этот файл необходимо скопировать с SBC на ПК (для этого можно воспользоваться SFTP-клиентом, входящим в состав MobaXterm)

Теперь берем принтер, переворачиваем его на бок и снимаем нижнюю крышку. Нам открывается прекрасный внутренний мир Anet ET5X:

Orange Pi 3 LTS: Klipper – это очень просто.

[Если что, блок питания в принтере уже не оригинальный.]

Отсоединяем все разъемы, откручиваем плату и несем её поближе к ПК. Если есть возможность принести поближе к ПК весь принтер – еще лучше, тогда ничего отсоединять и откручивать не надо, можно прошивать плату прямо так.

Для прошивки понадобится программатор ST-Link и одноименная программа STM32 ST-LINK utility. К сожалению, скачать по указанной ссылке программу с территории России нельзя, поэтому или используем VPN, или гуглим, откуда еще её можно взять. Далее устанавливаем программу и драйвера для программатора (установщик спросит), подключаем программатор в USB и убеждаемся, что ST-LINK видит ST-Link:

Orange Pi 3 LTS: Klipper – это очень просто.

У меня ST-LINK написал, что у программатора устаревшая прошивка, после чего работал с ним крайне нестабильно, были частые отвалы от МК. Обновлять поначалу было страшно, вдруг оригинальное ПО окирпичит китайское железо (как было с FT232), но потом нашел у себя плату STM32 Value, которую можно в крайнем случае использовать как ST-Link, так что, в конечном счете, решился на обновление (делается через меню ST-LINK). К моему небольшому удивлению, ST-LINK успешно обновил прошивку китайского ST-Link и после этого работал с ним весьма стабильно. Так что обновлять прошивку крайне рекомендую (но это не точно).

Далее необходимо подключить программатор к МК на плате принтера. Для этого находим небольшую гребенку из 4-х пинов рядом с МК и подключаем их к выходу программатора по следующей «схеме» (DuPont-проводки идут в комплекте с программатором):

1. Ближайший к МК пин соединяем с землей программатора (GND)

2. Следующий пин (вывод 76 МК) соединяем с SWCLK

3. Третий по счету пин (вывод 72 МК) соединяем с SWDIO

4. Четвертый пин и четвертый проводок (задуманный для подачи питания) оставляем висеть в воздухе

Выглядит это примерно так:

Orange Pi 3 LTS: Klipper – это очень просто.

Далее на плату принтера необходимо подать питание. Если вы не вытаскивали плату из корпуса и не отсоединяли разъемы, то просто включите принтер. В моем же случае пришлось подать внешние питание от блока на 12 В. Номинально принтер рассчитан на 24 В, однако на входе стоит Step-down преобразователь, который сделают нужное напряжения и из 12 В. В теории можно было подать 3.3 В с выхода ST-Link непосредственно на МК платы, однако, не зная её схемотехники делать этого я не стал.

Теперь в программе ST-LINK можно подсоединиться к МК:

Orange Pi 3 LTS: Klipper – это очень просто.

Оказалось, что МК не залочен производителем, и текущую прошивку можно легко считать для создания бэкапа. Это хорошо, если идея с Клиппером не понравится, всегда можно будет вернуть её назад и продолжить эксплуатировать принтер как и раньше. В данной серии МК есть аж целый мегабайт ПЗУ (не смейтесь, для МК это правда немало), который начинается с адреса 0x08000000, поэтому вводим это значение в поле адреса, в поле размер вводим 0x00100000 = 1 МБ и сохраняем прошивку на диск. Если немного глянуть внутрь того, что мы скачали, можно увидеть, что первые 64 КБ занимает бутлоадер, а дальше идет совершенно стандартная прошивка ET5X v1.0.0, которую можно даже скачать с их сайта.

Теперь загружаем созданный ранее klipper.bin и прошиваем МК. В качества адреса прошивки выбираем начало ПЗУ = 0x08000000. Через несколько секунд, когда прошивка завершится, плату можно отключать от программатора, ставить назад в принтер и всё собирать обратно.

Отмечу один важный момент: прошивка через ST-Link возможна только в том случае, если микропрограмма принтера не переопределила выводы, используемые при программировании. Микропрограмма Клиппера, по всей видимости, именно так и делает, поэтому, чтобы повторно перепрошить МК после Клиппера, необходимо выполнить следующие действия:

1. Подключить программатор

2. Зажать на плате принтера кнопку сброса (она расположена рядом с ионистором)

3. Нажать в программе ST-LINK кнопку «Connect»

4. Тут же отпустить кнопу сброса на плате

Программатор подключится, и вы сможете нормально программировать МК.

Настройка Клиппера

Для дальнейшей настройки Клиппера подключаем принтер к SBC кабелем USB A-B (я выбрал для этого порт USB2.0 на SBC) и включаем притер. Конфигурировать Клиппер удобнее всего через веб-интерфейс, поэтому вводим в браузере адрес принтера, после чего должен открыться Fluidd. У меня изначально он открылся на русском языке, поэтому мне понадобилось перейти в настройки Fluidd, временно выбрать там русский, после чего переключить обратно на английский. Далее на панели слева нажимаем иконку фигурных скобок (конфигурация Клиппера), затем находим в списке файл printer.cfg и нажимаем на него:

Orange Pi 3 LTS: Klipper – это очень просто.

Файл откроется на редактирование прямо в браузере. После внесения требуемых изменений следует нажать кнопку «Save & Restart», расположенную сверху справа, и тогда изменения сохранятся, а управляющая программа Клиппера будет перезапущена, чтобы их перечитать. С полной документацией по конфигурации Клиппера можно ознакомиться тут.

Первым делом необходимо настроить подключение к микроконтроллеру. Плата Anet ET спроектирована таким образом, что вход USB идет не напрямую в микроконтроллер, а подключен к преобразователю USB <-> UART, выход которого уже подключен к UART МК (за счет этого, кстати, невозможно перепрограммировать МК в режиме DFU). Это также означает, что подключение такого устройства создает в системе новый последовательный порт. Вот его и нужно найти. Для этого идем в терминал и выполняем команду ls -al /dev/serial/by-id/

Orange Pi 3 LTS: Klipper – это очень просто.

Если вы ничего другого еще не подключали к SBC, в списке будет лишь одно устройство. Необходимо скопировать его идентификатор (у меня он получился usb-1a86_USB2.0-Serial-if00-port0) и вернуться к конфигу Клиппера, где занести его в секцию подключения к МК:

[mcu]

baud: 115200
restart_method: command
serial: /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0

Далее зададим основные параметры принтера:

[printer]

kinematics: cartesian
max_velocity: 300
max_accel: 3000
max_accel_to_decel: 3000
max_z_velocity: 50
max_z_accel: 50

Здесь я решил, что мой принтер может перемещаться со скоростью 300 мм/сек и ускорением 3000 мм/сек². А если не может? Или может больше? Тогда я просто поменяю значения в конфиге на другие, и Клиппер будет им следовать.

Теперь нужно заполнить остальные секции. Я приведу свой конфиг в конце статьи, поэтому не буду подробно останавливаться на каждой. Для заполнения проще всего взять за основу какой-либо готовый конфиг из интернета и по очереди копировать оттуда секции, внося требуемые изменения «на лету». Я за основу взял данный конфиг для ET4X, а также руководствовался распиновкой платы принтера.

Требуемые секции:

  • Параметры шаговых двигателей: [stepper_{x|y|z}]
  • Параметры экструдера: [extruder]
  • Подогрев стола: [heater_bed]
  • Настройки вентиляторов: [fan], [heater_fan]
  • Датчик приближения к столу: [probe]
  • Параметры карты стола: [bed_mesh]
  • Координаты парковки по Z: [safe_z_home]

Для определения координат срабатывания концевиков по осям X/Y и положения датчика стола относительно сопла придется взять линейку и провести несколько измерений, но это совсем не сложно. При указании смещения датчика стола имейте в виду, что отрицательные значения указывают в сторону начала координат. Так как у нас по оси Z не концевик, а датчик, еще понадобится указать координаты X/Y для парковки (обычно выбирается центр стола).

Когда настройки будут завершены, сохраните конфигурацию и перезапустите Клиппер. Если вы допустите какие-то концептуальные ошибки, Клиппер об этом сообщит и вам придется вернуться и устранить их. В конечном счете, когда ошибок не останется, можно, наконец, попробовать принтер в действии. Но что-то отправлять на печать пока рано, сначала надо выполнить следующие шаги:

  • Убедиться, что парковка осей X и Y работает правильно
  • Проверить парковку Z
  • Включить подогревы сопла и стола и убедиться, что вентилятор охлаждения головки включается, а температуры растут
  • Настроить PID-регуляторы сопла и стола (команды PID_CALIBRATE HEATER=extruder TARGET=250 и PID_CALIBRATE HEATER=heater_bed TARGET=70)
  • Откалибровать экструдер
  • ???
  • PROFIT

После этого следует снять карту стола. Делается это на рабочей температуре как сопла, так и стола, чтобы компенсировать все возможные тепловые расширения. В моем случае это 235 и 70 градусов, используемые для печати PETG. В итоге, получился вот такой стол:

Orange Pi 3 LTS: Klipper – это очень просто.

Теоретически, стол можно было бы еще попытаться подстроить винтами, т.к. раньше 0.28 мм считалось достаточно большим диапазоном, однако, для Клиппера печатать на таком столе – вообще не проблема, первый слой будет ложиться хорошо. Добавим лишь в конфиг секцию, чтобы Клиппер сам загружал карту стола после старта:

[delayed_gcode bed_mesh_init]

initial_duration: .01
gcode:
BED_MESH_PROFILE LOAD=default

Подключение экрана

На этом, в принципе, конфигурацию Клиппера можно было бы завершить и перейти уже к печати, но меня сильно смущал белый экран принтера. Белым он получился потому, что его поддержка никак не настроена в прошивке, и он отображает то, что считает нужным контроллер, а контроллер много не раздумывает. Поскольку в конфиге от ЕТ4, который я брал за основу, поддержка экрана есть, я подумал, что легко смогу перенести её и сюда. Но это оказалось не совсем так. Точнее, совсем не так.

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

Если посмотреть описание компонентов платы принтера, то видно, что ЕТ4 использует экран на контроллере ST7789, а ЕТ5Х – на ST7796S, то есть, просто скопировать конфиг ЕТ4 здесь не выйдет. А если пойти глубже и посмотреть документацию Клиппера, окажется, что поддержки ST7796S в нем нет вообще.

Тогда я решил начать с того, что просто перенести настройки с ЕТ4 – ведь оригинальные платы от этих принтеров очень похожи, может и модули дисплея тоже? И тут же столкнулся с новой проблемой – оказалось, что поддержки ST7789 в Клиппере тоже нет! А ведь он как-то работал на том ЕТ4? Разгадка была простой – г-н pienjo добавил поддержку этого дисплея в Клиппер сам!

В итоге, покопавшись немного в незнакомом питонячем коде, прикрутить дисплей все же удалось. Не буду вдаваться в детали, т.к. искренне считаю, что это практически не нужно, остановлюсь лишь на основных моментах (если вдруг у кого появится интерес, пишите в комментах):

  • Добавить из репозитория pienjo файл st7789v.py
  • Добавить в display.py включение st7789v.py
  • Исправить в st7789v.py пару ошибок, связанных с обновлением Клиппера и Питона за это время, изменить направление экрана по горизонтали
  • Добавить в Клиппер файл lcd_st7789v.c, т.к. поддержка дисплея должна быть и в МК
  • Добавить lcd_st7789v.c в makefile, чтобы он компилировался
  • Перепрошить МК
  • Добавить в конфиг Клиппера параметры, связанные с дисплеем

Внешне дисплей теперь выглядит так:

Orange Pi 3 LTS: Klipper – это очень просто.

Кнопки просто отображаются, но пока что не работают, т.к. поддержку xpt2046 в Клиппер тоже надо добавлять.

Пробная печать

Так ради чего это всё затевалось? Ну, вроде как, чтобы печатать. Печатать лучше и быстрее. Поэтому после приблизительной настройки «на глаз» Input Shaping (MZV 25 Hz) и Pressure Advance (0.12) напечатал тестовый кубик на скорости 100 мм/сек с ускорением 2000 мм/сек² (3000, к сожалению, оказалось слишком много – всё же большой стол принтера дает о себе знать). Тестовая печать заняла ровно 15 минут (не обращайте внимания на значения РА на скрине, он делался в другое время):

Orange Pi 3 LTS: Klipper – это очень просто.

Раньше, емнип, такой же кубик печатался примерно за 37 минут, так что прирост скорости тут налицо. А что же по качеству? Смотрите сами:

Orange Pi 3 LTS: Klipper – это очень просто.

Слева расположен кубик, напечатанный сейчас, справа – раньше. Первый и последний слои однозначно стали лучше. Также PA дает о себе знать – хоть на кубике и не очень заметно, но на углах ушли наплывы пластика. И, вообще, принтер начал печатать «чище», т.к. уменьшились «капли» в местах ретракта и меньше пластика сочится из сопла при холостом перемещении. Это очень важно, т.к. означает меньше постобработки напечатанной детали напильником ножом.

Но что-то стало и хуже, например, геометрия – это из-за 100 мм/сек (у старого внешние стенки были 25 мм/сек), всё же механика принтера не топ. Хуже выглядят и нависания (на такой скорости нужен лучше обдув), а углы стали менее острыми – это из-за ускорения и Input Shaping. В целом же, я постарался максимально передать дефекты печати на фото, в жизни они так в глаза не бросаются, оба кубика выглядят достаточно хорошо.

Если останавливаться на финальных параметрах печати, я бы снизил скорость внешних стенок до 50 мм/сек, внутренних до 70 мм/сек, ускорение до 1500 мм/сек², тщательно подобрал Input Shaping, чуть уменьшил бы экструзию, таким образом, получив примерно х1.5 — 2 от изначальной скорости при лучшем, в целом, качестве.

Итоги

Перевод принтера на Клиппер оказался интересным и далеко не таким сложным, как это изначально казалось. Результат тоже приятный – произведение скорости на качество у принтера явно поднялось. Я теперь даже жалею, что два года сидел на стоковой прошивке. Так что, если у вас есть сомнения, переходить на Клиппер или нет – переходите, не сомневайтесь. Рекомендую.

Что касается самого ЕТ5Х – на Клиппере он еще вполне мог бы поработать, тем более, бывают задачи, требующие именно его большую область печати. Однако, к покупке я его не рекомендую, т.к. из коробки принтер посредственный, в нем надо много чего дорабатывать:

  • Перевод на директ: это, прямо, мастхэв.
  • Клиппер: обязательно, т.к. штатная прошивка глючит, а обновлений её нет и не будет.
  • Замена обдува: обязательно, штатного обдува, можно считать, что нет.
  • Замена экструдера: очень желательно, т.к. штатный – полная фигня с одной шестеренкой.
  • Заменя хотэнда: желательно, штатный не очень.

Спасибо тем, кто дочитал до конца, ниже прикладываю получившийся конфиг. Всем добра!

printer.cfg
[include fluidd.cfg]

[virtual_sdcard]
path: /home/pi/printer_data/gcodes
on_error_gcode: CANCEL_PRINT
[mcu]
baud: 115200
restart_method: command
serial: /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0
[printer]
kinematics: cartesian
max_velocity: 300
max_accel: 3000
max_accel_to_decel: 3000
max_z_velocity: 50
max_z_accel: 50
[safe_z_home]
home_xy_position: 150, 150
speed: 100
z_hop: 5
z_hop_speed: 5
[stepper_x]
step_pin: PB6
dir_pin: !PB5
enable_pin: !PB7
rotation_distance: 40
microsteps: 16
endstop_pin: ^!PC13
position_min: -2
position_endstop: -2
position_max: 300
homing_speed: 100
second_homing_speed: 25
[stepper_y]
step_pin: PB3
dir_pin: PD6
enable_pin: !PB4
rotation_distance: 40
microsteps: 16
endstop_pin: ^!PE12
position_min: -19
position_endstop: -19
position_max: 300
homing_speed: 100
second_homing_speed: 25
[stepper_z]
step_pin: PA12
dir_pin: !PA11
enable_pin: !PA15
rotation_distance: 8
microsteps: 16
endstop_pin: probe:z_virtual_endstop
position_min: -5
position_max: 350
homing_speed: 12
second_homing_speed: 5
[extruder]
step_pin: PB9
dir_pin: PB8
enable_pin: !PE0
rotation_distance: 22.57
microsteps: 16
nozzle_diameter: 0.400
filament_diameter: 1.750
heater_pin: PA0 # END_CONTROL
sensor_pin: PA1 # TEMP_EXB1
sensor_type: EPCOS 100K B57560G104F
max_extrude_only_distance: 1000
pressure_advance: 0.08
pressure_advance_smooth_time: 0.040
#control: pid
#pid_Kp: 20.375
#pid_Ki: 0.844
#pid_Kd: 123.016
min_temp: 0
max_temp: 250
[heater_bed]
heater_pin: PE2 # BED_CONTROL
sensor_pin: PA4 # TEMP_BED
sensor_type: EPCOS 100K B57560G104F
#control: pid
#pid_Kp: 70.721
#pid_Ki: 1.981
#pid_Kd: 631.118
min_temp: 0
max_temp: 125
[fan]
pin: PE3 # LAY_FAN
max_power: 1.0
cycle_time: 0.010
kick_start_time: 0.500
[heater_fan hotend_fan]
pin: PE1 # END_FAN
max_power: 1.0
cycle_time: 0.010
heater_temp: 50.0
[temperature_sensor orange_temp]
sensor_type: temperature_host
min_temp: 0
max_temp: 100
[temperature_sensor mcu_temp]
sensor_type: temperature_mcu
min_temp: 0
max_temp: 100
[probe]
pin: ^!PC3
deactivate_on_each_sample: False
x_offset: -22.0
y_offset: -8.0
#z_offset: 0.170
speed: 5.0
samples: 2
sample_retract_dist: 2.0
lift_speed: 5.0
samples_result: average
samples_tolerance: 0.05
samples_tolerance_retries: 5
[bed_mesh]
speed: 150
horizontal_move_z: 5
mesh_min: 25, 25
mesh_max: 275, 275
probe_count: 5, 5
fade_start: 3.0
fade_end: 10.0
algorithm: bicubic
zero_reference_position: 150, 150
[delayed_gcode bed_mesh_init]
initial_duration: .01
gcode:
BED_MESH_PROFILE LOAD=default
[pause_resume]

[display_status]
########################################
# EXP1 / EXP2 (display) pins
########################################
[board_pins]
aliases:
# P1 header
P1_1=PD7, P1_3=PB2, P1_5=PE4, P1_7=PB1, P1_9=<GND>,
P1_2=PD5, P1_4=PE5, P1_6=PB0, P1_8=PD4, P1_10=<3V3>,
# P2 header
P2_1= PE6, P2_3=PD15, P2_5=PD1, P2_7=PE8, P2_9=PE10,
P2_2=PD13, P2_4=PD14, P2_6=PD0, P2_8=PE7, P2_10=PE9
[display]
lcd_type: st7789v
fgcolor: 255,255,0
bgcolor: 0, 0, 64
resx_pin: P2_1
dcx_pin: P2_2
csx_pin: P1_1
wrx_pin: P1_2
rdx_pin: P1_8
d15_pin: P2_9
d14_pin: P2_10
d13_pin: P2_7
d12_pin: P2_8
d11_pin: P2_5
d10_pin: P2_6
d9_pin: P2_3
d8_pin: P2_4
rect: 0,0,480,320
button0_rect: 0,260,114,320
button0_fgcolor: 255,255,255
button0_bgcolor: 48,63,0
button0_glyph:
.......**.......
......****......
.....**..**.....
....**....**....
...**......**...
..**........**..
.**..........**.
****************
button1_rect: 122,260,236,320
button1_fgcolor: 255,255,255
button1_bgcolor: 0,0,63
button1_glyph:
........**....**
......**....**..
....**....**....
..**....**......
**....**........
**....**........
..**....**......
....**....**....
......**....**..
........**....**
button2_rect: 244,260,358,320
button2_fgcolor: 255,255,255
button2_bgcolor: 192,16,16
button2_glyph:
...............**
.............**..
...........**....
**.......**......
.**....**........
..**.**..........
...**............
button3_rect: 366,260,480,320
button3_fgcolor: 255,255,255
button3_bgcolor: 48,63,0
button3_glyph:
****************
.**..........**.
..**........**..
...**......**...
....**....**....
.....**..**.....
......****......
.......**.......
#*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [extruder]
#*# control = pid
#*# pid_kp = 37.162
#*# pid_ki = 3.754
#*# pid_kd = 91.976
#*#
#*# [heater_bed]
#*# control = pid
#*# pid_kp = 72.007
#*# pid_ki = 1.450
#*# pid_kd = 893.786
#*#
#*# [bed_mesh default]
#*# version = 1
#*# points =
#*# -0.166250, -0.133750, -0.122500, -0.101250, -0.092500
#*# -0.115000, -0.057500, -0.017500, 0.005000, -0.027500
#*# -0.126250, -0.045000, 0.000000, 0.046250, 0.017500
#*# -0.168750, -0.088750, -0.055000, -0.053750, -0.067500
#*# -0.167500, -0.155000, -0.142500, -0.231250, -0.153750
#*# x_count = 5
#*# y_count = 5
#*# mesh_x_pps = 2
#*# mesh_y_pps = 2
#*# algo = bicubic
#*# tension = 0.2
#*# min_x = 25.0
#*# max_x = 275.0
#*# min_y = 25.0
#*# max_y = 275.0
#*#
#*# [probe]
#*# z_offset = 0.490

СМОТРИ ТАКЖЕ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *