Pular para o conteúdo
RobotVisual

Projeto final: um robô que desvia de obstáculos

Aqui se junta tudo da trilha: um sensor que mede, um microcontrolador que decide, um driver que dá a potência e dois motores. Monte em 3D, teste na pista e depois faça de verdade.

Carregando a cena 3D

O que você precisa

Sem preços: mudam por loja e por país. Muitos kits de "robô de 2 rodas" já trazem o chassi, os motores, as rodas e o suporte de pilhas.

Qtd.PeçaPara quê
1Arduino Uno (ou compatível) com cabo USBO cérebro: roda o código.
1Driver TB6612FNG (ou L298N)Dá a potência aos motores.
2Motorredutores TT com rodaMovem o robô; um de cada lado.
1Roda bobaSegura a parte de trás.
1Chassi de acrílicoA base onde vai tudo.
1Sensor HC-SR04Mede a distância até o que está à frente.
1Suporte para 4 pilhas AA (6 V) com chaveAlimenta só os motores.
1Power bank USBAlimenta o Arduino, separado dos motores.
1Mini protoboard e jumpersPara ligar sem soldar.

As ligações

DeParaPor quê
HC-SR04 VCC / GNDArduino 5V / GNDAlimenta o sensor.
HC-SR04 TrigArduino pino 7O Arduino pede para medir.
HC-SR04 EchoArduino pino 8O sensor devolve o tempo do eco.
TB6612FNG VCCArduino 5VA lógica do driver.
TB6612FNG VM+ do suporte de pilhasA potência dos motores.
TB6612FNG GNDGND do Arduino e − das pilhasTerra comum: sem ela, os sinais não se entendem.
AIN1, AIN2, PWMAPinos 2, 4 e 5Sentido e velocidade do motor esquerdo.
BIN1, BIN2, PWMBPinos 10, 11 e 6Sentido e velocidade do motor direito.
STBYPino 12Em HIGH, o driver trabalha.
AO1 / AO2 e BO1 / BO2Motor esquerdo e direitoA saída de potência para cada motor.

O código

Sketch do robô (Arduino IDE)
// Robô que desvia de obstáculos: Arduino Uno + TB6612FNG + HC-SR04
const int TRIG = 7, ECHO = 8;
const int AIN1 = 2, AIN2 = 4, PWMA = 5;    // motor esquerdo
const int BIN1 = 10, BIN2 = 11, PWMB = 6;  // motor direito
const int STBY = 12;                       // standby do driver

void setup() {
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
  int pinos[] = {AIN1, AIN2, PWMA, BIN1, BIN2, PWMB, STBY};
  for (int p : pinos) pinMode(p, OUTPUT);
  digitalWrite(STBY, HIGH);  // tira o driver do modo de espera
  Serial.begin(9600);
}

long distanciaCm() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);  // pulso de 10 µs: "meça"
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  long us = pulseIn(ECHO, HIGH, 30000);  // espera o eco até 30 ms
  if (us == 0) return 400;               // sem eco: caminho livre
  return us / 58;                        // µs / 58 = cm
}

// vel de -255 (trás) a 255 (frente)
void motor(int in1, int in2, int pwm, int vel) {
  digitalWrite(in1, vel > 0);
  digitalWrite(in2, vel < 0);
  analogWrite(pwm, abs(vel));
}

void mover(int esq, int dir) {
  motor(AIN1, AIN2, PWMA, esq);
  motor(BIN1, BIN2, PWMB, dir);
}

void loop() {
  long d = distanciaCm();
  Serial.println(d);
  if (d < 20) {
    mover(-150, -150);  // recua
    delay(300);
    mover(150, -150);   // vira no lugar
    delay(350);
  } else {
    mover(180, 180);    // para frente
  }
  delay(50);
}
  • distanciaCm() faz o mesmo que o laboratório do HC-SR04: pulso de 10 µs, espera o eco e divide por 58.
  • motor() usa a ponte H do driver: um pino para cada sentido e PWM para a velocidade.
  • Se um motor girar ao contrário, não mude o código: inverta os dois fios dele no driver.

Se algo falhar

O Arduino reinicia quando os motores arrancam
Os motores e o Arduino dividem as pilhas. Alimente o Arduino pelo USB e os motores pelo suporte de pilhas.
Os motores não se mexem
Confira se o STBY está em HIGH, se a chave das pilhas está ligada e se os terras estão unidos.
O sensor sempre marca 0 ou 400
O Trig e o Echo podem estar trocados, ou o sensor aponta para algo macio ou inclinado.
O robô anda em círculos
Um motor é mais rápido que o outro. Baixe um pouco a velocidade do mais rápido em mover().
Vai para trás quando deveria ir para frente
Inverta os dois fios desse motor no driver.

Antes de ligar as pilhas, leia a seção de segurança. Ver segurança e falhas comuns.