Projetos

Braço Robótico com Joystick

Eletrogate 1 de julho de 2020

Introdução

Em nosso blog, já existe um tutorial sobre Braço Robótico. Mas controlado com potenciômetros.

Kit Braço Robótico MDF com Arduino

Para facilitar o controle do Braço Robótico, criei esse novo tutorial. Com Joysticks, o manuseio do braço fica bem interessante! Controlando com potenciômetros, o braço ajusta os movimentos de acordo com os valores da tensões nos potenciômetros. Se você gira o potenciômetro, o servo vai movimentar-se e parar no valor PWM correspondente à tensão no potenciômetro.

Usando Joysticks, o controle da movimentação é diferente. Se você soltar a manete do Joystick, ele volta para a posição inicial. Portanto não é possível usar a mesma programação do Braço Robótico com potenciômetros. Irei explicar detalhadamente como tudo funciona. Leia todo o tutorial até o final.


Materiais Necessários para o Projeto Braço Robótico com Joystick

cta_cart

Para quem não conhece um Joystick, é um mecanismo de controle, que possui dois potenciômetros (5 K ohms) e um botão que pode ser acionado quando a manete é pressionada. Esse é um diagrama de um Joystick:

Para que o Arduino possa fazer a leitura da tensão sobre cada Joystick, ele precisa estar conectado no pino +5 V e no pino terra (GND). Assim as tensões nas portas analógicas poderão variar entre 5 e Zero Volts. O joystick com a manete liberada (posição inicial) corresponde à tensão de aproximadamente 2,5V.

Se você ainda não montou as peças do Braço Robótico, eu criei esse manual com dezenas de figuras ilustrativas, que irão facilitar bastante a montagem. Baixe o manual no link abaixo :

Manual de montagem do Braço Robótico

Recomendo que faça a montagem do Braço Robótico e dos dois Joysticks sobre uma base de madeira. Prenda as peças com parafusos.  A base de madeira deve ter no mínimo 20 x 25 cm. Monte o Arduino na base do Braço Robótico (já tem furação para isso). Para facilitar a montagem, use também um Sensor Shield. Esse Sensor Shield V 5.0 deve ser montado sobre o Arduino.

Sensor Shield V5.0 para Arduino

Na fiação do servomotor da Garra sugiro montar uma extensão (três fios) , para permitir maior flexibilidade do braço.

Faça a montagem das ligações de acordo com os diagramas abaixo. Os joysticks devem ser  conectados nas portas analógicas e os servos nas portas digitais do Arduino.

O Joystick de controle da Garra e da Base eu deixei no lado esquerdo. E o Joystick que controla a altura e a profundidade do Braço, eu deixei no lado direito. Veja no diagrama que as portas A0, A1, A2 e A3 do Arduino devem ser conectadas nos Joysticks. Não se esqueça de conectar o +5V e terra nos dois módulos de Joystick também.

Para servir de guia, caso ainda reste alguma dúvida quanto à ligação, confira abaixo a descrição de cada pino a ser conectado:

  • Servo Profundidade = D06
  • Servo Base = D09
  • Servo Garra = D10
  • Servo Altura = D11
  • X Joystick esquerdo = A0
  • Y Joystick esquerdo = A1
  • X Joystick direito = A2
  • Y Joystick direito = A3

Não se esqueça de conectar os fios vermelhos (+VCC) dos joysticks nos pinos V do Sensor Shield, e os fios marrons (GND) nos pinos G.

O servo que controla a Altura fica no lado esquerdo do Braço Robótico. E o servo que controla a Profundidade fica no lado direito. (olhando por trás do braço robótico).

Para a alimentação de todo o conjunto do Braço Robótico, use uma fonte de alimentação de 5V com a corrente mínima de 1 A, no conector azul do Sensor Shield. Atenção para a polaridade! Negativo da fonte no terra (GND) e o positivo no +5V.

Para evitar problemas de ruídos na fonte, poderá conectar também um capacitor de 1000 uF/16V no mesmo conector azul. Atenção também para a polaridade.

Ao lado do conector azul, tem um jumper. Mantenha-o conectado nos pinos.

Não use esse braço robótico, conectando o Arduino no seu computador sem usar uma fonte externa. Pois sobrecarregará o regulador de 5V do Arduino e assim danificá-lo.

