Robô Seguidor de Linha com 2 Sensores Infravermelhos
Robô autônomo · Sensores IV · Ponte H · Decisão por leitura múltipla
O que vamos conseguir fazer
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).
Peças e materiais · parte 1
Arduino Uno + cabo USB
1×
Sensores infravermelhos TCRT5000 (módulo)
2×
Módulo Ponte H L298N
1×
Motores DC com caixa de redução + rodas
2×
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
1×
Jumpers macho-macho e macho-fêmea
Peças e materiais · parte 2
Fita isolante PRETA (pra fazer a pista)
Cartolina branca grande (base da pista)
O mapa do nosso robô
cada fio colorido é uma ligação de verdade — o diagrama completo está na página da aula
Introduçã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 / 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.
Montagem / Hardware
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.
Montagem / Hardware
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
Compile o código.
Antes de enviar, eleve o robô do chão (rodas no ar) — vai ser teste.
Envie pro Arduino.
Com o robô no ar, abra o Monitor Serial pra ver as leituras dos sensores.
Programação
Passe fita preta na frente de um sensor de cada vez — confira se a roda do lado certo para.
Ajuste o limiar dos sensores girando o trimpot até funcionar bem.
Teste e ajustes
Construa a pista: fita isolante PRETA sobre cartolina BRANCA, com curvas suaves.
Coloque o robô na pista com os sensores sobre a linha.
Espera-se que ele siga a linha — corrigindo quando sai pra um lado.
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.
Teste e ajustes
Variação: faça curvas em zigue-zague e cruzamentos.
Encerramento
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.
Como ele decide o que fazer
O código da aula
// 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);
}
role dentro da caixa · o código completo está na página da aula
🥊
Bora construir!
dúvidas? a página completa da aula tem tudo: montagem, código e materiais.