Braço Robótico

Braço Robótico

Será apresentado uma maneira fácil e acessível de um braço robótico, ideal para o seu primeiro projeto desse tipo. Basicamente sua estrutura é composta por placas acrílicas, parafusos e porcas. Sem grandes esforços, é possível obter por baixo custo esse formidável braço robótico. No primeiro contato com essa estrutura é bem provável alguma dificuldade na montagem, mas nada que uma boa paciência e cuidadosa observação não resolva.
Componentes:
  • 01 Kit Braço Robótico em Acrílico ou MDF
  • 04 Micro Servo 9g
  • 01 Joystick PS2 com Controle Remoto
  • 01 Arduino Uno
  • 01 Sensor Shield V5.0 (opcional)
Após a montagem do Braço Robótico com os servos motores faça a conexão da fiação conforme a fiação abaixo:

Braço Robótico


Quando estiver certo de que esteja tudo conectado corretamente,  faça o download da biblioteca PS2, descompacte o arquivo e cole a pasta PS2X_lib dentro da pasta C:\Users\admin\Documents\Arduino\libraries da IDE do Arduino e, então, carregue o código:

  1
  2  #include <PS2X_lib.h>
  3  #include <Servo.h>
  4
  5  // Aqui vc define as ligações para o braço
  6
  7  #define PS2_DAT 11 //DATA conectar à porta digital 11
  8  #define PS2_CLK 10 //CLOCK  conectar à porta digital 10
  9  #define PS2_CMD  9 //COMMAND conectar à porta digital 9
 10  #define PS2_SEL  8 //ATTENTION à porta digital 8
 11
 12
 13  #define pressures   true
 14  //#define pressures   false
 15  //#define rumble      true
 16  #define rumble      false
 17
 18  PS2X ps2x;
 19
 20  int posicao_corpo = 80;
 21  int posicao_braco_esq = 75;
 22  int posicao_braco_dir = 70;
 23  int Velocidade = 7;
 24  int contgarra =0;
 25  int error = 0;
 26  byte vibrate = 0;
 27  int posicaogarra = 100;
 28
 29  Servo motorgarra;
 30  Servo motorbraco_dir;
 31  Servo motorbraco_esq;
 32  Servo motorcorpo;
 33
 34  void setup()
 35  {
 36      //Inicializa as portas
 37      motorgarra.attach(3);
 38      motorbraco_dir.attach(4);
 39      motorbraco_esq.attach(5);
 40      motorcorpo.attach(6);
 41 

 42      //Inicializar os motores nesta posição
 43      motorgarra.write(100);//abre: 60 //fechar:100
 44      motorcorpo.write(80);
 45      motorbraco_dir.write(175);//sobe:175 //desce:80
 46      motorbraco_esq.write(20);//sobe:20 //desce: 180
 47
 48      Serial.begin(9600);
 49
 50      delay(300);
 51
 52      error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);
 53
 54      /*Se você quiser usar o recurso de sensibilidade de pressão do botão, na linha de comando acima você irá definir isso como "true" e
 55        caso queira que o motor rumble esteja disponível para fornecer feedback, então você devrá definir isso para "true" também.  */
 56  }
 57
 58  /* Os botões com as formas coloridas também podem ser referidos pelos nomes:
 59     PSB_TRIANGLE, PSB_CIRCLE, PSB_CROSS, e PSB_SQUARE
 60     Os botões podem ser pressionados, pressionados e mantidos, ou pressionados com uma pressão variável,
 61     por isso há uma série de métodos que podem ser aplicados aos botões e joystick. Os métodos são:
 62     Button Pressed, Button, and Analog.
 63     Alguns exemplos:
 64     ps2x.ButtonPressed(PSB_RED) --> É para uma simples pressão do botão de círculo vermelho.
 65     ps2x.Button(PSB_PAD_DOWN)   --> É para o botão para baixo no pad sendo pressionado e mantido.
 66     ps2x.Analog(PSAB_CROSS)     --> É o comando para medir a pressão aplicada ao botão "X",
 67     se a sensibilidade à pressã tiver sido ativada. Como você pode ver a forma "PSAB" do nome foi usado para o botão.
 68     ps2x.Analog(PSS_RY)         --> É o comando para obter leituras fora do stick analógico direito na direção vertical.
 69  */
 70
 71  void loop()
 72  {
 73      if(error == 1)
 74      {
 75          setup();
 76          //return;
 77      }
 78      else
 79      {
 80          ps2x.read_gamepad(true, vibrate);
 81
 82          if(ps2x.Button(PSB_START))
 83          {
 84              reset();
 85          }
 86          if(ps2x.Button(PSB_SELECT))
 87          {
 88
 89          }
 90          if(ps2x.Button(PSB_PAD_UP))
 91          {
 92              braco_esq_sobe();
 93          }
 94          if(ps2x.Button(PSB_PAD_RIGHT))
 95          {
 96              corpodir();
 97          }
 98          if(ps2x.Button(PSB_PAD_LEFT))
 99          {
100              corpoesq();
101          }
102          if(ps2x.Button(PSB_PAD_DOWN))
103          {
104              braco_esq_desce();
105          }
106
107          vibrate = ps2x.Analog(PSAB_CROSS);
108
109          if (ps2x.NewButtonState())
110          {
111              if(ps2x.Button(PSB_L3))
112              {
113
114                  if (contgarra == 0)
115                  {
116                      contgarra 1;
117                      garra_abrir();
118                  }
119                  else
120                  {
121                      contgarra = 0;
122                      garra_fechar();
123                  }
124              }
125
126              if(ps2x.Button(PSB_L1))
127              {
128                  garra_abrir();
129              }
130              if(ps2x.Button(PSB_R1))
131              {
132                  garra_fechar();
133              }
134
135              if(ps2x.Button(PSB_TRIANGLE))//Triângulo - Acelera as velocidades
136              {
137                  if (Velocidade <20)
138                  {
139                      Velocidade = Velocidade + 1;
140                  }
141              }
142          }
143
144          if(ps2x.ButtonPressed(PSB_CIRCLE))  //Círculo - Abre a garra N graus
145          {
146              if (posicaogarra > 59)
147              {
148                  posicaogarra = posicaogarra - 2;
149                  motorgarra.write(posicaogarra);
150                  Serial.println("Posicao Garra");
151                  Serial.print(posicaogarra);
152              }
153          }
154
155          if(ps2x.NewButtonState(PSB_CROSS)) // Letra X - Fecha a garra N graus
156          {
157              if (posicaogarra <105 && posicaogarra >= 59)
158              {
159                  posicaogarra = posicaogarra + 2;
160                  motorgarra.write(posicaogarra);
161              }
162          }
163
164          if(ps2x.ButtonReleased(PSB_SQUARE)) // Quadrado - Reduz a velocidade
165          {
166              if (Velocidade != 1)
167              {
168                  Velocidade = Velocidade - 1;
169              }
170          }
171
172          // Alavanca esquerda
173          // Sentidos subir e descer - Início
174          if (ps2x.Analog(PSS_LY) == 0)
175          {
176              braco_esq_sobe();
177          }
178          if (ps2x.Analog(PSS_LY) == 255)
179          {
180              braco_esq_desce();
181          }
182
183          // Sentidos esquerdo e direito - Início
184          if (ps2x.Analog(PSS_LX) == 0)
185          {
186              corpoesq();
187          }
188          if (ps2x.Analog(PSS_LX) == 255)
189          {
190              corpodir();
191          }
192          //Fim
193          // Fim alavanca esquerda - Fim do código
194
195
196          // Alavanca direita código - Início
197          // Sentidos subir e descer - Início
198          if (ps2x.Analog(PSS_RY) == 0)
199          {
200              braco_dir_desce();
201          }
202          if (ps2x.Analog(PSS_RY) == 255)
203          {
204              braco_dir_sobe();
205          }
206          // Fim
207          // Fim alavanca direita - Fim do código
208      }
209      delay(20);
210  }
211 

