Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Контроллер руки робота MK2 Plus

Компоненты и расходные материалы

CNC Shield
× 1
Шаговый двигатель OpenBuilds NEMA 17
Я использовал стандартные степперы Nema 17.
× 3
Arduino UNO
× 1
Плата драйвера шагового двигателя SparkFun A4988
× 3
Микро концевой выключатель OpenBuilds
× 3

Необходимые инструменты и машины

3D-принтер (общий)

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Рука EEZYBOT MK2

Если вы искали на сайте thingiverse.com крутые роботизированные манипуляторы, скорее всего, вы наткнулись на это. Рычаг EEZYBOT MK2 (разработанный блестящим дагизмо) имеет кинематическую связь ABB IRB460 в уменьшенном масштабе с соотношением 1:7. Однако эта рука предназначена для работы с сервоприводами, что делает ее немного шаткой и менее изящной. Однако есть лучшее решение. Рука MK2 Plus, найденная здесь, https://www.thingiverse.com/thing:2520572, представляет собой переработанную версию оригинальной руки MK2, в которой для перемещения рычагов используются 3 шаговых двигателя.

Печать этого требует времени, поэтому добавьте эту статью в закладки, распечатайте все и возвращайтесь, когда закончите! (Это займет несколько дней)

Если у вас возникли проблемы со сборкой руки, в Интернете есть множество учебных пособий.

Выбор исходного положения

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

(т.е. нет XY, как декартова система, но мы все равно будем называть их так, чтобы упростить задачу)

Вы можете установить концевой выключатель Z в любом месте на основном основании рычага. Добавьте немного горячего клея, чтобы провода не оторвались при движении руки.

Электропроводка

Подключение довольно простое, так как все клеммы отмечены на щитке ЧПУ. Только не вставляйте драйверы A4988 неправильно! Шаговый двигатель на стороне концевого выключателя Y должен быть подключен к клемме для шагового двигателя Y в вашем щите ЧПУ. То же самое и с двигателем на стороне концевого выключателя X. (Мы называем их X и Y, так как с этим проще работать с экраном ЧПУ). Подключите последний шаговый двигатель, который вращает основание рычага, к клемме Z и подключите ограничители в соответствии с их названиями. Полярность не имеет значения.

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

Код

Давайте приступим к делу. Мы будем использовать библиотеку AccelStepper для Arduino, чтобы плавно управлять шаговыми двигателями. Эта библиотека позволяет легко ускорять, замедлять и запускать несколько шаговых двигателей одновременно. Вы можете получить эту библиотеку непосредственно через IDE Arduino, используя Диспетчер библиотек (Sketch> Включить библиотеку> Диспетчер библиотек)

Вы также можете получить его на оригинальной странице создателей на airspayce. https://www.airspayce.com/mikem/arduino/AccelStepper/

Теперь, когда у нас есть все, что нам нужно, давайте шаг за шагом рассмотрим код.

Сначала мы определим некоторые имена для контактов, которые мы собираемся использовать. Вы можете найти схему контактов щита с ЧПУ, выполнив быстрый поиск изображений в Google. Мы также создадим объекты AccelStepper для наших 3 шаговых двигателей.

  #define XSTEP 2 // Шаговый штифт шагового двигателя 
#define YSTEP 3
#define ZSTEP 4
#define XDIR 5 // Штырь управления направлением шагового двигателя
#define YDIR 6
#define ZDIR 7
#define ENABLE 8 // Вывод включения экрана ЧПУ
#define XLIMIT 9 // Выводы концевого выключателя
#define YLIMIT 10
# define ZLIMIT 11
#define XMOTORACC 250 // Значения ускорения и максимальной скорости
#define XMOTORMAXSPEED 1000
#define YMOTORACC 250
#define YMOTORMAXSPEED 1000
# include
AccelStepper XMOTOR (1, XSTEP, XDIR);
AccelStepper YMOTOR (1, YSTEP, YDIR);
AccelStepper ZMOTOR (1, ZSTEP, ZDIR);

Давайте создадим небольшую вспомогательную функцию для настройки наших контактов.

  void pinsetup () {
pinMode (ENABLE, OUTPUT);
digitalWrite (ENABLE, LOW);
pinMode (XLIMIT, INPUT_PULLUP);
pinMode ( YLIMIT, INPUT_PULLUP);
pinMode (ZLIMIT, INPUT_PULLUP);
}

