3D роботизированная рука на Arduino с записью и воспроизведением действий


Роботизированные руки с каждым годом находят все большее применение в жизни современного общества, особенно в тех приложениях, в которых требуется скорость, точность и безопасность действий. Их можно не только увидеть в современных кинофильмах, например, в серии фильмов "Железный человек", но их еще в большом количестве и ассортименте производят такие компании как Fanuc, Kuka, Denso, ABB, Yaskawa и т.д. Эти роботизированные руки используются на производственных линиях по сборке автомобилей, горнодобывающей промышленности, химических заводах и т.п.

Внешний вид 3D роботизированной руки на Arduino

В этой статье мы рассмотрим создание роботизированной руки (Robotic Arm) с помощью платы Arduino и сервомоторов MG995. Эта роботизированная рука будет иметь 4 степени свободы (без учета захвата) и управляться с помощью потенциометров. Кроме этого, мы также сможем записывать и в дальнейшем воспроизводить все движения руки – именно так во многих случаях и программируются роботизированные руки для работы на реальных производствах.

Необходимые компоненты

  1. Плата Arduino Nano (купить на AliExpress).
  2. Сервомотор MG-995 (5 шт.) (купить на AliExpress).
  3. Потенциометр (5 шт.) (купить на AliExpress).
  4. Перфорированная плата.
  5. Скелет роботизированной руки и крепления.

Примечание: скелет данной роботизированной руки полностью напечатан на 3D принтере. Если у вас есть доступ к 3D принтеру, то вы можете самостоятельно напечатать все части этой руки на нем по приведенным ниже файлам. Если у вас нет доступа к 3D принтеру, то вы можете изготовить скелет этой руки из акрилового волокна или дерева. В простейшем случае вы можете изготовить скелет этой руки из обычных листов картона, как сделано в простейшей роботизированной руке на основе платы Arduino.

3D печать и сборка роботизированной руки

Вначале мы пытались разработать дизайн этой руки самостоятельно, но потом обнаружили что на сервисе Thingiverse есть достаточно много потрясающих дизайнов подобных роботизированных рук и решили "не изобретать заново велосипед". Мы обнаружили, что роботизированная рука Robotic Arm V2.0 by Ashing будет прекрасно работать с сервомоторами MG995, поэтому она отлично подходит для нашего проекта.

Поэтому перейдите по приведенной ссылке на Thingiverse и скачайте там файлы модели этой руки. Всего рука содержит 14 компонентов для 3D печати, STL файлы для всех из них можно скачать по приведенной ссылке. Мы использовали программное обеспечение Cura 3.2.1 от Ultimaker для обработки STL файлов и 3D принтер TEVO tarantula для печати компонентов руки.

Настройки печати для роботизированной руки

Дизайн всех компонентов этой руки достаточно прост, поэтому его можно напечатать практически на любом 3D принтере. У нас на печать всех компонентов руки ушло примерно 4,5 часа. Инструкция по сборке руки приведена на этой странице, поэтому в нашей статье не будем останавливаться на ней подробно.

Напечатанные компоненты роботизированной руки

Единственный момент, на который нам бы хотелось обратить внимание – возможно вам придется вручную подровнять (подшлифовать) края некоторых компонентов чтобы "втиснуть" туда сервомотор - обычно крепления для сервомоторов проектируются с таким расчетом, чтобы запихивать в них сервомоторы приходилось с некоторым усилием, так они будут лучше держаться. Вам понадобится 20 болтов диаметром 3 мм для сборки компонентов этой роботизированной руки.

Перед тем как окончательно закрутить болты удостоверьтесь в том, что сервомоторам ничего не мешает вращаться в необходимых направлениях. Провода к трем сервомоторам вам придется тянуть снаружи конструкции руки, при необходимости удлинить эти провода можно использовать соединители папа-мама. Удостоверьтесь в том, что при работе руки эти провода не будут перекручиваться или каким либо другим образом мешать работе руки. После сборки у нас получилась рука следующего вида:

Собранная роботизированная рука

Работа схемы

Схема роботизированной руки на Arduino представлена на следующем рисунке.

Схема роботизированной руки на Arduino

Поскольку сервомоторы MG995 работают от питающего напряжения 5V, то их можно запитать от соответствующего разъема платы Arduino. Управляющие контакты сервомоторов подключены к цифровым контактам платы Arduino, на которых возможно формирование сигналов ШИМ (широтно-импульсной модуляции). Потенциометры подключены к аналоговым контактам платы Arduino для управления сервомоторами.

