Превращаем DIY SCARA-робота в точный лазерный гравер на Arduino
В этом уроке покажу, как переделать 3D-печатный SCARA-робот из прошлого видео в лазерный гравер. Смотрите видео или читайте статью ниже.
Обзор проекта
SCARA-робот имеет 4 степени свободы, привод — 4 шаговых двигателя NEMA 17, управление — Arduino. В оригинале использовал Arduino UNO + CNC Shield, теперь — Arduino MEGA + RAMPS, так как будем прошивать прошивку Marlin для 3D-принтеров.

Механически: заменяю захват на лазерный модуль (5.5 Вт — достаточно для гравировки).
Крутая фишка: большой ход по Z — можно гравировать высокие объекты.

Рабочая зона впечатляет для такого габарита: перед роботом и по бокам. Можно охватить почти 360° вокруг — благодаря поддержке SCARA и лазера в открытой прошивке Marlin.

G-код генерирую в Inkscape с плагином Inkscape-Lasertools: контуры, заполнение, настройка луча, скоростей, PWM-управление лазером.

Теперь по шагам: конструкция SCARA, установка и настройка Marlin, подготовка чертежей и G-кода. Поехали.
Конструкция и 3D-модель
Быстрый взгляд на 3D-модель, если не видели оригинальный урок.

Робот спроектирован для 3D-печати. Суставы — NEMA 17 + ремни GT2 + печатаемые шкивы. 4 DOF, но для гравировки нужно 3: два поворота для XY и линейный ход Z. 4-й сустав (поворот эффектора) не используется, но лазер закреплен на нем так, что луч проходит через центр вращения — поворот не смещает точку попадания.


Модель на Thangs:
Скачать сборку с Thangs.
Спасибо Thangs за поддержку.
STL для печати:
Спонсор
Разрабатывал в 3DEXPERIENCE SOLIDWORKS for Makers — спонсор видео. SOLIDWORKS наконец доступен мейкерам за $99/год, а для моих зрителей — со скидкой 20% по ссылке ниже.

В комплекте: облачный SOLIDWORKS, браузерные 3D Creator и 3D Sculptor.

Перейдите по ссылке, создайте бесплатный 3DEXPERIENCE ID и получите скидку. Спасибо SOLIDWORKS за поддержку образовательного контента.
Проверить SOLIDWORKS for makers
20% off SOLIDWORKS for makers
Установка лазерного модуля
Снимаю захват (4 болта).

Провода от сервы захвата пойдут на лазер.

Мой лазер — 12V, PWM, два провода: GND (черный) и VCC (белый). Паяю к ним мамы для разъема эффектора. Вставляю разъем, вывожу провод через отверстие держателя, креплю лазер двумя болтами M3. К роботу — четырьмя болтами M4.

Вместо Arduino UNO — Arduino MEGA + RAMPS.

Ставлю перемычки на драйверах для максимального микрошага (A4988 — 1/16, DRV8825 — 1/32). Подключаю все провода — они были промаркированы.
Схема подключения SCARA лазерного гравера

Драйверы над моторами, концевые выключатели (NC, 2 провода) на пины S и – каждого конца. Лазер на pin D9 (PWM, как вентилятор в 3D-принтере). Питание — 12V, мин. 3А.
Компоненты:
- Шаговый двигатель NEMA 17………………
- Драйвер A4988…………………..…
- Плата RAMPS 1.6………………………..…
- Arduino MEGA………………….…..………
- Концевой выключатель …………………………………. Amazon / Banggood / AliExpress
- Блок питания DC …………………………. Amazon / Banggood / AliExpress
- Лазерный модуль ………………………………… Amazon / Banggood / AliExpress
- Очки для лазера …………………….. Amazon / Banggod / AliExpress
Механика — в оригинальной статье.
Собрал, аккуратно уложил провода, закрыл электронику.

Финал сборки
Нужно изменить срабатывание концевого выключателя второго плеча. Робот работает как правосторонний — парковка второго плеча в 0° (в линии с первым), вращение влево. Приклеил маленький кусочек на плечо, чтобы выключатель срабатывал в нужной позиции.

Еще одна деталь: оригинальный триггер мешал гайке у основания плеча, ограничивая ход. Убрал гайку, поставил втулку с резьбой — ничего не торчит.


Механика готова. Осталось прошить Arduino.
См. также: DIY манипулятор Arduino с управлением со смартфона
Прошивка Marlin для лазерной гравировки на SCARA
Использую Marlin — популярную открытую прошивку для 3D-принтеров с поддержкой лазера и SCARA. Скачать с официального сайта или GitHub.

