[Перевод] Собираем самодельный перьевой плоттер
В этой статье задокументированы уроки, полученные мной при проектировании и создании самодельного перьевого плоттера летом 2023 года.
Моей конечной целью было создание собственного станка с программным управлением, и перьевой плоттер показался мне хорошим промежуточным шагом в этом направлении. Это важный контекст в проектировании этого устройства, потому что если бы мне просто нужен был перьевой плоттер, то многое можно было бы упростить.
Надеюсь, мои заметки будут полезны тем, кто решится приступить к похожему проекту.
Проектирование
До этого проекта все мои дизайны объектов для трёхмерной печати создавались или в коде (разумеется, при помощи моих собственных инструментов: Modeler b hiccup-sdf), или в SolveSpace.
Проектирование при помощи кода отлично подходит для параметрических дизайнов или художественных проектов (например, FabFungus), а SolveSpace идеален для быстрых набросков. В этом проекте мне нужно было комбинировать множество разных деталей, поэтому без серьёзного инструмента я бы не справился. Я выбрал Fusion 360, просто потому, что слышал о нём ранее.
На YouTube можно легко найти кучу туториалов по работе с Fusion 360. Я просто посмотрел парочку таких видео и начал экспериментировать с инструментом (он бесплатен для личного пользования).
При проектировании деталей для трёхмерной печати необходимо привязать их к реальным объектам, поэтому нужно ссылаться на эти объекты в CAD. Можно смоделировать их самостоятельно, но обычно они доступны в библиотеке GrabCAD Library. Для Fusion 360 нужны файлы .stp
, которые можно добавлять к проекту.
Вот туториал Autodesk.
Обычно после трёхмерной печати объекты ужимаются. В реальности ничто не совпадает идеально, как в CAD. Если вы сделаете отверстие ровно 20 мм на 20 мм под алюминиевый профиль, то велика вероятность, что после печати он туда не поместится.
Я поступил так: напечатал пару черновых версий с разными изменениями размеров, чтобы проверить, что лучше подойдёт, а затем использовал их на всём этапе проектирования.
Например, в моём случае, это означало, что нужно печатать отверстия 3,2 мм, а не 3 мм для винтов M3, 8,4 мм вместо 8 мм для поворотного трапецеидального винта и так далее.
В самом Fusion 360 я рекомендую настроить два параметра:
Что касается самой конструкции, то не рекомендую использовать колёса для оси Y, как показано на изображении выше. Очень сложно реализовать допуски правильно, поэтому ось Z у меня сильно колеблется. Это нормально для перьевого плоттера, но совершенно не подходит для станка. Я планирую изменить конструкцию, воспользовавшись двумя линейными валами с подшипниками качения, что создаст гораздо более жёсткую конструкцию, чем та, что у меня имеется для оси Z.
Материалы
Большинство самодельных 3D-принтеров, перьевых плоттеров и станков с ЧПУ изготавливается из сочетания распространённых готовых деталей и объектов из 3D-печати.
Корпус своего перьевого плоттера я спроектировал из следующих элементов:
Алюминиевых профилей 20×20 мм (часто называемых просто
2020
)Линейных валов 10 мм и линейных подшипников 10 мм (
LM10UU
)Ходовых трапецеидальных винтов 8 мм с соответствующими гайками ходовых винтов
Клонов
NEMA17
в качестве двигателейАлюминиевых муфт для соединения двигателей с ходовыми винтами
Ещё один способ преобразования вращения двигателей в линейное движение — при помощи ремней, но я решил, что ходовые винты лучше подойдут для станка, потому что мне интуитивно показалось, что таким образом можно передавать бОльшую мощность. Кроме того, мне не нужно беспокоиться о натяжке ремней.
Эти детали проще всего получить, заказав в сервисах 3D-печати. Двигатели могут оказаться довольно дорогими, поэтому я просто взял самые дешёвые из тех, что смог найти. Алюминиевые профили, валы и ходовые винты можно отрезать в размер, но мне просто удалось подобрать те, которые подходят под мою конструкцию (а иногда я проектировал её на основании того, что удалось найти).
Для соединения профилей с напечатанными деталями я воспользовался стандартным подходом: добавил в профили T-образные гайки, оставил в конструкции отверстия под них и закрепив их винтами. Если вы когда-нибудь собирали 3D-принтер, то знаете, о чём я говорю; если нет, то поищите T-nuts в YouTube.
Линейные подшипники зажаты между двумя напечатанными деталями, которые я скрепил винтами. Эту часть конструкции для идеальной подгонки пришлось реализовывать самым долгим путём проб и ошибок.
Электроника
Для работы двигателей понадобится пара электронных деталей. Я выбрал то, что показалось мне стандартной схемой:
Arduino CNC Shield
четыре драйвера электродвигателя
A4988
дешёвый клон Arduino UNO, который нашёлся у меня в ящике
источник питания — в ящике нашёлся и блок на 3А и 12 В; кажется, он вполне подошёл
концевые выключатели — любые, которые найдутся в ближайшем магазине электроники; я выбрал самые дешёвые механические, которые смог найти (по два на ось, так что всего шесть)
Необходимо будет настроить VRef
для драйверов электродвигателей; об этом тоже есть куча туториалов на YouTube. В основном это нужно для того, чтобы двигатели не перегревались.
Концевые выключатели — это мера защиты, чтобы у плоттера был «жёсткий останов» при физическом контакте с ограничением (и чтобы он себя не сломал). Они могут быть открытыми в обычном положении (normally opened, NO) или закрытыми (normally closed, NC). Я выбрал NC, потому что они безопаснее — если по какой-то причине проводное соединение сломается, то результат будет таким же, как если бы сработал концевой выключатель. При работе с NO такой защиты нам не получить.
Мне не было сразу очевидно, как правильно подключать два NC-выключателя на каждую ось, особенно проходящие через CNC Shield. Похоже, их нужно подключать последовательно, соединяя один конец к контакту выключателя оси, а другой — к заземлению:
Для отладки соединения двигателей и концевых выключателей с CNC Shield лучше использовать простой код Arduino, а не выполнять полную установку GRBL, потому что это добавляет ещё один слой косвенности и усложняет выявление источников проблем.
Ниже показан код, который я использовал для проверки возможности перемещения одного двигателя. Для проверки разных двигателей следует изменить параметры dirPin
и stepPin
, которые можно найти, поискав схему контактов CNC Shield.
#define dirPin 5#define stepPin 2#define enablePin 8// эти параметры нужно настраивать в зависимости от спецификации двигателя#define stepsPerRevolution 200#define microsPulseWidth 250#define microsBetweenSteps 1000void setup() { pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT); pinMode(enablePin, OUTPUT); digitalWrite(enablePin, LOW);}void stepMotor() { digitalWrite(stepPin, HIGH); delayMicroseconds(microsPulseWidth); digitalWrite(stepPin, LOW); delayMicroseconds(microsBetweenSteps);}void loop() { // вращение по часовой стрелке digitalWrite(dirPin, HIGH); for (int i = 0; i < 5 stepsPerRevolution; i++) { stepMotor(); } delay(1000); // вращение против часовой стрелки digitalWrite(dirPin, LOW); for (int i = 0; i < 5 stepsPerRevolution; i++) { stepMotor(); } delay(1000);}
А вот, что я использовал для отладки концевых выключателей:
#define xLimitPin 9#define yLimitPin 10#define zLimitPin 11void setup() { Serial.begin(115200); pinMode(xLimitPin, INPUT_PULLUP); pinMode(yLimitPin, INPUT_PULLUP); pinMode(zLimitPin, INPUT_PULLUP);}void loop() { Serial.print("x = "); Serial.print(digitalRead(xLimitPin)); Serial.print("y = "); Serial.print(digitalRead(yLimitPin)); Serial.print("z = "); Serial.println(digitalRead(zLimitPin)); delay(200);}
Когда все оси начнут двигаться, а концевые выключатели будут подключены правильно, настанет время начать управлять устройством при помощи G-code — стандарта для 3D-принтеров и станков с ЧПУ.
К счастью, для Arduino UNO и CNC Shield есть опенсорсный интерпретатор G-code под названием grbl
. Установка выполняется довольно просто, она описана здесь: по сути, нужно добавить grbl
как библиотеку Arduino, а затем загрузить единственный скетч: GrblUpload
.
Мне пришлось внести в конфигурацию контроллера config.h
одно изменение — я закомментировал #define VARIABLE_SPINDLE
, конфликтовавшее с концевыми выключателями оси Z.
После того, как grbl
заработает в Arduino, начинается самое интересное — настройка всех его параметров. Это можно сделать напрямую через последовательную консоль Arduino, но я решил переключиться на GUI для простоты тестирования плоттера и управления им. Протестировав несколько приложений, которые по каким-то причинам не работали, я остановился на cncjs
.
По конфигурированию в вики grbl
есть длинная документация; вот, что сделал:
вычислил шаги на мм для перемещения двигателя, как написано здесь
настроил максимальную частоту для двигателей, как описано здесь
инвертировал некоторые из осей двигателей, чтобы они перемещались предсказуемым образом
они должны быть инвертированы, потому что «закрыты в обычном состоянии»
они должны быть включены
при этом можно включить и цикл возврата в исходное положение (автоматический поиск углов)
наконец, я задал исходное положение станка (при помощи кнопки в GUI) и вручную пошагово довёл его до другого концевого выключателя, чтобы узнать мягкие границы (которые тоже должны быть включены)
G-code
Для плоттинга изображений станку нужен G-code, описывающий последовательность перемещений двигателей. Существует множество способов его генерации, я выбрал vpype
и vpype-gcode
— мощный инструмент командной строки для всего, что связано с SVG и плоттерами.
Так как это полностью самостоятельно спроектированный плоттер, мне также пришлось создать собственную конфигурацию для vpype-gcode
, которая выглядит так:
[gwrite.plotter]document_start = '''G90 ; абсолютные координатыG21 ; единицы ммG17 ; плоскость xyG00 Z-15 ; перо наверху'''segment_first = '''G00 Z-20 ; перо внизуG00 X{x:.4f} Y{y:.4f}'''segment = '''G00 X{x:.4f} Y{y:.4f}'''segment_last = '''G00 X{x:.4f} Y{y:.4f}G00 Z-15 ; перо вверху'''document_end = '''M2 ; конец программы'''unit = "mm"# масштаб равен (1 / (1/96 дюймы в мм))# превращает 1px в SVG == 1 мм в реальном миреscale_x = 3.779527559scale_y = 3.779527559
Эта конфигурация масштабирует получившийся G-code так, чтобы 1 px в SVG равнялся 1 мм. Для плоттинга файла SVG я сначала преобразую его в G-code:
vpype --config vpype-config.toml read image.svg gwrite -p plotter image.gcode
Затем я запускаю станок, привожу его в исходное положение (команда $H
в grbl
) и вручную перемещаю по оси X/Y, если хочу начинать рисунок не с левого нижнего угла.
Наконец, я обнуляю оси в координаты, где они G10 L20 P1 X0 Y0 Z0
(чтобы 0/0/0
были там, где находится инструмент), после чего я готов к загрузке получившегося image.gcode
и запуску отрисовки.
Полезные ссылки
В Anatomy of a CNC Router рассказывается о материалах и ПО гораздо подробнее, чем в моей статье.
Если вы хотите создать DIY-проект, но не полностью с нуля, то рекомендую воспользоваться PrintNC.