Построение DIY SCARA-робота на Arduino — полное руководство
В этом уроке научимся строить SCARA-робота на Arduino. Покажу весь процесс: от проектирования до собственного графического интерфейса управления.
Смотрите видео или читайте ниже.
Обзор
Робот — 4 степени свободы, 4 шаговых двигателя NEMA 17. Сервопривод малого размера для захвата (эффектора). Мозг — Arduino UNO + CNC Shield + 4 драйвера A4988.

Интерфейс на Processing: прямое и обратное кинематика. Прямая — ручное управление углами суставов (слайдеры слева), справа — рассчитанные X,Y,Z эффектора.
Обратная — задаем целевые X,Y,Z, программа сама считает углы суставов.

Оба режима одновременно на одном экране — углы и координаты всегда синхронизированы.
Автоматический режим: кнопка «Save» запоминает позы, «Run» — воспроизводит циклически. Настройка скорости и ускорения в интерфейсе.
3D-модель SCARA-робота

Проектировал в 3DEXPERIENCE SOLIDWORKS — спонсор видео.
3DEXPERIENCE SOLIDWORKS — Solidworks с облаком через платформу 3DEXPERIENCE. Доступ к данным/моделям из любой точки мира. Платформа включает приложения для продуктивности и управления.

Project Planner — задачи, дедлайны, прогресс. 3D Markup — просмотр, заметки на любом устройстве. Облачный моделировщик SOLIDWORKS xDesign — в браузере, моделирование где угодно.

Спасибо Solidworks за поддержку образования. Проверить можно по ссылкам:
Try 3DEXPERIENCE for free: www.solidworks.com/HTMTryNow
Learn more: www.solidworks.com/HTMLearnMore
Цель — большинство деталей 3D-печатаются. Всё печатается даже на малой площадке. GT2 шкивы тоже печатаемые, параметрические — меняем число зубьев, всё пересчитывается.

1-й сустав: редукция 20:1 в две стадии кастомных шкивов. Ремни GT2 замкнутые: 200 мм и 300 мм. Суставы — два стопорных подшипника и один радиальный.

2-й сустав: 16:1, та же схема. 3-й: 4:1, одна стадия. Суставы полые — провода моторов и микровыключателей внутри. На ремнях слоты под натяжные ролики.

Захват — серва MG996R, легко менять пальцы под разные размеры. Z-ось — трапециевидный винт 8 мм, рука скользит по 4 гладким стержням 10 мм на линейных подшипниках. Высота = длина стержней (40 см). Винт на 2 см короче, или Z-мотор поднимаем на 2 см распорными гайками.
Модель на Thangs:

Скачать сборку на Thangs.
STL для печати:
3D-печать деталей робота
Печатал на Creality CR-10 — отличный бюджетный принтер. Детали помещаются на Ender 3.

Большинство — PLA+ (синий), шкивы и захват — обычный PLA. ~120 часов печати при 60 мм/с. База — 32 часа. При большей скорости — быстрее.
См. также: Лучшие 3D-принтеры для новичков и мейкеров [2021]
Все напечатанные детали:

Важно: Horizontal Expansion = –0.1 мм в слайсере — точные размеры, лучшая посадка под подшипники, стержни, болты.
Сборка робота
Список механики (электроника — в разделе схемы).
- 4× Гладкий вал 10 мм 400 мм……… Amazon / Banggood / AliExpress
- 1× Трапециевидный винт 8 мм 400 мм ………………… Amazon / Banggood / AliExpress
- 4× Линейный подшипник 10 мм ………………….. Amazon / Banggood / AliExpress
- 1× Стопорный шароподшипник 40×60×13 мм ….. Amazon / AliExpress
- 2× Стопорный шароподшипник 35×52×12 мм ….. Amazon / AliExpress
- 5× Радиальный шароподшипник 8×22×7 мм ……………. Amazon / Banggood / AliExpress
- Болты/гайки M3, M4, M5 разной длины
Размеры болтов:

Начинаю с базы. Вставляю радиальный подшипник 35×47 мм.

Сверху — стопорный подшипник 40×60 мм (между шкивом и базой). С другой стороны базы — еще один стопорный 40×60 мм + соединительная муфта сустава.

