This repository contains code for a line follower robot using an ESP32 as the main controller. It implements an advanced PID control loop with adaptive speed control to maximize performance on tight turns.
High Performance
- PID tuned for fast response
 - Adaptive speed control in corners
 - Optimized processing with minimal delay (5ms)
 - Noise filtering for stable sensor readings
 
Smart Control
- Proportional–Integral–Derivative (PID): KP=2.5, KI=0.1, KD=0.8
 - Automatic curve detection based on error
 - Progressive speed reduction on tight turns
 - Gradual return to normal speed after stabilization
 
Optimizations for Tight Turns
- Configurable curve threshold (0.6)
 - Minimum speed in turns (80/255)
 - Search strategy when the line is not detected
 - Smoothing filter to reduce oscillations
 
- ESP32 (any model)
 - 2x 6V DC motors (rear)
 - 8-channel reflectance sensor array (QTR-8A or similar)
 - L298N motor driver or similar
 - 6V–12V battery (depending on driver)
 
Left Motor:
- IN1 → GPIO 26
- IN2 → GPIO 27
- ENA → GPIO 14
Right Motor:
- IN1 → GPIO 32
- IN2 → GPIO 33
- ENB → GPIO 25
Sensor 1 → GPIO 13
Sensor 2 → GPIO 12
Sensor 3 → GPIO 14
Sensor 4 → GPIO 27
Sensor 5 → GPIO 26
Sensor 6 → GPIO 25
Sensor 7 → GPIO 33
Sensor 8 → GPIO 32
#define KP 2.5        // Proportional — response strength
#define KI 0.1        // Integral — removes steady-state error
#define KD 0.8        // Derivative — adds stability/damping#define VELOCIDADE_BASE 200      // Base speed (0-255)
#define VELOCIDADE_MIN 80        // Minimum speed in turns
#define VELOCIDADE_MAX 255       // Maximum speed
#define THRESHOLD_CURVA 0.6      // Threshold to detect curves- Average of 3 reads to reduce noise
 - Temporal smoothing filter
 - Search strategy when the line is not detected
 
- Weighted average of active sensors
 - Weights from -7 to +7 for precision
 - Smoothing filter for stability
 
- Optimized computation of the three components
 - Integral windup limiting
 - Output clamping to avoid saturation
 
- Curve detection: based on absolute error
 - Progressive reduction: speed decreases as error increases
 - Gradual return: speed returns to normal after stabilization
 
- PWM control for variable speed
 - Direction controlled by IN1/IN2 pins
 - 5kHz PWM frequency for smoothness
 
#define KP 3.0        // Increase responsiveness
#define VELOCIDADE_MIN 60        // Lower minimum speed
#define THRESHOLD_CURVA 0.5      // Detect curves earlier#define VELOCIDADE_BASE 220      // Increase base speed
#define KP 2.0        // Reduce response for stability#define KD 1.2        // Increase damping
#define KI 0.05       // Reduce integral correction- Set to 115200 baud
 - Debug info every 100ms
 - Data: Error, PID Output, Speeds, Curve state
 
debugInfo()           // Real-time information
paradaEmergencia()    // Full motor stop
calibrarSensores()    // Manual calibration (optional)- Check all connections
 - Tune PID parameters as needed
 - Test on straight lines before curves
 
- Start with low KP and increase gradually
 - Adjust KD to reduce oscillations
 - Use KI only if there is steady-state error
 
- Comment out 
debugInfo()to reduce overhead - Adjust 
VELOCIDADE_BASEto match the track - Test on different curve types
 
- Lower KP
 - Increase KD
 - Check sensor alignment
 
- Increase KP
 - Reduce VELOCIDADE_MIN
 - Adjust THRESHOLD_CURVA
 
- Increase VELOCIDADE_BASE
 - Check motor connections
 - Ensure adequate power supply
 
This code was developed for educational and competition purposes. Feel free to modify and adapt it to your needs.
Built with a focus on performance for robotics competitions.
Este é um código para um robô seguidor de linha que utiliza um ESP32 como controlador principal. O sistema implementa controle PID avançado com controle de velocidade adaptativo para maximizar a performance em curvas fechadas.
Alta Performance
- Sistema PID otimizado para resposta rápida
 - Controle de velocidade adaptativo em curvas
 - Processamento otimizado com delay mĂnimo (5ms)
 - Filtros de ruĂdo para leitura estável dos sensores
 