Прошиваю через PlatformIO IDE (на базе VS Code), а не Arduino IDE — Marlin велик и сложен, Arduino IDE может выдавать ошибки компиляции.

Ставлю VS Code, расширение PlatformIO. Открываю папку Marlin через «Open Project».


Главные файлы конфигурации — Configuration.h и Configuration_adv.h.

Сначала лучше взять готовые конфиги для SCARA из репозитория конфигураций Marlin на GitHub: папка Examples → SCARA, копирую два файла в свою папку Marlin.
См. также: Как настроить GRBL и управлять станком с ЧПУ на Arduino
Настройка прошивки Marlin
Открываю Configuration.h с загруженными конфигами SCARA. Выбираю тип робота.
/** * MORGAN_SCARA — параллельный SCARA (QHARLEY, 2012-2013) */ //#define MORGAN_SCARA /** * MP_SCARA — последовательный SCARA (Tyler Williams) */ #define MP_SCARA #if EITHER(MORGAN_SCARA, MP_SCARA) #define SCARA_SEGMENTS_PER_SECOND 100 #define SCARA_LINKAGE_1 228.15 // Длина плеча 1 (мм) #define SCARA_LINKAGE_2 136.2 // Длина плеча 2 (мм) #define SCARA_OFFSET_X 300 // Смещение базы по X (мм) #define SCARA_OFFSET_Y 150 // Смещение базы по Y (мм)
MP_SCARA — наш случай (последовательный). Реализует обратную кинематику для G-кода декартовой системы. Обратная кинематика вычисляет углы плеч для заданных X,Y — тригонометрия, зависящая только от длин плеч.

Задаю длины: 228 мм и 136.5 мм. Задаю нулевую точку стола (SCARA_OFFSET_X/Y) — расстояние от базы (первого сустава) до нуля стола.
Нужны MANUAL_X_HOME_POS и MANUAL_Y_HOME_POS — координаты эффектора (лазера) в парковке относительно нуля стола. Получаю их в SOLIDWORKS: рисую два отрезка-плеча, выставляю нуль стола, читаю координаты.

Концевые выключатели — по одному на ось, в минимуме.
#define USE_XMIN_PLUG #define USE_YMIN_PLUG #define USE_ZMIN_PLUG
Направление парковки — MIN (-1).
#define X_HOME_DIR -1 #define Y_HOME_DIR -1 #define Z_HOME_DIR -1
Проверяю, что все *_MIN_ENDSTOP_INVERTING = false.
Корректирую DEFAULT_AXIS_STEPS_PER_UNIT — шаги на единицу (градус для осей вращения, мм для Z).
#define DEFAULT_AXIS_STEPS_PER_UNIT { 177.7777777, 142.2222222, 400, 93 }
Расчет: NEMA 17 — 200 шагов/оборот. При 1/16 шага — 3200 шагов/оборот. 1-й сустав: редукция 20:1 → 64000 шагов/оборот. /360 = 177.777 шаг/градус. 2-й: 16:1 → 142.222. Z: винт 8 мм шаг → 3200/8 = 400 шаг/мм. 4-е значение — экструдер, не используется.

Направление моторов — по подключению проводов. Если наоборот — либо перекинуть провода, либо INVERT_X_DIR = true.
#define INVERT_X_DIR false #define INVERT_Y_DIR false #define INVERT_Z_DIR false
Есть баги в SCARA-режиме Marlin (мало интереса — мало поддержки). Мои правки: в scara.cpp строка 75 — MORGAN_SCARA → MP_SCARA; в motion.cpp закомментировал строки 1716-1717; в Configuration.h закомментировал VALIDATE_HOMING_ENDSTOPS; в Configuration_adv.h раскомментировал QUICK_HOME.
Даже с правками парковка работала не идеально — опишу обходной путь ниже.
Загружаю прошивку кнопкой Upload (слева внизу). Мой вариант Marlin с правками можно скачать ниже, либо сделать всё самому по инструкции.
ПО управления — Repetier-Host
Прошивка загружена. Нужен софт для отправки G-кода. Выбираю Repetier-Host — популярный бесплатный софт для 3D-печати.

Выбираю COM-порт, Baud Rate из прошивки. Во вкладке Printer Shape — X/Y max и область печати. Подключаюсь. Во вкладке Manual Control пробую двигать.

При нажатии стрелок X/Y робот может вести себя странно — сразу включается обратная кинематика, двигаются оба плеча.
Сначала — парковка (Home). Руками подводим суставы к концевым выключателям.

Жму Home: 2-й плечо едет к своему выключателю, 1-й — в противоположную сторону. Когда 2-й сработает, 1-й поедет к своему. Потом Z.
После парковки робот может глючить при любых командах. Лекарство: отключить и снова подключить в софте.
Теперь ручное управление и гравировка работают. Баг Marlin в SCARA-режиме.
Команда G00 X0 Y0 ведет лазер в нуль (заданный в Configuration.h).

