Создание точного манипулятора с ПК-управлением на Arduino Nano и сервоприводах Tower Pro MG996R
Компоненты и расходные материалы
| Arduino Nano R3 | × | 1 |
| Сервоприводы Tower Pro MG996R | × | 4 |
Приложения и онлайн-сервисы
- Microsoft Visual Studio 2015 (для ПК-приложения)
- Arduino IDE
О проекте
Я всегда восхищался современными производственными технологиями и ролью манипуляторов в подъеме материалов, сборке, сварке, резке и работе на складах.
Создание этого манипулятора стало вызовом. В основу взял простой дизайн 2016 года (автор fortzero), но решил не управлять вручную, а написать приложение автоматизации на C# (Windows Forms), стилизованное под промышленные SCADA-системы.
Приложение полностью управляет манипулятором, отслеживает движения, позволяет задавать последовательности задач.
Шаг 1: Материалы

Основной материал — МДФ: 2 мм для конструкции, 4 мм для основания. Чертежи доступны для скачивания в последнем шаге — распечатайте, наклейте на МДФ, вырежьте по контуру, просверлите отверстия. Для сверления и резки использовал ротационную шлифмашинку. Для основания чертежей нет — можно импровизировать.
Шаг 2: Покраска и оформление

Для привлекательного вида использовал те же чертежи: в Photoshop создал декали и геометрические формы, распечатал и наклеил на дерево клеем ПВА.
Шаг 3: Сборка рамы

Манипулятор собирался просто: всё заранее спланировано. Сервоприводы закреплены винтами. Для соединения левой и правой сторон использовал толстые деревянные штыри на суперклей — легче, чем длинные винты.
Шаг 4: Захват (щипцовый механизм)

Согнул два металлических стержня плоскогубцами, просверлил отверстие в деревянной детали 3 мм и закрепил суперклеем.
Шаг 5: Изготовление основания

Основание из МДФ 4 мм: квадрат ~17×10 см, отверстие под сервопривод основания (9g). Для снижения трения использовал картонную трубку (высота 2,5 см, диаметр 10 см) с отверстием под вал сервы.
Шаг 6: Электроника


При использовании более двух сервоприводов с Arduino обязательно внешнее питание. Здесь: 3 микросервы 9g и 1 мощный сервопривод. Сначала тестировал виртуально на Tinkercad.
Питание: 4 батареи АА (1,5 В) = 6 В. Сделал макет на breadboard, затем простую расширительную плату для Arduino Nano.
Шаг 7: Код Arduino
- Скачайте и установите последнюю Arduino IDE: arduino.cc
- Подключите Arduino к USB.
- Инструменты → Плата → выберите вашу плату.
- Вставьте код в редактор IDE.
- Проверьте код (кнопка ✔).
- Загрузите (кнопка ➤).
Шаг 8: Приложение автоматизации

Любимая часть — автоматизация Arduino через ПХ. Хороший старт для изучения расширенного управления платами.
Достижение фиксированных углов было непросто. Сначала решал через Processing 3: сделал интерфейс, симулирующий сервы (База, Плечо, Локоть, Захват) с клавиатуры «угол за углом» до заданных позиций. Зафиксировал углы в массивы (A,B,C,D) и использовал их в Windows-приложении — это помогло узнать пределы каждого сервопривода.
Эти пределы заложены в ползунки интерфейса для безопасности и поддержки воспроизведения.
Возможности приложения:
1. Ручной контроль: ползунки для каждой сервы + клавиатура:
- Захват: кнопки Открыть/Закрыть
- База: ползунок или стрелки ←/→
- Плечо: ползунок или стрелки ↑/↓
- Локоть: ползунок или клавиши W/S
2. Запись движений: кнопка «Rec. Position» или клавиша R — сохраняет текущие углы в список. Кнопка «Start Auto mood» воспроизводит последовательность.
3. Мониторинг: графический интерфейс рисует графики движений в реальном времени, таблица справа показывает точные углы и время. Можно создавать свои задачи и отправлять манипулятору — как в промышленной автоматизации.
Шаг 9: Обновления (авг. 2018)

