- Робот-манипулятор на Arduino
- Общее описание проекта робота-манипулятора
- Основные узлы для проекта манипулятора
- Сборка механической части
- Схват манипулятора
- Добавление подсветки на манипулятор
- Электросхема
- Программирование и первый запуск
- Программа управления и пояснения к ней
- Скетч с использованием ультразвукового датчика расстояния
- Дешевый и полнофункциональный робот-манипулятор своими руками
- Конкурентные решения на рынке
- Что же нам нужно купить?
- Сборка
- Делаем 3D модель
- А что с реальной рукой?
- Как подвигать наш манипулятор?
Робот-манипулятор на Arduino
Создаем робот-манипулятор с использованием дальномера, реализуем подсветку.
Резать основание будем из акрила. В качестве двигателей используем сервопривода.
Общее описание проекта робота-манипулятора
В проекте использовано 6 серводвигателей. Для механической части использован акрил толщиной 2 миллиметра. В качестве штатива пригодилось основание от диско-шара (один из двигателей вмонтирован внутрь). Также использован ультразвуковой датчик расстояния и светодиод диаметром 10 мм.
Для управления роботом используется Arduino плата питания. Сам источник питания — блок питания компьютера.
В проекте изложены исчерпывающие пояснения по разработке робо-руки. Отдельно рассмотрены вопросы питания разработанной конструкции.
Основные узлы для проекта манипулятора
Давайте начнем разработку. Вам понадобятся:
- 6 серводвигателей (я использовал 2 модели mg946, 2 mg995, 2 futuba s3003 (mg995/mg946 по характеристикам лучше, чем futuba s3003, но последние намного дешевле);
- акрил толщиной 2 миллиметра (и небольшой кусок толщиной 4 мм);
- ультразвуковой датчик расстояния hc-sr04;
- светодиды 10 мм (цвет — на ваше усмотрение);
- штатив (используется в качестве основания);
- схват аллюминиевый (стоит около 10-15 долларов).
- Плата Arduino Uno (в проекте использована самодельная плата, которая полностью аналогична Arduino);
- плата питания (вам придется ее сделать самим, к этому вопросу мы вернемся позже, он требует отдельного внимания);
- блок питания (в данном случае используется блок питания компьютера);
- компьютер для программирования вашего манипулятора (если вы используете для программирования Arduino, значит, среда Arduino IDE)
Конечно же, вам пригодятся кабели и некоторые базовые инструменты вроде отверток и т.п. Теперь мы можем перейти к конструированию.
Сборка механической части
Перед началом разработки механической части манипулятора, стоит отметить, что чертежей у меня нет. Все узлы делались «на коленке». Но принцип очень простой. У вас есть два звена из акрила, между которыми надо установить серводвигатели. И другие два звенья. Тоже для установки двигателей. Ну и сам схват. Подобный схват проще всего купить в интеренете. Практически все устанавливается с помощью винтов.
Длина первой части около 19 см; второй — около 17.5; длина переднего звена около 5.5 см. Остальные габариты подбирайте в соответсвии с размерами вашего проекта. В принципе, размеры остальных узлов не так важны.
Механическая рука должна обеспечивать угол поворота 180 градусов в основании. Так что мы должны установить снизу серводвигатель. В данном случае он устанавливается в тот самый диско-шар. В вашем случае это может быть любой подходящий бокс. Робот устанавливается на этот серводвигатель. Можно, как это показано на рисунке, установить дополнительное металлическое кольцо-фланец. Можно обойтись и без него.
Для установки ультразвукового датчика, используется акрил толщиной 2 мм. Тут же снизу можно установить светодиод.
Детально объяснить как именно сконструировать подобный манипулятор сложно. Многое зависит от тех узлов и частей, которые есть у вас в наличии или вы приобретаете. Например, если габариты ваших сервоприводов отличаются, звенья арма из акрила тоже изменятся. Если изменятся габариты, калибровка манипулятора тоже будет отличаться.
Вам точно придется после завершения разработки механической части манипулятора удлинить кабели серводвигателей. Для этих целей в данном проекте использовались провода из интернет-кабеля. Для того, чтобы все это имело вид, не поленитесь и установите на свободные концы удлиненных кабелей переходники — мама или папа, в зависимости от выходов вашей платы Arduino, шилда или источника питания.
После сборки механической части, мы можем перейти к «мозгам» нашего манипулятора.
Схват манипулятора
Для установки схвата вам понадобится серводвигатель и несколько винтов.
Итак, что именно необходимо сделать.
Берете качалку от сервы и укорачиваете, пока она не подойдет к вашему схвату. После этого закручиваете два маленьких винта.
После установки сервы, проворачиваете ее в крайнее левое положение и сжимаете губки схвата.
Теперь можно установить серву на 4 болта. При этом следите, чтобы двигатель был все так же в крайнем левом положении, а губки схвата закрыты.
Можно подключить сервопривод к плате Arduino и проверить работоспособность схвата.
Учтите, что могут возникнуть проблемы с работой схвата, если болты/винты слишком сильно затянуты.
Добавление подсветки на манипулятор
Можно сделать ваш проект ярче, добавив на него подсветку. Для этого использовались светодиоды. Делается несложно, а в темноте выглядит очень эффектно.
Места для установки светодиодов зависят от вашего креатива и фантазии.
Электросхема
Можно использовать вместо резистора R1 потенциометр на 100 кОм для регулировки яркости вручную. В качестве сопротивлени R2 использовались резисторы на 118 Ом.
Перечень основных узлов, которые использовались:
- R1 — резистор на 100 кОм
- R2 — резистор на 118 Ом
- Транзистор bc547
- Фоторезистор
- 7 светодиодов
- Переключатель
- Подключение к плате Arduino
В качестве микроконтроллера использовалась плата Arduino. В качестве питания использовался блок питания от персонального компьютера. Подключив мультиметр к красному и черному кабелям, вы увидите 5 вольт (которые используются для серводвигателей и ультразвукового датчика расстояния). Желтый и черный дадут вам 12 вольт (для Arduino). Делаем 5 коннекторов для сервомоторов, параллельно подключаем позитивные к 5 В, а негативные — к земле. Аналогично с датчиком расстояния.
После этого подключите оставшиеся коннекторы (по одному с каждой сервы и два с дальномера) к распаянной нами плате и Arduino. При этом не забудьте в программе в дальнейшем корректно указать пины, которые вы использовали.
Кроме того, на плате питания был установлен светодиод-индикатор питания. Реализуется это несложно. Дополнительно использовался резистор на 100 Ом между 5 В и землей.
10 миллиметровый светодиод на роботе тоже подключен к Arduino. Резистор на 100 Ом идет от 13 пина к к позитивной ноге светодиода. Негативный — к земле. В программе его можно отключить.
Для 6 серводвигателей использовано 6 коннекторов, так как 2 серводвигателя снизу используют одинаковый сигнал управления. Соответствующие проводники соединяются и подключаются к одному пину.
Повторюсь, что в качестве питания используется блок питания от персонального компьютера. Либо, конечно, вы можете приобрести отдельный источник питания. Но с учетом, того, что у нас 6 приводов, каждый из которых может потреблять около 2 А, подобный мощный блок питания обойдется недешево.
Обратите внимание, что коннекторы от серв подключаются к ШИМ-выходам Arduino. Возле каждого такого пина на плате есть условное обозначение
. Ультразвуковой датчик расттояния можно подключить к пинам 6, 7. Светодиод — к 13 пину и земле. Это все пины, которые нам понадобятся.
Теперь мы можем перейти к программированию Arduino.
Перед тем как подключить плату через usb к компьютеру, убедитесь, что вы отключили питание. Когда будете тестировать программу, также отключайте питание вашей робо-руки. Если питание не выключить, Arduino получит 5 вольт от usb и 12 вольт от блока питания. Соответственно, мощность от usb перекинется к источнику питания и он немного «просядет».
На схеме подключения видно, что были добавлены потенциометры для управления сервами. Потенциометры не являются обязательным звеном, но приведенный код не будет работать без них. Потенциометры можно подключить к пинам 0,1,2,3 и 4.
Программирование и первый запуск
Для управления использовано 5 потенциометров (вполне можно заменить это на 1 потенциометр и два джойстика). Схема подключения с потенциометрами приведена в предыдущей части. Скетч для Arduino находится здесь.
Снизу представлены несколько видео робота-манипулятора в работе. Надеюсь, вам понравится.
На видео сверху представлены последние модификации арма. Пришлось немного изменить конструкцию и заменить несколько деталей. Оказалось, что сервы futuba s3003 слабоваты. Их получилось использовать только для схвата или поворота руки. Так что виесто них были установлены mg995. Ну а mg946 вообще будут отличным вариантом.
Программа управления и пояснения к ней
// управляются привода с помощью переменных резисторов — потенциометров.
int potpin = 0; // аналоговый пин для подключения потенциометра
int val; // переменная для считывания данных с аналогового пина
val = analogRead(potpin); // считывает значение потенциометра (значение между 0 и 1023)
val = map(val, 0, 1023, 0, 179); // масштабирует полученное значение для использования с сервами (получаем значение в диапазоне от 0 до 180)
myservo1.write(val); // выводит серву в позицию в соответствии с рассчитанным значением
delay(15); // ждет, пока серводвигатель выйдет в заданное положение
val = analogRead(potpin1); // серва 2 на аналоговом пине 1
val = map(val, 0, 1023, 0, 179);
val = analogRead(potpin2); // серва 3 на аналоговом пине 2
val = map(val, 0, 1023, 0, 179);
val = analogRead(potpin3); // серва 4 на аналоговом пине 3
val = map(val, 0, 1023, 0, 179);
val = analogRead(potpin4); //серва 5 на аналоговом пине 4
val = map(val, 0, 1023, 0, 179);
Скетч с использованием ультразвукового датчика расстояния
Это, наверное, одна из самых эффектных частей проекта. На манипулятор устанавливается датчик расстояния, который реагирует на препятствия вокруг.
Основные пояснения к коду представлены ниже
#define trigPin 7
#define echoPin 6
Мы добавили в наш код серводвигатели, светодиод и датчик расстояния. Здесь изменять ничего не надо.
Следующий кусок кода:
Мы присвоили всем 5-ти сигналам (для 6 приводов) названия (могут быть любыми)
Источник
Дешевый и полнофункциональный робот-манипулятор своими руками
Сразу оговоримся, что совсем дешево делать не будем, т.к. не хочется убивать нервные клетки, делая доморощенные энкодеры для моторчиков + хочется упростить создание 3D модели, которая нужна для управления через ROS (ссылка на готовую модель – ниже в статье).
На момент написания статьи ориентировочная конечная стоимость изделия составляет
70 000 руб. Если у вас есть 3D принтер, то можно смело вычесть из нее 20 000 руб. Если принтера нет, то его появление станет приятным бонусом. Все расходы я буду описывать исходя из того, что у нас нет ничего, кроме денег.
Как выглядит результат:
Также нужно отметить, что для программирования руки нам понадобится компьютер с установленными ОС Linux (я использую Ubuntu 18.04) и фреймворком ROS (я использую Melodic).
Может возникнуть вопрос «почему 70К рублей – это дешево?»
Отвечаю. Изначально я не хотел заморачиваться с созданием роборуки и думал просто купить что-нибудь простенькое, но достаточно функциональное в сборе.
Что являлось для меня критериями функциональности и минимальной допустимой простотой (т.е. почему НЕ подойдут манипуляторы с алиэкспресса) – можно обсудить в комментариях, чтобы не грузить тех, кому это очевидно и/или не интересно.
Конкурентные решения на рынке
Опишу, однако, кратко примеры того, что я рассматривал на рынке:
1) top3dshop.ru/robots/manipulators/dobot-magician-basic.html
176 000 руб. DOBOT можно купить не только в этом магазине, но обычно он стоит еще больше. Наверняка есть шанс найти его где-нибудь дешевле, но все равно это будет сильно дороже, чем 70 000 руб.
2) robotbaza.ru/product/robot-manipulyator-widowx-robotic-arm-mark-ii
280 000 руб. Еще дороже. Вообще, манипуляторы от TossenRobotics прямо у производителя стоят супервменяемых денег. Вот только доставку в Россию (а я-то именно тут) из их магазина не заказать.
Забегая немного вперед скажу, что делать мы будем копию робо-руки PhantomX Pincher Robot Arm Kit Mark II, которая производится именно компанией TossenRobotics.
Итого, видим, что 70 000 руб – это совсем не так дорого.
Что же нам нужно купить?
Все цены привожу на момент написания статьи (июль 2020 года):
1) 6 моторчиков DYNAMIXEL AX-12A
Я покупал по цене 7200 руб за 1 штуку, но, кажется, можно найти и за 6000 при большом желании. Будем считать, что вам не повезет и вы тоже купите за 7200.
Суммарная стоимость: 43 200 руб
Подойдет любой простенький, можно уложиться в 20 000 руб.
3) Arduino Uno + Power Shield
4) Опционально (но я очень рекомендую): Лабораторный источник питания
Сборка
Отлично! Мы закупили все, что нам нужно (вероятно, дольше всего ждали доставки моторчиков, мне их везли больше месяца).
1) Напечатаем детали для манипулятора на 3D принтере.
Качаем STL файлы отсюда
2) Собираем воедино с моторчиками. Проблем со сборкой быть не должно, но если они вдруг появятся, можно воспользоваться вот этой инструкцией
Делаем 3D модель
Класс! Рука у нас есть, но ведь ей же нужно как-то управлять. Хочется максимально использовать достижения человечества, поэтому установим себе ROS.
Для того, чтобы полноценно работать с манипулятором в ROS – нужно сделать его URDF модель. Она будет нам необходима для того, чтобы управлять робо-рукой с помощью пакета MoveIT!
На момент написания статьи последняя стабильная сборка доступна для Melodic/Ubuntu 18.04, чем и объясняется мой выбор версии системы и фреймворка в начале статьи.
Построение URDF модели – довольно трудоемкая (и, на мой взгляд, самая скучная) часть данного проекта. Нужно немного допилить напильником stl модели компонентов и соединить их воедино в XML-образном файле, вручную подбирая правильные коэффициенты смещения деталей друг относительно друга.
Кто хочет – может проделать работу самостоятельно, всем остальным поберегу нервы и просто дам ссылку на свой готовый файл:
В данной модели пока нет захватывающего устройства, однако, до того момента, чтобы захватывать предметы в реальном мире нам еще далеко. Для остальных задач этой модели более чем достаточно.
Выглядит модель вот так:
Из полученного URDF файла мы сделаем конфиг MoveIT!, который позволит нам моделировать движения манипулятора и отправлять управляющие команды на реальную робо-руку.
Для создания конфига есть отличный туториал (ссылка)
Тут я могу опять сэкономить время и предоставить свой конфиг. Лежит он вот тут:
Можно скачать конфиг с гитхаба и запустить следующей командой:
Примерно так можно будет управлять нашей реальной робо-рукой через rviz, когда мы подключим ее к ROS:
А что с реальной рукой?
Переместимся из мира 3D моделей в суровую реальность. У нас есть собранный ранее манипулятор. Хотелось бы его как-то подвигать. Сделаем это с помощью Arduino UNO и Power Shield.
Подключим первый моторчик манипулятора (который снизу) к Power Shield’у и блоку питания следующим образом:
Да, data pin моторчика мы соединим сразу с 3 и 4 выводом Arduino. Пытливый читатель мануала Dynamixel (вот он) сразу заметит, что связь с внешним миром у моторчика организована по Half Duplex Asynchronous Serial Communication, а это означает, что data pin используется сразу и для получения команд и для ответа.
По умолчанию, на аппаратном уровне Arduino умеет работать только с Full Duplex UART. Эту проблему можно обойти, используя Soft Serial библиотеку, что мы и сделаем. Именно использование Half Duplex режима объясняет подключение data pin мотора к 3 и 4 выводам шилда одновременно.
Помимо полудуплексного обмена работа с Dynamixel через Arduino имеет еще пару занимательных моментов, которые могут быть не совсем очевидны с самого начала. Сведем их все воедино.
Как подвигать наш манипулятор?
1) Сначала скачаем нужную библиотеку. Она называется ardyno и ее можно получить через Arduino Library Manager, либо тут (ссылка)
2) По умолчанию Dynamixel AX-12A хотят работать с baud rate = 1000000. Однако Software Serial Interface не потянет такую скорость, поэтому baud rate стоит снизить до 57600. Таким образом, начало файла с вашей программой будет выглядеть примерно вот так:
3) Все наши моторчики соединены друг с другом последовательно. Значит, чтобы обращаться к каждому из них — нужно знать его ID? Это действительно так, объект DynamixelMotor при инициализации получает два параметра: interface (одинаков для всех, его мы задали в предыдущем пункте) и id (должен быть у всех разный, иначе поведение будет у манипулятора весьма странное)
Id каждому моторчику придется задать вручную. Кажется, что будучи соединенными последовательно, они могли бы и сами рассчитаться по номерам от 1 до 6, но этого не предусмотрено. Поэтому нужно каждый моторчик отдельно подключить к Arduino (отключив от остальных) и выполнить следующую программу:
Изначально все моторчики имеют именно поэтому мы и указываем вверху
NEW_ID для каждого моторчика нужно заменить на число от 1 до 6 (да, ок, первый моторчик можно не трогать). Нумеруем их в порядке от нижнего к верхнему.
Ура! у нас есть полноценный манипулятор, который мы можем двигать, а также имеется 3D модель к нему. Можно брать ROS и программировать любые крутые штуки. Но это уже рассказ для отдельной статьи (и не одной). Данное же повествование подошло к концу, спасибо за внимание!
Источник