Роботизированные манипуляторы в течение десятилетий использовались на сборочных линиях, производящих все, от автомобилей до электронных плат. Они также являются очень популярными проектами для экспериментаторов робототехники. Манипулятор над которой мы будем работать сегодня - это набор DF Robot 5 DOF Robotic Arm, а для управления движениями и захватом будет использована плата Arduino.
Давайте начнем с того, что мы будем строить.
Данный набор включает в себя сервоприводы, кронштейны, крепеж, подшипники и механизм захвата, с помощью которого можно собрать небольшой мощный роботизированный манипулятор.
Кронштейны и опоры для кронштейна изготовлены из черного анодированного алюминия, что обеспечивает прочную опору.
Манипулятор оснащен пятью сервоприводами стандартного типоразмера:
Сервоприводы, кронштейны и крепеж поставляются в индивидуальных пакетах с идентификационными метками, а механизм захвата предварительно собран.
Полный список деталей набора DFRobot 5 DOF Robotic Arm:
Как и в случае с большинством наборов манипуляторов от DFRobot, комплект идёт как «5 DOF» манипулятор (манипулятор с пятью степенями свободы). Что именно означает термин «степени свободы»?
Термин «степени свободы» может означать разные вещи. Если Вы авиационный инженер, то Вам, скорее всего, будут представлены степени свободы в классических трех измерениях и направлениях, в которых объект может двигаться:
В робототехнике под количеством степеней свободы обычно указывается, сколько у механизма подвижные соединения. У данной робо-руки 5 таких соединения, т.е. робот с пятью степенями свободы.
Каждый серводвигатель приводит в действие отдельную секцию манипулятора. Чтобы было проще, я дал названия каждой секции манипулятора.
Для нормальной работы основание рычага необходимо надежно закрепить на твердой поверхности.
На этом сборка механики завершена. Теперь осталось подключить электронику и начать экспериментировать с кодом и управлением.
Для управления всеми сервоприводами использован модуль 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 следующим образом:
Обратите внимание, что A4 и A5 используются I2C.
Помните, что для подключения Arduino Nano к компьютеру Вам понадобится кабель USB с разъемом mini USB (не micro USB). Разъемы mini USB не так часто встречаются в наши дни.
Теперь давайте рассмотрим подключение PCA9685 сервоконтроллера:
Сбоку PCA9685, линии I2C и питания подключаются к Arduino. Затем 5 (или 6) сервоприводов подключаются к разъёмам PWM0-PWM4. У разъёмов подключения сервоприводов следующая распиновка:
Распиновка у используемых сервоприводов такая:
При подключении сервоприводов убедитесь, что не перепутано местами выводы (земля и управляющий).
Наконец, Вам понадобится источник питания на 5В с достаточным током (желательно как минимум на 2 Ампера) для пяти серводвигателей. Источник питания подключается непосредственно к разъему на модуле PCA9685.
Как только всё будет подключено и перепроверено, можно переходить к программированию.
Скетч для своей работы задействует библиотеку 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. Если Вы будете использовать другие сервомоторы, возможно Вам понадобиться подкорректировать эти значения.
Ряд переменных определяется следующим образом:
В функции setup просто инициализируется объект сервоконтроллера и устанавливается частоту генератора, равная 50 Гц, что является стандартным для таких сервоприводов.
Далее в коде определяется две функции:
Код в loop цикле довольно прост. С помощью функции getDegree определяется положение потенциометра, затем эта информация передается в функцию moveMotorDeg для перемещения соответствующего сервопривода в нужное положение.
И так 5 раз для каждого потенциометра и сервопривода. После чего c помощью функции delay делается небольшая задержка и затем цикл начинается выполняться заново. В результате серводвигатели движутся в зависимости от положения потенциометра.
Подключите все, обеспечьте подходящий источник питания и приготовьтесь проверить, как работает собранный манипулятор.
Убедитесь, что Вы надежно прикрепили руку к основанию, которое имеет достаточную массу, что бы манипулятор не опрокинулся. И держите руки подальше от манипулятора, когда будете включать питание - сервоприводы сразу же придут в движение, чтобы занять положение, соответствующее тому, как повёрнуты потенциометры!
Манипулятор достаточно крепкий, а сервоприводы достаточно мощные что бы поднимать небольшие предметы.
Управлять манипулятором увлекательно, рассчитывайте на то, что даже с таким простым скетчем можно заниматься этим часами!
На этом сборка и первоначальное тестирование завершается, но это только начало экспериментов с роботизированным манипулятором DFRobot 5 DOF, по крайней мере для меня.
Я уже установил один датчик для следующей серии экспериментов. Это модуль трёх осевого гироскопа и акселерометра MPU5060, который я установил сверху манипулятора, чтобы получать данные о положении. Этот датчик также работает на I2C шине, поэтому подключить и взаимодействовать с ним будет очень просто.
Кроме MPU6050 на манипуляторе можно установить камеру (телеуправление или для экспериментов с машинным зрением для реализации автоматизированного поведения), датчики расстояния, тензорезистор для измерения силы сжатия захватом предмета и т.д.
Я надеюсь, что эта статья вдохновит Вас на создание интересных проектов, с помощью такого роботизированного манипулятора.