RoboFeed
Robótica

Seguidor de Linha · 4 sensores TCRT5000

por Weslley Barros E.M. Abdalla 7º ano8º ano9º ano1º ano (EM)2º ano (EM)3º ano (EM) Plugada
▶ Apresentar slide interativo · tela cheia, pra projetar 🔧 Modo Bancada · passo a passo, pro aluno no tablet

🎯 Objetivos de aprendizagem

  • Construir e programar um robô que segue uma linha usando 4 sensores TCRT5000 e um driver TB6612, corrigindo a rota em tempo real com um PID proporcional-derivativo — calibração, ajuste de ganhos 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

1×
Arduino Uno
Arduino Uno
1×
🧰
Driver de motor TB6612FNG
4×
Sensor de linha TCRT5000
Sensor de linha TCRT5000
2×
Motor DC com caixa de redução
Motor DC com caixa de redução
1×
Roda + roda boba (esfera)
Roda + roda boba (esfera)
1×
Bateria 9V (ou pack de pilhas)
Bateria 9V (ou pack de pilhas)
1×
Chassi (impressão 3D)
Chassi (impressão 3D)
1×
🧰
Pista: fita isolante preta sobre fundo branco
1×
Jumpers, parafusos e interruptor
Jumpers, parafusos e interruptor
🪜 Desenvolvimento da aula
Introdução / Contextualização

Apresente o desafio: um robô que segue uma linha sozinho usando só 4 sensores. Pergunta: como ele decide para que lado corrigir, com tão poucos sensores?

Montagem do Circuito / Hardware

1) Montar o chassi, fixar os 2 motores e as rodas. 2) Ligar o driver TB6612 (motor A: D9/D7/D8 · motor B: D3/D5/D4 · STBY no D6, que precisa ficar em nível alto). 3) Ligar os 4 sensores TCRT5000 (sinais em A1–A4, emissor no D13) e a alimentação: bateria na entrada VM, o 5V e o GND comuns com o Arduino.

Programação / Codificação

Carregar o código. Explicar a lógica: ler a POSIÇÃO da linha, calcular o ERRO e corrigir com um PID simples (proporcional + derivativo), sempre avançando. 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 oscila, baixe a velocidade base ou o ganho proporcional; se corta as curvas, aumente o ganho derivativo.

Encerramento / Socialização

Roda de conversa: o que é controle em malha fechada (medir → corrigir → repetir)? Por que calibrar é tão importante? Como o número de sensores muda a precisão?

Montagem do robô

Placa: Arduino Uno

⬇ baixar SVG
🧰 Montagem do robôPlaca: Arduino Uno · 4 componentes · 18 ligações detectadas do códigoUSBATMEGA328PLARDUINO UNOAREFGND131211109876543210DIGITAL (PWM ~)IOREFRESET3V35VGNDGNDVINPOWERA0A1A2A3A4A5ANALOG INArduino Uno⚡ Barramento de alimentação · 5V (+) / GND (–)D9 · PWMA (vel. A)D7 · AIN1D8 · AIN2D3 · PWMB (vel. B)D5 · BIN1D4 · BIN2D6 · STBY (habilita)Driver TB6612FNGAO1·AO2Motor DC esquerdoBO1·BO2Motor DC direitoD13 · liga os LEDs IRA1 · leitura da linhaA2 · leitura da linhaA3 · leitura da linhaA4 · leitura da linhaTCRT5000LM393PWROUTSENSIB.VCCGNDOUTSensores de linha (4xTCRT5000)LEGENDA DOS FIOSAlimentação (+5V)Terra (GND)DigitalAnalógico (leitura)PWM (velocidade)Saída de motor
🧰 Montagem do robôArduino Unoplaca controladoraTCRT5000LM393PWROUTSENSIB.VCCGNDOUTSensores de linha (4x…A1A2A3A4D135VGNDDriver TB6612FNGD9D7D8D3D5D4D6Motor DC esquerdoAO1AO2Motor DC direitoBO1BO2
as peças reagem: LED acende, botão é clicável, serial abaixo
🖥️ Monitor serial

⚡ Energia: uma bateria de 9V (ou pack de pilhas) alimenta os motores na entrada VM da TB6612; o 5V e o GND da TB6612 vão no 5V/GND do Arduino (terra comum). O pino STBY precisa estar em nível alto — está ligado ao D6, que o código coloca em HIGH para habilitar o driver.
📋 Tabela de ligações (fio a fio)
Sensores
Sensores de linha (4x TCRT5000)
S1 (sinal) → A1 leitura da linha
S2 (sinal) → A2 leitura da linha
S3 (sinal) → A3 leitura da linha
S4 (sinal) → A4 leitura da linha
LEDON (emissor) → D13 liga os LEDs IR
VCC (vermelho) → 5V alimentação
GND (preto) → GND terra
Sistema motor
Driver TB6612FNG
fio → D9 PWMA (vel. A)
fio → D7 AIN1
fio → D8 AIN2
fio → D3 PWMB (vel. B)
fio → D5 BIN1
fio → D4 BIN2
fio → D6 STBY (habilita)
Motor DC esquerdo
fio → AO1 (Ponte H) tração esq
fio → AO2 (Ponte H) tração esq
Motor DC direito
fio → BO1 (Ponte H) tração dir
fio → BO2 (Ponte H) tração dir
🔧 Passo a passo de ligação
  1. Energia primeiro: ligue o 5V e o GND do Arduino no VCC e GND da TB6612, e ligue o STBY no D6 (o código deixa o D6 em HIGH para habilitar o driver). A bateria (9V/pack) entra na VM, e o GND da bateria no mesmo GND (terra comum).
  2. Sensores TCRT5000 (4): VCC no 5V do Arduino e GND no GND. Os 4 sinais vão em A1, A2, A3 e A4; o emissor (LEDON) vai em D13.
  3. Controle dos motores: PWMA→D9, AIN1→D7, AIN2→D8 (motor A); PWMB→D3, BIN1→D5, BIN2→D4 (motor B).
  4. Motores: o esquerdo nas saídas AO1/AO2; o direito nas BO1/BO2. Se algum girar ao contrário, inverta os dois fios dele.
  5. Antes de energizar, confira: STBY no D6, todos os GND no mesmo ponto, bateria só na VM (nunca no 5V). Então envie o código e calibre passando os sensores sobre a linha e o fundo.

Código

aula.ino
/*
 * Seguidor de Linha · 4 sensores TCRT5000 — Arduino UNO
 * Driver: TB6612FNG   |   Sensores: 4x TCRT5000 (lidos como régua QTR)
 * PID proporcional-derivativo simples, sempre avançando.
 * (código original adaptado; comentários traduzidos para o português)
 */

// ===== Pinos do driver TB6612FNG =====
#define PWMA 9   // velocidade do motor A
#define AIN2 8   // direção do motor A
#define AIN1 7   // direção do motor A
#define BIN1 5   // direção do motor B
#define BIN2 4   // direção do motor B
#define PWMB 3   // velocidade do motor B
#define STBY 6   // standby: precisa ficar em HIGH para o driver funcionar

int velocidadeBase = 250;   // velocidade de cruzeiro (0 a 255)

// ===== Ganhos do PID =====
float KP = 0.2;
float KD = 5;

int erro = 0;
int derivada = 0;
int erroAnterior = 0;
float correcao;

#include <QTRSensors.h>

#define NUM_SENSORES 4
#define TIMEOUT 2500
#define PINO_EMISSOR 13   // liga os LEDs infravermelhos dos sensores

QTRSensorsRC qtr(
  (unsigned char[]){18, 17, 16, 15},   // A4, A3, A2, A1
  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);
  pinMode(STBY, OUTPUT);

  digitalWrite(STBY, HIGH);   // habilita o TB6612

  // Calibração: passe os 4 sensores sobre a linha e o fundo 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() {
  posicao = qtr.readLine(leiturasSensores, QTR_EMITTERS_ON, 0);

  // Centro para 4 sensores: faixa 0..3000, centro = 1500
  erro = posicao - 1500;

  // ===== PID =====
  derivada = erro - erroAnterior;
  correcao = (erro * KP) + (derivada * KD);
  correcao = constrain(correcao, -velocidadeBase, velocidadeBase);

  int motorA = velocidadeBase - correcao;
  int motorB = velocidadeBase + correcao;
  motorA = constrain(motorA, 0, 255);
  motorB = constrain(motorB, 0, 255);

  // ===== Sempre para frente, ajustando só a velocidade de cada lado =====
  digitalWrite(AIN1, HIGH); digitalWrite(AIN2, LOW); analogWrite(PWMA, motorA);
  digitalWrite(BIN1, HIGH); digitalWrite(BIN2, LOW); analogWrite(PWMB, motorB);

  erroAnterior = erro;
  delay(5);
}

Fluxograma do algoritmo

graph TD INICIO([INÍCIO]) N1["Esperar 0.005 segundos"] INICIO --> N1 N1 --> N1 style INICIO fill:#fbbf24,stroke:#1e3a8a,color:#1e3a8a

Algoritmo em blocos

when green flag clicked
forever
  set [posicao v] to (qtr.readLine(leiturasSensores, QTR_EMITTERS_ON, 0))
  set [erro v] to (posicao - 1500)
  set [derivada v] to (erro - erroAnterior)
  set [correcao v] to ((erro * KP) + (derivada * KD))
  set [correcao v] to (constrain(correcao, -velocidadeBase, velocidadeBase))
  set [motorA v] to (velocidadeBase - correcao)
  set [motorB v] to (velocidadeBase + correcao)
  set [motorA v] to (constrain(motorA, 0, 255))
  set [motorB v] to (constrain(motorB, 0, 255))
  digitalWrite(AIN1, HIGH); digitalWrite(AIN2, LOW); analogWrite(PWMA, motorA) :: custom
  digitalWrite(BIN1, HIGH); digitalWrite(BIN2, LOW); analogWrite(PWMB, motorB) :: custom
  set [erroAnterior v] to (erro)
  wait (0.005) secs
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.