Теперь, когда это сделано, давайте рассмотрим логику нашей процедуры наведения.

  void autohome () {// Мы используем это для вызова нашей подпрограммы самонаведения 
xyhome ();
zhome ();
}
void xyhome () {
int initial_xhome =-1;
int initial_yhome =-1;
// Устанавливаем максимальную скорость и ускорение каждого шагового двигателя при запуске для самонаведения
XMOTOR.setMaxSpeed ​​(500.0 ); // Устанавливаем максимальную скорость шагового двигателя (медленнее для большей точности)
XMOTOR.setAcceleration (50.0); // Устанавливаем ускорение шагового двигателя
YMOTOR.setMaxSpeed ​​(500.0); // Устанавливаем максимальную скорость шагового двигателя (медленнее для большей точности)
YMOTOR.setAcceleration (50.0); // Устанавливаем ускорение шагового двигателя
// Запускаем процедуру возврата в исходное положение шагового двигателя при запуске
while (digitalRead (YLIMIT)) {// Заставляем шаговый двигатель двигаться против часовой стрелки, пока переключатель не будет активирован
XMOTOR. moveTo (initial_xhome); // Устанавливаем позицию для перемещения на
YMOTOR.moveTo (initial_yhome); // Устанавливаем позицию для перехода к
initial_xhome--; // При необходимости уменьшить на 1 для следующего хода
initial_yhome--;
XMOTOR.run (); // Начинаем движение шагового двигателя
YMOTOR.run ();
delay (5);
}
XMOTOR.setCurrentPosition (0); // Устанавливаем текущую позицию как ноль
YMOTOR.setCurrentPosition (0);
initial_xhome =-1;
initial_yhome =1;
while (digitalRead (XLIMIT)) {
XMOTOR.moveTo (initial_xhome); // Устанавливаем позицию для перемещения на
YMOTOR.moveTo (initial_yhome); // Устанавливаем позицию для перехода к
initial_xhome--; // При необходимости уменьшить на 1 для следующего хода
initial_yhome ++;
XMOTOR.run (); // Начинаем движение шагового двигателя
YMOTOR.run ();
delay (5);
}
YMOTOR.setCurrentPosition (0); // Устанавливаем текущую позицию как нулевую
YMOTOR.setMaxSpeed ​​(250.0); // Устанавливаем максимальную скорость шагового двигателя (медленнее для большей точности)
YMOTOR.setAcceleration (10.0); // Устанавливаем ускорение шагового двигателя
initial_yhome =1;
while (! DigitalRead (YLIMIT)) {// Заставляем шаговый двигатель двигаться по часовой стрелке, пока переключатель не будет деактивирован
YMOTOR.moveTo (initial_yhome);
YMOTOR.run ();
initial_yhome ++;
delay (5);
}
YMOTOR.setCurrentPosition (0);
YMOTOR.setMaxSpeed ​​(YMOTORMAXSPEED ); // Устанавливаем максимальную скорость шагового двигателя (быстрее для обычных движений)
YMOTOR.setAcceleration (YMOTORACC); // Устанавливаем ускорение шагового двигателя
XMOTOR.setCurrentPosition (0); // Устанавливаем текущую позицию как ноль
XMOTOR.setMaxSpeed ​​(250.0); // Устанавливаем максимальную скорость шагового двигателя (медленнее для большей точности)
XMOTOR.setAcceleration (10.0); // Устанавливаем ускорение шагового двигателя
initial_xhome =1;
while (! DigitalRead (XLIMIT)) {// Заставляем шаговый двигатель двигаться по часовой стрелке, пока переключатель не будет деактивирован
XMOTOR.moveTo (initial_xhome);
XMOTOR.run ();
initial_xhome ++;
delay (5);
}
XMOTOR.setCurrentPosition (0);
XMOTOR.setMaxSpeed ​​(XMOTORMAXSPEED ); // Устанавливаем максимальную скорость шагового двигателя (быстрее для обычных движений)
XMOTOR.setAcceleration (XMOTORACC); // Устанавливаем ускорение шагового двигателя
}
void zhome () {
int initial_zhome =-1;
// Устанавливаем максимальную скорость и ускорение каждого шагового двигателя при запуске для самонаведения
ZMOTOR.setMaxSpeed ​​(100.0); // Устанавливаем максимальную скорость шагового двигателя (медленнее для большей точности)
ZMOTOR.setAcceleration (100.0); // Устанавливаем ускорение шагового двигателя
// Запускаем процедуру возврата в исходное положение шагового двигателя при запуске
while (digitalRead (ZLIMIT)) {// Заставляем шаговый двигатель двигаться против часовой стрелки, пока переключатель не будет активирован
ZMOTOR. moveTo (initial_zhome); // Устанавливаем позицию для перехода к
initial_zhome--; // При необходимости уменьшаем на 1 для следующего хода
ZMOTOR.run (); // Начинаем движение шагового двигателя
delay (5);
}
ZMOTOR.setCurrentPosition (0); // Устанавливаем текущую позицию как ноль на данный момент
ZMOTOR.setMaxSpeed ​​(50.0); // Устанавливаем максимальную скорость шагового двигателя (медленнее для большей точности)
ZMOTOR.setAcceleration (50.0); // Устанавливаем ускорение шагового двигателя
initial_zhome =1;
while (! DigitalRead (ZLIMIT)) {// Заставляем шаговый двигатель двигаться по часовой стрелке, пока переключатель не будет деактивирован
ZMOTOR.moveTo (initial_zhome);
ZMOTOR.run ();
initial_zhome ++;
delay (5);
}
ZMOTOR.setCurrentPosition (0);
ZMOTOR.setMaxSpeed ​​(1000.0 ); // Устанавливаем максимальную скорость шагового двигателя (быстрее для обычных движений)
ZMOTOR.setAcceleration (1000.0); // Устанавливаем ускорение шагового двигателя
}

