Программируемый набор 3-осевой манипулятора — локальное и удаленное управление через Arduino и Bluetooth
Компоненты и материалы
| Arduino Mega 2560 | × | 1 |
| SainSmart DIY 3-Axis Control Palletizing Robot Arm Model для Arduino UNO MEGA2560 | × | 1 |
| MeArm DIY Robot Arm Kit | × | 1 |
| HC-06 Bluetooth модуль | × | 1 |
| Adafruit RGB Backlight LCD 16x2 | × | 1 |
| Android устройство | × | 1 |
| Потенциометр вращательный 10 кОм | × | 4 |
| Кнопка тактовая 12 мм | × | 3 |
| Светодиоды (красный, синий, зеленый, желтый) | × | 4 |
Приложения и сервисы
| Arduino IDE |
| MIT App Inventor 2 |
О проекте

Цель этого руководства — пошагово разработать проект управления и программирования манипулятора, имитирующего базовые функции промышленного робота.
Шаг 1: Спецификации

Робот имеет две основные функции:
- Программирование (Program): запись позиций манипулятора в трех измерениях (каждая запись — «шаг»);
- Выполнение (Run): последовательное выполнение записанных позиций. Программа работает до команды «ABORT».
Основные характеристики:
- Управление роботами с 3 или 4 степенями свободы (DOF);
- Режимы «LOCAL» (локальное) и «REMOTE» (удаленное через Android);
- Переключение режимов во время программирования;
- Индикация через цветные LED, 2-строчный LCD дисплей и звуковой извещатель (зуммер);
- Звуковая тревога может запускаться удаленно.
Шаг 2: Проект

Блок-схема показывает спецификацию материалов. Выбрал Arduino MEGA, чтобы не беспокоиться о количестве пинов (на UNO понадобился бы расширитель, например 74138).
Для Bluetooth используется HC-06. Android-приложение для «remote mode» разработано в MIT App Inventor 2, доступно бесплатно в Google Play: «MJRoBot Arduino Robot Arm Control».
Видео демонстрирует удаленное программирование.
Шаг 3: Разработка проекта

Роботизированные манипуляторы классифицируются по количеству «суставов» или степеней свободы (DOF):
- База (Основание/Таз) — поворачивает руку на 180° или 360° (в проекте серво 180°);
- Плечо (Shoulder) — поднимает/опускает руку вертикально;
- Локоть (Elbow) — двигает руку вперед/назад;
- Захват (Claw/Gripper) — открывается/закрывается для захвата предметов.
Шаг 4: Схема подключения

