Robô Seguidor de Linha com 2 Sensores Infravermelhos
Robô autônomo · Sensores IV · Ponte H · Decisão por leitura múltipla
- • Construir um robô móvel autônomo capaz de seguir uma linha preta no chão.
- • Programar a lógica de decisão com base na leitura de 2 sensores simultâneos.
- • Compreender o princípio do sensor TCRT5000 (reflexão de luz infravermelha).
- • Controlar motores DC com a ponte H L298N (sentido + velocidade).
• 1× Arduino Uno + cabo USB • 2× Sensores infravermelhos TCRT5000 (módulo) • 1× Módulo Ponte H L298N • 2× Motores DC com caixa de redução + rodas • 1× Roda boba (3ª roda traseira) • 1× Chassi (acrílico, MDF ou papelão duro) • 1× Suporte de 4 pilhas AA (6V) — alimenta a Ponte H • Jumpers macho-macho e macho-fêmea • Fita isolante PRETA (pra fazer a pista) • Cartolina branca grande (base da pista)
Introdução / Contextualização
Mostre vídeos curtos de robôs seguidores de linha em competições e fábricas (AGVs). Discuta a diferença entre 'pré-programado' (faz sempre a mesma coisa) e 'autônomo' (decide em tempo real). Apresente os componentes na bancada: sensor IV (mostra a luz vermelha que ele emite quando ligado), Ponte H (explique a expressão 'ponte' — permite inverter o sentido), motores DC. Princípio do sensor IV: emite luz IV e mede o quanto reflete. Superfície preta absorve → pouco retorna → leitura 0. Superfície branca reflete → muito retorna → leitura 1. Mostre o trimpot do sensor pra calibrar o limiar. Explique a Ponte H: 4 pinos de controle (IN1-IN4) decidem o sentido, 2 pinos PWM (ENA, ENB) decidem a velocidade. Mostre como combinações de HIGH/LOW invertem o motor.
Montagem do Circuito / Hardware
AULA 1 (sem sensores ainda): 1. Monte o chassi com os 2 motores e a roda boba. 2. Conecte os motores aos terminais OUT1/OUT2 e OUT3/OUT4 da Ponte H. 3. Ligue o suporte de pilhas (6V) na entrada VCC da Ponte H, e a chave de alimentação. 4. Ligue GND da Ponte H ao GND do Arduino. 5. Conecte IN1, IN2, IN3, IN4, ENA, ENB nos pinos do Arduino conforme código. AULA 2 (sensores): 6. Fixe os 2 sensores na FRENTE do chassi, a ~1 cm do chão, separados por ~3 cm. 7. VCC dos sensores → 5V do Arduino. GND → GND. OUT esquerdo → A0. OUT direito → A1.
Programação / Codificação
1. Compile o código. 2. Antes de enviar, eleve o robô do chão (rodas no ar) — vai ser teste. 3. Envie pro Arduino. 4. Com o robô no ar, abra o Monitor Serial pra ver as leituras dos sensores. 5. Passe fita preta na frente de um sensor de cada vez — confira se a roda do lado certo para. 6. Ajuste o limiar dos sensores girando o trimpot até funcionar bem.
Teste, Depuração e Ajustes
1. Construa a pista: fita isolante PRETA sobre cartolina BRANCA, com curvas suaves. 2. Coloque o robô na pista com os sensores sobre a linha. 3. Espera-se que ele siga a linha — corrigindo quando sai pra um lado. 4. Erros comuns: sensores muito altos (não detectam), motores invertidos (anda pra trás), velocidade muito alta (ele 'pula' a linha). Diminua VELOCIDADE pra 100 pra estabilizar. 5. Variação: faça curvas em zigue-zague e cruzamentos.
Encerramento / Socialização
Competição: cada equipe corre seu robô na mesma pista. Cronometre. Discussão final: 'O que faria seu robô melhor?'. Anotem ideias: mais sensores, PWM dinâmico, PID. Conexão com a realidade: AGVs em armazéns Amazon, robôs Mars Rover, Roomba — todos usam o mesmo princípio (sensor → decisão → atuador), só com sensores mais sofisticados.
// Robô seguidor de linha
// 2 sensores IV: pinos A0 (esquerdo) e A1 (direito)
// Ponte H L298N: motor esquerdo (IN1=2, IN2=3, ENA=5)
// motor direito (IN3=4, IN4=7, ENB=6)
// Sensores: leitura digital — 0 = linha preta, 1 = fora da linha
const int SENSOR_ESQ = A0;
const int SENSOR_DIR = A1;
// Motor esquerdo
const int M_ESQ_IN1 = 2;
const int M_ESQ_IN2 = 3;
const int M_ESQ_PWM = 5; // ENA
// Motor direito
const int M_DIR_IN3 = 4;
const int M_DIR_IN4 = 7;
const int M_DIR_PWM = 6; // ENB
const int VELOCIDADE = 150; // 0–255 (PWM)
void setup() {
pinMode(SENSOR_ESQ, INPUT);
pinMode(SENSOR_DIR, INPUT);
pinMode(M_ESQ_IN1, OUTPUT);
pinMode(M_ESQ_IN2, OUTPUT);
pinMode(M_DIR_IN3, OUTPUT);
pinMode(M_DIR_IN4, OUTPUT);
Serial.begin(9600);
}
void frente() {
digitalWrite(M_ESQ_IN1, HIGH); digitalWrite(M_ESQ_IN2, LOW);
digitalWrite(M_DIR_IN3, HIGH); digitalWrite(M_DIR_IN4, LOW);
analogWrite(M_ESQ_PWM, VELOCIDADE);
analogWrite(M_DIR_PWM, VELOCIDADE);
}
void viraEsquerda() {
digitalWrite(M_ESQ_IN1, LOW); digitalWrite(M_ESQ_IN2, LOW); // para esq
digitalWrite(M_DIR_IN3, HIGH); digitalWrite(M_DIR_IN4, LOW); // dir frente
analogWrite(M_DIR_PWM, VELOCIDADE);
}
void viraDireita() {
digitalWrite(M_ESQ_IN1, HIGH); digitalWrite(M_ESQ_IN2, LOW); // esq frente
digitalWrite(M_DIR_IN3, LOW); digitalWrite(M_DIR_IN4, LOW); // para dir
analogWrite(M_ESQ_PWM, VELOCIDADE);
}
void parar() {
analogWrite(M_ESQ_PWM, 0);
analogWrite(M_DIR_PWM, 0);
}
void loop() {
int esq = digitalRead(SENSOR_ESQ);
int dir = digitalRead(SENSOR_DIR);
// Lógica:
// Ambos brancos (1,1) → reta → frente
// Esq preto, dir branco (0,1) → desviou pra direita → vira esquerda
// Esq branco, dir preto (1,0) → desviou pra esquerda → vira direita
// Ambos pretos (0,0) → cruzamento ou fim → para
if (esq == 1 && dir == 1) frente();
else if (esq == 0 && dir == 1) viraEsquerda();
else if (esq == 1 && dir == 0) viraDireita();
else parar();
delay(20);
}
quando @greenFlag for clicado
sempre
se <ambos os sensores livres> então
seguir em frente
senão
se <sensor esquerdo na linha> então
virar à esquerda
senão
se <sensor direito na linha> então
virar à direita
senão
parar
end
end
end
endVocê chegou ao fim! 🎉
O que foi mais difícil? O que você faria diferente? Conte pra turma!