Привет, гиктаймс!

Хочу поделиться с вами результатами реверс-инжиниринга uArm – простого настольно манипулятора из оргстекла на сервоприводах.

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

Сейчас моя робо-рука выглядит так:



Работая не спеша за два года я успел сделать четыре версии и получил достаточно много опыта. Описание, историю проекта и все файлы проекта вы сможете найти под катом.

Пробы и ошибки


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

С такими входными параметрами я нарисовал первую версию. К сожалению, у меня не сохранилось фотографий той версии манипулятора (который был выполнен в желтом цвете). Ошибки в ней были просто эпичнейшие. Во-первых, ее было почти невозможно собрать. Как правило, механика которую я рисовал до манипулятора, была достаточно простая, и мне не приходилось задумываться о процессе сборки. Но все-таки я его собрал и попробовал запустить, И рука почти не двигалась! Все детли крутились вокруг винтов и, сли я затягивал их так, чтобы было меньше люфтов, она не могла двигаться. Если ослаблял так, чтобы она могла двигаться, появлялись невероятные люфты. В итоге концепт не прожил и трех дней. И приступил к работе над второй версией манипулятора.



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



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



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



Меня удручает то, что я не смог привнести ничего принципиально нового в проект uArm. К тому времени, как я начал рисовать финальную версию, они уже выкатили 3D-модели на GrabCad. В итоге я только немного упростил клешню, подготовил файлы в удобном формате и применил очень простые и стандартные комплектующие.

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


До появления uArm, настольные манипуляторы подобного класса выглядели достаточно уныло. У них либо не было электроники вообще, либо было какое-нибудь управление с резисторами, либо было свое проприетарное ПО. Во-вторых, они как правило не имели системы параллельных шарниров и сам захват менял свое положение в процессе работы. Если собрать все достоинства моего манипулятора, то получается достаточно длинный список:
  1. Система тяг, позволяющих разместить мощные я тяжелые двигатели в основании манипулятора, а также удерживающие захват параллельно или перпендикулярно основанию
  2. Простой набор комплектующих, которые легко купить или вырезать из оргстекла
  3. Подшипники почти во всех узлах манипулятора
  4. Простота сборки. Это оказалось действительно сложной задачей. Особенно трудно было продумать процесс сборки основания
  5. Положение захвата можно менять на 90 градусов
  6. Открытые исходники и документация. Все подготовлено в доступных форматах. Я дам ссылки для скачивания на 3D-модели, файлы для резки, список материалов, электронику и софт
  7. Arduino-совместимость. Есть много противников Arduino, но я считаю, что это возможность расширения аудитории. Профессионалы вполне могут написать свой софт на C — это же обычный контроллер от Atmel!

Механика


Для сборки необходимо вырезать детали из оргстекла толщиной 5мм:



… и 3мм:



С меня за резку всех этих деталей взяли около $10.

Основание монтируется на большом подшипнике:



Особенно трудно было продумать основание с точки зрения процесса сборки, но я подглядывал за инженерами из uArm. Качалки сидят на штифте диаметром 6мм. Надо отметить, что тяга локтя у меня держится на П-образном держателе, а у uFactory на Г-образном. Трудно объяснить в чем разница, но я считаю у меня получилось лучше.



Захват собирается отдельно. Он может поворачиваться вокруг своей оси. Сама клешня сидит прямо на валу двигателя:



В конце статьи я дам ссылку на суперподробную инструкцию по сборке в фотографиях. За пару часов можно уверенно все это скрутить, если все необходимое есть под рукой. Также я подготовил 3D-модель в бесплатной программе SketchUp. Её можно скачать, покрутить и посмотреть что и как собрано.





Электроника


Чтобы заставить руку работать достаточно всего навсего подключить пять сервоприводов к Arduino и подать на них питание с хорошего источника. У uArm использованы какие-то двигатели с обратной связью. Я поставил три обычных двигателя MG995 и два маленьких двигателя с металлическим редуктором для управления захватом.

Тут мое повествование тесно сплетается с предыдущими проектами. С некоторых пор я начал преподавать программирование Arduino и для этих целей даже подготовил свою Arduino-совместимую плату. С другой стороны как-то раз мне подвернулась возможность дешево изготовить платы (о чем я тоже писал). В итоге все это закончилось тем, что я использовал для управления манипулятором свою собственную Arduino-совместимую плату и специализированный шилд.



