Манипулятор с захватом 2 DOF

Описание

Набор предназначен для самостоятельной сборки манипулятора на 2 степени свободы с механическим захватом. Первая степень отвечает за наклон захвата, вторая непосредственно отвечает за работу захвата. С помощью захвата можно перемещать различные предметы. Максимальная рабочая ширина захвата 55 мм. Манипулятор может быть установлен на шасси робота.

Манипулятор приводится в движение с помощью сервоприводов. Всего в данном манипуляторе их используется 2. Чем мощнее сервоприводы, тем больший груз сможет переместить манипулятор. Например, при использовании сервоприводов с крутящим моментом около 10 кг⋅см - грузоподъемность захвата будет около 300 грамм. Мы специально не стали добавлять сервоприводы в данный набор, чтобы каждый смог подобрать их под свои индивидуальные требования.

Для работы с манипулятором подойдут сервоприводы стандартного типоразмера 54х20 мм с 4 посадочными отверстиями 50х10 мм. К таковым относятся MG995, MG996R, S3003, DS04-NFC 360, TD8120 и многие другие. Подбор сервоприводов должен осуществляться на основе необходимых требований к грузоподъемности, причем чем больше рабочее плечо, тем мощнее должен быть сервопривод. Например, для работы захвата может быть использован менее мощный сервопривод, а для его наклона потребуется наоборот более мощный, поскольку рабочее плечо уже будет больше.

Максимальная длина манипулятора составляет 21 см.

Манипулятор выполнен из сплава алюминия с нанесенным защитным покрытием. Общий вес манипулятора без сервоприводов составляет 140 г.

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

Обратите внимание, что при использовании мощных сервоприводов потребуется внешнее питание - подключать все сервоприводы напрямую к контроллеру небезопасно. Требуемая мощность источника тока определяется на основе выбранных вами сервоприводов.

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

Комплектация

  • комплект деталей для сборки манипулятора x1
  • инструкция по сборке х1
  • пакет упаковочный х1
  • Сервоприводы в комплект не входят.

Пример работы с манипулятором

Пример №1

Описание: В примере управление сервоприводами манипулятора производится с помощью модуля джойстика. Каждое изменение положения джойстика, влияет на поворот сервопривода.

Для примера понадобится:

#include <Servo.h> // подключение библиотеки для работы с сервоприводом
 
#define SERVOS_COUNT 2 // количество сервоприводов
 
Servo myservos[SERVOS_COUNT];  // создание объектов для работы с сервоприводами
int servos_pins[SERVOS_COUNT] = {6, 5}; // выводы подключения сервоприводов 
int joy_pins[SERVOS_COUNT] = {A0, A1}; // выводы подключения джойстика
 
void setup() {
 
  for (byte i = 0; i < SERVOS_COUNT; i++) { // цикл по количеству сервоприводов
    myservos[i].attach(servos_pins[i], 500, 2500);  // подключение и инициализация сервоприводов
  }
 
}
 
void loop() {
 
  for (byte i = 0; i < SERVOS_COUNT; i++) { // в цикле:
    int ang = analogRead(joy_pins[i]); // получить текущее значение от джойстика
    ang = map(ang, 0, 1024, 0, 180); // ограничить значение от 0 до 180
    myservos[i].write(ang); // повернуть сервопривод на полученное значение
  }  
 
}

Минусом данного варианта управления джойстиком является то, что когда джойстик возвращается «домой», сервопривод повторяет его движение. Таким образом невозможно зафиксировать положение манипулятора. Исправить эту особенность мы постараемся в примере №2.

Пример №2

Описание: В примере управление сервоприводами манипулятора производится с помощью модуля джойстика. Каждое изменение положения джойстика, влияет на поворот сервопривода, но при этом одно сервопривод фиксируется в определённом положении. Каждое движение джойстика, поворачивает сервопривод на ту или иную позицию.

Для примера понадобится:

#include <Servo.h> // подключение библиотеки для работы с сервоприводом
 
#define SERVOS_COUNT 2 // количество сервоприводов
 
Servo myservos[SERVOS_COUNT];  // создание объектов для работы с сервоприводами
int servos_pins[SERVOS_COUNT] = {6, 5}; // выводы подключения сервоприводов 
int joy_pins[SERVOS_COUNT] = {A0, A1}; // выводы подключения джойстика
int angs[SERVOS_COUNT] = {90, 90}; // хранение текущих углов поворота
 
void setup() {
 
  Serial.begin(9600); // инициализация сериал порта для вывода отладочной информации
  for (byte i = 0; i < SERVOS_COUNT; i++) { // в цикле
    myservos[i].attach(servos_pins[i], 500, 2500);  // подключение сервопривода
  }
 
}
 
void loop() {
 
  for (byte i = 0; i < SERVOS_COUNT; i++) { // в цикле (по количеству сервоприводов)
 
    int x = analogRead(joy_pins[i]); // получение текущей позиции джойстика
 
    int new_ang = angs[i]; // чтение текущего угла поворота сервопривода
 
    if (x < 100) { // если значение джойстика меньше 100
      new_ang += 1; // увеличить угол на 1 градус
    } else if (x > 924) { // если значение джойстика больше 924
      new_ang -= 1; // уменьшить угол на 1 градус
    } else { // иначе
      continue; // считается что джойстик не двигался
    }
 
    if (i == 0) { // если это первый сервопривод (сам захват) 
      new_ang = constrain(new_ang, 80, 145); // то ограничить угол между 80 и 145 градусами
    } else { // иначе
      new_ang = constrain(new_ang, 0, 180); // ограничить между 0 и 180
    }
 
 
    if (new_ang != angs[i]) { // если новый угол отличается от старого
      angs[i] = new_ang; // зафиксировать новое значение
      Serial.print("New ang joy #"); // вывести отладочную информацию
      Serial.print(i); // вывести отладочную информацию
      Serial.print(" is "); // вывести отладочную информацию
      Serial.println(new_ang); // вывести отладочную информацию
      myservos[i].write(new_ang); // повернуть сервопривод на новый угол
    }    
  }  
}