Как стать автором
Обновить

Собираем самодельный перьевой плоттер

Время на прочтение7 мин
Количество просмотров11K
Автор оригинала: Szymon Kaliski

В этой статье задокументированы уроки, полученные мной при проектировании и создании самодельного перьевого плоттера летом 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-печати.

Корпус своего перьевого плоттера я спроектировал из следующих элементов:

  • Алюминиевых профилей 20x20 мм (часто называемых просто 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 так, чтобы 1px в 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.

Теги:
Хабы:
Всего голосов 20: ↑20 и ↓0+20
Комментарии13

Публикации

Истории

Ближайшие события

Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург