Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Самодельная рука робота Arduino - управляемая жестами рук

Компоненты и расходные материалы

Arduino UNO
× 1
Специальная плата JLCPCB
× 1
Серводвигатель, MG996R
× 6
Аккумулятор 5 В
× 1
National Control Devices PCA9685 8-канальный 8-канальный пропорциональный клапан с драйвером на полевых транзисторах, 8 Вт, 12 В Контроллер с интерфейсом I2C
× 1
Модуль Bluetooth HC-05
× 2
Плата драйвера шагового двигателя SparkFun A4988
× 1
Шаговый двигатель NEMA-17
× 1
Макет (общий)
× 1
Единица инерциального измерения (IMU) (6 градусов свободы)
× 1
Arduino Nano R3
× 1
Датчик гибкости
× 1

Необходимые инструменты и машины

3D-принтер (общий)

Об этом проекте

Представляем самодельный робот-манипулятор, управляемый человеческими жестами .

Такие блокбастеры, как «Тихоокеанский рубеж», «Аватар» и другие научно-фантастические фильмы, намекают на возможность взаимодействия с роботами, при этом ваши движения могут быть улучшены с помощью роботов.

Что, если бы мы могли построить того же промышленного робота, но в меньшем масштабе?

Этот проект - попытка добиться этого.

Это рука робота Arduino, которую можно программировать или даже управлять с помощью жестов руки.

Оставаясь верным условию костюмов Железного человека, каждая итерация будет называться Марком. Этот прототип будет называться MARK 1. Мы можем ожидать, что больше итераций улучшат исходную роботизированную руку.

Полный текст руководства для робота-манипулятора DIY (управляемый с помощью жестов руки) можно найти здесь

Обзор

В этом уроке мы построим шестиосевого робота, управляемого жестами рук с помощью роботизированной перчатки. И, имитируя естественные человеческие жесты, такие как щипки или вращение запястья влево, вы сможете открывать / закрывать или вращать роботизированную руку влево и вправо соответственно. Фактически, это ручное управление роботизированной рукой.

Узнайте больше об исходной статье

Особенности MARK 1:

  • Вращение по 6 осям
  • Портативный
  • Управляйте роботом с помощью человеческих жестов
  • Может быть запрограммирован на выполнение основных функций.
  • Можно управлять по беспроводной сети с большого расстояния.
  • Может выдерживать нагрузку весом 600 г (максимальная нагрузка 1 кг).

Список деталей

Роботизированная рука полностью настраивается. Вы можете купить его самостоятельно или распечатать его на 3D-принтере. Если вы выберете 3D-печать, не беспокойтесь. Существует список различных роботов, использующих серводвигатели, поэтому теория того, что мы создаем, все еще применима.

Для этого проекта этот прототип (Mark 1) будет напечатан на 3D-принтере, так как он дает мне больше места для создания нестандартных деталей.

Роботизированная рука: Роботизированная рука Thingiverse, напечатанная на 3D-принтере (кредиты:Wonder Tiger):

  • Часть 1. Детали захвата
  • Часть 2:Основание и поворотный стол
  • Часть 3. Роботизированная основная рука

Вы можете найти дополнительную информацию об этой сборке, а также о типах винтов из частей выше. Время печати может достигать 40 часов. Однако это снижает стоимость покупки роботизированной руки.

Роботизированная перчатка : Файлы Robotic Glove.STL (кредиты:Роман 13)

Роботизированная перчатка была эстетическим дополнением к проекту, но вы также можете использовать перчатку строителя для создания роботизированной руки.

Примечание. для больших рук распечатайте в масштабе 105%

Как это работает

В общем, мы отправляем сигнал (через Bluetooth) от Robotic Glove на серводвигатель. Когда значение получено, сервопривод отправляет сигнал на конкретный серводвигатель, перемещающий роботизированный манипулятор.