Сцепляю шкив и верхнюю часть 4 болтами M4×55 мм. Контровайки, затягиваю так: сустав крепкий, но свободно вращается.
Средний шкив (парный суставному, ремень 300 мм). Два подшипника 608 (сверху и снизу базы), болт M8×45 мм, шайба, контровайка.

Шаговый мотор 1-го сустава (парный со средним шкивом, ремень 200 мм). 4 болта M3 в базу.

Перед затяжкой натягиваю ремень макс. сильно. Заметка: заменил болт M8 среднего шкива на головку вниз — чтобы влезал в базу.
Проверяю натяжение ремней. Если слабо — натяжные ролики. Болт M5×35 мм + гайки — натяжный ролик.

Крепится в слоты по бокам ремня — натягиваю как надо. Натянул с обеих сторон. 1-й сустав готов.
Микровыключатель 1-го сустава. Провода запаял заранее — туго допаивать после. Болт M3×20 мм + гайка.

Муфта сустава проходит близко к выключателю — один болт держит, во второе отверстие вставил короткий болт, заклеил снизу. Выключатель держится и работает.
Z-ось: на муфте сустава креплю нижнюю пластину Z.

На ней — 4 зажима для гладких стержней. Вставляю стержни — плотная посадка, до муфты. Зажимаю болтами/гайками M4.

Вставляю подшипник под трапециевидный винт. Декоративная крышка — чистый вид.
Первое плечо: две детали, сбитые болтами. Первая деталь — посадочные места под линейные подшипники (скользят по стержням). Вставка подшипников тугая — зависит от точности принтера. Рекомендую Horizontal Expansion и подгон под свой принтер. У меня два подшипника не вошли до конца — не критично.

Собираю два куска плеча — 4 болта M5×25 мм.

Мотор 2-го сустава. 3D-шкив GT2 20 зубьев (параметрический дизайн — работает хорошо). Фиксирую гайку трапециевидного винта.

Ремни и шкивы 2-го сустава: 400 мм и 300 мм. Монтаж как для 1-го.

Подшипники меньше: радиальный 30×42 мм, стопорный 35×52 мм.
Перед установкой муфты 2-го сустава — вставляю 6 болтов M4×20 мм в шестигранные слоты.

На них крепится второе плечо. При необходимости — натяжные ролики (как раньше). Микровыключатель 2-го сустава. Плечо №1 собрано.

Креплю второе плечо к муфте: болты, вставленные ранее в муфту.

Проверил люфты суставов. Ожидал люфт от ремней, но был огромный люфт между частями муфты. Причина: отверстия под болты чуть больше самих болтов. Лечение — более плотная посадка.

У меня: расверлил 4.5 мм, использовал болты M5 вместо M4. В 3D-модели исправил: отверстия 3.5 мм, болты M4. Пересобрал 1-й сустав так же. Люфты почти ушли, остался только небольшой бэклеш ремней.
Второе плечо: мотор 3-го сустава.

Меньший NEMA 17 (корпус 24 мм) — легче плечо.
Ремни/шкивы 3-го сустава: одна стадия, ремень 400 мм. Перед соединением нижней и верхней частей плеча — подключаю мотор и микровыключатель, провода через 2-й сустав.

Провода эффектора: 4-проводной кабель от шагового (серва захвата — 3 провода).
Гайки M4 в слотах верхнего плеча — для крепления нижней части.

Провода под крючки — подальше от движущихся частей.
Провода из 2-го сустава могут зацепляться гайками шкива — сделал простой держатель проводов.

Провода по одной стороне плеча. Крышка 1-го плеча — на защелке.

Руки собраны. Надеваю на стержни Z.

Верхняя пластина Z: микровыключатель Z + 4 зажима стержней.

Перед установкой верхней пластины — декоративная крышка (как снизу), скрывает зажимы/болты/выключатель. Надеваю пластину, зажимаю зажимами.
Трапециевидный винт. Мой был длиннее — укоротил до 38 см металлопилой. 4-й мотор (Z). Муфта валов 5→8 мм.

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

Перед укладкой в короба — маркирую каждый провод.
Эффектор: захват на серве MG996R. Два стержня 6 мм — пальцы скользят по ним.

Пальцы — к рогу сервы через 3D-рычаги, болты/гайки M3. Всё на M3. Полный список болтов/гаек в статье. Места тесные — нужно терпение.

