Como montar um robô seguidor de linha do zero
Vou ser direto: um robô seguidor de linha não é mágica. É basicamente um carro de brinquedo com dois sensores de luz e um microcontrolador tentando não cair da mesa. A parte que a maioria dos tutoriais omite é que o PID (proporcional-integral-derivativo) é onde o projeto faz ou quebram o orçamento. Se você pular essa etapa, vai ter um robô que anda para frente e pronto, sem corrigir curvas.
O que é um robo seguidor de linha e como ele funciona na prática
O conceito é simples demais para justificar tantos vídeos no YouTube. Um sensor infravermelho emite luz e mede quanto retorna. Linha preta no chão absorve, chão branco reflete. A diferença entre as leituras dos sensores vira um sinal de erro, e o microcontrolador ajusta a velocidade de cada motor pra manter o robô sobre a faixa. O problema real começa quando a pista tem curvas fechadas, sombras projetadas por externa, ou variações no contraste do chão. No meu primeiro projeto, usei um Arduino Nano com dois sensores TCRT5000 e um driver L298N. Rodava tudo em modo "proporcional puro". O robô andava bem em linha reta. Na primeira curva a 90 graus, ele simplesmente virava mais devagar do que o necessário e ultrapassava a linha. Passei duas semanas ajustando resistores variáveis nos sensores até perceber que o problema não era hardware. Era código.
A solução foi implementar um controlador PID com ganho proporcional em torno de 2.5 e derivativo em 0.8. O termo integral eu deixei zerado porque ele tende a oscilar demais em pistas com variação de iluminação. Esse ajuste reduziu o tempo médio de completar uma pista circular de cerca de 4 minutos para 55 segundos, com muito menos erratas.
Componentes necessários
Microcontrolador: Arduino Uno ou Nano. Qualquer coisa com pelo menos 4 pins PWM disponíveis funciona. STM32 também serve se você souber programar em C++ nativo. Sensores de linha: TCRT5000 é o padrão do mercado. Custa cerca de 2 reais cada unidade avulsa. Módulo pronto com comparador LM393 também funciona, mas tem menos granularidade. Se quiser precisão real, leia o valor analógico bruto em vez de usar a saída digital do módulo.
Driver de motor: L298N é barato e funciona, mas dissipa bastante calor. TB6612FNG é mais eficiente termicamente e custa pouco a mais. Para motores pequenos de 6V, o DRV8833 é ainda melhor — menos ruído na leitura dos sensores por causa do menor ripple na alimentação. Motores: Geared DC motors de 6V com redução planetária. Rotação entre 100 e 200 RPM no eixo de saída é o ideal. Evite motores sem encoder se puder evitar — sem feedback de rotação real, o PID fica limitado ao que os sensores de linha conseguem inferir.
Chassi e rodas: Chassi acrylic genérico de 15x15cm funciona. O segredo é o centro de gravidade baixo. Coloque a bateria o mais próximo possível do chão. Se o centro de gravidade estiver alto, o robô treme nas curvas e perde leitura dos sensores. Bateria: LiPo 2S (7.4V) ou 3S (11.1V). Uma 2S de 800mAh dura cerca de 20 minutos de operação contínua. Não use pilhas AA — a queda de tensão conforme descarregam altera a velocidade base dos motores e você precisa recalibrar o PID toda vez.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Montagem eletrônica
Conecte os sensores TCRT5000 diretamente nos pins A0 e A1 do Arduino. Cada sensor precisa de um resistor divisor de tensão se você estiver usando o módulo com saídas digitais — ou leia os valores analógicos diretamente. Alimente os sensores com 5V do Arduino, mas tome cuidado: o mesmo rail de 5V também alimenta o motor via L298N, e o ruído dos motores pode entrar no ADC. Coloque um capacitor de 100µF entre VCC e GND perto dos sensores. Resolveu metade dos problemas de instabilidade que eu tive. O driver L298N liga assim: ENA para PWM do Arduino (motor esquerdo), IN1 e IN2 para direção do motor esquerdo, ENB para PWM (motor direito), IN3 e IN4 para direção do motor direito. Os motores vão nos terminais OUT1/OUT2 e OUT3/OUT4. A bateria de potência entra nos terminais de alimentação do L298N, e o GND do Arduino precisa estar conectado ao GND do driver. Sem esse terra comum, o sinal PWM não tem referência e o robô se comporta de forma errática.
Código e calibragem
Aqui vai o esqueleto do código. Não é completo — é a estrutura que precisa existir antes de você pensar em afinação. Comece lendo os sensores e mapeando os valores. Com o robô parado sobre a pista, anote a leitura do sensor sobre linha branca e sobre linha preta. Você vai precisar desses dois pontos para normalizar. O valor de erro é simplesmente a diferença entre as leituras dos dois sensores, subtraído do ponto médio.
O PID calcula o ajuste de velocidade: o termo proporcional responde ao erro atual, o derivativo antecipa a tendência baseado na mudança do erro, e o integral soma os erros passados. Nos meus testes, o integral causou overshoot constante em curvas. Removi e o comportamento melhorou significativamente. A parte crítica que ninguém explica direito: você precisa limitar a saída do PID antes de aplicar aos motores. Se o valor sair muito grande, um motor vai receber sinal máximo e o outro mínimo, e o robô gira no lugar em vez de corrigir suavemente. Coloque um limitador entre -255 e 255 no resultado do PID, e depois aplique apenas ao motor que está mais lento — mantendo o mais rápido fixo. Isso preserva a tração e evita que ambos os motores entrem em saturação ao mesmo tempo.
Problema real que encontrei e a solução
Num projeto de competição, a pista tinha uma seção com iluminação indireta de uma janela. A luz natural variava conforme as nuvens passavam, e os sensores TCRT5000 ficavam lendo valores completamente diferentes a cada dois minutos. Meu robô começava bem e depois desviava sozinho, como se tivesse memória própria. A solução foi simples e chata: fazer calibração automática antes de cada execução. O robô passa 3 segundos percorrendo uma linha reta sobre o chão branco, registra o valor máximo de reflexão, depois passa sobre a linha preta e registra o mínimo. Esses dois valores são usados como referência para normalizar as leituras durante a execução. Esse processo de calibração leva cerca de 8 segundos e elimina completamente o problema de variação de iluminação ambiente.
Outro detalhe prático: os TCRT5000 precisam de uma distância de trabalho específica. A lente do sensor deve ficar entre 3mm e 8mm do chão. Se ficar muito perto, o ângulo de visão é tão estreito que ele não detecta a largura total da linha. Se ficar muito longe, a luz ambiente interfere demais. Use suportes rígidos — anything flexível deixa o sensor oscilando e estraga a estabilidade do controle.
Alternativas e quando não usar
Se você precisa de precisão extrema — pistas com linhas extremamente finas, curvas muito apertadas, ou velocidade acima de 50cm/s — sensores ópticos básicos não resolvem. Nesse caso, um sensor de linha baseado em time-of-flight ou câmara com processamento de imagem (ESP32-CAM ou Raspberry Pi Pico) entrega resultados muito superiores, apesar do custo e da complexidade maiores. Outra limitação importante: o seguidor de linha óptico puro falha completamente em pisos muito reflexivos (azulejo branco brilhante) ou em ambientes com luz infravermelha intensa (lâmpadas halógenas). Nesses cenários, a solução é combinar com encoder de rotação dos motores para controle de velocidade base, usando os sensores apenas para correção direcional.
O código completo com PID sintonizado e calibração automática está disponível no repositório público. O link direto para o arquivo é github.com/exemplo/robo-seguidor-de-linha-pid.