В любой момент времени у нас будет двигаться только один сервомотор, поэтому потребляемый ток не превысит 150 мА, в связи с чем регулятор питания платы Arduino без проблем выдержит такую нагрузку. Сама плата Arduino в нашем проекте запитывалась через USB кабель от компьютера.

После пайки и сборки компонентов на перфорированной плате у нас получилась конструкция, показанная на следующем рисунке. Дополнительно в конструкцию проекта мы добавили разъем для подключения батарейки если в дальнейшем потребуется питание от нее.

Собранная на перфорированной плате схема управления роботизированной рукой

Если вы раньше не сталкивались с сервомоторами рекомендуем прочитать статью про подключение сервомотора к плате Arduino.

Объяснение программы для Arduino

В программе мы должны предусмотреть возможность записи движений пользователя по вращению ручек потенциометров и их воспроизведения когда это потребуется. Поэтому в программе нам необходимо два режима – режим записи (Record mode) и режим воспроизведения (Play mode). Пользователь сможет переключаться между этими двумя режимами с помощью монитора последовательной связи (serial monitor). Полный текст программы приведен в конце данной статьи, здесь же мы рассмотрим его наиболее важные фрагменты.

Как обычно, программу начнем с подключения необходимых заголовочных файлов. Мы будем использовать библиотеку Servo.h для управления сервомоторами. У нас 5 сервомоторов в проекте, поэтому каждому из них необходимо дать уникальное имя. Также мы инициализируем переменные, которые затем будем использовать в программе. Мы сделали все переменные глобальными – но вы самостоятельно можете оптимизировать эту часть программы если захотите. Также мы инициализировали массив saved_data, в который мы будем записывать движения руки.

Внутри функции void setup мы инициализируем последовательную связь со скоростью 9600 бод/с. Также мы укажем плате Arduino к каким ее контактам подключены сервомоторы – в нашем случае это контакты 3,5,6,9 и 10. Также в функции setup поскольку она запускается при подаче питания на плату Arduino мы зададим начальное положение руки с помощью поворотов осей сервомоторов на заданные углы. Также в функции setup мы выведем в окно монитора последовательной связи сообщение с просьбой нажать клавишу R или P чтобы потом мы могли выполнить заданное действие (запись или воспроизведение).

Также мы запрограммируем функцию Read_POT, которая будет считывать аналоговые значения с выходов всех потенциометров и преобразовывать их в значения для позиций сервомоторов. Как мы знаем, значения на выходе АЦП (аналогово-цифровой преобразователь) платы Arduino могут изменяться в диапазоне 0-1023, а позиция осей сервомоторов может изменяться только в диапазоне 0-180. Поскольку сервомоторы у нас бюджетные и потому не очень точные, то в целях безопасности целесообразно сузить диапазон их используемых углов поворота с 0-180 до 0-170. Поэтому мы будем использовать функцию map чтобы конвертировать диапазон 0-1023 в диапазон 10-170 для всех наших 5 сервомоторов.

Код для режима записи

В режиме записи мы должны записывать все движения руки – то есть позицию и номер каждого сервомотора. Эти данные мы будем записывать в массив saved_data.

При работе с сервомоторами существует такая проблема как их дрожание/колебание (jitter) во время их работы. Для решения этой проблемы существует множество способов. Но первоначально вы должны определить из-за чего именно возникает эта проблема – из-за схемы управления сервомотором или из-за неточности значения позиции, которая записывается в сервомотор. В нашем случае мы использовали монитор последовательной связи и обнаружили что значение позиции сервомотора не является постоянным и иногда колеблется/изменяется случайным образом.

Таким образом, мы запрограммировали плату Arduino таким образом, чтобы считывать значения с выходов потенциометров дважды и затем сравнивать их между собой. Значение признается истинным (правильным) только тогда когда оба значения совпадают, иначе значение игнорируется. И этот прием решил проблему колебания/джиттера сервомоторов в нашем случае. Также убедитесь в том, что потенциометры надежно (крепко) подсоединены к аналоговым контактам платы Arduino (в нашем случае они припаяны). Любое не очень надежное соединение может приводить к джиттеру. Переменная P_x_pos используется для сохранения старых значений потенциометров, а новые значения потенциометров считываются и преобразуются в заданный диапазон с помощью ранее описанной функции Read_POT.

Теперь, мы должны устанавливать позицию сервомотора если значение истинно. После этого мы еще должны сохранить номер сервомотора и его позицию в массив. Можно было бы, конечно, использовать два массива для раздельного хранения номера сервомотора и его позиции, но в целях экономии памяти и уменьшения сложности программы мы решили использовать один массив при помощи добавления разделителя к позиции перед сохранением ее в массиве.

