Autonomous Line-Follower Robot

Robotics & Hardware•2025

Overview

Engineered and constructed in 2025, this autonomous robotics platform navigates complex tracks using high-speed differential drive kinematics powered by the ATmega328P microcontroller and an L298N dual H-bridge motor driver.
Autonomous Line-Follower Robot

📷 Fig 1: Front chassis perspective showing the ATmega328P controller, battery pack, and differential drive platform.

Hardware-Level PWM Frequency Calibration (TCCR0B Manipulation)

Standard Arduino PWM switches at ~490 Hz or 980 Hz, causing audible motor whine and low-duty-cycle stalling under torque load. By directly configuring the TCCR0B timer/counter control register to set timer prescalers for ~7.8 kHz / 62.5 kHz operation, the motors deliver smooth, stall-free torque across micro-adjustments.
Autonomous Line-Follower Robot

📷 Fig 2: Top chassis layout detailing the L298N dual H-bridge motor driver, power distribution switch, and motor leads.

Sensor Array & Closed-Loop Control Algorithm

The front bumper integrates high-sensitivity analog/digital IR optical sensors with threshold hysteresis. A tuned closed-loop proportional controller dynamically adjusts differential wheel velocities to negotiate sharp 90-degree corners, acute intersections, and speed straights.
Autonomous Line-Follower Robot

📷 Fig 3: Optical IR line detection array mounted beneath the front bumper with threshold adjustment potentiometers.

Timer Configuration & Control Code

LineFollower_TCCR0B.ino
1// Configure Timer0 for High-Frequency PWM on Pins 5 & 6
2void setupHighFreqPWM() {
3  // Set Fast PWM mode and 1/8 prescaler for 7.8 kHz PWM
4  TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM00) | _BV(WGM01);
5  TCCR0B = _BV(CS01); // Prescaler 8
6  
7  pinMode(LEFT_PWM_PIN, OUTPUT);
8  pinMode(RIGHT_PWM_PIN, OUTPUT);
9}
10
11void loop() {
12  int leftSense = analogRead(IR_LEFT_PIN);
13  int rightSense = analogRead(IR_RIGHT_PIN);
14  int error = leftSense - rightSense;
15  
16  int leftSpeed = constrain(BASE_SPEED + (error * KP), 0, 255);
17  int rightSpeed = constrain(BASE_SPEED - (error * KP), 0, 255);
18  
19  analogWrite(LEFT_PWM_PIN, leftSpeed);
20  analogWrite(RIGHT_PWM_PIN, rightSpeed);
21}
← Back to Portfolio