+7-960-0655211 (Билайн)
+7-987-4207734 (МТС)
интернет-магазин
доставка по России и СНГ
нам уже 10 лет!

Роботизированный манипулятор на основе набора DFRobot 5 DOF Robot Arm

Роботизированный манипулятор на основе набора DFRobot 5 DOF Robot Arm

Введение

Роботизированные манипуляторы в течение десятилетий использовались на сборочных линиях, производящих все, от автомобилей до электронных плат. Они также являются очень популярными проектами для экспериментаторов робототехники. Манипулятор над которой мы будем работать сегодня - это набор DF Robot 5 DOF Robotic Arm, а для управления движениями и захватом будет использована плата Arduino.

Давайте начнем с того, что мы будем строить.

Набор DF Robot 5 DOF Robotic Arm

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




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

Манипулятор оснащен пятью сервоприводами стандартного типоразмера:

  • 2 для основания и локтя
  • 1 для запястья
  • 2 для механизма захвата

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




Полный список деталей набора DFRobot 5 DOF Robotic Arm:

  • 2шт. сервопривод Hitec HS311
  • 2шт. сервопривод DF DSS-M15
  • 1шт. сервопривод DF05BB
  • 1шт. LG-NS захват
  • 4шт. многоцелевой кронштейн сервопривода
  • 3шт. длинный U-образный кронштейн
  • 3шт. набор подшипник с крепежом
  • 1шт. L-кронштейн
  • 1шт. оплётка для провода (1 метр)
  • 1шт. набор резьбонарезающих винтов
  • 1шт. набор M3 винтов и гаек

Степени свободы манипулятора

Как и в случае с большинством наборов манипуляторов от DFRobot, комплект идёт как «5 DOF» манипулятор (манипулятор с пятью степенями свободы). Что именно означает термин «степени свободы»?

Термин «степени свободы» может означать разные вещи. Если Вы авиационный инженер, то Вам, скорее всего, будут представлены степени свободы в классических трех измерениях и направлениях, в которых объект может двигаться:

  • вперед и назад
  • вверх и вниз
  • влево и вправо
  • крен
  • тангаж
  • рыскание



В робототехнике под количеством степеней свободы обычно указывается, сколько у механизма подвижные соединения. У данной робо-руки 5 таких соединения, т.е. робот с пятью степенями свободы.

Секции манипулятора

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




Секции:
  • Base (база) – основание руки робота, соответствует человеческому плечу. База зафиксирована на месте, по крайней мере, на данный момент
  • Elbow (локоть) – первая секция на руке. Как и человеческий локоть, он позволяет узлу сгибаться
  • Wrist (запястье) – вторая секция на руке. Это позволяет лучше позиционировать узел захвата
  • Pivot (поворот) – позволяет захвату поворачиваются на 90 градусов в любом направлении. У человеческой руки нет такого, вместо этого вращение руки выполняется несколькими различными мышцами в руке
  • Jaws (челюсть, захват) – сам механизм захвата

Для нормальной работы основание рычага необходимо надежно закрепить на твердой поверхности.

Сборка захвата


Детали:
  • 1шт. LG-NS захват
  • 2шт. сервопривод Hitec HS-311
  • 2шт. саморез (поставляется в комплекте с сервоприводом)



Инструкция:
  • Установите оба сервопривода в положение 0 градусов (полное вращение против часовой стрелки)
  • Возьмите захват и один сервопривод
  • Проверните вал сервопривода на 90 градусов (т.е. установить в среднее положение)
  • Вставьте вал сервопривода (поворот захвата) в заднюю часть узла захвата
  • Проверьте, правильно ли выровнено
  • Крепежным винтом зафиксируйте захват на валу двигателя
  • Руками попробуйте повращать качалку, чтобы проверить, нет ли подклинивания в механизме захвата
  • Вставить второй сервопривод
  • Проверьте, правильно ли выровнено
  • Крепежным винтом зафиксируйте захват на валу двигателя




Сборка кронштейна базы


Детали:
  • 1шт. многоцелевой кронштейн сервопривода
  • 1шт. подшипник с крепежом



Сборка:
  • Вставьте винт из комплекта подшипника в отверстие на левой задней стороне кронштейна сервомотора так, чтобы головка винта была на стороне, обращенной к сервомотору
  • Вставьте подшипник. Убедитесь, что скошенная часть подшипника находится на одном уровне с кронштейном сервопривода
  • Вставьте прокладку, затем надежно затяните гайку
  • Убедитесь, что подшипник может свободно вращаться




