Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Controlador de braço de robô MK2 Plus

Componentes e suprimentos

CNC Shield
× 1
OpenBuilds NEMA 17 Stepper Motor
Usei Steppers Nema 17 genéricos.
× 3
Arduino UNO
× 1
SparkFun Stepper motor driver board A4988
× 3
Chave de micro limite OpenBuilds
× 3

Ferramentas e máquinas necessárias

Impressora 3D (genérica)

Aplicativos e serviços online

Arduino IDE

Sobre este projeto





O braço EEZYBOT MK2


Se você já pesquisou em thingiverse.com por braços robóticos legais, é provável que tenha tropeçado nisso. O braço EEZYBOT MK2 (projetado pelo brilhante daghizmo) compartilha a ligação cinemática do ABB IRB460 em escala reduzida com uma proporção de 1:7. No entanto, este braço foi projetado para funcionar com servos, o que o torna um pouco instável e menos gracioso. No entanto, existe uma solução melhor lá fora. O braço MK2 Plus encontrado aqui, https://www.thingiverse.com/thing:2520572 é uma versão remixada do braço MK2 original que usa 3 motores de passo para mover suas ligações.

A impressão deste artigo demora um pouco, portanto, marque este artigo, imprima tudo e volte quando terminar! (Vai demorar alguns dias)

Se você estiver tendo problemas para montar o braço, há muitos tutoriais online.





Seleção de uma posição inicial


Ao contrário dos servos, os motores de passo não têm nenhuma percepção posicional. Teremos que remediar isso configurando primeiro uma rotina de homing quando o braço for ligado. Estaremos usando 3 interruptores de limite para definir nossa posição inicial. As ligações funcionam de uma forma um tanto complexa, mas você entenderá facilmente onde posicionar as chaves depois de montar o braço e ver como tudo se move.

(ou seja, não há XY como um sistema cartesiano, mas vamos chamá-los assim para tornar as coisas mais fáceis)

Você pode definir o interruptor de limite Z em qualquer lugar na base principal do braço. Adicione um pouco de cola quente para que os fios não se soltem quando o braço se mover.





Fiação


A fiação é bastante simples, uma vez que todos os terminais são marcados na blindagem do CNC. Apenas não conecte seus drivers A4988 da maneira errada! O motor de passo ao lado com a chave limitadora Y deve ser conectado ao terminal para o motor de passo Y na blindagem do CNC. O mesmo vale para o motor ao lado do interruptor de limite X. (Estamos chamando-os de X e Y porque é mais fácil lidar com a blindagem do CNC desta forma) Conecte o stepper final que gira a base do braço ao terminal Z e conecte os terminais de acordo com seus nomes. A polaridade não importa.

Encontre uma fonte de alimentação decente de 12 V que possa fornecer a corrente para os motores funcionarem sem travar.





Código


Vamos ao que interessa. Estaremos usando a biblioteca AccelStepper para Arduino para conduzir os steppers sem problemas. Esta biblioteca permite acelerar, desacelerar e operar vários motores de passo simultaneamente. Você pode obter esta biblioteca diretamente através do Arduino IDE usando o Gerenciador de Biblioteca (Sketch> Incluir Biblioteca> Gerenciador de Biblioteca)

Você também pode obtê-lo na página dos criadores originais no airspayce. https://www.airspayce.com/mikem/arduino/AccelStepper/

Agora que temos tudo de que precisamos, vamos rever o código passo a passo.

Primeiro vamos definir alguns nomes para os pinos que vamos usar. Você pode encontrar um diagrama de pinos do escudo CNC com uma rápida pesquisa de imagens no Google. Também criaremos os objetos AccelStepper para nossos 3 motores de passo.
  #define XSTEP 2 // Pino de passo do motor de passo 
#define YSTEP 3
#define ZSTEP 4
#define XDIR 5 // Pino de controle de direção do motor de passo
#define YDIR 6
#define ZDIR 7
#define ENABLE 8 // Pino de habilitação do escudo do CNC
#define XLIMIT 9 // Pinos da chave de limite
#define YLIMIT 10
# definir ZLIMIT 11
#define XMOTORACC 250 // Aceleração e valores de velocidade máxima
#define XMOTORMAXSPEED 1000
#define YMOTORACC 250
#define YMOTORMAXSPEED 1000
# incluem
AccelStepper XMOTOR (1, XSTEP, XDIR);
AccelStepper YMOTOR (1, YSTEP, YDIR);
AccelStepper ZMOTOR (1, ZSTEP, ZDIR);

Vamos fazer uma pequena função auxiliar para configurar nossos pinos.
  void pinsetup () {
pinMode (ENABLE, OUTPUT);
digitalWrite (ENABLE, LOW);
pinMode (XLIMIT, INPUT_PULLUP);
pinMode ( YLIMIT, INPUT_PULLUP);
pinMode (ZLIMIT, INPUT_PULLUP);
}