Сервоприводы приводят суставы в движение, подключены прямо к Arduino. На базе иногда используют шаговые двигатели для большего момента и точности. Выбор серв критичен (дешевые китайские MG995 плохо сделаны, но для проекта подошли).
Питание серв должно быть отдельным от Arduino и остальной электроники. Внешний источник 5-6В (проверьте даташит серв). Рекомендуется конденсатор 470 мкФ между VCC и GND для сглаживания шумов от двигателей серв. Все «Ground» должны быть соединены (внешний источник с GND Arduino).
Если сервы вибрируют — увеличьте задержки в коде, чтобы сервы успевали дойти до позиции. Также проверьте, цифровые или аналоговые сервы: цифровые работают на 300 Гц, аналоговые на 50 Гц. Стандартная библиотека Servo.h для аналоговых, для цифровых может потребоваться модификация.
Шаг 5: Код
Проект не сложный, но много переменных. Разумно определить их в отдельном файле:
ArmDefine.h
Здесь же задаются минимальные, максимальные и начальные углы серв. В коде два набора параметров для протестированных манипуляторов (использовать только один):
// MeArm 4-DOF
#define minGrip 15
#define minBase 0
#define minShou 60
#define minElbw 60
#define maxGrip 45
#define maxBase 170
#define maxShou 180
#define maxElbw 150
#define midGrip 30
#define midBase 87
#define midShou 138
#define midElbw 100
/* SS 3-DOF
#define minGrip 75
#define minBase 5
#define minShou 5
#define minElbw 0
#define maxGrip 125
#define maxBase 150
#define maxShou 155
#define maxElbw 0
#define midGrip 100
#define midBase 90
#define midShou 90
#define midElbw 0
*/
У каждого манипулятора свои параметры. Рекомендую: поставьте потенциометры в середину, PWM маппинг по умолчанию (Max=255, Min=0, Mid=126). Затем поворачивайте потенциометры по одному и смотрите в Serial Monitor или на LCD минимальные/максимальные рабочие значения. Их и пропишите в ArmDefine.h.
Для записи наборов координат (шагов) использую массивы:
int gripPosition[100];
int basePosition[100];
int shouPosition[100];
int elbwPosition[100];
int positionIndex = 0; // индекс для массива записанных задач
Записанная программа не сохраняется после выключения (индекс сбрасывается в 0). Можно хранить в EEPROM для сохранения между сессиями.
Шаг 6: Логика программы
Главный блок loop() прост:
void loop() {
checkBTcmd();
defineLocalRemote();
execTaskCmd = digitalRead(execTaskPin);
if (execTaskCmd == HIGH || command == "runon") {
RunProgram();
} else {
recArmPosition();
}
command = "";
}
checkBTcmd()— собирает строку из символов, приходящих от BT модуля, кладет в переменнуюcommand.defineLocalRemote()— анализируетcommandна смену режима Local/Remote. Также обрабатывает команду тревоги: если тревога с Android, рука обязательно переходит в Remote.RunProgram()— подготовка (LED и т.д.) и вызовExecuteTask(). Последняя содержит логику выполнения последовательности шагов: увеличиваетpositionIndex, посылает позиции сервам черезarmPosition(grip, base, shoulder, elbow).recArmPosition()— реально командует сервами и записывает шаги. В зависимости от команды от Android позиционирование серв происходит через потенциометры или слайдеры приложения. При изменении позиции координаты отправляются сервам черезarmPosition. При команде «SAVE» или «PROGRAM» индекс массива увеличивается и шаг сохраняется.
Код разбит на файлы по функциям:
- MJRoBot_Arm_Robot_Task_Prgm.ino —
setup,loopи основные функции; - General_Functions.ino — общие функции:
checkBTcmd(), генерация звукаbeep(pin, freq, ms), дебаунс кнопокdebounce(pin); - Arm_Ctrl_and_Display.ino — чтение потенциометров
readPotenciometers(), чтение слайдеров AndroidreadSliders(), установка сервarmPosition(grip, base, shoulder, elbow), функции отображения на LCD, Serial Monitor, тревоги.
Видео показывает 4DOF манипулятор «meArm», запрограммированный удаленно через Android-приложение.
Полный исходный код на GitHub: https://github.com/Mjrovai/MJRoBot-Programmed-Arm
Файлы проекта: F49C85FIL8CVX0P.ino, FC4OQJNIL8CVX1C.h, FBYPQAMIL8CVX1D.ino, F2SBAXVIL8CVX1E.ino
Шаг 7: Заключение

Надеюсь, проект поможет другим в увлекательном мире электроники, робототехники и IoT! Больше проектов в блоге: MJRoBot.org
Привет с юга мира! До встречи в следующем уроке!
Спасибо, Марсело
Код
Фрагмент кода #1 (Arduino) — параметры манипулятора
// MeArm 4-DOF
#define minGrip 15
#define minBase 0
#define minShou 60
#define minElbw 60
#define maxGrip 45
#define maxBase 170
#define maxShou 180
#define maxElbw 150
#define midGrip 30
#define midBase 87
#define midShou 138
#define midElbw 100
/* SS 3-DOF
#define minGrip 75
#define minBase 5
#define minShou 5
#define minElbw 0
#define maxGrip 125
#define maxBase 150
#define maxShou 155
#define maxElbw 0
#define midGrip 100
#define midBase 90
#define midShou 90
#define midElbw 0
*/
Фрагмент кода #2 (Arduino) — массивы позиций
int gripPosition[100];
int basePosition[100];
int shouPosition[100];
int elbwPosition[100];
int positionIndex = 0; // индекс для массива записанных задач
Фрагмент кода #3 (Arduino) — основной цикл
void loop() {
checkBTcmd();
defineLocalRemote();
execTaskCmd = digitalRead(execTaskPin);
if (execTaskCmd == HIGH || command == "runon") {
RunProgram();
} else {
recArmPosition();
}
command = "";
}
GitHub
https://github.com/Mjrovai/MJRoBot-Programmed-Arm
Схемы
Роботизированная рука
Производственный процесс
- Универсальный Android-пульт на Arduino, 1Sheeld и ИК-управлении
- Как промышленные манипуляторы трансформируют производство: ключевые преимущества
- Роботизированные манипуляторы vs роботизированные руки: ключевые различия
- Создание анимации и игр на LCD 16×2 с Arduino UNO
- Умный вольтметр на Arduino и смартфоне — простое DIY-проект
- Удаленное IoT-управление самодельной манипулятором
- Сборка функционального 3D-печатного манипулятора на Arduino: пошаговое руководство
- Роботизированная рука 6 степеней свободы на Arduino Mega с управлением через Nunchuk
- Сборка вольтметра на Arduino с дисплеем Nokia 5110 — Пошаговое руководство
- Умная робо-рука на Arduino: простое DIY-руководство