Этот шилд на самом деле очень простой. На нем четыре переменных резистора, две кнопки, пять разъемов для сервопривода и разъем питания. Это очень удобно с точки зрения отладки. Можно загрузить тестовый скетч и записать какой-нибудь макрос для управления или что-нибудь вроде того. Ссылку для скачивания файла платы я тоже дам в конце статьи, но она подготовлена для изготовления с металлизацией отверстий, так что мало пригодна для домашнего производства.



Программирование


Самое интересное, это управление манипулятором с компьютера. У uArm есть удобное приложение для управления манипулятором и протокол для работы с ним. Компьютер отправляет в COM-порт 11 байт. Первый из них всегда 0xFF, второй 0xAA и некоторые из оставшихся — сигналы для сервоприводов. Далее эти данные нормализуются и отдаются на отработку двигателям. У меня сервоприводы подключены к цифровым входам/выходам 9-12, но это легко можно поменять.

Терминальная программа от uArm позволяет изменять пять параметров при управлении мышью. При движении мыши по поверхности изменяется положение манипулятора в плоскости XY. Вращение колесика — изменение высоты. ЛКМ/ПКМ — сжать/разжать клешню. ПКМ + колесико — поворот захвата. На самом деле очень удобно. При желании можно написать любой терминальный софт, который будет общаться с манипулятором по такому же протоколу.

Я не буду здесь приводить скетчи — скачать их можно будет в конце статьи.

Видео работы


И, наконец, само видео работы манипулятора. На нем показано управление мышью, резисторами и по заранее записанной программе.



Ссылки


Файлы для резки оргстекла, 3D-модели, список для покупки, чертежи платы и софт можно скачать в конце моей основной статьи.
Подробная инструкция по сборке в фотографиях (осторожно, траффик).

