DIY манипулятор, управляемый жестами руки: пошаговая сборка на Arduino
Компоненты и материалы
| Arduino UNO | 1 шт. |
| JLCPCB Customized PCB | 1 шт. |
| Сервопривод MG996R | 6 шт. |
| Батарейный отсек 5V | 1 шт. |
| PCA9685 8-канальный драйвер серв (I2C) | 1 шт. |
| Bluetooth модуль HC-05 | 2 шт. |
| Драйвер шагового двигателя A4988 (SparkFun) | 1 шт. |
| NEMA-17 шаговый двигатель | 1 шт. |
| Макетная плата | 1 шт. |
| IMU (6 степеней свободы) | 1 шт. |
| Arduino Nano R3 | 1 шт. |
| Флекс-сенсор | 1 шт. |
Необходимые инструменты
- 3D-принтер
О проекте
DIY манипулятор, управляемый жестами человека.
Фильмы вроде «Тихоокеанский рубеж», «Аватар» намекали на синергию с роботами — ваши движения усиливаются роботизированной помощью. А что, если построить тот же промышленный робот, но в меньшем масштабе?
Этот проект — попытка достичь этого.
Arduino-манепулятор, который можно запрограммировать или управлять жестами руки.

По традиции Iron Man, каждая итерация — Mark. Этот прототип — MARK 1. Ожидаются улучшения.

Полный туториал: DIY Robot Arm (controlled by Hand Gestures)
Обзор
Соберём 6-осевого робота, управляемого жестами руки через роботизированную перчатку. Подражая естественным жестам (щипок, поворот запястья), вы сможете открывать/закрывать захват или поворачивать руку влево/вправо. Фактически — ручное управление роботорукой.

Особенности MARK 1:
- 6 осей вращения
- Портативный
- Управление жестами человека
- Можно запрограммировать базовые функции
- Беспроводное управление на расстоянии
- Грузоподъёмность 600 г (макс. 1 кг)
Список деталей

Роборука полностью настраиваема. Можно купить или напечатать на 3D-принтере. Если печатаете — есть список роботов на сервоприводах, теория та же.
Для MARK 1 выбрана 3D-печать — больше места для кастомных деталей.
Роборука: Thingiverse 3D Printed Robotic Arm (автор: Wonder Tiger):
- Часть 1: Захват
- Часть 2: Основание и поворотный стол
- Часть 3: Основная рука
Подробности, типы винтов — в исходнике. Печать до 40 часов, но дешевле покупки.
Робоперчатка: STL файлы (автор: Roman 13)

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

Отправляем сигнал (по Bluetooth) от перчатки к сервоприводу. При получении значения драйвер серв посылает сигнал конкретному сервоприводу, двигая манипулятор.
Добавляя больше серв и сенсоров, управляем каждым мотором.

Роборука — серия сервоприводов, координирующих друг друга. Можно создать руку, управляемую перчаткой.
Arduino перчатки использует сенсоры для связи с Arduino руки и отправки данных для поворота сервы к нужному углу.
Какие сенсоры в перчатке?
Для MARK 1: флекс-сенсоры и акселерометр (MPU6050).
- Флекс-сенсоры — сопротивление меняется при изгибе, детектирует движение пальцев.
- Акселерометры — для естественных жестов определяют вращение запястья и руки.
Сенсоры детектируют изменение жеста, отправляют специфическое значение (маппинг жеста) на манипулятор для управления сервоприводом через Bluetooth. С достаточным числом жестов рука оживает!

Маппинг манипулятора
Таблица соответствия значений, отправляемых перчаткой манипулятору. Капитальная «F» (finger) — противоположное направление вращения сервы.
Сборка деталей

Сборка манипулятора
Покупка готовой руки дорогая. 3D-печать — бюджетный вариант. В долгосрочной перспективе легко кастомизировать: добавить LED, камеру, зажим.
Модель основана на Thingiverse (Wonder Tiger) — отличный дизайн: 6 осей, хорошо документирован, прочный. Доступ к файлам через список деталей.
Также есть мои ремиксы для камерной стойки. Детали печатаются ~40 часов.
Сервопривод и драйвер

Роборука — координированные моторы. Используем драйвер PCA9685 для питания MG996R серв.
Важно: Используйте внешнее питание для моторов. Arduino не тянет все. Здесь — 5V 2200 mAh RC батарея.
Схема подключения Arduino:

NEMA-17 для поворота основания
Роборука стала тяжелее, MG996R не крутит основание. Нужен более мощный мотор — шаговый NEMA-17 за счёт точности и высокого крутящего момента.

NEMA-17 и драйвер A4988 управляют направлением. Схема ниже:

Финальная схема сборки всей электроники манипулятора.
Сборка электроники
Ниже схема окончательной сборки всех электронных частей, включая Bluetooth модуль. Парный процесс описан ниже.

Человеческий флекс-сенсор

Для эстетики можно напечатать 3D-экзоскелет перчатки. Для прототипа подойдёт строительная перчатка.
Компоненты робоперчатки:
- Флекс-сенсор — изгиб пальца меняет ток, посылаем сигнал мотору
- Акселерометр (MPU6050) — управление мотором через жесты в плоскостях X, Y, Z
- LED — индикатор отправки жеста
- Bluetooth HC-05 — передача данных на приёмник руки
- Arduino Nano — мозг перчатки
Схема для тестирования флекс-сенсора и акселерометра:

Важно: Точность руки зависит от точности перчатки. Стоит потратить время на калибровку.
Настройка Bluetooth (Master и Slave)
Arduino руки общается по Bluetooth через HC-05. Критические параметры:
| Модуль | Конфигурация |
| Робоперчатка HC-05 | Master |
| Роборука HC-05 | Slave |
Baud Rate: 4800
Программирование Arduino
Код можно скачать ниже. Все тестовые скетчи и последняя версия в GitHub репозитории.
Программирование манипулятора

