Контроллер робота-манипулятора MK2 Plus на Arduino
Компоненты и материалы
| CNC Shield | ×1 |
| NEMA 17 шаговые моторы (OpenBuilds или аналогичные) | ×3 |
| Arduino UNO | ×1 |
| Драйверы A4988 (SparkFun) | ×3 |
| Микро-концевики (OpenBuilds) | ×3 |
Инструменты
- 3D-принтер
Программное обеспечение
- Arduino IDE
О проекте
Робот-манипулятор EEZYBOT MK2
На Thingiverse популярная рука EEZYBOT MK2 (автор daghizmo) — масштаб 1:7 к ABB IRB460. Оригинал на сервоприводах — дрожит. Версия MK2 Plus (Thingiverse) использует 3 шаговых мотора для плавного движения.

Печать занимает несколько дней. Сборка по туториалам в сети.
Выбор домашней позиции (Homing)
Шаговые моторы не знают свою позицию — нужна процедура хоминга на 3 концевиках. Расположение понятно после сборки.

Z-концевик можно поставить на базе. Капните горячий клей для фиксации проводов.
Проводка
CNC Shield имеет подписанные клеммы. Не перепутайте драйверы A4988! Мотор у Y-концевика → Y-разъём Shield, у X-концевика → X-разъём. Базовый мотор → Z-разъём. Концевики по названиям. Полярность не важна.

Нужен блок питания 12 В с достаточным током.
Программный код
Используем библиотеку AccelStepper (через Library Manager или GitHub) для плавного управления несколькими моторами.