Число разделитель в массиве для нулевого сервомотора (Servo_0)  у нас будет 0, для Servo_1 – 1000 и т.д. для Servo_3 – 3000, а для захвата (Gripper) – 4000. Фрагмент кода, в котором в массив записываются наши данные с добавлением разделителя, выглядит следующим образом:

Код для режима воспроизведения

Когда у нас все движения сервомоторов уже записаны в массиве saved_data мы можем переключиться в режим воспроизведения этих действий при помощи ввода символа ‘P” в окне монитора последовательной связи. В режиме воспроизведения у нас есть доступ к каждому элементу этого массива и, зная известные нам разделители, мы можем разделить значения этого массива чтобы извлечь из них номер мотора и его позицию.

Мы будем использовать цикл for для навигации по элементам массива. Затем в две переменные с именами action_servo и action_pos мы будем записывать номер сервомотора и его позицию соответственно. Чтобы определить номер сервомотора мы будем делить значение из массива на 1000, а позиция сервомотора будет извлекаться из трех последних цифр этого числа (значения из массива).

К примеру, если в массиве сохранено значение 3125, то это будет означать, что 3-й сервомотор необходимо повернуть в позицию 125.

После этого все, что остается сделать, это повернуть нужный сервомотор на заданную позицию. Для выполнения этих операций мы использовали оператор выбора switch case.

Основная функция loop

Внутри основной функции программы loop нам необходимо всего лишь проверять что пользователь ввел в окне монитора последовательной связи и, соответственно, запускать на выполнение режим записи или режим воспроизведения. Если пользователь нажал ‘R’ – активируется режим записи, а если ‘P’ – режим воспроизведения.

Тестирование работы роботизированной руки

Сделайте все соединения, которые показаны на выше приведенной схеме, и загрузите программу в плату Arduino. Подайте питание на плату Arduino Nano через порт USB с вашего компьютера и откройте окно монитора последовательной связи – в нем вы увидите приветственное сообщение.

Приветственное сообщение в окне монитора последовательной связи

Теперь введите R в окне монитора последовательной связи и нажмите ввод. Внизу монитора последовательной связи должна быть установлена опция Newline. Пример работы программы в этом режиме показан на следующем рисунке:

Пример работы проекта в режиме записи

Информация, показанная на этом рисунке, может быть использована для отладки. Цифры, начинающиеся с 69, это текущая позиция сервомоторов с 0-го до 5-го. Значения индекса – это размер массива. Помните, что максимальный размер массива ограничен 700 числами, поэтому старайтесь не превышать этот размер. После того как вы завершите запись нажмите P и ввод в окне монитора последовательной связи и программа переключится в режим воспроизведения и на экране тогда появится примерно следующая картина:

Пример работы проекта в режиме воспроизведения

Во время режима воспроизведения роботизированная рука будет повторять те же самые движения, которые она совершала в режиме записи. Эти движения она будет выполнять снова и снова до тех пор пока вы не прервете ее работу из окна монитора последовательной связи.

Исходный код программы (скетча)

Код программы достаточно подробно объяснен выше в статье, поэтому, я надеюсь, вы без особо труда разберетесь в нем и при необходимости измените его по своему желанию. Перевод комментариев к коду программы также представлен в предыдущем разделе статьи, здесь второй раз решил не переводить.

Видео, демонстрирующее работу роботизированной руки

(1 голосов, оценка: 5,00 из 5)
Загрузка...
10 462 просмотров

Комментарии