Сборка U-кронштейнов

Детали:
  • 2шт. длинный U-кронштейн
  • 4шт. болт с гайкой




Сборка:
  • Совместите два U-образных кронштейна так, чтобы короткие секции были прижаты друг к другу, а монтажные отверстия совмещены. Если у вас есть предварительно просверленные монтажные отверстия, как у меня, вы должны убедиться, что они выровнены одинаково, в противном случае ориентация не имеет значения
  • Используйте 4 винта и гайки из пакета, чтобы скрепить кронштейны. Убедитесь, что они надежно закреплены




Сборка elbow (локтевой) секции


Детали:
  • 1шт. многоцелевой кронштейн сервопривода
  • 1шт. длинный U-образный кронштейн
  • 1шт. L-кронштейн
  • 1шт. подшипник с крепежом
  • 4шт. винты и гайки




Сборка:
  • Установите кронштейн сервопривода так, чтобы сервопривод был установлен вперед, а плоская пластина с двумя отверстиями сзади
  • Вставьте винт из комплекта подшипника в отверстие на левой задней стороне кронштейна так, чтобы головка винта была на стороне, обращенной к сервоприводу
  • Вставьте подшипник. Убедитесь, что скошенная часть подшипника находится на одном уровне с кронштейном сервопривода
  • Вставьте прокладку, затем надежно затяните гайку
  • Убедитесь, что подшипник может свободно вращаться
  • Совместите монтажные отверстия на короткой стороне L-образного кронштейна с крепежными отверстиями на коротком плоском дне U-образного кронштейна. L-образный кронштейн должен находиться под прямым углом к U-образному кронштейну
  • Прикрепите L-образный кронштейн к U-образному кронштейну с помощью винтов, прилагаемых к L-образному кронштейну. Головки винтов должны быть на стороне L-кронштейна
  • Совместите монтажные отверстия на длинной стороне L-образного кронштейна с монтажными отверстиями в нижней правой части монтажного кронштейна сервопривода
  • Прикрепите L-образный кронштейн к кронштейну сервопривода, головки винтов должны быть на стороне L-кронштейна




Соединение кронштейнов wrist (запястье) и захвата

Детали:
  • 2шт. многоцелевой кронштейн сервопривода
  • 1шт. подшипник с крепежом
  • 4шт. винты и гайки




Сборка:
  • Поместите один кронштейн сервопривода, чтобы потом можно было установить сервопривод спереди, а плоская пластина располагалась сзади
  • Вставьте винт из комплекта подшипника в отверстие на задней правой стороне кронштейна сервомотора так, чтобы головка винта была на стороне, обращенной к сервомотору (обратите внимание, что это противоположная сторона, которая использовалась в предыдущих инструкциях по закреплению сервопривода)
  • Вставьте подшипник. Убедитесь, что скошенная часть подшипника находится на одном уровне с кронштейном сервопривода
  • Вставьте прокладку, затем надежно затяните гайку
  • Убедитесь, что подшипник может свободно вращаться
  • Выровняйте второй монтажный кронштейн сервопривода под прямым углом относительно первого, чтобы вал второго сервопривода, который установим позже, был с правой стороны и совместите монтажные отверстия
  • Закрепите два кронштейна сервопривода с помощью 4 винтов и гаек из пакета. Головки винтов должны быть обращены в сторону нижнего сервопривода. Надежно затяните




Сборка базовой секции


Детали:
  • 1шт. DF DSS-M15 сервопривод
  • 1шт. качалка
  • 4шт. винты и гайки из набора универсального кронштейна сервопривода
  • 1шт. кронштейн базы (ранее собранный)




Сборка:
  • Поверните вал сервопривода в положение 0 градусов (против часовой стрелки)
  • Установите сервопривод, валом в противоположную сторону от закреплённого подшипника
  • Используя 4 винта и гайки, поставляемые с кронштейном сервопривода
  • Наденьте на вал сервопривода алюминиевую качалку, но пока не закрепляйте её болтом




Соединение базы с двойным U-образным кронштейном


Детали:
  • 4шт. винты
  • 1шт. винт для качалки из набора от сервопривода
  • Ранее собранная секция двойного U-кронштейна




