Манипулятор с захватом 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
Описание: В примере управление сервоприводами манипулятора производится с помощью модуля джойстика. Каждое изменение положения джойстика, влияет на поворот сервопривода.
Для примера понадобится:
Что нужно | Количество |
---|---|
Контроллер | 1 |
Sensor shield | 1 |
Манипулятор 2 DOF | 1 |
Сервопривод TD8120MG | 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}; // выводы подключения джойстика 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
Описание: В примере управление сервоприводами манипулятора производится с помощью модуля джойстика. Каждое изменение положения джойстика, влияет на поворот сервопривода, но при этом одно сервопривод фиксируется в определённом положении. Каждое движение джойстика, поворачивает сервопривод на ту или иную позицию.
Для примера понадобится:
Что нужно | Количество |
---|---|
Контроллер | 1 |
Sensor shield | 1 |
Манипулятор 2 DOF | 1 |
Сервопривод TD8120MG | 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); // повернуть сервопривод на новый угол } } }