← RETURN TO PROJECT LAB
// ENGINEERING_LOG : 01

Autonomous Line Follower v2.0: The PID Revolution

BY: RAWNOK ISTIAQUE DATE: NOV 2024 TIME: 15 MIN READ TECH: ARDUINO, C++, PID MATH
Autonomous Robot Circuit Board Fig 1.0 - The core processing unit of the Autonomous Line Follower.

Welcome to the official engineering log of the Autonomous Line Follower v2.0. This project isn't just about making motors spin; it represents a fundamental shift in how we approach robotics at Virtual Science Club Bangladesh (VSC.BD). Instead of relying on hardcoded, delay-based movements that fail the moment variables change, we engineered a closed-loop feedback system capable of "thinking" and adjusting in real-time.

This specific build secured 2nd place at the National Robotics Olympiad 2024. In this extensive guide, I will break down the hardware selection, the mathematical philosophy of PID control, and the exact C++ architecture we used to achieve speeds exceeding 2 meters per second without derailing.

1. Breaking the Cycle of "If/Else" Robotics

Most beginners start robotics by using basic ultrasonic sensors or two-channel IR sensors. The logic is usually simple: If the left sensor sees black, turn left. If the right sensor sees black, turn right.

While this is a great starting point, it creates a rigid, "wobbling" movement. The robot constantly zig-zags across the line, losing crucial speed and efficiency. To win competitions, we had to abandon basic if/else logic and adopt a system that calculates exactly how far the robot is off-center and applies a proportional corrective force. Enter the world of PID.

// LOGICAL_ENGINEERING_NOTE

True engineering is about creating dynamic systems. The robot must not merely follow instructions; it must analyze its environment continuously and calculate the most efficient path forward. This is the difference between rote memorization and true logic.

2. The Hardware Architecture

To support high-speed data processing, hardware selection is critical. Here is the exact loadout for the V2.0 build:

Hardware Components Fig 2.0 - Selecting high-efficiency components minimizes weight and maximizes agility.

3. The Math Behind the Magic: Understanding PID

PID stands for Proportional, Integral, and Derivative. It is a control loop mechanism widely used in industrial control systems. Let's break down how we applied it to our line follower:

1. Proportional (The Present):
This calculates the current error. If the line is perfectly in the middle of our 8-sensor array, the error is 0. If it's far to the left, the error is negative; far to the right, it's positive. The Proportional term applies a corrective force directly related to this error. The further off-center it is, the harder it turns back.

2. Integral (The Past):
If the robot is slightly off-center for a long time (perhaps due to a heavy battery on one side), the Integral term accumulates this past error and eventually provides a strong enough push to correct it. (Note: For fast line followers, this is often set to 0 or a very low value as it can cause overcompensation).

3. Derivative (The Future):
This is the secret weapon. The Derivative calculates the rate of change of the error. If the robot is rapidly approaching the center line, the Derivative term realizes it's moving too fast and applies a "braking" force to prevent it from overshooting to the other side. This stops the wobbling effect.

4. The Codebase (C++ Implementation)

To calculate the PID, we must first translate the physical sensor data into a mathematical value. We used the QTRSensors library to read the array, which returns a value between 0 and 7000 (3500 being perfectly centered).

// Constants for PID tuning
float Kp = 0.15; // Proportional Gain
float Ki = 0.00; // Integral Gain
float Kd = 1.20; // Derivative Gain

int lastError = 0;
int integral = 0;
int baseSpeed = 150;

void calculatePID() {
    uint16_t position = qtr.readLineBlack(sensorValues);
    int error = position - 3500; // 3500 is the center point

    integral = integral + error;
    int derivative = error - lastError;

    // The magic equation
    int motorSpeedChange = (Kp * error) + (Ki * integral) + (Kd * derivative);

    int leftMotorSpeed = baseSpeed + motorSpeedChange;
    int rightMotorSpeed = baseSpeed - motorSpeedChange;

    lastError = error;

    // Constrain speeds to prevent motor burnout
    leftMotorSpeed = constrain(leftMotorSpeed, -50, 255);
    rightMotorSpeed = constrain(rightMotorSpeed, -50, 255);

    setMotors(leftMotorSpeed, rightMotorSpeed);
}

5. Calibration: The True Test of Patience

You cannot copy-paste PID values. Every robot has a different weight distribution, motor RPM, and battery voltage. Tuning Kp, Ki, and Kd is an empirical process.

We started with Kp. We increased it until the robot could follow the line but wobbled heavily. Then, we slowly increased Kd (the brake) until the wobbling stopped entirely and the movement became fluid. At high speeds, aerodynamic drag and battery drain became factors, meaning we had to re-calibrate depending on the charge level of our LiPo battery.

6. Conclusion and Future Iterations

The Autonomous Line Follower v2.0 proved that a deep understanding of control theory and hardware optimization can yield exceptional results. It completely shattered the limitations of simple delay() programming.

For V3.0, the VSC.BD engineering team is looking into integrating an ESP32 to send live telemetry data via Wi-Fi to a dashboard, allowing us to monitor the PID error graph in real-time during a race. The pursuit of perfect logical engineering never stops.

Rawnok Istiaque

Rawnok Istiaque

Founder & Lead Engineer | VSC.BD

Rawnok specializes in autonomous systems, logical engineering, and closed-loop control algorithms. As the founder of VSC.BD, he believes that true innovation in robotics comes from deeply understanding the mathematics that govern hardware physics, moving beyond surface-level coding to build systems that dynamically adapt to their environment.