3D роботизированная рука на Arduino с записью и воспроизведением действий — 23 комментария

  1. И серводвигатель MG 995 при пиковой нагрузке потребляет больше одного ампера. Я бы посоветовал подключать их от отдельного источника питания.

    • Да, это верно. В большинстве других аналогичных проектов на нашем сайте эти серводвигатели запитаны от отдельного источника питания

  2. Переменные :C_S0_pos, C_S1_pos, C_S2_pos, C_S3_pos, C_G_pos; что делают в этом коде? По моему это ошибка. В коде поменять C_S0_pos на P_S0_pos. и далее по списку. И по-моему тогда все должно заработать

    • Переменные C_S0_pos, C_S1_pos, C_S2_pos, C_S3_pos, C_G_pos хранят предыдущие значения потенциометров. Мы изменяем положение конкретного сервомотора только если изменилось положение соответствующего ему потенциометра. Поэтому в этом плане не вижу никакой ошибки в коде

  3. Здравствуйте а у вас сервопривод на основании поворачивается только на 180 градусов или 360?

    • Добрый вечер. Они все однотипные и поворачиваются только на 180 градусов.

  4. Отличный сайт.Много интересного.Хотелось бы увидеть серворук с шестью а то и семью моторами. с оптимизированным кодом. Кто сможет написать код для такого?

    • А что вы понимаете под оптимизированным кодом? Чем вас не устраивает код в данном проекте?

  5. Здравствуйте, можно фото платы с обратной стороны. Не до конца понял как всё соединять

    • Добрый вечер. К сожалению, фото платы с обратной стороны у меня нет поскольку эта статья является переводом с иностранного сайта. Но на схеме вроде бы подробно все показано что куда соединять, что конкретно вам непонятно?

      • У меня почему-то не работает один сервопривод подключенный к порту D3, а остальные начинают крутиться при подаче напряжения. Вот я и думаю что навряд-ли ошибка в коде

        • Ну а вы попробуйте подключить не сразу все сервоприводы, а подключайте их по одному и проверяйте работают они или нет. Можно даже попробовать подключать один и тот же сервопривод к разным контактам платы. Код ведь легко изменить для управления одним сервоприводом. Так вы быстро найдете причину в чем у вас неисправность - в сервоприводах, контактах платы или коде.

            • Именно такой эффект, как вы описали, вряд ли возможен при смене серводвигателей с MG 995 на SG 90, но все таки SG 90 - это одни из самых дешевых серводвигателей на рынке и поэтому у них качество компонентов, конечно, похуже, чем у более дорогих моделей. И на работу этих серводвигателей в некоторых проектах все же есть определенные жалобы. Не сказать, конечно, что сильно плохие серводвигатели, но определенные недостатки у них, конечно, есть

        • Добрый день! У меня такая же проблема. я так и не смог решить ее. Скажите у Вас получилось? Если решили подскажите ответ, пожалуйста!

          • Добрый вечер. Какая у вас проблема? Не работает только один сервопривод, подключенный к порту D3?

            • Добрый день. Происходит следующее: включается одновременно четыре сервомотора и вращаются без остановки не реагируют на потенциометры. В мониторе последовательной связи идет постоянная запись пока не отключишь питание.

              От админа: а попробуйте из функции void loop() весь код удалить, чтобы выполнилась только часть кода из функции void setup (). Что при этом у вас будет происходить?

  6. Здравствуйте! Собрал подобную руку, управляется также с потенциометров. Меня напрягает один момент, когда серво упирается в конструкцию, а на потенциометре еще запас хода и его выкручиваешь до конца, начинают хаотично дергаться все (их 4) сервоприводы. Скажите так и должно быть? Скетч самый простой наверно, через val (0, 1023, 0, 180)

    • Добрый вечер. Да, проблема дрожания сервоприводов может наблюдаться и с ней желательно бороться. Но в представленной здесь статье ведь описан способ борьбы с этой проблемой - считывать значения с выходов потенциометров дважды и затем сравнивать их между собой. Значение признается истинным (правильным) только тогда когда оба значения совпадают, иначе значение игнорируется

  7. Здравствуйте! Подскажите, что за элементы размещены на макетке помимо потенциометров и платы? Это конденсатор? Имеет ли он отношение к руке, или никуда не подключен?
    И большое спасибо за статью!)

    • Добрый вечер. Анна, это коннекторы (разъемы), к которым подключаются провода от серводвигателей

  8. Задолбала проклятая быдло - петушиная реклама!!!
    Для чего вообще вставлять эту поганую дрянь между тех. описанием проекта?
    Это сильно отвлекает и раздражает!!!
    Кому вообще интересно просматривать эту херню?
    Не вставляйте пожалуйста больше эту глупую рекламу в промежутках между теста!

    • Олег, на такую достаточно длинную статью я насчитал всего 3 рекламных блока в тексте статьи - по сегодняшним меркам это достаточно мало. И при этом на моем сайте нет никакой назойливой рекламы - всплывающих блоков по центру или в углах, которые нужно принудительно закрывать чтобы получить доступ к контенту. Реклама контекстная, подстраивается под интересы конкретного пользователя, то есть если содержание рекламы вам очень неприятно - значит до захода на мой сайт вы ходили по "неприятным" сайтам, здесь я уже ничего не могу изменить.
      При этом весь контент на моем сайте полностью бесплатен - я не прошу никаких денег за то, к примеру, чтобы получить доступ к коду программы как это делают на некоторых других похожих сайтах. Я развиваю сайт только на доходы от рекламы и большинство сайтов поступают точно также. Не будет рекламы - и количество полезного контента в сети интернет снизится в разы.
      Наверное, вы зашли на сайт в плохом настроении, поэтому так резко высказались. Хотел бы пожелать вам в будущем более хорошего настроения

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *