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

Seguidor de Linha · 4 sensores TCRT5000

👤 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 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

Arduino Uno
Arduino Uno
🧰
Driver de motor TB6612FNG
Sensor de linha TCRT5000
Sensor de linha TCRT5000
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 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 · 21 ligações detectadas do códigoUSBATMEGA328PLARDUINO UNOAREFGND131211109876543210DIGITAL (PWM ~)IOREFRESET3V35VGNDGNDVINPOWERA0A1A2A3A4A5ANALOG INArduino Uno⚡ Barramento de alimentação · 5V (+) / GND (–)D9 · PWM velocidade AD7 · direção AD8 · direção AD5 · direção BD4 · direção BD3 · PWM velocidade BD6 · habilita o driver…Driver TB6612FNGAO1·AO2Motor DC esquerdoBO1·BO2Motor DC direitoD13 · liga os LEDs IRA1 · leitura da linhaA2 · leitura da linhaA3 · leitura da linhaA4 · leitura da linhaSensores de linha (4xTCRT5000)LEGENDA DOS FIOSAlimentação (+5V)Terra (GND)DigitalAnalógico (leitura)PWM (velocidade)Saída de motor
🧰 Montagem do robôArduino Unoplaca controladoraSensores de linha (4x…A1A2A3A4D135VGNDDriver TB6612FNGD9D7D8D5D4D3D65VGNDbateria +Motor 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
PWMA D9 PWM velocidade A
AIN1 D7 direção A
AIN2 D8 direção A
BIN1 D5 direção B
BIN2 D4 direção B
PWMB D3 PWM velocidade B
STBY D6 habilita o driver (HIGH)
VCC 5V alimentação lógica
GND GND terra comum
VM bateria + alimentação dos motores
Motor DC esquerdo
terminal + AO1 (Ponte H) tração esq
terminal − AO2 (Ponte H) tração esq
Motor DC direito
terminal + BO1 (Ponte H) tração dir
terminal − 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.