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ça | Para quê |
|---|---|---|
| 1 | Arduino Uno (ou compatível) com cabo USB | O cérebro: roda o código. |
| 1 | Driver TB6612FNG (ou L298N) | Dá a potência aos motores. |
| 2 | Motorredutores TT com roda | Movem o robô; um de cada lado. |
| 1 | Roda boba | Segura a parte de trás. |
| 1 | Chassi de acrílico | A base onde vai tudo. |
| 1 | Sensor HC-SR04 | Mede a distância até o que está à frente. |
| 1 | Suporte para 4 pilhas AA (6 V) com chave | Alimenta só os motores. |
| 1 | Power bank USB | Alimenta o Arduino, separado dos motores. |
| 1 | Mini protoboard e jumpers | Para ligar sem soldar. |
As ligações
| De | Para | Por quê |
|---|---|---|
| HC-SR04 VCC / GND | Arduino 5V / GND | Alimenta o sensor. |
| HC-SR04 Trig | Arduino pino 7 | O Arduino pede para medir. |
| HC-SR04 Echo | Arduino pino 8 | O sensor devolve o tempo do eco. |
| TB6612FNG VCC | Arduino 5V | A lógica do driver. |
| TB6612FNG VM | + do suporte de pilhas | A potência dos motores. |
| TB6612FNG GND | GND do Arduino e − das pilhas | Terra comum: sem ela, os sinais não se entendem. |
| AIN1, AIN2, PWMA | Pinos 2, 4 e 5 | Sentido e velocidade do motor esquerdo. |
| BIN1, BIN2, PWMB | Pinos 10, 11 e 6 | Sentido e velocidade do motor direito. |
| STBY | Pino 12 | Em HIGH, o driver trabalha. |
| AO1 / AO2 e BO1 / BO2 | Motor esquerdo e direito | A saída de potência para cada motor. |
O código
// 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.