Сборка:
  • Установите вал сервопривода в среднее положение
  • Возьмите один конец U-образного кронштейна в сборе и наденьте большое отверстие на подшипник на монтажном кронштейне базового двигателя
  • Другая сторона U-образного кронштейна должна располагаться сверху качалки сервопривода, при этом 4 отверстия качалки и кронштейна должны совпадать. Затем четырьмя винтами прикрутите
  • Используя винт, поставляемый с сервоприводом, прикрутите качалку к валу сервопривода




Соединение сервопривода с elbow (локтевой) секцией


Детали:
  • 1шт. сервопривод DF DSS-M15
  • 1шт. металлическая качалка
  • 4шт. болта и гайки из набора универсального кронштейна сервопривода
  • Ранее собранная elbow секция




Сборка:
  • Поверните вал сервопривода в положение 0 градусов (полностью против часовой)
  • Установите сервопривод, валом в противоположную от подшипника сторону
  • Используя 4 винта и гайки, прикрепите сервопривод к кронштейну
  • Наденьте качалку на вал сервопривода, но пока не прикручивайте её винтом




Соедините elbow секции с двойным U-образным кронштейном и базой


Детали:
  • 4шт. винты из пакета
  • Винт из набора сервопривода
  • Ранее собранная секция базы и U-образного кронштейна
  • Ранее собранная elbow секция с сервоприводом




Сборка:
  • Возьмите оставшийся открытый конец U-образного кронштейна и вставьте в отверстие подшипник elbow секции. Качалки сервоприводов располагаются с одной стороны
  • Теперь другу сторону U-образного кронштейна наденьте поверх качалки сервопривода, при этом отверстия качалки и кронштейна должны совпадать
  • С помощью 4 винтов из пакета соедините кронштейн с качалкой
  • Винтом из набора сервопривода закрепите качалку на валу






Установка wrist (запястье) сервопривода

Детали:
  • 1шт. сервопривод DF05BB
  • 4шт. винт и гайка из набора универсального кронштейна сервопривода
  • Собранная ранее wrist секция




Сборка:
  • Установите сервопривод на верхний кронштейн (тот, что с подшипником). Вал сервопривода и подшипник сориентированы в разные стороны
  • Используйте 4 винта и гайки, поставляемые с кронштейном что бы закрепить сервопривод

 


Соедините elbow и wrist секций


Детали:
  • Ранее собранные секции
  • 5шт. резьбонарезающих винта
  • 1шт. качалка из набора сервопривода




Сборка:
  • Поверните вал сервопривода в положение 0 градусов (полностью против часовой)
  • Наденьте качалку на вал, но пока не прикручивайте его винтом
  • Вставьте подшипник wrist кронштейна в отверстие открытого конца U-образного кронштейна. Качалки сервоприводов должны быть расположены с одной стороны
  • Другую сторону U-образного кронштейна наденьте поверх качалки, при этом отверстия качалки и кронштейна должны совпадать
  • С помощью 4 винтов из пакета соедините кронштейн с качалкой
  • Винтом из набора сервопривода закрепите качалку на валу






Соединение захвата


Детали:
  • 4шт. винт и гайка от универсального кронштейна сервопривода
  • Винт из набора сервопривода
  • Ранее собранные секции




Сборка:

  • Установите сервопривод захвата на wrist кронштейн. Вал сервопривод должен находится на левой стороне крепления двигателя
  • С помощью 4 винтов и гаек закрепите сервопривод к кронштейну




На этом сборка механики завершена. Теперь осталось подключить электронику и начать экспериментировать с кодом и управлением.






Управляющая электроника

Для управления всеми сервоприводами использован модуль 16-канального ШИМ-контроллера на базе микросхемы PCA9685, который закреплён непосредственно на корпусе манипулятора. Модуль сервопривода управляется платой Arduino по I2C шине.

В своих проектах я обычно предпочитаю использовать Arduino Uno, но она всегда отвечает всем требованиям. В данном случае мне было удобней использовать Arduino Nano.

Для начала я хотел сделать управление с помощью пяти потенциометров, каждый из которых независимо бы управлял своим сервоприводом. Получаемые данные о положении каждого потенциометра затем будут передаваться по I2C шине на PCA9685 для управления сервоприводами. Мне также хотелось бы, чтобы была возможность добавить шестой потенциометр и ещё один мотор в основании манипулятора, чтобы сделать манипулятор с шестью степенями свободы.

У Arduino Uno есть 6 аналоговых входов, поэтому на первый взгляд она казалась идеальной для реализации данного проекта. Но как оказалось, есть подвох - два аналоговых входа не могут быть использованы в этой конструкции.