212  void garra_abrir()
213  {
214      posicaogarra = 60;
215      motorgarra.write(60);

216  }
217
218  void garra_fechar()
219  {
220      posicaogarra = 100;
221      motorgarra.write(100);
222  }
223
224
225  void corpodir()
226  {
227      if (posicao_corpo > 0)
228      {
229          posicao_corpo = posicao_corpo - Velocidade;
230          motorcorpo.write(posicao_corpo);
231      }
232  }
233
234  void corpoesq()
235  {
236      if (posicao_corpo < 200)
237      {
238          posicao_corpo = posicao_corpo + Velocidade;
239          motorcorpo.write(posicao_corpo);
240      }
241  }
242 

243  // dir sobe:175 //desce:80
244  // esq sobe:20 //desce: 180
245
246  void braco_dir_sobe()
247  {
248      if (posicao_braco_dir > 81)
249      {
250          posicao_braco_dir = posicao_braco_dir - Velocidade;
251          motorbraco_dir.write(posicao_braco_dir);
252      }
253  }
254
255  void braco_dir_desce()
256  {
257      if (posicao_braco_dir <175)
258      {
259          posicao_braco_dir = posicao_braco_dir + Velocidade;
260          motorbraco_dir.write(posicao_braco_dir);
261      }
262  }
263
264
265  void braco_esq_desce()
266  {
267      if (posicao_braco_esq <181)
268      {
269          posicao_braco_esq = posicao_braco_esq + Velocidade;
270          motorbraco_esq.write(posicao_braco_esq);
271      }
272  }
273
274  void braco_esq_sobe()
275  {
276      if (posicao_braco_esq > 21)
277      {
278          posicao_braco_esq = posicao_braco_esq - Velocidade;
279          motorbraco_esq.write(posicao_braco_esq);
280      }
281  }
282
283
284  void reset()
285  {
286      motorgarra.write(100);
287      motorcorpo.write(85);
288      motorbraco_dir.write(175);
289      motorbraco_esq.write(20);
290      posicaogarra=100;
291  }


Depois de carregado, certamente será necessário fazer os ajustes da posição inicial, você pode fazer mecanicamente soltando os acoplamentos dos servos motores, eletronicamente ajustando o código para obter as informações dos servos motores pelo Monitor Serial ou a combinação dos dois.
Depois disso, podemos observar o fácil controle do braço robótico com o joystick que é simplesmente formidável.


Nenhum comentário:

Postar um comentário