Agora que isso é feito, vamos examinar a lógica de nossa rotina de homing.
  void autohome () {// Estamos usando isso para chamar nossa rotina de homing 
xyhome ();
zhome ();
}
void xyhome () {
int initial_xhome =-1;
int initial_yhome =-1;
// Definir velocidade máxima e aceleração de cada Steppers na inicialização para homing
XMOTOR.setMaxSpeed ​​(500.0 ); // Definir velocidade máxima do passo (mais lento para obter melhor precisão)
XMOTOR.setAcceleration (50.0); // Definir aceleração de passo
YMOTOR.setMaxSpeed ​​(500.0); // Definir velocidade máxima do passo (mais lento para obter melhor precisão)
YMOTOR.setAcceleration (50.0); // Defina a aceleração do motor de passo
// Inicie o procedimento de homing do motor de passo na inicialização
while (digitalRead (YLIMIT)) {// Faça o motor de passo mover no sentido anti-horário até que a chave seja ativada
XMOTOR. moveTo (initial_xhome); // Defina a posição para mover para
YMOTOR.moveTo (initial_yhome); // Defina a posição para mover para
initial_xhome--; // Diminui em 1 para o próximo movimento se necessário
initial_yhome--;
XMOTOR.run (); // Comece a mover o stepper
YMOTOR.run ();
delay (5);
}
XMOTOR.setCurrentPosition (0); // Defina a posição atual como zero por agora
YMOTOR.setCurrentPosition (0);
inicial_xhome =-1;
inicial_yhome =1;
while (digitalRead (XLIMIT)) {
XMOTOR.moveTo (inicial_xhome); // Defina a posição para mover para
YMOTOR.moveTo (initial_yhome); // Defina a posição para mover para
initial_xhome--; // Diminui em 1 para o próximo movimento, se necessário
initial_yhome ++;
XMOTOR.run (); // Comece a mover o stepper
YMOTOR.run ();
delay (5);
}
YMOTOR.setCurrentPosition (0); // Defina a posição atual como zero por enquanto
YMOTOR.setMaxSpeed ​​(250.0); // Definir velocidade máxima do passo (mais lento para obter melhor precisão)
YMOTOR.setAcceleration (10.0); // Defina a aceleração do Stepper
initial_yhome =1;
while (! DigitalRead (YLIMIT)) {// Faça o Stepper se mover no sentido horário até que a chave seja desativada
YMOTOR.moveTo (initial_yhome);
YMOTOR.run ();
inicial_yhome ++;
atraso (5);
}
YMOTOR.setCurrentPosition (0);
YMOTOR.setMaxSpeed ​​(YMOTORMAXSPEED ); // Definir velocidade máxima do passo (mais rápido para movimentos regulares)
YMOTOR.setAcceleration (YMOTORACC); // Definir aceleração de passo
XMOTOR.setCurrentPosition (0); // Defina a posição atual como zero por enquanto
XMOTOR.setMaxSpeed ​​(250.0); // Definir velocidade máxima do passo (mais lento para obter melhor precisão)
XMOTOR.setAcceleration (10.0); // Defina a aceleração do Stepper
initial_xhome =1;
while (! DigitalRead (XLIMIT)) {// Faça o Stepper se mover no sentido horário até que a chave seja desativada
XMOTOR.moveTo (initial_xhome);
XMOTOR.run ();
casa_inicial ++;
atraso (5);
}
XMOTOR.setCurrentPosition (0);
XMOTOR.setMaxSpeed ​​(XMOTORMAXSPEED ); // Definir velocidade máxima do passo (mais rápido para movimentos regulares)
XMOTOR.setAcceleration (XMOTORACC); // Definir aceleração de stepper
}
void zhome () {
int initial_zhome =-1;
// Definir velocidade máxima e aceleração de cada steppers na inicialização para homing
ZMOTOR.setMaxSpeed ​​(100,0); // Definir velocidade máxima de passo (mais lento para obter melhor precisão)
ZMOTOR.setAcceleration (100.0); // Definir aceleração do motor de passo
// Iniciar procedimento de homing do motor de passo na inicialização
while (digitalRead (ZLIMIT)) {// Fazer o motor de passo mover no sentido anti-horário até que a chave seja ativada
ZMOTOR. moveTo (inicial_zhome); // Defina a posição para mover para
initial_zhome--; // Diminui em 1 para o próximo movimento, se necessário
ZMOTOR.run (); // Comece a mover o stepper
delay (5);
}
ZMOTOR.setCurrentPosition (0); // Defina a posição atual como zero por enquanto
ZMOTOR.setMaxSpeed ​​(50.0); // Definir velocidade máxima de passo (mais lento para obter melhor precisão)
ZMOTOR.setAcceleration (50.0); // Defina a aceleração do Stepper
initial_zhome =1;
while (! DigitalRead (ZLIMIT)) {// Faça o Stepper se mover no sentido horário até que o switch seja desativado
ZMOTOR.moveTo (initial_zhome);
ZMOTOR.run ();
inicial_zhome ++;
atraso (5);
}
ZMOTOR.setCurrentPosition (0);
ZMOTOR.setMaxSpeed ​​(1000.0 ); // Definir velocidade máxima de passo (mais rápido para movimentos regulares)
ZMOTOR.setAcceleration (1000.0); // Definir aceleração de passo
}