Аналоговые входы A4 и A5 на Arduino Uno выполняют двойную функцию в качестве линий SDA (Data) и SCL (Clock) на шине I2C. Даже если ваш Uno имеет отдельные выводы SDA и SCL, они просто внутренне подключены к A4 и A5. Поэтому, если Вы используете I2C (что я и делаю), Вы не сможете использовать аналоговые контакты A4 и A5, о которых они говорят. Реализовать управление сервоконтроллером ещё можно с помощью программной реализации I2C, но для реализации было решено сначала посмотреть, можно ли реализовать всё необходимое, если использовать другую плату Arduino.

Оказывается, Arduino Nano имеет восемь аналоговых входов, на два больше, чем Uno. Таким образом, даже несмотря на то, что Nano использует ту же схему «двойного режима I2C» для контактов A4 и A5, у него все еще достаточно аналоговых входов, чтобы реализовать всё необходимое.

С Nano во многих отношениях работать так же легко, как и с UNO, особенно если вы устанавливаете его на беспаечную макетную плату или в плату расширения.

Подключение

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

Чтобы избежать путаницы, я показываю схему на двух схемах. Это совпадает с моей схемой подключения PCA9685 непосредственно на кронштейне. Вы можете установить PCA9685 не на корпусе манипулятора, а на той же макетной плате, на которой установлена Arduino Nano.

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




В данной схеме все пять потенциометров двумя крайними выводами подключены к питанию Arduino – с одной стороны к земле, с другой к +5В.

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

  • Base (база) – A0
  • Elbow (локоть) – A1
  • Wrist (запястье) – A2
  • Grip Pivot (поворот захвата) – A3
  • Grip Jaws (сжатие захвата) – A6

Обратите внимание, что A4 и A5 используются I2C.

Помните, что для подключения Arduino Nano к компьютеру Вам понадобится кабель USB с разъемом mini USB (не micro USB). Разъемы mini USB не так часто встречаются в наши дни.

Теперь давайте рассмотрим подключение PCA9685 сервоконтроллера:




Сбоку PCA9685, линии I2C и питания подключаются к Arduino. Затем 5 (или 6) сервоприводов подключаются к разъёмам PWM0-PWM4. У разъёмов подключения сервоприводов следующая распиновка:

  • желтый – управляющий
  • красный – плюс питания
  • чёрный – земля

Распиновка у используемых сервоприводов такая:

  • желтый – управляющий
  • красный – плюс питания
  • коричневый – земля

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

Наконец, Вам понадобится источник питания на 5В с достаточным током (желательно как минимум на 2 Ампера) для пяти серводвигателей. Источник питания подключается непосредственно к разъему на модуле PCA9685.

Как только всё будет подключено и перепроверено, можно переходить к программированию.

Скетч для Arduino

Скетч для своей работы задействует библиотеку Adafruit PWM. Если она у Вас не установлена, поищите в менеджере библиотек «Adafruit PWM» и установите.






/*
  Basic Robot Arm Controller
  robot-arm-control-basic.ino
  Controls 5 DOF Robot Arm, uses Arduino Nano and PCA9685 PWM Controller
  Uses Adafruit PWM library
  Uses 5 potentiometers for input (can be modified for 6)

  DroneBot Workshop 2018
  https://dronebotworkshop.com
*/

// Include Wire Library for I2C Communications
#include <Wire.h>

// Include Adafruit PWM Library
#include <Adafruit_PWMServoDriver.h>

#define MIN_PULSE_WIDTH       650
#define MAX_PULSE_WIDTH       2350
#define FREQUENCY             50

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

// Define Potentiometer Inputs

int controlBase = A0;
int controlElbow = A1;
int controlWrist = A2;
int controlPivot = A3;
int controlJaws = A6;

// Define Motor Outputs on PCA9685 board

int motorBase = 0;
int motorElbow = 1;
int motorWrist = 2;
int motorPivot = 3;
int motorJaws = 4;

// Define Motor position variables
int mtrDegreeBase;
int mtrDegreeElbow;
int mtrDegreeWrist;
int mtrDegreePivot;
int mtrDegreeJaws;

void setup() 
{
  // Setup PWM Controller object
  pwm.begin();
  pwm.setPWMFreq(FREQUENCY);
}