Включаю лазер: M106 S10 (PWM 0-255 = 0-100%). S10 — видно, но не жжет, можно сфокусировать.

Фокус: кручу линзу лазера, дистанция ~5 см, ищу минимальную точку.
Лазерная гравировка на SCARA-роботе
Калибровка: гравирую простой квадрат.

Первый раз квадрат кривой — ошибся в MANUAL_X_HOME_POS. Исправил — квадрат стал правильным.
Гравю логотип.

ОБЯЗАТЕЛЬНО очки для лазера — УФ вреден для глаз. Респиратор и вентиляция — пары опасны.
Логотип получился хорошо, но не идеально квадратный.

Возвращаюсь к квадрату. Проблема — длины плеч. Робот нежесткий: при вытянутых плечах вес прогибает конструкцию вперед, реальная геометрия смещается.

После десятков тестов скорректировал длины: 228 → 228.15 мм (1-е плечо), 136.5 → 136.2 мм (2-е). Квадрат стал точным. Точность всё равно зависит от позиции — при вытянутых плечах хуже.
Генерация G-кода для лазерной гравировки
Подготовка чертежей в Inkscape (векторный редактор).
Размер страницы = рабочая область. Пример — логотип Arduino.

Импортирую картинку → Trace Bitmap → вектор. Плагин Inkscape-Lasertools (с GitHub, файлы в папку extensions Inkscape).
Extensions → Lasertools → настройки. Лазер на pin D9 → команда M106. Выбираю: только контуры или с заполнением. Задаю скорости перемещения, заполнения, контуров. PWM для заполнения: M106 S128 (50%). Можно вместо PWM увеличить скорость заполнения. Настройки подбираются экспериментально.

Preferences: Remove tiny infill paths. Bounding Box: Generate G-Code for bounding box preview — полезно, показывает область гравировки для позиционирования заготовки.
Генерирую G-код, загружаю в Repetier-Host. Галочка «Show Travel Moves» — превью траекторий.

Жму Print — робот гравирует. Замечательно смотреть.

Регулируемый Z — гравирую высокие объекты. Пример: деревянная коробка для фрез — лого спереди, надпись «Forstner bits» сзади.

Пример: силуэт Бэтмена — только контуры и с заполнением.

С заполнением дольше, но выглядит лучше.
Крупный рисунок 600×450 мм.

Ставлю робота на заготовку — он охватывает перед и бока. Выравниваю вручную.

В Marlin: нуль в левом нижнем углу заготовки, 300 мм по X и 150 мм по Y от робота. Меняю MANUAL_X/Y_HOME_POS соответственно.
Прошиваю, паркую, посылаю лазер в нуль, включаю лазер (M106 S10) — довожу ориентацию заготовки. Прямыми движениями G01 проверяю и поправляю позицию.
В Inkscape делаю шаблон этой компоновки — вижу зону досягаемости, обрезаю рисунок под неё.

Картинку → Trace Bitmap → вектор. Масштабирую, позиционирую, стираю зоны, где робот и где не доходит.


Генерирую G-код, запускаю. 4 часа гравировки.

Потом хотел загравировать пустое место, где стоял робот. Переставил робота и заготовку, сменил параметры Marlin под новую зону.

Метод требует настройки, но работает отлично. Результат нравится.
Итоги
Несмотря на проблемы с прошивкой, нашел обходные пути. Гравировка далеко от идеала.

Робот нежесткий, есть люфты — нет плавных точных движений. Но знания применимы к любому SCARA — можно сделать лучше.
Надеюсь, урок понравился. Вопросы — в комментариях. Смотрите коллекцию проектов на Arduino.
Производственный процесс
- Ретро-часы на индикаторах Numitron с Arduino: просто, надёжно, экономно
- Робот-ускользатор на сервоприводе: сборка на Arduino и HC-SR04
- Управление Roomba Create 2 через Arduino и Android: пошаговое руководство
- Сборка вольтметра на Arduino с дисплеем Nokia 5110 — Пошаговое руководство
- MobBob: Самостоятельная сборка Arduino-робота под управлением Android-смартфона
- Сборка точного измерительного колеса на Arduino Nano и вращательном энкодере
- Точный монитор качества воздуха на датчике Sharp GP2Y1010AU0F
- 1D Pong на Arduino и ленте WS2812: пошаговое руководство
- DIY манипулятор, управляемый жестами руки: пошаговая сборка на Arduino
- Управление манипулятором LittleArm через Android-приложение по Bluetooth