Плюс: пальцы легко менять — шире, уже, спецформа. Крепление захвата к руке — болты/гайки M4.

Подключаю серву к заложенным проводам.
Механика SCARA полностью собрана. Осталась электроника.
Схема SCARA-робота
Arduino UNO + CNC Shield + 4 драйвера A4988.

Хотя это робот, электроника минимальна. Можно вместо UNO — Arduino MEGA + RAMPS (3D-принтерный контроллер).
Напечатал корпус для Arduino, крепится к базе. Микрошаг 1/4 — перемычки в нужных пинах. Подключаю моторы и микровыключатели к CNC Shield.

Схема подключения:

Компоненты:
- Шаговый двигатель NEMA 17………………
- Драйвер A4988…………………..…
- Arduino CNC Shield ………………………. Amazon / Banggood / AliExpress
- Arduino Uno………………………………..…
- Серва MG996R………………….….
- Концевой выключатель …………………………………. Amazon / Banggood / AliExpress
- Блок питания DC …………………………. Amazon / Banggood / AliExpress
Питание: 12V, мин. 4А (лучше 6А). Зависит от настройки тока драйверов — ставьте минимум.

Укладываю провода в корпус, радиаторы драйверов оставляю открытыми, закрываю крышкой.
Финал сборки
Робот собран. Нужно зафиксировать базу. Использую доску 20 мм. Внизу базы 12 отверстий. Распечатал чертеж базы, сверлил по нему.

Снизу зенкеровал — втулковые болты вровень с деревом. Гайки M4 в слоты базы, затягиваю деревянную базу к роботу.

Идеально — приболтить к столу, я — зажимы.

SCARA готов. Осталось посмотреть, как работает.
См. также: DIY манипулятор Arduino с управлением со смартфона
Принцип работы SCARA-робота
Два метода позиционирования: прямая и обратная кинематика.
Прямая — позиция/ориентация эффектора из заданных углов суставов.

Обратная — углы суставов для заданной позиции эффектора. Это основной режим робототехники: нужно поставить инструмент в точку X,Y,Z.
Обратная кинематика вычисляет углы по координатам.

Уравнения — из тригонометрии.
Программирование SCARA-робота — код Arduino и Processing
Коды внизу статьи.
Прямая кинематика в Processing:
// FORWARD KINEMATICS void forwardKinematics() { float theta1F = theta1 * PI / 180; float theta2F = theta2 * PI / 180; xP = round(L1 * cos(theta1F) + L2 * cos(theta1F + theta2F)); yP = round(L1 * sin(theta1F) + L2 * sin(theta1F + theta2F)); }
X,Y эффектора из углов theta1, theta2 и длин L1, L2.
Обратная кинематика — углы theta2, theta1 из X,Y:
// INVERSE KINEMATICS void inverseKinematics(float x, float y) { theta2 = acos((sq(x) + sq(y) - sq(L1) - sq(L2)) / (2 * L1 * L2)); if (x < 0 & y < 0) { theta2 = (-1) * theta2; } theta1 = atan(x / y) - atan((L2 * sin(theta2)) / (L1 + L2 * cos(theta2))); theta2 = (-1) * theta2 * 180 / PI; theta1 = theta1 * 180 / PI; // Коррекция квадрантов if (x >= 0 & y >= 0) { theta1 = 90 - theta1; } if (x < 0 & y > 0) { theta1 = 90 - theta1; } if (x < 0 & y < 0) { theta1 = 270 - theta1; phi = 270 - theta1 - theta2; phi = (-1) * phi; } if (x > 0 & y < 0) { theta1 = -90 - theta1; } if (x < 0 & y == 0) { theta1 = 270 + theta1; } // Угол phi — ориентация захвата параллельно оси X phi = 90 + theta1 + theta2; phi = (-1) * phi; if (x < 0 & y < 0) { phi = 270 - theta1 - theta2; } if (abs(phi) > 165) { phi = 180 + phi; } theta1=round(theta1); theta2=round(theta2); phi=round(phi); cp5.getController("j1Slider").setValue(theta1); cp5.getController("j2Slider").setValue(theta2); cp5.getController("j3Slider").setValue(phi); cp5.getController("zSlider").setValue(zP); }
Коррекция углов по квадрантам («if»). Для нашей конфигурации — обратная кинематика по двум звеньям. Третий угол «phi» — ориентация захвата.