Используется библиотека HCPCA9685 (для драйвера серв). Подключаем библиотеку, объявляем переменные серв.
/* Include the HCPCA9685 library */
#include "HCPCA9685.h"
/* I2C slave address for the device/module. For the HCMODU0097 the default I2C address is 0x40 */
#define I2CAdd 0x40
/* Create an instance of the library */
HCPCA9685 HCPCA9685(I2CAdd);
//initial parking position of the motor
const int servo_joint_L_parking_pos = 60;
//Degree of robot servo sensitivity - Intervals
int servo_joint_L_pos_increment = 20;
//Keep track of the current value of the motor positions
int servo_joint_L_parking_pos_i = servo_joint_L_parking_pos;
//Minimum and maximum angle of servo motor
int servo_joint_L_min_pos = 10;
int servo_joint_L_max_pos = 180;
Инициализация Serial на 4800 бод для Bluetooth:
Serial.begin(4800); // Initialise default communication rate of the Bluetooth module
В loop() постоянно проверяем поступление данных от перчатки. Если есть — сохраняем в переменную state и двигаем моторы.
//Defining the servo driver. 0x40 Address is the default I2C Address.
#define I2CAdd 0x40
int response_time = 5; //Receiving values from the Robotic Glove interval
if (Serial.available() > 0) {
state = Serial.read();
Serial.print(state);
//Motor functionality code block
}
Пример: если согнули пальцы, перчатка шлёт 'f', рука читает и вызывает функцию поворота сервы. Процесс повторяется бесконечно.
if (Serial.available() > 0) {
state = Serial.read();
Serial.print(state);
//For the naming of the motors, refer to the article / tutorial
//Move (Base Rotation) Stepper Motor Left
if (state == 'S') {
baseRotateLeft();
delay(response_time);
}
}
Реализован hard stop, чтобы не превысить макс. угол (180°) и не стереть шестерёнки.
HCPCA9685.Servo(0, servo_joint_L_parking_pos_i);
//Move Claw Motor Downwards
if (state == 'f') {
if (servo_joint_3_parking_pos_i < servo_joint_3_max_pos) {
HCPCA9685.Servo(4, servo_joint_3_parking_pos_i);
delay(response_time);
Serial.println(servo_joint_3_parking_pos_i);
servo_joint_3_parking_pos_i = servo_joint_3_parking_pos_i + servo_joint_3_pos_increment;
}
}
void baseRotateLeft() {
digitalWrite(stepPin, LOW);
delayMicroseconds(stepDelay);
}
Программирование флекс-сенсора
Код на GitHub. Если работаете над проектом — контрибьютьте в репозиторий.
Ключевые моменты:
Определение пяти сенсоров:
//LED ON PIN 3
int pinkie_Data = A1;
int finger_Data = A2;
int thumb_Data = A3;
//const int MPU_addr = 0x68;
const int MPU2 = 0x69, MPU1 = 0x68;
Примечание: 0x68 и 0x69 — I2C адреса двух MPU6050.
//How often to send values to the Robotic Arm
int response_time = 1000;
Чтение значений сенсоров:
pinkie = analogRead(pinkie_Data);
finger = analogRead(finger_Data);
thumb = analogRead(thumb_Data);
Чтение акселерометров:
GetMpuValue1(MPU1);
GetMpuValue2(MPU2);
Калибровка: При включении (или нажатии Reset) определяются верхние/нижние пределы флекс-сенсоров.
if (bool_caliberate == false ) {
delay(1000);
thumb_high = (thumb * 1.15);
thumb_low = (thumb * 0.9);
finger_high = (finger * 1.03);
finger_low = (finger * 0.8);
pinkie_high = (pinkie * 1.06);
pinkie_low = (pinkie * 0.8);
bool_caliberate = true;
}
Постоянно проверяем, превысил ли текущий значение порог. Если да — шлём команду манипулятору.
// finger 1 - Claw Bend/Open
if (finger >= finger_high) {
Serial.print("F");
delay(response_time);
}
if (finger <= finger_low) {
Serial.print("f");
delay(response_time);
}
Программирование роборуки
Результаты

Манипулятор достаточно точен для перемещения объектов. Для сложных задач нужна доработка кода. Работает как задумано для MARK 1. Можно улучшить значительно.
Хотите улучшить код? Контрибьютьте в Arduino Robot Arm Git Repo и делайте открытым для других!
Также можно управлять жестами и программировать автоматизацию базовых задач.
Дальнейшие шаги
Всё для MARK 1! Если проект понравился, поддержите мой Patreon.
Код
Фрагменты кода (см. выше) и полные скетчи на GitHub:
CAD модели
Схемы
Производственный процесс
- Создание Bluetooth-робота на Raspberry Pi с аудио-обратной связью
- Сборка домашней машины для написания домашних заданий (плоттер-писатель)
- Android-управляемая робот-платформа на Raspberry Pi и Motor Shield
- Робот-ускользатор на сервоприводе: сборка на Arduino и HC-SR04
- Автономный линий-следующий робот на Arduino UNO
- Роботизированная рука 6 степеней свободы на Arduino Mega с управлением через Nunchuk
- Голосовой робот на Arduino Nano: Управление речью через Bluetooth
- Управление манипулятором по Ethernet: Arduino 101 + WIZ750SR + Android-приложение
- MobBob: Самостоятельная сборка Arduino-робота под управлением Android-смартфона
- Набор для создания робота с умной внутренней навигацией на базе Arduino