Neste projeto, desenvolveremos um carro robótico autônomo capaz de desviar dos obstáculos numa
simples plataforma de acrílico e, também, com uma outra opção de controle manual via bluetooth.
Componentes:
- 01 Chassi completo com quatro motores DC (3~6v) com caixa de redução, quatro rodas de borracha, um suporte para pilhas e um jogo de parafusos
- 01 Arduino Uno/Mega
- 01 Arduino Sensor Shield(opcional)
- 01 Sensor HC-SR04
- 01 Micro Servo 9g
- 01 Ponte H L298N
- 01 Módulo Bluetooth HC-06
Monte com calma os componentes no chassi e faça a ligação conforme o esquema abaixo:
Feito isso, carregue o seguinte código:
1 # include <SoftwareSerial.h>
2 #
include <string.h>
3
4 #
define enA 2 // ENA
5 #
define MotorDireitoAvante 3 // IN1
6 #
define MotorDireitoAtras 4 // IN2
7
8 #
define enB 8 // ENB
9 #
define MotorEsquerdoAvante 6 // IN3
10 #
define MotorEsquerdoAtras 7 // IN4
11
12 #
define pinRx 0 // RX do
Arduino
13 #
define pinTx 1 // TX do
Arduino
14
15 int veloc = 0;
16 int v1 = 0;
17 char dir;
18 String modo;
19
20 String StringRecebido;
21
22 void MoverAdiante(int veloc);
23 void MoverAtras(int veloc);
24 void left(int veloc);
25 void VirarEsquerda(int veloc);
26 void VirarDireita(int veloc);
27 void Parar();
28 int Acelerar() ;
29 int Desacelerar();
30
31 #
include <Servo.h> // Ativa a bibliateca Servo Motor
32 #
include <NewPing.h> // Biblioteca
do Sensor Ultrassônico
33 #
define trig_pin A0 // Trig no pino analógico A1
34 #
define echo_pin A1 // Echo no pino analógico A2
35
36 #
define dist_maxima 300
37
38 int dist;
39
40 int VarrerDireita();
41 int VarrerEsquerda();
42 int LerPing();
43
44 NewPing sonar(trig_pin, echo_pin, dist_maxima);
45 Servo servo_motor;
46
47 void setup()
48 {
49 Serial.begin(9600);
50 pinMode(pinRx, INPUT);
51 pinMode(pinTx, OUTPUT);
52 pinMode(MotorDireitoAvante, OUTPUT); // IN1
53 pinMode(MotorDireitoAtras, OUTPUT); // IN2
54 pinMode(MotorEsquerdoAvante, OUTPUT); // IN3
55 pinMode(MotorEsquerdoAtras, OUTPUT); // IN4
56 servo_motor.attach(12);
57 servo_motor.write(80);
58 delay(2000);
59 dist = LerPing();
60 delay(100);
61 dist = LerPing();
62 delay(100);
63 dist = LerPing();
64 delay(100);
65 dist = LerPing();
66 delay(100);
67 dir = 'F';
68 modo = "auto";
69 }
70 void loop()
71 {
72 if(Serial.available())
73 {
74 delay(100);
75 StringRecebido = "";
76 while(Serial.available())
77 {
78 char c = Serial.read();
79 StringRecebido += c;
80 delay(5);
81 }
82 Serial.println(StringRecebido);
83 }
84 if(StringRecebido
== "downAdiante"
&& modo == "manual")
85 {
86 MoverAdiante(veloc);
87 dir = 'F';
88 }
89 if(StringRecebido
== "upAdiante"
&& modo == "manual")
90 {
91
92 }
93 if(StringRecebido
== "downAtras"
&& modo == "manual")
94 {
95 MoverAtras(veloc);
96 dir = 'R';
97 }
98 if(StringRecebido
== "upAtras"
&& modo == "manual")
99 {
100
101 }
102 if(StringRecebido == "downEsquerda" && modo == "manual")
103 {
104
VirarEsquerda(veloc);
105 }
106 if(StringRecebido == "upEsquerda" && modo == "manual")
107 {
108 if(dir == 'F')
109 {
110
MoverAdiante(veloc);
111 }
112 if(dir == 'R')
113 {
114
MoverAtras(veloc);
115 }
116 }
117 if(StringRecebido == "downDireita" && modo == "manual")
118 {
119
VirarDireita(veloc);
120 }
121 if(StringRecebido == "upDireita" && modo == "manual")
122 {
123 if(dir == 'F')
124 {
125
MoverAdiante(veloc);
126 }
127 if(dir == 'R')
128 {
129
MoverAtras(veloc);
130 }
131 }
132 if(StringRecebido == "downAcel" && modo == "manual")
133 {
134
veloc = Acelerar(v1);
135
delay(30);
136 v1 = veloc;
137 if(dir == 'F')
138 {
139
MoverAdiante(veloc);
140 }
141
142 if(dir == 'R')
143 {
144
MoverAtras(veloc);
145 }
146 }
147
148 if(StringRecebido == "upAcel" && modo == "manual")
149 {
150
151 }
152 if(StringRecebido == "downDesacel" && modo == "manual")
153 {
154
veloc = Desacelerar(v1);
155
delay(30);
156 v1 = veloc;
157 if(dir == 'F')
158 {
159
MoverAdiante(veloc);
160 }
161
162 if(dir == 'R')
163 {
164
MoverAtras(veloc);
165 }
166 }
167 if(StringRecebido == "upDesacel" && modo == "manual")
168 {
169
170 }
171 if(StringRecebido == "Auto")
172 {
173
Parar();
174
modo = "auto";
175
delay(2000);
176
StringRecebido = "";
177 }
178 if(StringRecebido == "Manual")
179 {
180
modo = "manual";
181
Parar();
182
veloc = 0;
183 }
184 if(StringRecebido == "B1")
185 {
186
187 }
188 if(StringRecebido == "b1")
189 {
190
191 }
192 if(StringRecebido == "B2")
193 {
194
195 }
196 if(StringRecebido == "b2")
197 {
198
199 }
200 if(StringRecebido == "B3")
201 {
202
203 }
204 if(StringRecebido == "b3")
205 {
206
207 }
208 if(modo == "auto")
209 {
210 int dist_Direita = 0;
211 int dist_Esquerda = 0;
212 int dist_Adiante = 0;
213
214 if (dist <= 50)
215 {
216
Parar();
217
delay(500);
218
MoverAtras(130);
219
delay(400);
220
Parar();
221
dist_Direita = VarrerDireita();
222
delay(100);
223
dist_Esquerda = VarrerEsquerda();
224
delay(100);
225
dist_Direita = VarrerDireita();
226
delay(100);
227
dist_Esquerda = VarrerEsquerda();
228
delay(100);
229
230
if (dist_Direita >= dist_Esquerda)
231
{
232
VirarDireita(130);
233
delay(800);
234
Parar();
235
delay(500);
236
dist = LerPing();
237
}
238
else
239
{
240
VirarEsquerda(130);
241
delay(800);
242
Parar();
243
delay(500);
244
dist = LerPing();
245
}
246 }
247 else
248 {
249
delay(100);
250
MoverAdiante(140);
251 }
252
dist = LerPing();
253 }
254 }
255 int Acelerar(int v)
256 {
257 v = v + 5;
258 if(v >255)
259 {
260 v = 255;
261 }
262 return v;
263 }
264 int Desacelerar(int v)
265 {
266 v = v - 5;
267 if(v < 0)
268 {
269 v = 0;
270 }
271 return v;
272 }
273 void MoverAdiante(int veloc)
274 {
275
digitalWrite(MotorDireitoAvante, HIGH); // IN1
276
digitalWrite(MotorDireitoAtras, LOW); // IN2
277
digitalWrite(MotorEsquerdoAvante, HIGH); // IN3
278
digitalWrite(MotorEsquerdoAtras, LOW); // IN4
279
analogWrite(enA, veloc);
280 analogWrite(enB, veloc);
281 }
282 void MoverAtras(int veloc)
283 {
284
digitalWrite(MotorDireitoAtras, HIGH); // IN2
285
digitalWrite(MotorEsquerdoAtras, HIGH); // IN4
286
digitalWrite(MotorDireitoAvante, LOW); // IN1
287
digitalWrite(MotorEsquerdoAvante, LOW); // IN3
288
analogWrite(enA, veloc);
289
analogWrite(enB, veloc);
290 }
291 void VirarEsquerda(int veloc)
292 {
293
digitalWrite(MotorDireitoAvante, HIGH);
294
digitalWrite(MotorEsquerdoAtras, HIGH);
295
digitalWrite(MotorDireitoAtras, LOW);
296
digitalWrite(MotorEsquerdoAvante, LOW);
297
analogWrite(enA, veloc);
298
analogWrite(enB, veloc);
299 }
300 void VirarDireita(int veloc)
301 {
302
digitalWrite(MotorDireitoAtras, HIGH);
303
digitalWrite(MotorEsquerdoAvante, HIGH);
304
digitalWrite(MotorDireitoAvante, LOW);
305
digitalWrite(MotorEsquerdoAtras, LOW);
306
analogWrite(enA, veloc);
307
analogWrite(enB, veloc);
308 }
309 void Parar()
310 {
311
digitalWrite(MotorDireitoAvante, LOW); // IN1
312
digitalWrite(MotorDireitoAtras, LOW); // IN2
313
digitalWrite(MotorEsquerdoAvante, LOW); // IN3
314
digitalWrite(MotorDireitoAtras, LOW); // IN4
315
analogWrite(enA, 0);
316
analogWrite(enB, 0);
317 }
318 int VarrerDireita()
319 {
320
servo_motor.write(0);
321 int dist = LerPing();
322 delay(500);
323 dist = LerPing();
324
servo_motor.write(80);
325 return dist;
326 }
327 int VarrerEsquerda()
328 {
329
servo_motor.write(180);
330 int dist = LerPing();
331 delay(500);
332 dist = LerPing();
333
servo_motor.write(80);
334 return dist;
335 }
336 int LerPing()
337 {
338 int dist_cm = sonar.ping_cm();
339 Serial.println(dist_cm);
340 return dist_cm;
341 }
Partindo para a próxima etapa, faça seu aplicativo no App Inventor conforme os blocos mostrados na figura abaixo:
Depois de instalar o aplicativo Android no seu celular, podemos ligar o carro robô, percebemos que ele inicia o movimento no modo autônomo. Quando apertamos o botão "manual" ele para imediatamente, então pressionamos o botão "+" para acelerar e "-" para desacelerar combinando com os outro botões para controlar a direção e mais o botão de parada quando a mesma se torna necessária.
Com isso, concluímos que esse projeto não é tão difícil como aparenta e ao mesmo tempo muito interessante com a possibilidade de fazer várias alterações com a inclusão de outros sensores aproveitado a mesma plataforma.
Com isso, concluímos que esse projeto não é tão difícil como aparenta e ao mesmo tempo muito interessante com a possibilidade de fazer várias alterações com a inclusão de outros sensores aproveitado a mesma plataforma.