// Function to move motor to specific position
void moveMotorDeg(int moveDegree, int motorOut)
{
  int pulse_wide, pulse_width;

  // Convert to pulse width
  pulse_wide = map(moveDegree, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
  pulse_width = int(float(pulse_wide) / 1000000 * FREQUENCY * 4096);
  
  //Control Motor
  pwm.setPWM(motorOut, 0, pulse_width);
}

// Function to convert potentiometer position into servo angle
int getDegree(int controlIn)
{
  int potVal,srvDegree;
  
  // Read values from potentiometer
  potVal = analogRead(controlIn);
  
  // Calculate angle in degrees
  srvDegree = map(potVal, 0, 1023, 0, 180);
  
  // Return angle in degrees
  return srvDegree;
  
}

void loop() {

  //Control Base Motor
  
  // Get desired position
  mtrDegreeBase = getDegree(controlBase);
  // Move motor
  moveMotorDeg(mtrDegreeBase,motorBase);
  
  
  //Control Elbow Motor
  
  // Get desired position
  mtrDegreeElbow = getDegree(controlElbow);
  // Move motor
  moveMotorDeg(mtrDegreeElbow,motorElbow);
  
  
  //Control Wrist Motor
  
  // Get desired position
  mtrDegreeWrist = getDegree(controlWrist);
  // Move motor
  moveMotorDeg(mtrDegreeWrist,motorWrist);
  
  
  //Control Pivot Motor
  
  // Get desired position
  mtrDegreePivot = getDegree(controlPivot);
  // Move motor
  moveMotorDeg(mtrDegreePivot,motorPivot);
  
  
  //Control Jaws Motor
  
  // Get desired position
  mtrDegreeJaws = getDegree(controlJaws);
  // Move motor
  moveMotorDeg(mtrDegreeJaws,motorJaws);

 
  // Add short delay
  delay(20);

}

В начале скетча подключается две библиотеки - Adafruit PWM (управление сервоконтроллером) и Wire (связь по I2C шине).

Для сервоконтроллера определены несколько констант - минимальная и максимальная длительность импульса, а также частота. Заданные значения в скетче будут правильно работать для сервоприводов, поставляемых в наборе DF Robot 5 DOF Robot Arm. Если Вы будете использовать другие сервомоторы, возможно Вам понадобиться подкорректировать эти значения.

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

  • Переменные, у которых название начинается с «control», задают порт, к которому подключен потенциометр
  • Переменные, у которых название начинается с «motor», задают порт платы PCA9685, к которому подключен сервопривод
  • Переменные, у которых название начинается с «mtrDegree», устанавливают угол (от 0 до 180), на который нужно провернуть вал сервопривода

В функции setup просто инициализируется объект сервоконтроллера и устанавливается частоту генератора, равная 50 Гц, что является стандартным для таких сервоприводов.

Далее в коде определяется две функции:

  • moveMotorDeg – эта функция устанавливает нужный сервопривод (второй параметр) в желаемое положение (первый параметр)
  • getDegree – эта функция в качестве параметра принимает номер порта АЦП, к которому подключен потенциометр и возвращает значение угла (в градусах), на которое данный потенциометр в данный момент повёрнут

Код в loop цикле довольно прост. С помощью функции getDegree определяется положение потенциометра, затем эта информация передается в функцию moveMotorDeg для перемещения соответствующего сервопривода в нужное положение.

И так 5 раз для каждого потенциометра и сервопривода. После чего c помощью функции delay делается небольшая задержка и затем цикл начинается выполняться заново. В результате серводвигатели движутся в зависимости от положения потенциометра.


Тестирование роборуки

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

Убедитесь, что Вы надежно прикрепили руку к основанию, которое имеет достаточную массу, что бы манипулятор не опрокинулся. И держите руки подальше от манипулятора, когда будете включать питание - сервоприводы сразу же придут в движение, чтобы занять положение, соответствующее тому, как повёрнуты потенциометры!

Манипулятор достаточно крепкий, а сервоприводы достаточно мощные что бы поднимать небольшие предметы.

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




Дальнейшее развитие проекта

На этом сборка и первоначальное тестирование завершается, но это только начало экспериментов с роботизированным манипулятором DFRobot 5 DOF, по крайней мере для меня.

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

Кроме MPU6050 на манипуляторе можно установить камеру (телеуправление или для экспериментов с машинным зрением для реализации автоматизированного поведения), датчики расстояния, тензорезистор для измерения силы сжатия захватом предмета и т.д.

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


Автор: DroneBot 
Перевод и адаптация: RobotoTehnika.ru