Neste projeto, será possível desenvolver o seu próprio robô capaz de desviar dos obstáculos numa simples plataforma de acrílico. É uma ótima opção para aqueles que querem entrar no mundo
da robótica e abre várias possibilidades de aplicações com outros sensores nessa mesma plataforma. Basicamente serão aplicados simples conhecimentos no sensor ultrassônico HC-SR04, no Micro Servo 9g e, também, na Ponte H L298N.
Componentes:
- 01 Chassi completo com dois motores DC (3~6v), duas rodas de borracha, uma roda giratória, dois discos de encoder, um suporte para pilhas e um jogo de parafusos
- 01 Arduino
- 01 Arduino Sensor Shield
- 01 Sensor HC-SR04
- 01 Micro Servo 9g
- 01 Ponte H L298N
Após a montagem do chassi, faça a fixação do Arduino, do suporte de pilhas, da Ponte H, do Micro Servo e do Sensor Ultrassônico de acordo com a sua conveniência utilizando parafusos com auxílio dos orifícios do chassi, elásticos e até fitas adesivas.
Ao terminar a montagem dos componentes no chassi, conecte os fios conforme o esquema:
A fonte de alimentação fica a critério de cada um, podendo usar uma bateria de 9v para a Ponte H mais um suporte de pilhas para o Arduino ou uma outra fonte com bateria para a alimentação dois dois. Uma excelente sugestão é uma fonte com duas pilhas recarregáveis de 3,7V as quais alimentam muito bem tanto os motores quanto o Arduino com o Micro Servo. Neste projeto, foi utilizado um Arduino Mega com um Mega Shield Sensor v2.0, podendo utilizar o Arduino Uno a critério de cada um sem maiores problemas.
A fonte de alimentação fica a critério de cada um, podendo usar uma bateria de 9v para a Ponte H mais um suporte de pilhas para o Arduino ou uma outra fonte com bateria para a alimentação dois dois. Uma excelente sugestão é uma fonte com duas pilhas recarregáveis de 3,7V as quais alimentam muito bem tanto os motores quanto o Arduino com o Micro Servo. Neste projeto, foi utilizado um Arduino Mega com um Mega Shield Sensor v2.0, podendo utilizar o Arduino Uno a critério de cada um sem maiores problemas.
1 # include
<Servo.h> //
Ativa a biblioteca Servo Motor
2 #
include <NewPing.h> // Biblioteca do Sensor Ultrassônico
3
4 // Pinagem do L298N
5
6 #
define enA 4 // ENA
7 #
define MotorDireitoAvante 3 // IN1
8 #
define MotorDireitoAtras 2 // IN2
9
10 #
define enB 8 // ENB
11 #
define MotorEsquerdoAvante 7 // IN3
12 #
define MotorEsquerdoAtras 6 // IN4
13
14
15 // Pinagem do senssor ultrassônico
16 #
define trig_pin A0 // Trig no pino analógico A0
17 #
define echo_pin A1 // Echo no pino analógico A1
18
19 #
define dist_maxima 300
20
21 boolean Adiante = false;
22 int dist;
23
24 NewPing sonar(trig_pin, echo_pin, dist_maxima); // Inicializa o NewPing
25
26 Servo servo_motor; // Define servo_motor
27
28 void setup()
29 {
30 Serial.begin(9600);
31 pinMode(MotorDireitoAvante, OUTPUT); // IN1
32 pinMode(MotorDireitoAtras, OUTPUT); // IN2
33 pinMode(MotorEsquerdoAvante, OUTPUT); // IN3
34 pinMode(MotorEsquerdoAtras, OUTPUT); // IN4
35
36
37 servo_motor.attach(12); // Servo motor setado no
pino 12
38
39 servo_motor.write(115); // Ângulo inicial
calibrado para frente (Ângulo 0° relativo ao carro)
40 delay(2000);
41 dist = LerPing();
42 delay(100);
43 dist = LerPing();
44 delay(100);
45 dist = LerPing();
46 delay(100);
47 dist = LerPing();
48 delay(100);
49 }
50
51 void loop()
52 {
53
54 int dist_Direita = 0;
55 int dist_Esquerda = 0;
56 int dist_Adiante = 0;
57
58 if (dist <= 50)
59 {
60 Parar();
61 delay(500);
62 MoverAtras();
63 delay(500);
64 Parar();
65 dist_Direita = VarrerDireita();
66 delay(100);
67 dist_Esquerda = VarrerEsquerda();
68 delay(100);
69 dist_Direita = VarrerDireita();
70 delay(100);
71 dist_Esquerda = VarrerEsquerda();
72 delay(100);
73
74 if (dist_Direita
>= dist_Esquerda)
75 {
76 VirarDireita();
77 delay(400);
78 Parar();
79 delay(500);
80 dist = LerPing();
81 }
82 else
83 {
84 VirarEsquerda();
85 delay(400);
86 Parar();
87 delay(500);
88 dist = LerPing();
89 }
90 }
91 else
92 {
93 delay(100);
94 MoverAdiante();
95 }
96
97 dist = LerPing();
98
99 }
100
101 int VarrerDireita()
102 {
103
servo_motor.write(50);
104 int dist = LerPing();
105 delay(500);
106 dist = LerPing();
107
servo_motor.write(115);
108 return dist;
109 }
110
111 int VarrerEsquerda()
112 {
113
servo_motor.write(180);
114 int dist = LerPing();
115 delay(500);
116 dist = LerPing();
117
servo_motor.write(115);
118 return dist;
119 }
120
121 int LerPing()
122 {
123 int dist_cm = sonar.ping_cm();
124 Serial.println(dist_cm);
125 return dist_cm;
126 }
127
128 void Parar()
129 {
130
digitalWrite(MotorDireitoAvante, LOW); // IN1
131
digitalWrite(MotorDireitoAtras, LOW); // IN2
132
digitalWrite(MotorEsquerdoAvante, LOW); // IN3
133
digitalWrite(MotorDireitoAtras, LOW); // IN4
134 analogWrite(enA, 0);
135
analogWrite(enB, 0);
136 }
137
138 void MoverAdiante()
139 {
140 if(!Adiante)
141 {
142
Adiante = true;
143
144
digitalWrite(MotorDireitoAvante, HIGH); // IN1
145
digitalWrite(MotorDireitoAtras, LOW); // IN2
146
digitalWrite(MotorEsquerdoAvante, HIGH); // IN3
147
digitalWrite(MotorEsquerdoAtras, LOW); // IN4
148
analogWrite(enA, 100); //
Valor de 0 a 255
149
analogWrite(enB, 100);
150
151 }
152 }
153
154 void MoverAtras()
155 {
156 Adiante
= false;
157
158
digitalWrite(MotorDireitoAtras, HIGH); // IN2
159
digitalWrite(MotorEsquerdoAtras, HIGH); // IN4
160
digitalWrite(MotorDireitoAvante, LOW); // IN1
161
digitalWrite(MotorEsquerdoAvante, LOW); // IN3
162
analogWrite(enA, 80);
163
analogWrite(enB, 80);
164 }
165
166 void VirarDireita()
167 {
168
digitalWrite(MotorDireitoAtras, HIGH);
169
digitalWrite(MotorEsquerdoAvante, HIGH);
170
digitalWrite(MotorDireitoAvante, LOW);
171
digitalWrite(MotorEsquerdoAtras, LOW);
172
analogWrite(enA, 80);
173
analogWrite(enB, 80);
174
175 }
176
177 void VirarEsquerda()
178 {
179
digitalWrite(MotorDireitoAvante, HIGH);
180
digitalWrite(MotorEsquerdoAtras, HIGH);
181
digitalWrite(MotorDireitoAtras, LOW);
182
digitalWrite(MotorEsquerdoAvante, LOW);
183
analogWrite(enA, 80);
184
analogWrite(enB, 80);
185
186 }
Feito isso, podemos ligar o carro e observar seu deslocamento até encontrar um obstáculo, quando o mesmo faz uma parada, anda um pouco atrás, faz a leitura duas vezes de ambos os lados, compara, gira para o lado onde a distância é maior e reinicia seu movimento.