Определение пинов и объектов
#define XSTEP 2
#define YSTEP 3
#define ZSTEP 4
#define XDIR 5
#define YDIR 6
#define ZDIR 7
#define ENABLE 8
#define XLIMIT 9
#define YLIMIT 10
#define ZLIMIT 11
#define XMOTORACC 250
#define XMOTORMAXSPEED 1000
#define YMOTORACC 250
#define YMOTORMAXSPEED 1000
#include <AccelStepper.h>
AccelStepper XMOTOR(1, XSTEP, XDIR);
AccelStepper YMOTOR(1, YSTEP, YDIR);
AccelStepper ZMOTOR(1, ZSTEP, ZDIR);
Настройка пинов
void pinsetup() {
pinMode(ENABLE, OUTPUT); digitalWrite(ENABLE, LOW);
pinMode(XLIMIT, INPUT_PULLUP);
pinMode(YLIMIT, INPUT_PULLUP);
pinMode(ZLIMIT, INPUT_PULLUP);
}
Процедура хоминга
void autohome() { xyhome(); zhome(); }
void xyhome() {
int initial_xhome = -1, initial_yhome = -1;
XMOTOR.setMaxSpeed(500); XMOTOR.setAcceleration(50);
YMOTOR.setMaxSpeed(500); YMOTOR.setAcceleration(50);
// 1. Движение в противоположных направлениях до нажатия Y-лимита
while (digitalRead(YLIMIT)) {
XMOTOR.moveTo(initial_xhome); YMOTOR.moveTo(initial_yhome);
initial_xhome--; initial_yhome--;
XMOTOR.run(); YMOTOR.run(); delay(5);
}
XMOTOR.setCurrentPosition(0); YMOTOR.setCurrentPosition(0);
initial_xhome = -1; initial_yhome = 1;
// 2. Движение в одном направлении до нажатия X-лимита
while (digitalRead(XLIMIT)) {
XMOTOR.moveTo(initial_xhome); YMOTOR.moveTo(initial_yhome);
initial_xhome--; initial_yhome++;
XMOTOR.run(); YMOTOR.run(); delay(5);
}
YMOTOR.setCurrentPosition(0);
YMOTOR.setMaxSpeed(250); YMOTOR.setAcceleration(10);
initial_yhome = 1;
// 3. Отпускание Y-лимита
while (!digitalRead(YLIMIT)) {
YMOTOR.moveTo(initial_yhome); YMOTOR.run(); initial_yhome++; delay(5);
}
YMOTOR.setCurrentPosition(0);
YMOTOR.setMaxSpeed(YMOTORMAXSPEED); YMOTOR.setAcceleration(YMOTORACC);
XMOTOR.setCurrentPosition(0);
XMOTOR.setMaxSpeed(250); XMOTOR.setAcceleration(10);
initial_xhome = 1;
// 4. Отпускание X-лимита
while (!digitalRead(XLIMIT)) {
XMOTOR.moveTo(initial_xhome); XMOTOR.run(); initial_xhome++; delay(5);
}
XMOTOR.setCurrentPosition(0);
XMOTOR.setMaxSpeed(XMOTORMAXSPEED); XMOTOR.setAcceleration(XMOTORACC);
}
void zhome() {
int initial_zhome = -1;
ZMOTOR.setMaxSpeed(100); ZMOTOR.setAcceleration(100);
while (digitalRead(ZLIMIT)) {
ZMOTOR.moveTo(initial_zhome); initial_zhome--; ZMOTOR.run(); delay(5);
}
ZMOTOR.setCurrentPosition(0);
ZMOTOR.setMaxSpeed(50); ZMOTOR.setAcceleration(50);
initial_zhome = 1;
while (!digitalRead(ZLIMIT)) {
ZMOTOR.moveTo(initial_zhome); ZMOTOR.run(); initial_zhome++; delay(5);
}
ZMOTOR.setCurrentPosition(0);
ZMOTOR.setMaxSpeed(1000); ZMOTOR.setAcceleration(1000);
}
Логика: сначала X и Y движутся навстречу друг другу до Y-лимита, затем вместе до X-лимита, потом отжимают лимиты, в конце Z-хоминг.
Осторожно при первом запуске! Если моторы вращаются не туда — выключите питание и переверните коннектор мотора.
Setup и Loop
void setup() {
Serial.begin(9600);
pinsetup();
autohome();
Serial.println("HOMING OK");
}
void loop() {
// Пример движений
XMOTOR.runToNewPosition(100); delay(1000);
YMOTOR.runToNewPosition(50); delay(1000);
YMOTOR.runToNewPosition(-50); delay(1000);
YMOTOR.runToNewPosition(0); delay(1000);
XMOTOR.runToNewPosition(0); delay(1000);
}
Заключение
Многие используют GRBL + ПК для управления. Но если нужно несколько фиксированных движений, можно зашить логику в Arduino. Также можно добавить Serial-парсинг команд (например, «5,6,7*» — шаги X,Y,Z) или обратную кинематику для задавания координат захвата.
Удачи! Спасибо дизайнерам Thingiverse!
Код
Полный скетч: GitHub репозиторий (скачайте и откройте в Arduino IDE).
3D-модели
Робот MK2 Plus на Thingiverse: CAD файл (автор ackyltle).
Производственный процесс
- Infineon представляет IMC300 контроллер двигателя с интегрированным Arm Cortex-M0 для повышенной гибкости
- Двухрукие SCARA-роботы: передовые решения для сборки и производства
- Роботизированная рука MeArm V1.0 — сборка на Arduino и Raspberry Pi
- Управление манипулятором по Ethernet: Arduino 101 + WIZ750SR + Android-приложение
- LittleArm 2C: 3D-печатаемый робот-манипулятор на Arduino для STEM-обучения
- DIY манипулятор, управляемый жестами руки: пошаговая сборка на Arduino
- Управление манипулятором LittleArm через Android-приложение по Bluetooth
- Realtime Robotics запускает продвинутый контроллер для упрощения интеграции и ускорения развертывания
- Yama Seiki GA-2000CR: компактный токарный центр с роботом-манипулятором и паллетной системой
- KUKA KMR iiwa: мобильный коллаборативный манипулятор для Индустрии 4.0