Embedded · Reverse engineering · Klipper
Как я поставил голову Anycubic Kobra X на самодельный CoreXY
Я интегрировал четырёхканальную голову ACE GEN2 в самодельный CoreXY, сохранив её штатную электронную плату и всю исполнительную механику. Самое сложное было не закрепить модуль на портале, а разобраться в его электронике, подготовить для контроллера головы прошивку Klipper и собрать надёжный цикл смены четырёх материалов с резаком, датчиками и определением Z по усилию на сопле.
- 4 канала · 1 сопло
- GD32F303 + STM32F446
- UART · 576000 бод
- ≈250 с · полный T-цикл
- Стол · 320 × 320 мм
01 · Задача
Что нужно было подружить
ACE GEN2 — это не просто экструдер. В одном корпусе у неё четыре входа филамента, селектор каналов, общий привод подачи, механический резак, хотэнд, два вентилятора, семисегментный индикатор, датчики движения по каждому каналу и тензодатчик в сопле. На собственной плате стоят микроконтроллер, драйверы двигателей и силовые ключи.
Подключить такую голову как обычный экструдер нельзя. Сначала нужно было понять, как с ней разговаривать, какой узел за что отвечает, чем подтверждать каждое движение и как безопасно останавливаться при ошибке. Базой стал самодельный CoreXY на алюминиевом профиле со столом 320 × 320 мм. Кинематикой управляет BTT Octopus на STM32F446, а Raspberry Pi 3 с Klipper, Moonraker и Mainsail отвечает за хостовую часть.
Мне было важно не просто заставить механику двигаться, а сделать так, чтобы у каждого действия было проверяемое подтверждение, а при его отсутствии система останавливалась.
Проверка узлов
Проверка шла от безопасного к рискованному: сначала осмотрены компоненты и прозвонена плата без питания, затем плата запущена от лабораторного источника с ограничением тока, записан UART-обмен и отдельно проверены исполнительные механизмы. На принтер голова попала только после этого. Функция считалась рабочей, когда команда стабильно давала ожидаемое действие и его можно было подтвердить независимо: импульсами энкодера, датчиком, током, температурой или выходом материала из сопла.
02 · Контроллеры
Кто за что отвечает
Первый вариант сохранял штатную прошивку и эмулировал для неё материнскую плату Anycubic. Удалось восстановить идентификацию устройства, часть команд и общую модель каналов. Но закрытый протокол не давал достаточно надёжно связать команду, действие механизма и его подтверждение. Поэтому контроллер головы переведён на прошивку, совместимую с Klipper.
Klipper раздаёт события двум MCU. Octopus занимается кинематикой CoreXY, осью Z и нагревателем стола. GD32F303 локально управляет головой: селектором, подачей, хотэндом и датчиками. Связь с KXHead организована через CP2102 по UART 3,3 В на скорости 576000 бод. После этого EBB42, BLTouch и отдельный датчик окончания филамента больше не нужны.
03 · Плата и прошивка
Плата и обновление прошивки
Назначение узлов восстанавливалось по маркировке компонентов, прозвонке цепей и стендовым испытаниям с ограниченным током. Так удалось найти два шаговых привода, четыре пары энкодерных входов, четыре сигнала ready, нагреватель, термистор, два вентилятора, индикатор, акселерометр и АЦП CS1237 для тензомоста. Отдельно восстановлена разметка flash-памяти GD32F303.
| Область | Адрес | Назначение |
|---|---|---|
| Bootloader | 0x08000000 | Штатный загрузчик |
| Application | 0x08004000 | Рабочая прошивка MCU |
| Staging | 0x08012000 | Предварительная запись образа |
| Metadata | 0x0801F800 | Признак готовности обновления |
Обновление сделал транзакционным. Новый образ сначала записывается в staging-область, затем полностью читается обратно и сравнивается с исходным. Метаданные, разрешающие перенос в application, появляются только если совпали размер и содержимое. Если связь оборвётся, рабочая прошивка не меняется, а обновление можно повторить без внешнего программатора.
04 · Четыре канала
Как устроена подача филамента
В ACE GEN2 нет четырёх независимых экструдеров. Один двигатель крутит общий привод подачи, а второй ставит селектор напротив нужного тракта. Поэтому канал — это не просто номер, а набор параметров: позиция селектора, направление движения, входы encoder/ready и цифра на индикаторе. Позиции измерены и собраны в одну таблицу конфигурации.
| Канал | Позиция селектора | Направление |
|---|---|---|
| 1 | 31,4 | прямое |
| 2 | 15,7 | прямое |
| 3 | 62,8 | зеркальное |
| 4 | 47,1 | зеркальное |
Энкодеры подтверждают, что пруток действительно прошёл заданное расстояние, но не помогают уверенно определить направление: наблюдаемые окна каналов A и B не перекрываются. На стенде получилось 0,65–0,73 импульса на миллиметр. Это рабочий инженерный порог, а не метрологическая характеристика. Подача идёт шагами по 20 мм; после каждого шага система ждёт не меньше 10 импульсов. Сигнал ready говорит только о том, что пруток прошёл конкретную точку тракта, а не о наличии материала на катушке.
05 · Смена материала
Смена материала по шагам
Команда выбора инструмента запускает последовательность шагов с понятными условиями перехода. Если на каком-то шаге нет ожидаемого физического признака, цикл останавливается именно там. Семисегментный индикатор сам показывает активный канал от 1 до 4.
- ТермоподготовкаПроверка температуры хотэнда и разрешения на движение филамента.
- РезКаретка проходит X=333, нажимает пружинный резак в X=347 и освобождает его в X=328.
- ОтводТекущий материал выводится участками по 20 мм под контролем энкодера и ready-сенсора.
- ВыборСелектор переходит в измеренную позицию нового канала.
- ПодачаНовый пруток продвигается до подтверждения движения и достижения зоны хотэнда.
- ПродувкаЧерез сопло подаётся 100 мм материала, после чего управление возвращается печати.
Полный цикл занимает около 250 с. На принтере проверены переход 1→2 и автоматические циклы 4→3 и 3→4. Успешный переход подтверждали импульсы нужного энкодера, выход материала из сопла и цифра на индикаторе, совпадающая с выбранным трактом. Если импульсов нет, цикл прекращается, голова паркуется вне модели и без подтверждения дальше не идёт.
06 · Калибровка Z
Z по касанию соплом
Механический Z-концевик заменён сигналом тензомоста, который считывает CS1237 с усилением 128 и частотой 640 выборок в секунду. Ноль определяется при запуске и ещё раз перед базированием при текущей температуре хотэнда: нагрев и состояние механики заметно меняют исходный уровень сигнала.
Порог срабатывания выбрал равным 75 внутренним единицам. На стенде с контрольными массами это примерно 50 г нагрузки. Это инженерная оценка, а не аттестованное измерение силы. Когда порог превышен, GD32F303 отдаёт событие виртуального Z-endstop, а Klipper через trsync синхронно останавливает ось. Проверены одиночные защищённые касания и серии из трёх повторов. Рабочая карта поверхности содержит 7 × 7 точек при температуре стола 70 °C.
07 · Связь и задержки
Почему для этого узла выбран UART
Сначала система работала по CAN 500 кбит/с через Waveshare HAT на MCP2515. Когда пошёл поток данных тензодатчика, появились потери связи, переполнение приёмной очереди и ошибки планирования. Уменьшение частоты публикации помогало, но не устраняло первопричину. В итоге Octopus подключён напрямую по USB, а голове выделен отдельный быстрый UART.
Отдельные измерения показали задержки диспетчеризации Linux до 526,9 мс. На них влияли подробное синхронное логирование, расчёт от устаревшей метки события и отсутствие приоритета реального времени у Klipper. После сокращения логов, перехода на монотонное время и запуска с политикой FIFO и приоритетом 50 в контрольной серии задержек выше разрешения используемого измерителя не было. Диагностические счётчики оставил в прошивке, чтобы дальше следить за ситуацией.
08 · Защита
Что происходит, когда что-то пошло не так
Оба драйвера головы используют общий активный-low вход разрешения PC15. Программная блокировка не даёт селектору и приводу подачи двигаться одновременно, а watchdog снимает разрешение, если управляющие обновления прекращаются. Вентилятор радиатора включается при заданном нагреве или когда температура хотэнда поднимается выше 45 °C.
Эти ограничения появились не на всякий случай, а после реальных сбоев. Ошибка в номере или направлении канала стачивала пруток, поэтому проверка по энкодеру теперь есть в каждой фазе подачи. После электростатического разряда один раз завис контроллер. Причинная связь пока не доказана, поэтому отдельная ESD-проверка остаётся в списке следующих испытаний.
09 · Результат
Что в итоге работает
Голова Anycubic работает на самодельном CoreXY. Проверка подтвердила позиционирование всех четырёх трактов, показ активного канала, нагрев до 230 °C, экструзию PETG, работу обоих вентиляторов, механического резака и контроль по энкодерам. Контур Z откалиброван, принтер печатает реальные задания.
| Подсистема | Статус | Подтверждение |
|---|---|---|
| Все четыре позиции селектора | Подтверждено | Физическое сопоставление каналов и индикатора |
| Нагрев, PETG и вентиляторы | Подтверждено | 230 °C и выход материала из сопла |
| Переходы 1→2, 4→3, 3→4 | Подтверждено | Полные циклы с резом, отводом и продувкой |
| Горячая сетка и первый слой | Подтверждено | Сетка 7 × 7 и Z-offset используются в рабочей печати |
| Эксплуатационный цикл | Подтверждено | Принтер выполняет реальные задания печати |
| Prime tower и продувка | Настроено | Рабочий профиль применяется при печати |
Процесс работы




Видео 1. Стендовый запуск головы во время исследования интерфейса.