Depois de tudo montado, carregue a programação do Arduino. Desenvolvi a programação, permitindo a movimentação das partes do Braço Robótico, controlada pelos joysticks. Enquanto o joystick for acionado para uma das posições, o servomotor estará se movimentando. Quando parar de acionar o joystick, o servomotor também irá parar. E ficará paralisado na posição escolhida. O controle da garra é diferente, devido à rapidez do movimento. Para manter a garra presa, por exemplo, deverá manter o joystick na posição correspondente.

Logo abaixo está o  programa Sketch que eu desenvolvi para esse projeto. Se ainda não instalou a biblioteca Servo na Arduino IDE use o procedimento através da própria Arduino IDE.  Clique em Sketch / Incluir Biblioteca / Gerenciar Biblioteca. Após a abertura da janela do Gerenciador de Bibliotecas, procure pela biblioteca Servo e instale-a.

// BLOG Eletrogate
// Kit Braço Robótico controlado com Joysticks
// https://blog.eletrogate.com/braco-robotico-com-joystick/
// Gustavo Murta 01/julho/2020

#define potGarra        0           // porta A0 Joystick esquerda POT X
#define potBase         1           // porta A1 Joystick esquerda POT Y 
#define potAltura       2           // porta A2 Joystick direita  POT X
#define potProfundidade 3           // porta A3 Joystick direita  POT Y 

int atraso = 20;                    // atraso de 20 milisegundos

int valorGarra ;
int valorBase ;
int valorAltura ;
int valorProfundidade;

int valorGarraFinal ;
int valorBaseFinal ;
int valorAlturaFinal ;
int valorProfundidadeFinal;

#include <Servo.h>                    // Biblioteca Servo 

Servo myservoBase;                    // Objeto servo para controlar a base
Servo myservoGarra;                   // Objeto servo para controlar a garra
Servo myservoAltura;                  // Objeto servo para controlar a altura do braço
Servo myservoProfundidade;            // Objeto servo para profundidade a altura do braço

void setup()
{
  myservoBase.attach(9);              //Associa cada objeto a um pino pwm
  myservoGarra.attach(10);
  myservoAltura.attach(11);
  myservoProfundidade.attach(6);

  Serial.begin(9600);                 // console serial 9600 Bps
  valorBaseFinal = 90;                // valores usados para o controle dos servomotores 
  valorAlturaFinal = 90;
  valorProfundidadeFinal = 90;
}

void leituraJoysticks ()
{
  valorGarra = map(analogRead(potGarra), 10, 1000, 179, 0);                        // leitura do Joystick POT Garra
  Serial.print(" Valor Garra ="); Serial.println(valorGarra);                      // print Valor Garra  

  valorBase = map(analogRead(potBase), 10, 1000, 0, 179);                          // leitura do Joystick POT Base
  Serial.print(" Valor Base ="); Serial.println(valorBaseFinal);                   // print Valor Base

  valorAltura = map(analogRead(potAltura), 10, 1000, 0, 179);                      // leitura do Joystick POT Altura
  Serial.print(" Valor Altura ="); Serial.println(valorAlturaFinal);               // print Valor Altura 

  valorProfundidade = map(analogRead(potProfundidade), 10, 1000, 0, 179);          // leitura do Joystick POT Profundidade
  Serial.print(" Valor Profundidade ="); Serial.println(valorProfundidadeFinal);   // print Valor Profundidade

  Serial.println(); Serial.println();                                              // salta duas linhas 
}