Хорошо, это много кода. Что здесь на самом деле происходит? Рука сначала выполняет процедуру самонаведения на двигателях X и Y. Из-за того, как работают связи, это делается в несколько шагов. (Вы можете посмотреть видео в конце, чтобы увидеть это в действии)

  • Сначала двигатели X и Y перемещаются в противоположных направлениях, так что сначала нажимается концевой выключатель Y.
  • При нажатии концевого выключателя Y оба двигателя вращаются в одном направлении, так что нажимается концевой выключатель X.
  • После нажатия переключателя X двигатели немного сдвигаются, так что переключатели находятся в нажатом положении (в нажатом состоянии, а не в грустном нажатии).
  • Наконец, двигатель Z поворачивают так, чтобы был нажат концевой выключатель Z.

Вы должны быть очень осторожны при выполнении процедуры самонаведения в первый раз. Если ваши шаговые двигатели двигаются в другую сторону, просто ВЫКЛЮЧИТЕ ПИТАНИЕ, а ЗАТЕМ переверните разъем двигателя.

Теперь, когда это сделано, вызовите autohome () из вашей функции setup (), чтобы она запускалась только один раз. Оставьте свой loop () пустым. И держите руку на блоке питания, чтобы выключить его, если что-то пойдет не так.

  void setup () {
// поместите сюда ваш установочный код для однократного запуска:
Serial.begin (9600);
pinsetup ();
autohome ();
Serial.println ("ДОМОЙ ОК");
}

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

Наконец, вы можете написать свою собственную логику в loop (), чтобы ваша рука двигалась в нужное вам положение. Из-за способа соединения руки двигатели X и Y управляют концевым эффектором почти декартово.

  void loop () {
XMOTOR.runToNewPosition (100);
delay (1000);
YMOTOR.runToNewPosition (50);
delay (1000);
YMOTOR.runToNewPosition (-50);
delay (1000);
YMOTOR.runToNewPosition (0);
delay (1000);
XMOTOR.runToNewPosition ( 0);
задержка (1000);
}

Заключение

Я видел много руководств о том, как использовать популярную прошивку GRBL для управления этой рукой. Однако это означает, что вам нужен компьютер, чтобы посылать последовательные команды на руку, чтобы заставить ее двигаться. Если вам нужна рука MK2 только для нескольких движений, вы можете легко запрограммировать их в Arduino и позволить ей делать свои собственные вещи.

Это не значит, что вы не можете контролировать это с помощью последовательных команд! Вы можете просто включить в него код разделителя Serial и отправить шаги двигателя XY и Z в виде строки (разделенной специальными символами - например, 5, 6, 7 *, которые будут перемещать двигатель X на 5 шагов, Y на 6 и Z на 7. Знак * используется для обозначения конца строки).

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

Развлекайся! И от всего сердца благодарю всех блестящих дизайнеров Thingiverse!

Код

  • robotArm
robotArm Arduino
Извлеките файлы и откройте с помощью Arduino IDE
 Без предварительного просмотра (только загрузка). 
Контроллер руки робота MK2 - Github
Ссылка на репозиторий github https://github.com/yasaspeiris/MK2-Robot-Arm-Controller

Изготовленные на заказ детали и корпуса

Рука робота MK2 Plus на Thingiverse
Кредиты на файл САПР ackyltle на сайте thingiverse.com

Производственный процесс

  1. Контроллер мотора объединяет ядро ​​Arm Cortex-M0
  2. Робот SCARA с двумя руками
  3. Рука робота MeArm - Ваш робот - V1.0
  4. Рука робота, управляемая через Ethernet
  5. Littlearm 2C:создание напечатанной на 3D-принтере руки робота Arduino
  6. Самодельная рука робота Arduino - управляемая жестами рук
  7. Управление манипулятором Arduino с помощью приложения для Android
  8. Realtime Robotics представила новый компьютер для управления роботами
  9. Токарный центр с манипулятором
  10. Robot сочетает в себе манипулятор для совместной работы с мобильной платформой