Robô Seguidor de Linha (PID)
🎯 Objetivos de aprendizagem
- Construir e programar um robô que segue uma linha sozinho: ele lê uma régua de sensores de refletância e corrige a trajetória em tempo real com um controle proporcional-derivativo (PID) — desenvolvendo algoritmo, calibração de sensores e depuração.
🧭 Habilidades BNCC Computação (13)
Habilidades dos anos selecionados (7º ano, 8º ano, 9º ano, 1º ano (EM), 2º ano (EM), 3º ano (EM)) — Resolução CNE/CP nº 1/2022. Em turmas de Ensino Médio, mapear para EM13CO.
🧰 Materiais e componentes
🪜 Desenvolvimento da aula
Apresente o desafio: um robô que segue uma linha preta sozinho, sem controle remoto. Levante a pergunta: como ele 'enxerga' a linha e se corrige em tempo real?
1) Montar o chassi 3D, fixar os 2 motores e as rodas. 2) Ligar a Ponte H L298N ao Arduino (motor A: D9/D7/D8 · motor B: D3/D5/D4). 3) Ligar a régua de sensores (6 canais em A0–A3, D11 e D12; emissor no D13) e a alimentação: bateria de 9V no +12V do L298N, o 5V do L298N alimenta o Arduino e todos os GND no mesmo ponto (terra comum).
Carregar o código. Explicar a lógica: ler a POSIÇÃO da linha, calcular o ERRO (distância do centro) e corrigir com um controle PID. CALIBRAR passando os sensores sobre a linha e o fundo. Ajustar os ganhos (KP, KD) e a velocidade base.
Testar na pista. Depurar em equipe: se o robô oscila (zig-zag), baixe a velocidade base ou o ganho proporcional; se ele corta as curvas, aumente o ganho derivativo.
Roda de conversa: o que é um controle em 'malha fechada' (medir → corrigir → repetir)? Onde mais isso aparece no dia a dia (termostato, piloto automático, chuveiro elétrico)? Como melhorar o robô?
🔌 Montagem do robô
Placa: Arduino Uno
🖥️ Monitor serial
📋 Tabela de ligações (fio a fio)
🔧 Passo a passo de ligação
- Energia primeiro: ligue a bateria de 9V no +12V e no GND da Ponte H L298N. Depois ligue o +5V (saída regulada do L298N) ao 5V do Arduino e um GND do L298N ao GND do Arduino — o terra PRECISA ser comum.
- Régua de sensores: VCC no 5V do Arduino e GND no GND. As 6 saídas de sinal vão em A0, A1, A2, A3, D12 e D11; o pino do emissor (LEDON) vai em D13.
- Controle dos motores: ENA→D9, IN1→D7, IN2→D8 (motor A); IN3→D5, IN4→D4, ENB→D3 (motor B).
- Motores: o motor esquerdo nas saídas OUT1 e OUT2; o direito nas OUT3 e OUT4. Se algum girar ao contrário, basta inverter os dois fios daquele motor.
- Antes de energizar, confira: todos os GND no mesmo ponto? A bateria está só no +12V (nunca no 5V)? Então ligue o Arduino ao computador, envie o código e faça a calibração passando a régua sobre a linha e o fundo.
💻 Código
/*
* Robô Seguidor de Linha (PID) — Arduino UNO
* Driver: Ponte H L298N | Sensores: régua de refletância (QTR, 6 canais)
* Lê a posição da linha, calcula o erro e corrige a trajetória em tempo real (PID).
* (código original adaptado; comentários traduzidos para o português)
*/
// ===== Pinos do driver (Ponte H L298N) =====
#define PWMA 9 // ENA - velocidade do motor A
#define AIN2 8 // IN2 - direção do motor A
#define AIN1 7 // IN1 - direção do motor A
#define BIN1 5 // IN3 - direção do motor B
#define BIN2 4 // IN4 - direção do motor B
#define PWMB 3 // ENB - velocidade do motor B
int velocidadeBase = 250; // velocidade de cruzeiro (0 a 255)
int erro = 0; // erro atual (termo proporcional)
int derivada = 0;
int integral = 0;
int erroAnterior = 0;
float correcao;
#include <QTRSensors.h>
#define NUM_SENSORES 6
#define TIMEOUT 2500
#define PINO_EMISSOR 13 // liga os LEDs infravermelhos da régua
QTRSensorsRC qtr(
(unsigned char[]){17, 16, 15, 14, 12, 11}, // A3, A2, A1, A0, D12, D11
NUM_SENSORES,
TIMEOUT,
PINO_EMISSOR
);
unsigned int leiturasSensores[NUM_SENSORES];
unsigned int posicao = 0;
void setup() {
Serial.begin(115200);
pinMode(PWMA, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(PWMB, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
// Calibração: passe a régua sobre a linha preta e o fundo branco por alguns segundos
Serial.println("== CALIBRANDO ==");
digitalWrite(PINO_EMISSOR, HIGH);
for (int i = 0; i < 400; i++) {
qtr.calibrate();
delay(5);
}
digitalWrite(PINO_EMISSOR, LOW);
Serial.println("== PRONTO ==");
}
void loop() {
qtr.read(leiturasSensores);
posicao = qtr.readLine(leiturasSensores, QTR_EMITTERS_ON, 0);
erro = posicao - 3500; // 3500 = centro (régua de 6 sensores -> faixa 0..7000)
// ===== Monitor serial (depuração dos sensores) =====
Serial.print("POS: "); Serial.print(posicao);
Serial.print(" ERRO: "); Serial.print(erro);
Serial.print(" CORR: "); Serial.print(correcao);
Serial.print(" S: ");
for (int i = 0; i < NUM_SENSORES; i++) {
Serial.print(leiturasSensores[i]);
Serial.print(" ");
}
Serial.println();
// Linha bem à esquerda -> gira no lugar para reencontrá-la
if (erro < -3500) {
digitalWrite(AIN1, LOW); digitalWrite(AIN2, HIGH); analogWrite(PWMA, 255);
digitalWrite(BIN1, LOW); digitalWrite(BIN2, HIGH); analogWrite(PWMB, 255);
}
// Linha bem à direita -> gira no lugar para o outro lado
else if (erro > 3500) {
digitalWrite(AIN1, HIGH); digitalWrite(AIN2, LOW); analogWrite(PWMA, 255);
digitalWrite(BIN1, HIGH); digitalWrite(BIN2, LOW); analogWrite(PWMB, 255);
}
// Sobre a linha -> o controle PID ajusta as duas velocidades
else {
derivada = erro - erroAnterior;
integral = erro + erroAnterior;
correcao = (erro * 0.005) + (derivada * 15) + (integral * 0.125);
if (correcao > velocidadeBase) correcao = velocidadeBase;
if (correcao < -velocidadeBase) correcao = -velocidadeBase;
digitalWrite(AIN1, HIGH); digitalWrite(AIN2, LOW);
analogWrite(PWMA, velocidadeBase - correcao);
digitalWrite(BIN1, HIGH); digitalWrite(BIN2, LOW);
analogWrite(PWMB, velocidadeBase + correcao);
erroAnterior = erro;
}
delay(5); // evita saturar o monitor serial
}
🔀 Fluxograma do algoritmo
🧱 Algoritmo em blocos
quando @greenFlag for clicado
calibrar os sensores
sempre
ler a posição da linha
se <linha muito à esquerda> então
girar no lugar à esquerda
senão
se <linha muito à direita> então
girar no lugar à direita
senão
calcular a correção (PID)
ajustar a velocidade dos dois motores
end
end
end🖨️ Modelo 3D para impressão
Toque para ver em 3D · gire com o dedo.
🤖 Quer essa aula do SEU jeito?
O Co-professor adapta esta aula pro seu ano e contexto — ou a estica numa sequência didática de 2 a 4 encontros — e gera um PDF pronto pra você. A estrutura da aula é preservada. Cadastre-se grátis pra usar.
✨ Adaptar e gerar PDF💬 Comentários
Entre na sua conta ou crie uma grátis pra comentar.
Seja o primeiro a comentar.
Gostou desta aula?
Monte aulas como esta em minutos, com ajuda da IA — e compartilhe com professores do Brasil todo. É grátis.
Criar minha conta grátis📲 Compartilhar no WhatsApp