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

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

Для работы с манипулятором подойдут сервоприводы стандартного типоразмера 54х20 мм с 4 посадочными отверстиями 50х10 мм. К таковым относятся [[https://smartelements.ru/collection/motory-dravery-shassi/product/servoprivod-towerpro-mg995|MG995]], [[https://smartelements.ru/collection/motory-dravery-shassi/product/servoprivod-towerpro-mg996r|MG996R]], [[https://smartelements.ru/collection/motory-dravery-shassi/product/servoprivod-s3003|S3003]], [[https://smartelements.ru/collection/motory-dravery-shassi/product/servoprivod-ds04-nfc-360|DS04-NFC 360]], [[https://smartelements.ru/collection/motory-dravery-shassi/product/servoprivod-td8120mg|TD8120]] и многие другие. Подбор сервоприводов должен осуществляться на основе необходимых требований к грузоподъемности, причем чем больше рабочее плечо, тем мощнее должен быть сервопривод. Например, для работы захвата может быть использован менее мощный сервопривод, а для его наклона потребуется наоборот более мощный, поскольку рабочее плечо уже будет больше.

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

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

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

<WRAP center round important 80%>
Обратите внимание, что при использовании мощных сервоприводов потребуется внешнее питание - подключать все сервоприводы напрямую к контроллеру небезопасно. Требуемая мощность источника тока определяется на основе выбранных вами сервоприводов.
</WRAP>

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

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

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

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

Для примера понадобится:
^ Что нужно                                                                     ^ Количество  ^
| [[https://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер]]  | 1           |
| [[https://smartelements.ru/collection/shildy/product/sensor-shield|Sensor shield]]  | 1           |
| [[|Манипулятор 2 DOF]]  | 1           |
| [[https://smartelements.ru/collection/motory-dravery-shassi/product/servoprivod-td8120mg|Сервопривод TD8120MG]]  | 2           |

<file Arduino>
#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); // повернуть сервопривод на полученное значение
  }  
  
}
</file>

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

==== Пример №2 ====

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

Для примера понадобится:
^ Что нужно                                                                     ^ Количество  ^
| [[https://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер]]  | 1           |
| [[https://smartelements.ru/collection/shildy/product/sensor-shield|Sensor shield]]  | 1           |
| [[|Манипулятор 2 DOF]]  | 1           |
| [[https://smartelements.ru/collection/motory-dravery-shassi/product/servoprivod-td8120mg|Сервопривод TD8120MG]]  | 2           |

<file Arduino>
#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); // повернуть сервопривод на новый угол
    }    
  }  
}
</file>