Теперь, если мы добавим несколько сервоприводов и больше датчиков, мы сможем управлять каждым двигателем. `

Если мы думаем о роботизированной руке как о серии серводвигателей, координирующих друг друга для выполнения определенной функции, мы можем создать роботизированную руку, управляемую роботизированной перчаткой.

Arduino Robotic Glove использует датчики для связи с Arduino Robotic Arm и отправляет данные для перемещения сервопривода под желаемым углом.

Вам может быть интересно, какие датчики использует роботизированная перчатка?

Для MARK 1 мы будем использовать Flex Sensors и акселерометр (MPU6050)

  • Датчики Flex - В зависимости от степени изгиба этой пластмассовой детали изменяется сопротивление, влияющее на ток. Затем это измерение используется для обнаружения изменений движения руки.
  • Акселерометры - Для более естественных жестов акселерометр может определять изменение рук и вращение запястий.

Мы используем эти датчики для обнаружения изменения жеста. Затем мы можем отправить определенное значение, сопоставленное с жестом, в роботизированную руку для управления серводвигателем через Bluetooth. И с достаточным количеством жестов роботизированная рука оживает!

Картирование роботизированной руки

Ниже представлена ​​таблица сопоставления значений, отправленных в роботизированную руку перчаткой. Это можно найти в оригинальной статье. У каждого есть ключ для характеристики его функции. (П - Пинки, Л - Вправо и т. Д.)

Примечание. Заглавная буква "F" (палец ) представляет собой противоположное направление вращения серводвигателя

Сборка деталей

Роботизированная рука - сборка

Покупка роботизированной руки может быть довольно дорогой. Чтобы сохранить эту роботизированную руку в рамках бюджета, лучшим вариантом была 3D-печать роботизированной руки.

Это помогает в долгосрочной перспективе, поскольку существует множество примеров роботизированной руки, напечатанной на 3D-принтере, которую можно настроить, например, добавив светодиод, создав зажим для подставки для камеры:

Как упоминалось ранее, роботизированная рука была смоделирована на основе роботизированной руки на Thingyverse. Я выбрал этот пример, так как это была отличная шестиосевая конструкция, хорошо задокументированная и обладающая прочностью / надежностью. Вы можете получить доступ к роботизированной руке Wonder Tiger из списка деталей.

Вы также можете найти мои ремиксы для подставки для камеры с роботизированной рукой. Мы расскажем об этом подробнее в одном из следующих выпусков. Однако на печать всех деталей может потребоваться не менее 40 часов.

Вы также можете найти множество других альтернатив, напечатанных на 3D-принтере.

Представляем серводвигатель и драйвер

Учитывая, что роботизированная рука в идеале представляет собой серию двигателей, которые скоординированы вместе, мы теоретически можем подключить несколько двигателей, которые могут питаться от Arduino. В этом проекте мы будем использовать сервопривод PCA9685 для питания сервопривода MG966R.

Примечание. Используйте внешний источник питания для питания каждого двигателя. Arduino не может обеспечить достаточно мощности для управления всеми двигателями. В этом проекте использовалась RC-батарея на 5 В и 2200 мАч.

Схема подключения Arduino должна выглядеть следующим образом:

NEMA-17 для вращения основания

Поскольку робот начал немного набирать в весе, а серводвигатель MG966R не был достаточно мощным, чтобы вращать роботизированный манипулятор у основания. Чтобы вращать роботизированный манипулятор, потребуется более надежный двигатель, чем серводвигатель.

Шаговый двигатель (NEMA-17) может использоваться благодаря его точности и высокому крутящему моменту, помогая роботизированной руке плавно вращаться для управления жестами.

NEMA-17 и драйвер A4988, используемые для управления направлением двигателя, вы можете видеть на схеме ниже:

И, наконец, на следующей схеме показана окончательная сборка электрической схемы всей роботизированной руки.

Сборка схем

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

Датчик гибкости человека

Сохраняя эстетику робота-манипулятора, вы можете напечатать напечатанную на 3D-принтере рукавицу экзоскелета и использовать ее в качестве роботизированной перчатки.

Однако вы можете использовать стандартную перчатку строителя . для создания прототипа роботизированной перчатки. Этот дизайн «экзоскелета робота-перчатки» отлично сочетается с дизайном роботизированной руки.

Роботизированная перчатка состоит из следующих компонентов:

  • Датчик изгиба - На основе изгиба пальца текущие изменения, которые мы могли бы использовать для отправки сигнала на двигатель.
  • Акселерометр (MPU6050 ) - Мы можем управлять мотором, отображая человеческие жесты из плоскостей X, Y, Z
  • Светодиод - Светодиод загорится, когда на Arduino будет отправлено управление жестами человека.
  • Модуль Bluetooth (HC-05) - Отправка данных на приемник роботизированной руки HC-05
  • Arduino Nano - Микроконтроллер будет работать как мозг робота-перчатки.

Следующая диаграмма отлично подходит для проверки датчика изгиба и акселерометра.

Важно: Роботизированная рука будет работать так же точно, как и роботизированная перчатка, поэтому стоит понять это правильно.

Настройка Bluetooth (ведущий и приемник)

Роботизированная рука Arduino обменивается данными по Bluetooth с помощью модулей HC-05. Ниже выделите важную информацию.

Модуль

Конфигурация

Роботизированная перчатка HC-05 Master Роботизированная рука HC-05 Slave

Примечание.

Скорость передачи установлена ​​на 4800

Программирование Arduino

Вы можете скачать следующий код ниже:

Примечание. Все остальные тестовые коды и последнюю версию можно найти в Git Repo Arduino Robotic Arm

Программирование манипулятора

Код Robotic Arm использует библиотеку HCPCA9685 (для сервопривода). Таким образом, мы можем запитать несколько серводвигателей, и все они будут управляться Arduino. В коде мы можем начать с добавления этой библиотеки и объявления сервопеременных.

Следующие переменные используются для нахождения предыдущего / приращения и получения текущей позиции сервопривода.

  * Включить библиотеку HCPCA9685 * / 
#include "HCPCA9685.h"
/ * Адрес ведомого устройства I2C для устройства / модуля. Для HCMODU0097 адрес I2C по умолчанию
- 0x40 * /
#define I2CAdd 0x40
/ * Создание экземпляра библиотеки * /
HCPCA9685 HCPCA9685 (I2CAdd);
// начальное парковочное положение двигателя
const int servo_joint_L_parking_pos =60;
// Степень чувствительности сервопривода робота - интервалы
int servo_joint_L_pos_increment =20;
// Отслеживаем текущее значение положений двигателя
int servo_joint_L_parking_pos_i =servo_joint_L_parking_pos;
// Минимальный и максимальный угол серводвигателя
int servo_joint_L_min_pos =10;
int servo_joint_L_max_pos =180;

Инициализируйте последовательный порт со скоростью 4800 бод, чтобы начать связь по Bluetooth

  Serial.begin (4800); // Инициализируем скорость связи модуля Bluetooth по умолчанию  

В разделе loop () мы постоянно проверяем, поступают ли какие-либо данные от роботизированной перчатки. Если это правда, мы будем хранить входящие данные в переменной «состояние». И в зависимости от данного персонажа мы будем использовать его для перемещения двигателя (ов).

В следующем разделе представлен код:

Код роботизированной руки можно рассматривать как серию серводвигателей, работающих вместе, чтобы имитировать движения человека. Код тот же, сервопривод управляется сервоприводом на основе значений Bluetooth.

  // Определение сервопривода. Адрес 0x40 - это адрес I2C по умолчанию. 
#define I2CAdd 0x40
int response_time =5; // Получение значений из интервала Robotic Glove
// Проверяет, поступают ли данные через последовательный порт

if (Serial.available ()> 0) {
state =Serial .читать(); // Считывает данные из последовательного порта
Serial.print (state); // Распечатывает отправленное значение
// Блок кода функциональности двигателя
}

На основе текущего «значения состояния» сервопривод отправит сигнал соответствующему двигателю.

Например, если согнуть пальцы. Значение «f» будет отправлено роботизированной перчаткой (через Bluetooth), при этом роботизированная рука будет считывать эти данные и запускать функцию для вращения соответствующего серводвигателя. Этот процесс повторяется в бесконечном цикле.

  if (Serial.available ()> 0) {// Проверяет, поступают ли данные из последовательного порта 
state =Serial.read (); // Считывает данные из последовательного порта
Serial.print (state); // Распечатывает отправленное значение
// Для наименования моторов см. Статью / руководство
// Перемещение (базовое вращение) шагового двигателя влево
if (state ==' S ') {
baseRotateLeft ();
delay (response_time);
}
}

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

  HCPCA9685.Servo (0, servo_joint_L_parking_pos_i); // Управляем серводвигателем в канале 0 на желаемый угол. 
// Перемещаем кулачковый двигатель вниз
if (state =='f') {
if (servo_joint_3_parking_pos_i 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_joint_3_parking_pos_i =servo_parking_pos_i =servo_park_joint_pos}>}
void baseRotateLeft () {
digitalWrite (stepPin, LOW); // Вращение в направлении, основанном на HIGH, LOW
delayMicroseconds (stepDelay); // Изменение скорости шагового двигателя
}

Если значение серводвигателя меньше максимального вращения, продолжайте вращение. Если он достиг максимального поворота 180 градусов, остановитесь.

  servo_joint_3_parking_pos_i  

Где servo_joint_3_max_pos - максимальное положение двигателя.

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

Программирование гибкого датчика

Код Robotic Arm можно найти на GitHub. Если вы работаете над проектом, внесите свою версию в Git Repo. Это поможет составить список различных версий и функций роботизированной руки.

Код уже задокументирован (также доступен на Git). Однако мы рассмотрим ключевые моменты:

Мы определим пять датчиков:

  // Горит светодиод 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

  // Как часто отправлять значения в роботизированную руку 
int response_time =1000;

В следующем коде показано, как Arduino считывает значения датчиков:

  // считываем значения с датчиков Flex в Arduino 
pinkie =analogRead (pinkie_Data);
finger =analogRead (finger_Data);
thumb =analogRead (thumb_Data);

Считайте текущее положение акселерометра:

  GetMpuValue1 (MPU1); 
GetMpuValue2 (MPU2);

Калибровка значений:

Следующий код выполняет калибровку для определения верхнего и нижнего пределов гибкого датчика. Чтобы повторно откалибровать гибкую перчатку, нажмите кнопку сброса на Arduino.

  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 =истина;
}

Мы будем постоянно проверять, не превышает ли текущее значение установленный верхний или нижний предел гибкости на основе калибровки. Если датчик изгиба опускается выше или ниже этого значения, данные отправляются в роботизированный манипулятор для перемещения определенного серводвигателя в определенном направлении.

  // палец 1 - Сгибание / открытие когтя 
if (finger> =finger_high) {
Serial.print ("F");
delay (response_time);
}
if (finger <=finger_low) {
Serial.print("f ");
delay (response_time);
}

Программирование руки робота

Результаты - окупаемость

Роботизированная рука достаточно точна, чтобы перемещать объекты. Однако для перемещения сложных объектов потребуется некоторая работа или даже конкуренция с ловкостью человека за «миллион с лишним лет»… хотя, потратив больше времени на работу над кодом, точность робота может быть такой, как задумано для MARK 1i. . Хотя руку можно улучшить, можно значительно улучшить.

Если вы хотите улучшить код, внесите свой вклад в Arduino Robot Arm Git Repo и наращивайте руку. Давайте сделаем это открытым для других!

Наконец, мы также можем управлять роботом с помощью жестов рук и запрограммировать робота на автоматизацию основных задач.

Следующие шаги

И это все для пользователей MARK 1! Если вам нужен этот проект, подумайте о поддержке моей страницы на Patreon.

Код

  • Фрагмент кода №1
  • Фрагмент кода №3
  • Фрагмент кода 4
  • Фрагмент кода № 5
  • Фрагмент кода № 7
  • Фрагмент кода №11
  • Фрагмент кода № 12
Фрагмент кода №1 Обычный текст
 * Включить библиотеку HCPCA9685 * / # включить "HCPCA9685.h" / * Адрес ведомого устройства I2C для устройства / модуля. Для HCMODU0097 адрес I2C по умолчанию - 0x40 * / # define I2CAdd 0x40 / * Создание экземпляра библиотеки * / HCPCA9685 HCPCA9685 (I2CAdd); // начальная позиция парковки motorconst int servo_joint_L_parking_pos =60; // Степень сервопривода робота чувствительность - Интервалы int servo_joint_L_pos_increment =20; // Отслеживаем текущее значение положений двигателя int servo_joint_L_parking_pos_i =servo_joint_L_parking_pos; // Минимальный и максимальный угол серводвигателя int servo_joint_L_min_pos =10; int servo_joint_L; int servo_joint_L 
Фрагмент кода № 3 Обычный текст
 // Определение сервопривода. Адрес 0x40 - это адрес I2C по умолчанию. # Define I2CAdd 0x40 int response_time =5; // Получение значений из интервала Robotic Glove // ​​Проверяет, поступают ли данные через последовательный порт if (Serial.available ()> 0) {state =Serial.read (); // Считывает данные из последовательного порта Serial.print (state); // Распечатывает отправленное значение // Блок кода функциональности двигателя} 
Фрагмент кода №4 Обычный текст
 if (Serial.available ()> 0) {// Проверяет, поступают ли данные из последовательного порта state =Serial.read (); // Считывает данные из последовательного порта Serial.print (state); // Распечатывает отправленное значение // Для именования двигателей см. Статью / руководство // Перемещение (базовое вращение) шагового двигателя влево if (state =='S') {baseRotateLeft (); задержка (response_time); }} 
Фрагмент кода № 5 Обычный текст
 HCPCA9685.Servo (0, servo_joint_L_parking_pos_i); // Перевести серводвигатель в канале 0 на желаемый угол .// Переместить кулачковый двигатель вниз if (state =='f') {if (servo_joint_3_parking_pos_i  
Фрагмент кода № 7 Обычный текст
 // светодиод ВКЛ. PIN 3int pinkie_Data =A1; int finger_Data =A2; int thumb_Data =A3; // const int MPU_addr =0x68; const int MPU2 =0x69, MPU1 =0x68; 
Фрагмент кода № 11 Обычный текст
 если (bool_caliberate ==false) {задержка (1000); thumb_high =(большой палец * 1,15); thumb_low =(большой палец * 0,9); finger_high =(палец * 1,03); finger_low =(палец * 0,8); pinkie_high =(мизинец * 1,06); pinkie_low =(мизинец * 0,8); bool_caliberate =true; } 
Фрагмент кода № 12 Обычный текст
 // палец 1 - Сгибание / открытие когтя if (finger> =finger_high) {Serial.print ("F"); задержка (response_time); } если (finger <=finger_low) {Serial.print ("f"); задержка (response_time); } 
Github
http://github.com/EbenKouao/arduino-robot-armhttp://github.com/EbenKouao/arduino-robot-arm
Github
https://github.com/EbenKouao/arduino-robotic-armhttps://github.com/EbenKouao/arduino-robotic-arm

Изготовленные на заказ детали и корпуса

Thingiverse
https://www.thingiverse.com/thing:1748596CAD-файл на сайте thingiverse.com
Thingiverse
https://www.thingiverse.com/thing:1750025CAD-файл на сайте thingiverse.com
Thingiverse
https://www.thingiverse.com/thing:1838120CAD-файл на сайте thingiverse.com
Thingiverse
https://www.thingiverse.com/thing:1982745CAD-файл на сайте thingiverse.com

Схема

Робот-манипулятор Git Repo
https://github.com/EbenKouao/arduino-robot-arm

Производственный процесс

  1. Робот Raspberry Pi, управляемый через Bluetooth
  2. Сделайте машинку для письма домашнего задания дома
  3. Игрушка под управлением Android с использованием Raspberry Motor Shield
  4. Робот с сервомотором избегает препятствий
  5. Робот-последователь линии
  6. Роботизированная рука, управляемая нунчук (с Arduino)
  7. Робот, управляемый речью
  8. Рука робота, управляемая через Ethernet
  9. MobBob:самостоятельный робот Arduino, управляемый смартфоном Android
  10. Робот для супер-крутой навигации внутри помещений