🤖 RoboFeed
Explorar aulas Entrar Comece grátis
🤖 Robótica

Robô Seguidor de Linha (PID)

👤 Weslley Barros 🏫 E.M. Abdalla 7º ano8º ano9º ano1º ano (EM)2º ano (EM)3º ano (EM) ⚡ Plugada
🔧 Modo Bancada · passo a passo, pro aluno no tablet

🎯 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)
🧠 Pensamento Computacional
EF67CO01 Aplicar técnicas de decomposição, abstração e reconhecimento de padrões na resolução de problemas computacionais e cotidianos.
EF67CO02 Elaborar e implementar algoritmos com estruturas de controle (sequência, seleção e repetição), utilizando variáveis e operadores lógicos.
EF67CO03 Representar dados e estados de um sistema usando fluxogramas, tabelas-verdade e diagramas de estado.
EF89CO01 Desenvolver projetos computacionais que integrem decomposição, abstração, generalização e avaliação crítica da solução proposta.
EF89CO02 Implementar algoritmos com funções/sub-rotinas, listas/arrays e leitura de sensores, em linguagens de blocos ou textuais (C++, Python).
💻 Mundo Digital
EF67CO04 Construir protótipos eletrônicos usando placas programáveis (Arduino, ESP32, micro:bit), sensores (ultrassônico, LDR, DHT) e atuadores (LED, servo, buzzer).
EF67CO05 Compreender como dados são representados no computador (binário, ASCII, imagem, áudio) e como circulam por redes (LAN, Wi-Fi, internet).
EF89CO03 Projetar e construir sistemas integrados que combinem hardware (placa, sensores, atuadores) e software (algoritmo) para resolver problemas reais.
EF89CO04 Avaliar arquiteturas de hardware (processador, memória, periféricos) e modelos de comunicação (cliente-servidor, IoT) em soluções tecnológicas.
🌐 Cultura Digital
EF67CO06 Analisar criticamente o uso das tecnologias digitais e sua influência no comportamento social, no consumo de informação e na privacidade.
EF67CO07 Identificar fontes confiáveis de informação em ambientes digitais, reconhecendo desinformação (fake news), deepfakes e manipulação algorítmica.
EF89CO05 Discutir aspectos éticos do uso de inteligência artificial (viés algorítmico, automação, direitos autorais, deepfakes) e propor princípios de uso responsável.
EF89CO06 Compreender legislações de proteção de dados (LGPD) e aplicar boas práticas de segurança digital, autoria e propriedade intelectual em produções escolares.

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

Arduino Uno
Arduino Uno
Ponte H (L298N)
Ponte H (L298N)
Régua de sensores de linha (QTR / IR, 6 canais)
Régua de sensores de linha (QTR / IR, 6 canais)
Motor DC com caixa de redução
Motor DC com caixa de redução
Roda + roda boba (esfera)
Roda + roda boba (esfera)
Bateria 9V (ou pack de pilhas)
Bateria 9V (ou pack de pilhas)
Chassi (impressão 3D)
Chassi (impressão 3D)
🧰
Pista: fita isolante preta sobre fundo branco
Jumpers, parafusos e interruptor
Jumpers, parafusos e interruptor
🪜 Desenvolvimento da aula
Introdução / Contextualização

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?

Montagem do Circuito / Hardware

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).

Programação / Codificação

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.

Teste, Depuração e Ajustes

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.

Encerramento / Socialização

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

⬇ baixar SVG
🧰 Montagem do robôPlaca: Arduino Uno · 4 componentes · 22 ligações detectadas do códigoUSBATMEGA328PLARDUINO UNOAREFGND131211109876543210DIGITAL (PWM ~)IOREFRESET3V35VGNDGNDVINPOWERA0A1A2A3A4A5ANALOG INArduino Uno⚡ Barramento de alimentação · 5V (+) / GND (–)D12 · leitura da linhaD11 · leitura da linhaD13 · liga os LEDs IRA0 · leitura da linhaA1 · leitura da linhaA2 · leitura da linhaA3 · leitura da linhaRégua de sensores(QTR, 6 canais)D9 · PWM velocidade AD7 · IN1 (direção A)D8 · IN2 (direção A)D5 · IN3 (direção B)D4 · IN4 (direção B)D3 · PWM velocidade BPonte H (L298N)OUT1·OUT2Motor DC esquerdoOUT3·OUT4Motor DC direitoLEGENDA DOS FIOSAlimentação (+5V)Terra (GND)DigitalAnalógico (leitura)PWM (velocidade)Saída de motor
🧰 Montagem do robôArduino Unoplaca controladoraRégua de sensores (QTR, 6…A0A1A2A3D12D11D135VGNDPonte H (L298N)D9D7D8D5D4D3bateria +GND5V (Arduino)Motor DC esquerdoOUT1OUT2Motor DC direitoOUT3OUT4
as peças reagem: LED acende, botão é clicável, serial abaixo
🖥️ Monitor serial

Energia: uma bateria de 9V entra no +12V da Ponte H L298N; o regulador de 5V do L298N alimenta o Arduino (5V). Todos os GND precisam ser comuns. A régua de sensores é alimentada pelo 5V e GND do Arduino.
📋 Tabela de ligações (fio a fio)
Sensores
Régua de sensores (QTR, 6 canais)
S1 (sinal) A0 leitura da linha
S2 (sinal) A1 leitura da linha
S3 (sinal) A2 leitura da linha
S4 (sinal) A3 leitura da linha
S5 (sinal) D12 leitura da linha
S6 (sinal) D11 leitura da linha
LEDON (emissor) D13 liga os LEDs IR
VCC (vermelho) 5V alimentação
GND (preto) GND terra
Sistema motor
Ponte H (L298N)
ENA D9 PWM velocidade A
IN1 D7 IN1 (direção A)
IN2 D8 IN2 (direção A)
IN3 D5 IN3 (direção B)
IN4 D4 IN4 (direção B)
ENB D3 PWM velocidade B
+12V bateria + alimentação dos motores
GND GND terra comum
+5V (saída) 5V (Arduino) 5V regulado alimenta o Arduino
Motor DC esquerdo
terminal + OUT1 (Ponte H) tração esq
terminal − OUT2 (Ponte H) tração esq
Motor DC direito
terminal + OUT3 (Ponte H) tração dir
terminal − OUT4 (Ponte H) tração dir
🔧 Passo a passo de ligação
  1. 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.
  2. 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.
  3. Controle dos motores: ENA→D9, IN1→D7, IN2→D8 (motor A); IN3→D5, IN4→D4, ENB→D3 (motor B).
  4. 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.
  5. 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

aula.ino
/*
 * 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

flowchart TD A(["Início"]) --> CAL["Calibrar os sensores"] CAL --> B["Ler a posição da linha"] B --> C{"Linha muito à esquerda?"} C -->|Sim| D["Girar no lugar (à esquerda)"] C -->|Não| E{"Linha muito à direita?"} E -->|Sim| F["Girar no lugar (à direita)"] E -->|Não| G["Calcular a correção (PID) e ajustar a velocidade de cada motor"] D --> B F --> B G --> B

🧱 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.

Chassi do seguidor
📥 Baixar STL 👁️ Tela cheia

🤖 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

Explorar mais aulas · RoboFeed — robótica e computação na escola, alinhado à BNCC.