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)
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