void loop()
{
  leituraJoysticks ();                                                             // leitura dos POTs dos Joysticks 

  myservoGarra.write(valorGarra);                                                  // comando PWM para o servomotor Garra 

  if (valorBase > 95)                                                              // se Valor do POT Base > 95
  {
    valorBaseFinal = valorBaseFinal + 1;                                           // incrementa Valor Base 
    if (valorBaseFinal > 180) valorBaseFinal = 180;                                // limita Valor Base máximo até 180 
    delay (atraso);                                                                // atraso
  }
  if (valorBase < 80)                                                              // se Valor do POT Base < 80 
  {
    valorBaseFinal = valorBaseFinal - 1;                                           // decrementa Valor Base
    if (valorBaseFinal < 0) valorBaseFinal = 0;                                    // limita Valor Base mínimo até 0 
    delay (atraso);                                                                // atraso
  }
  myservoBase.write(valorBaseFinal);                                               // comando PWM para o servomotor Base

  if (valorAltura > 95)                                                            // se Valor do POT Altura > 95
  {
    valorAlturaFinal = valorAlturaFinal + 1;                                       // incrementa Valor Altura
    if (valorAlturaFinal > 160) valorAlturaFinal = 160;                            // limita Valor Base máximo até 160 
    delay (atraso);                                                                // atraso 
  }
  if (valorAltura < 80)                                                            // se Valor do POT Altura < 80 
  {
    valorAlturaFinal = valorAlturaFinal - 1;                                       // decrementa Valor Altura
    if (valorAlturaFinal < 30) valorAlturaFinal = 30;                              // limita Valor Base mínimo até 30 
    delay (atraso);                                                                // atraso
  }
  myservoAltura.write(valorAlturaFinal);                                           // comando PWM para o servomotor Altura

  if (valorProfundidade > 95)                                                      // se Valor do POT Profundidade > 95
  {
    valorProfundidadeFinal = valorProfundidadeFinal + 1;                           // incrementa Valor Profundidade
    if (valorProfundidadeFinal > 150) valorProfundidadeFinal = 150;                // limita Valor Base máximo até 150 
    delay (atraso);                                                                // atraso
  }
  if (valorProfundidade < 80)                                                      // se Valor do POT Profundiade < 80 
  {
    valorProfundidadeFinal = valorProfundidadeFinal - 1;                           // decrementa Valor Profundidade
    if (valorProfundidadeFinal < 30) valorProfundidadeFinal = 30;                  // limita Valor Base Profundidade até 30 
    delay (atraso);                                                                // atraso 
  }
  myservoProfundidade.write(valorProfundidadeFinal);                               // comando PWM para o servomotor Profundidade 

}

Você já deve saber que o servomotor gira 180 graus. Portanto o Arduino pode ajustar esse movimento entre os valores de 0 a 180 com o sinal PWM enviado para o servomotor. Como alguns servomotores do Braço Robótico não tem toda essa liberdade de movimentação de 180 graus, eu limitei algumas delas. Como no caso do servomotor Altura, os valores estão limitados entre 30 e 160 graus. Isso é importantes para não forçar os motores!

Para poder visualizar os valores do ajustes dos servomotores, os valores são enviados na console serial. Como a leitura precisa ser rápida, se quiser visualizar os valores clique em auto-rolagem para parar a listagem na console. Mas fiz isso só para você entender como funciona o controle do Braço Robótico com Joystick. Não interfere em nada no funcionamento.

Mais uma observação – inseri um atraso (delay) de 20 milisegundos durante cada avanço dos servomotores. Se você quiser a movimentação mais rápida, diminua esse valor.

Mas fica um desafio para você! Imagine uma programação automática de uma sequência de movimentos. Mas terá que fazer a conexão dos botões dos Joysticks com o Arduino.

Explicando melhor – a ideia é a seguinte. Você ajusta uma posição do Braço com o Joystick e pressiona o botão para memorizar essa posição. Assim você , vai gravando todas as movimentações do braço, pressionando o botão para cada posição. Depois de todas as movimentações gravadas, dê o comando para o Arduino executar toda a sequência! Só não fiz isso aqui no tutorial, pois é uma programação complexa e grande.

Fica para você esse desafio. Se concluir o desafio, compartilhe com a gente e você entrará para o Hall da Fama!


Links Interessantes:

Site do idealizador do Projeto do Braço Robótico Me Arm:  https://mearm.com/

Video com a montagem do Braço Robótico Me Arm: https://www.youtube.com/watch?v=zFBsEE7_NbQ

Se gostar ou tiver alguma dúvida,  deixe um comentário!

Conheça a Metodologia Eletrogate e ofereça aulas de robótica em sua escola!


Sobre o Autor


José Gustavo Abreu Murta

Consultor e Projetista de Sistemas Embarcados. Técnico em eletrônica, formado em Curso superior de TPD, pós-graduado em Marketing. Trabalhou por muitos anos na IBM na área de manutenção de computadores de grande porte. Aposentou-se, podendo curtir o que mais gosta : estudar e ensinar Tecnologia. Hobista em eletrônica desde 1976. Gosta muito de Fotografia e Observação de aves.


Eletrogate

1 de julho de 2020

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!