Комментарии (21)


  1. acos
    15.12.2015 09:47
    +1

    Отличная работа!
    А прямо из оргстекла подшипники скольжения не пробовали делать?


    1. ssg1712
      15.12.2015 09:55

      Спасибо!
      Нет, не пробовал. Если поделитесь ссылкой или в двух словах опишите о чем идет речь буду признателен.


      1. acos
        15.12.2015 10:18
        +2

        Да просто вместо мелких подшипников точно такие же по размеру кругляши из оргстекла воткнуть. Реализаций не припомню. Поначалу подумал, что вы именно так и сделали, потом только фотки из подробной статьи разглядел).
        Давно хочу попробовать такое, но сейчас мы из оргстекла механику совсем перестали делать, проверить не на чем.
        Сергей, я как всегда восхищен — проекты у вас очень классные! Спасибо)


        1. 3dtim
          15.12.2015 17:03
          +1

          оргстекло не скользит, втулки скольжения из фторопласта делают


  1. MaxAlekseev
    15.12.2015 11:46
    +1

    А что за прибор на заглавной фотке за манипулятором? Часто вижу на фотографиях из лабораторий.


    1. ssg1712
      15.12.2015 12:26

      Это дымоуловитель для пайки. Он с фильтром, поэтому нет воздуховода. Если не очень много паяешь, то вполне полезная вещь. Главное, что дым от лица отгоняет.


      1. MaxAlekseev
        15.12.2015 12:32
        +1

        Еще вопрос. У вас очень идеальные платы по качеству изготовления, я имею в виду дополнительные шилды для Arduino. Если это самодел, предположу что ламинатор и фоторезист, можно немного описать технологию лужения, т.к. у меня так не выходит.


        1. POS_troi
          15.12.2015 16:04
          +1

          Сплавом Розэ лудится.


        1. ssg1712
          15.12.2015 18:47

          Конкретно на картинке в этой статье на заводе изготовлена.


  1. czuryk
    15.12.2015 13:45
    +1

    Есть у меня похожая рука, собранная на основе такой штуковины.
    Тоже написал для ардуины прошивку и програмку для винды, которая использовала для управления радио джойстик. На саму клешню поставил микрокамеру с видео передатчиком, а сам сидел в другом месте и по камере, джлйстиком выполнял какие то манипуляции рукой, например печатал на клавиатура или перетасиквал предметы…
    На как то быстро наигрался и убрал все в шкаф… применение ей так и не нашел :(


  1. Surprise
    15.12.2015 14:13
    +11


  1. potan
    15.12.2015 14:14
    +2

    Интересно, когда будет сделана такая рука, что могла бы собрать свою копию из готовых деталей?


  1. VioletGiraffe
    15.12.2015 15:43
    +2

    А как вы добились уменьшения люфтов? Есть какая-то конкретная хитрость?


    1. ssg1712
      15.12.2015 18:49

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


  1. Lerk
    15.12.2015 18:44
    +1

    Какая точность передвижения? Повторяемость движений? При какой нагрузке?


    1. ssg1712
      15.12.2015 18:54

      Точность не очень высокая и ее трудно оценить. Стакан двигать хватит, гравировать надписи нет)
      С повторяемостью достаточно хорошо, но подгонять программу под определенную позицию сложно, так как у сервоприводов MG995 довольно большие люфты на валу и текущая позиция зависит от предыдущей.
      Приводы честно вращаются при 8кг/см на валу. На полностью вытянутой руке можно уверено держать около 200г. Если будет время, попробую потестировать с каким предельным весом она может работать.


      1. Lerk
        15.12.2015 19:20
        +1

        Ясно) Без повторяемости роборука — игрушка. Попробуйте может сделать калибровочную позицию? Тогда можно и на какую-нить реальную задачу поставить. А если на манипулятор поставить камеру с OpenCV… завидую, что у вас есть время на такое хобби)


        1. ssg1712
          15.12.2015 19:51

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


      1. vp7
        15.12.2015 20:52
        +1

        А если поставить датчики угла поворота на всех рычагах и использовать их для тонкой подстройки?
        Тогда даже большой люфт двигателя можно будет компенсировать.

        Интересно, существуют ли подходящие по размеру (и цене) датчики для установки на вашу робо-руку?


        1. ssg1712
          15.12.2015 23:24

          Тут дело в другом. Надо отталкиваться от того, для чего предназначен манипулятор. Мой для задач, в которых требуется дать компьютеру простенькую руку. Например для того, чтобы сделать настольную лампу с голосовым управлением. Или быстро автоматизировать простые действия (включить чайник, насыпать еды кошке и т.д.) Я хотел сделать изготовление манипулятора в домашних условиях предельно простым, дешевым и способным перетаскивать реальные предметы. Если задуматься, то есть очень много задач в которых такие люфты не помеха.


  1. nemilya
    16.12.2015 12:20

    Спасибо Сергей за публикацию!
    Очень хороший образовательный проект и опыт. Ведь одно дело — купить и собрать готовое — а другое — пройти весь путь от начала и до работающей модели — чтобы понять все тонкости и моменты.

    Тем более свой шилд и ардуино — выглядит классно. Думаю вполне можно DIY набором делать — и на мастеркласс в хакспейс :)

    Кстати — V-REP добавили в свои модели uArm — можно в 3д виртуальной реальности ей управлять.



    И даже запрограммировали её на автономное движение — взять предмет, поднять, и обратно положить, вот фрагмент:

    Код
    function threadFunction()
    	local maxVelocity=45*math.pi/180 -- rad/s
    	local maxAcceleration=40*math.pi/180 -- rad/s^2
    	local maxJerk=80*math.pi/180 -- rad/s^3
    	local maxTorque=10 -- kg*m^2/s^2
    
    	initialize(maxVelocity,maxAcceleration,maxJerk,maxTorque)
    
    	while simGetSimulationState()~=sim_simulation_advancing_abouttostop do
    		enableSuctionCup(false)
    		-- Synchronous operation of the individual joints:
    		moveToPosition({180*math.pi/180,59*math.pi/180,84*math.pi/180,180*math.pi/180},true)
    		moveToPosition({180*math.pi/180,52.5*math.pi/180,84*math.pi/180,180*math.pi/180},true)
    		enableSuctionCup(true)
    		moveToPosition({180*math.pi/180,59*math.pi/180,84*math.pi/180,180*math.pi/180},true)
    		moveToPosition({90*math.pi/180,104*math.pi/180,60*math.pi/180,90*math.pi/180},true)
    		-- Asynchronous operation of the individual joints:
    		moveToPosition({180*math.pi/180,59*math.pi/180,84*math.pi/180,180*math.pi/180},false)
    		moveToPosition({180*math.pi/180,52.5*math.pi/180,84*math.pi/180,180*math.pi/180},true)
    		enableSuctionCup(false)
    		moveToPosition({180*math.pi/180,59*math.pi/180,84*math.pi/180,180*math.pi/180},true)
    		moveToPosition({90*math.pi/180,104*math.pi/180,60*math.pi/180,90*math.pi/180},false)
    	end
    end