Controle Inteligente
- PID Proporcional-Integral-Derivativo: KP=2.5, KI=0.1, KD=0.8
 - Detecção automática de curvas baseada no erro
 - Redução progressiva de velocidade em curvas fechadas
 - Retorno gradual à velocidade normal após estabilização
 
Otimizações para Curvas Fechadas
- Threshold de curva configurável (0.6)
 - Velocidade mĂnima em curvas (80/255)
 - Estratégia de busca quando linha não é detectada
 - Filtro de suavização para reduzir oscilações
 
- ESP32 (qualquer modelo)
 - 2 Motores DC 6V (traseiros)
 - Array de 8 sensores de refletância (QTR-8A ou similar)
 - Driver de motores L298N ou similar
 - Bateria 6V-12V (dependendo do driver)
 
Motor Esquerdo:
- IN1 → GPIO 26
- IN2 → GPIO 27
- ENA → GPIO 14
Motor Direito:
- IN1 → GPIO 32
- IN2 → GPIO 33
- ENB → GPIO 25
Sensor 1 → GPIO 13
Sensor 2 → GPIO 12
Sensor 3 → GPIO 14
Sensor 4 → GPIO 27
Sensor 5 → GPIO 26
Sensor 6 → GPIO 25
Sensor 7 → GPIO 33
Sensor 8 → GPIO 32
#define KP 2.5        // Proporcional - Ajuste para resposta
#define KI 0.1        // Integral - Ajuste para eliminar erro estático
#define KD 0.8        // Derivativo - Ajuste para estabilidade#define VELOCIDADE_BASE 200      // Velocidade base (0-255)
#define VELOCIDADE_MIN 80        // Velocidade mĂnima em curvas
#define VELOCIDADE_MAX 255       // Velocidade máxima
#define THRESHOLD_CURVA 0.6      // Threshold para detectar curvas- MĂ©dia de 3 leituras para reduzir ruĂdo
 - Filtro de suavização temporal
 - Estratégia de busca quando linha não detectada
 
- Média ponderada dos sensores ativos
 - Pesos de -7 a +7 para precisĂŁo
 - Filtro de suavização para estabilidade
 
- Cálculo otimizado das três componentes
 - Limitação do erro integral (anti-windup)
 - Limitação da saĂda para evitar saturação
 
- Detecção de curvas: Baseada no erro absoluto
 - Redução progressiva: Velocidade diminui conforme erro aumenta
 - Retorno gradual: Velocidade retorna ao normal após estabilização
 
- Controle PWM para velocidade variável
 - Direção controlada pelos pinos IN1/IN2
 - FrequĂŞncia PWM de 5kHz para suavidade
 
#define KP 3.0        // Aumentar resposta
#define VELOCIDADE_MIN 60        // Reduzir velocidade mĂnima
#define THRESHOLD_CURVA 0.5      // Detectar curvas mais cedo#define VELOCIDADE_BASE 220      // Aumentar velocidade base
#define KP 2.0        // Reduzir resposta para estabilidade#define KD 1.2        // Aumentar amortecimento
#define KI 0.05       // Reduzir correção integral- Configurado para 115200 baud
 - Informações de debug a cada 100ms
 - Dados: Erro, SaĂda PID, Velocidades, Estado da curva
 
debugInfo()           // Informações em tempo real
paradaEmergencia()    // Parada total dos motores
calibrarSensores()    // Calibração manual (opcional)- Verifique todas as conexões
 - Ajuste os parâmetros PID conforme necessário
 - Teste em linha reta antes de curvas
 
- Comece com KP baixo e aumente gradualmente
 - Ajuste KD para reduzir oscilações
 - Use KI apenas se houver erro estático
 
- Comente a função 
debugInfo()para reduzir overhead - Ajuste 
VELOCIDADE_BASEconforme a pista - Teste em diferentes tipos de curvas
 
- Reduza KP
 - Aumente KD
 - Verifique se os sensores estĂŁo alinhados
 
- Aumente KP
 - Reduza VELOCIDADE_MIN
 - Ajuste THRESHOLD_CURVA
 
- Aumente VELOCIDADE_BASE
 - Verifique conexões dos motores
 - Confirme alimentação adequada
 
Este código foi desenvolvido para fins educacionais e de competição. Sinta-se livre para modificar e adaptar conforme suas necessidades.
Desenvolvido com foco em performance para competições de robótica.