Carro Robótico 4WD + Bluetooth

Carro Robótico 4WD + Bluetooth

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 
Quanto à escolha do Arduino, fica a critério de cada um com uma sugestão do Arduino Mega, pois se futuramente você quiser adicionar outros sensores, terá uma gama maior de opções.
Monte com calma os componentes no chassi e faça a ligação conforme o esquema abaixo:

Carro Robótico 4WD + Bluetooth


Feito isso, carregue o seguinte código:
  
  # 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(MotorDireitoAvanteOUTPUT); // IN1
 53      pinMode(MotorDireitoAtras,   OUTPUT); // IN2
 54      pinMode(MotorEsquerdoAvante, OUTPUT); // IN3
 55      pinMode(MotorEsquerdoAtrasOUTPUT); // 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(MotorDireitoAvanteHIGH); // IN1
276      digitalWrite(MotorDireitoAtras,   LOW);  // IN2
277      digitalWrite(MotorEsquerdoAvante, HIGH); // IN3
278      digitalWrite(MotorEsquerdoAtrasLOW);  // IN4
279      analogWrite(enA, veloc);
280      analogWrite(enB, veloc);
281  }
282  void MoverAtras(int veloc)
283  {
284      digitalWrite(MotorDireitoAtras,   HIGH); // IN2
285      digitalWrite(MotorEsquerdoAtrasHIGH); // IN4
286      digitalWrite(MotorDireitoAvanteLOW);  // IN1
287      digitalWrite(MotorEsquerdoAvante, LOW);  // IN3
288      analogWrite(enA, veloc);
289      analogWrite(enB, veloc);
290  }
291  void VirarEsquerda(int veloc)
292  {
293      digitalWrite(MotorDireitoAvanteHIGH);
294      digitalWrite(MotorEsquerdoAtrasHIGH);
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(MotorDireitoAvanteLOW);
305      digitalWrite(MotorEsquerdoAtrasLOW);
306      analogWrite(enA, veloc);
307      analogWrite(enB, veloc);
308  }
309  void Parar()
310  {
311      digitalWrite(MotorDireitoAvanteLOW);  // 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.


4 comentários:

  1. Boa tarde, achei ótimo seu projeto era o eu estava procurando mas nao consegui colocar pra funcionar no hardware que eu tenho, uso wifi em vez do Bluetooth é muito difícil mudar isso?

    ResponderExcluir
  2. O APLICATIVO NAO QUER TOCAR MEU ANDROID E 4.1.2

    ResponderExcluir
  3. E PARA ANDROID MAIS FORT ,OU CONSEGUE FAZER UM APLICATIVO PARA ANDROID 4.1.2

    ResponderExcluir
  4. ola eu gosto do seu projeto, parabenizo você infelizmente o aplicativo não está funcionando isso desatualizado você poderia atualizá-lo por favor

    ResponderExcluir