GUI на библиотеке controlP5 (Processing). Слайдеры — углы суставов, текстовые поля — целевые координаты. Каждое действие → данные в Arduino через Serial.
if (gripperValuePrevious != gripperValue) { if (activeIK == false) { gripperAdd = round(cp5.getController("gripperValue").getValue()); gripperValue=gripperAdd+50; updateData(); println(data); myPort.write(data); } }
Пакет данных: статус Save/Run, углы 3 суставов, Z, захват, скорость, ускорение.
public void updateData() { data = str(saveStatus) +","+str(runStatus) +","+str(round(cp5.getController("j1Slider").getValue())) +","+str(round(cp5.getController("j2Slider").getValue())) +","+str(round(cp5.getController("j3Slider").getValue())) +","+str(round(cp5.getController("zSlider").getValue())) +","+str(gripperValue) +","+str(speedSlider) +","+str(accelerationSlider); }
Arduino получает одну строку, парсит в массив data[10].
if (Serial.available()) { content = Serial.readString(); for (int i = 0; i < 10; i++) { int index = content.indexOf(","); data[i] = atol(content.substring(0, index).c_str()); content = content.substring(index + 1); } /* data[0] - SAVE, data[1] - RUN, data[2] - J1, data[3] - J2, data[4] - J3, data[5] - Z, data[6] - Gripper, data[7] - Speed, data[8] - Accel */
SAVE → сохраняю текущие углы (в шагах) в массивы.
if (data[0] == 1) { theta1Array[positionsCounter] = data[2] * theta1AngleToSteps; theta2Array[positionsCounter] = data[3] * theta2AngleToSteps; phiArray[positionsCounter] = data[4] * phiAngleToSteps; zArray[positionsCounter] = data[5] * zDistanceToSteps; gripperArray[positionsCounter] = data[6]; positionsCounter++; }
RUN → исполняю сохраненные шаги.
Управление шаговыми — библиотека AccelStepper. Отличная для множества моторов, но ограничение: не может делать разгон/торможение при одновременном движении нескольких моторов — важно для плавности робота.
stepper1.moveTo(stepper1Position); stepper2.moveTo(stepper2Position); stepper3.moveTo(stepper3Position); stepper4.moveTo(stepper4Position); while (stepper1.currentPosition() != stepper1Position || stepper2.currentPosition() != stepper2Position || stepper3.currentPosition() != stepper3Position || stepper4.currentPosition() != stepper4Position) { stepper1.run(); stepper2.run(); stepper3.run(); stepper4.run(); }
Реализовал разгон/торможение, но не так плавно, как хотел.
Полные коды Arduino и Processing в статье.
Итоги
Прошиваю Arduino, запускаю Processing, включаю питание — робот едет в парковку.

Далее — ручное управление или авто. Можно вешать любой эффектор: 3D-принтерный хотэнд → робот-принтер, лазерная головка — лазерный резак. Планирую попробовать — подписывайтесь.
Заметки: робот менее жесткий, чем ожидал.

Проблема: вся Z-ось и плечи держатся на 1-м суставе. Вес + инерция при движении деформируют пластик базы. Ремни тоже дают бэклеш. Но проект хорош для понимания SCARA и вдохновения строить свой.
Вопросы — в комментариях. Коллекция Arduino-проектов.
Производственный процесс
- Создание пользовательских объектных датчиков для LEGO Mindstorms EV3: DIY световые «глаза»
- Создание интернет-управляемого видеostreaming-робота на Arduino и Raspberry Pi
- Белая книга: Раскройте свой потенциал автоматизации — 7 проверенных шагов к робототехническим проектам с низк…
- Сборка Саурона: Полугуманоидный робот на Arduino Mega 2560 – Полное руководство
- Создание надежного монитора энергии и логгера данных на Arduino — пошаговое руководство
- Создание универсального ИК-пульта на Arduino: пошаговое руководство
- Выбор идеального SCARA-робота: Полное руководство для производителей
- LittleArm 2C: 3D-печатаемый робот-манипулятор на Arduino для STEM-обучения
- Автоматическая дверь на Arduino с ультразвуковым датчиком HC-SR04
- 7 шагов к построению успешной дорожной карты автоматизации