Carro Robô Autônomo 2WD

Carro Robô Autônomo 2WD



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

Carro Robô Autônomo 2WD

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.
Finalizada a montagem com a conexão dos fios, carregue o código:

  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(MotorDireitoAvanteOUTPUT); // IN1
 32      pinMode(MotorDireitoAtras,   OUTPUT); // IN2
 33      pinMode(MotorEsquerdoAvante, OUTPUT); // IN3
 34      pinMode(MotorEsquerdoAtrasOUTPUT); // 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(MotorDireitoAvanteLOW);  // 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(MotorDireitoAvanteHIGH); // IN1
145          digitalWrite(MotorDireitoAtras,   LOW);  // IN2
146          digitalWrite(MotorEsquerdoAvante, HIGH); // IN3
147          digitalWrite(MotorEsquerdoAtrasLOW);  // 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(MotorEsquerdoAtrasHIGH); // IN4
160      digitalWrite(MotorDireitoAvanteLOW);  // 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(MotorDireitoAvanteLOW);
171      digitalWrite(MotorEsquerdoAtras,   LOW);
172      analogWrite(enA, 80);
173      analogWrite(enB, 80);
174 
175  }
176 
177  void VirarEsquerda()
178  {
179      digitalWrite(MotorDireitoAvanteHIGH);
180      digitalWrite(MotorEsquerdoAtrasHIGH);
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.