Ok, então isso é muito código. O que realmente está acontecendo aqui? O braço primeiro executa uma rotina de homing nos motores X e Y. Devido à maneira como as ligações funcionam, isso é feito em algumas etapas. (Você pode ver o vídeo no final para ver isso em ação)
  • Primeiro, os motores X e Y são movidos em direções opostas para que o interruptor de limite Y seja pressionado primeiro.
  • Assim que o interruptor de limite Y é pressionado, ambos os motores giram na mesma direção para que o interruptor de limite X seja pressionado.
  • Depois que o interruptor X é pressionado, os motores são movidos um pouco para que os interruptores sejam pressionados (pressionados como em, não o triste meio deprimido.)
  • Finalmente, o motor Z é girado para que o interruptor de limite Z seja pressionado.

Você terá que ter muito cuidado ao fazer o procedimento de homing pela primeira vez. Se os seus steppers se moverem para o outro lado, simplesmente DESLIGUE A ALIMENTAÇÃO e, ENTÃO, vire o conector do motor.

Agora que isso é feito, chame autohome () da função setup () para que seja executado apenas uma vez. Deixe seu loop () em branco. E mantenha a mão na fonte de alimentação para desligá-la se algo der errado.
  void setup () {
// coloque seu código de configuração aqui, para executar uma vez:
Serial.begin (9600);
pinsetup ();
autohome ();
Serial.println ("HOMING OK");
}

Se você tiver sorte, seus motores girarão da maneira certa, os interruptores de limite irão clicar corretamente e a rotina de homing funcionará sem problemas. Mas se você for como eu, terá que fazer pequenas mudanças antes que tudo esteja instalado e funcionando. Portanto, sempre desconecte a energia se o retorno à posição der errado, para que você não bagunce seu braço impresso em 3D.

Finalmente, você pode escrever sua própria lógica no loop () para que seu braço se mova para as posições desejadas. Devido à forma como o braço está interligado, os motores X e Y controlam o efetor final de uma forma quase cartesiana.
  void loop () {
XMOTOR.runToNewPosition (100);
atraso (1000);
YMOTOR.runToNewPosition (50);
atraso (1000);
YMOTOR.runToNewPosition (-50);
atraso (1000);
YMOTOR.runToNewPosition (0);
atraso (1000);
XMOTOR.runToNewPosition ( 0);
atraso (1000);
}





Conclusão


Já vi muitos tutoriais sobre como usar o firmware GRBL popular para controlar este braço. No entanto, isso significa que você precisa de um computador para enviar comandos seriais ao braço para fazê-lo se mover. Se você só precisa do braço MK2 para fazer alguns movimentos, pode facilmente codificá-los no Arduino e deixá-lo fazer suas próprias coisas.

Isso não significa que você não pode controlar isso com comandos seriais! Você pode simplesmente incorporar um código delimitador serial a este e enviar as etapas do motor XY e Z como uma string (delimitado com caracteres especiais - por exemplo, 5, 6, 7 * que moveria o motor X em 5 etapas, o Y em 6 e o Z por 7. O * é usado para indicar o final da string).

Você também pode desenvolver isso para enviar as coordenadas do espaço 3D do efetor final e fazer com que o arduino descubra as etapas necessárias usando cinemática inversa ou mesmo trigonometria básica.

Divirta-se! E meus sinceros agradecimentos a todos os designers brilhantes do Thingiverse!

Código

  • robotArm
robotArm Arduino
Extraia os arquivos e abra com o IDE do Arduino
 Sem visualização (somente download). 
Controlador de braço robótico MK2 - Github
Link para o repositório githubhttps://github.com/yasaspeiris/MK2-Robot-Arm-Controller

Peças personalizadas e gabinetes

Robot Arm MK2 Plus no Thingiverse
Créditos para ackyltle arquivo CAD em thingiverse.com

Processo de manufatura

  1. O controlador do motor integra o núcleo Arm Cortex-M0
  2. Robô SCARA de braço duplo
  3. Braço do robô MeArm - Seu robô - V1.0
  4. Braço do robô controlado por Ethernet
  5. Littlearm 2C:Construir um braço de robô Arduino impresso em 3D
  6. Braço do robô Arduino DIY - Controlado por gestos manuais
  7. Controlar Arduino Robot Arm com aplicativo Android
  8. Realtime Robotics lança novo computador controlador de robô
  9. Centro de giro equipado com braço robótico
  10. Robot combina braço robótico colaborativo com plataforma móvel