Повторил дизайн на лазерном станке из МДФ 3 мм с улучшениями. Добавил кастомный джойстик — крутая идея.
Код
Task.ino (Arduino)
int delayT = 350;
void Home() { // Позиция "дом"
MyServo0.write(valGripper); delay(15);
MyServo.write(valBase); delay(30);
MyServo2.write(valShoulder); delay(30);
MyServo3.write(valElbow); delay(delayT);
}
void Pick() { // Фиксированная позиция захвата
MyServo.write(4); delay(delayT);
MyServo3.write(125); MyServo2.write(95); delay(delayT);
MyServo0.write(50); delay(delayT); // Открыть
MyServo0.write(2); delay(delayT); // Закрыть
MyServo2.write(60); MyServo3.write(80); delay(delayT);
Serial.println("Object Picked");
}
void Drop() { // Фиксированная позиция сброса
MyServo.write(145); delay(delayT);
MyServo2.write(80); delay(15);
MyServo3.write(115); delay(delayT);
MyServo0.write(40); delay(delayT); // Открыть
MyServo3.write(90); delay(delayT);
Serial.println("Object Dropped");
}
void Playback() { // Парсинг команд "servoId:angle&servoId:angle..."
char* command = strtok(ByteReceived, "&");
while (command != 0) {
char* separator = strchr(command, ':');
if (separator != 0) {
*separator = 0;
int servoId = atoi(command);
++separator;
int angle = atoi(separator);
if (servoId == 1) { MyServo.write(angle); delay(delayT); }
else if (servoId == 2) { MyServo2.write(angle); delay(delayT); }
else if (servoId == 3) { MyServo3.write(angle); delay(delayT); }
}
command = strtok(0, "&");
}
}
RobotArm.ino (Arduino)
// written by AhmedAzouz
#include
Servo MyServo, MyServo2, MyServo3, MyServo0;
char ByteReceived;
int valGripper = 30, valBase = 70, valShoulder = 25, valElbow = 150;
void setup() {
Serial.begin(9600);
pinMode(A5, OUTPUT);
MyServo0.attach(12); // Gripper
MyServo.attach(11); // Base
MyServo2.attach(13); // Shoulder
MyServo3.attach(10); // Elbow
// Стартовые позиции
MyServo0.write(valGripper); delay(15);
MyServo.write(valBase); delay(30);
MyServo2.write(valShoulder); delay(30);
MyServo3.write(valElbow); delay(300);
}
void loop() {
// Вывод текущих углов в Serial
while (Serial.available() > 0) {
ByteReceived = Serial.read();
switch (ByteReceived) {
case 'n': digitalWrite(A5, HIGH); Serial.println("LED on"); break;
case 'f': digitalWrite(A5, LOW); Serial.println("LED off"); break;
case 'l': MyServo.write(MyServo.read()+2); Serial.println(MyServo.read()); delay(15); break; // Base left
case 'r': MyServo.write(MyServo.read()-2); Serial.println(MyServo.read()); delay(15); break; // Base right
case 'u': MyServo2.write(MyServo2.read()+2); Serial.println(MyServo2.read()); delay(15); break; // Elbow up
case 'd': MyServo2.write(MyServo2.read()-2); Serial.println(MyServo2.read()); delay(15); break; // Elbow down
case 'w': MyServo3.write(MyServo3.read()+2); Serial.println(MyServo3.read()); delay(15); break; // Shoulder down
case 's': MyServo3.write(MyServo3.read()-2); Serial.println(MyServo3.read()); delay(15); break; // Shoulder up
case 'o': MyServo0.write(30); Serial.println(MyServo0.read()); delay(15); break; // Gripper open
case 'c': MyServo0.write(1); Serial.println(MyServo0.read()); delay(15); break; // Gripper close
case 'q': digitalWrite(A5,HIGH); Pick(); Drop(); Home(); digitalWrite(A5,LOW); break; // Quick demo
case 'h': Home(); digitalWrite(A5,LOW); break; // Force home
default: digitalWrite(A5,HIGH); Pick(); Playback(); Home(); digitalWrite(A5,LOW); break; // Auto mode
}
}
}
3D-модели
Файл SketchUp: f98t2axin238k2n_khGWAEIqdl.skp
Схемы

Производственный процесс
- Makerarm: универсальный настольный робот-манипулятор для мейкеров
- Как создаются манипуляторы роботов: проектирование и функции
- Как промышленные манипуляторы трансформируют производство: ключевые преимущества
- Промышленные роботизированные руки: повышение эффективности производства и ценности персонала
- Гидравлические роботизированные руки в производстве: экспертное руководство
- Удаленное IoT-управление самодельной манипулятором
- Сборка функционального 3D-печатного манипулятора на Arduino: пошаговое руководство
- Роботизированная рука 6 степеней свободы на Arduino Mega с управлением через Nunchuk
- Рынок SCARA-роботов достигнет $14,78 млрд к 2026 году, стимулируя рост автоматизации
- Промышленные роботы-манипуляторы: Движущая сила производственной революции