This is an old revision of the document!


Land Buster - BT-Controlled RC Car -

Cucu Viorel-Cosmin 334CA

GitHub: PROIECT_PM_MASINUTA

MCU: ATmega328P Xplained Mini · PlatformIO

Introduction

Land Buster is a small RC car (1/12 scale Land Buster chassis) that I upgraded into a smart rover. Instead of using a standard radio remote, I control it from my phone via Bluetooth.

The main idea was simple: a normal RC car does whatever you tell it, even if it is about to crash. I wanted to fix that. So I added sensors and automatic logic on top of the manual control.

What it does:

  • You drive it with a phone app over Bluetooth. You can pick between 3 speed modes and honk the horn.
  • The front ultrasonic sensor watches for obstacles. The buzzer starts beeping faster as you get closer. If you get too close (under 15 cm), the car stops by itself - you cannot override it.
  • The headlights turn on automatically when it gets dark, based on a light sensor.
  • The LCD screen shows the current speed mode and the distance to the nearest obstacle in real time.

Why it is useful: It shows how a cheap microcontroller can handle multiple real-time tasks at once - wireless communication, sensing, motor control, and display - using only hardware registers and no external libraries.

Course requirements met:

  • 5 laboratory concepts: USART (Lab 1), Timers & Interrupts (Lab 2), PWM (Lab 3), ADC (Lab 4), I2C (Lab 6)
  • 5 external peripherals: HC-05 Bluetooth, HC-SR04 Ultrasonic, 1602 I2C LCD, Photoresistor, Active Buzzer

General Description

The ATmega328P is the brain of the system. Everything connects to it.

  • Inputs: Bluetooth commands from the phone, distance data from the ultrasonic sensor, light level from the photoresistor.
  • Processing: The MCU reads all inputs, decides what to do (drive, stop, beep, light up), and sends signals to the outputs.
  • Outputs: The ESC drives the main motor (speed), the L298N drives the steering motor (direction), the LCD shows status, the buzzer gives audio alerts, and the LEDs provide lighting.

Block Diagram

Hardware Design

Components and Their Role

Component Model Role in Project
Microcontroller ATmega328P Xplained Mini Central brain. Reads all sensors, runs non-blocking logic, outputs PWM and I2C signals.
Bluetooth Module HC-05 Bidirectional telemetry with Android app — receives drive commands, sends sensor data.
Front Ultrasonic Sensor HC-SR04 Measures distance to obstacles ahead. Triggers buzzer alerts and emergency stop at <15 cm.
Rear Ultrasonic Sensor HC-SR04 Measures distance behind the rover. Powers the reverse parking assist display on the LCD.
Light Sensor GL5528 Photoresistor + 10kΩ Voltage divider read by ADC. Activates headlights automatically when ambient light drops.
Speed Controller 20A Brushed ESC Controls the rear 390 DC traction motor via 50 Hz PWM. Receives signal from MCU Timer 1.
Traction Motor 390 DC Motor (7.4V) Drives the rover forward and backward from Battery 2's dedicated high-current rail.
Steering Motor 3–6V DC Motor Turns the front axle left or right under L298N control.
Motor Driver L298N H-Bridge Accepts PWM (ENA) and two direction pins (IN1/IN2) to drive the steering DC motor.
LCD Display 1602 LCD + PCF8574 I2C “Smart dashboard”: shows expressive animated eyes in normal mode, parking assist in reverse.
Active Buzzer TMB12A05 5V Proximity alert (beep rate increases near obstacles) and horn command from phone.
Headlights & Taillights 5mm LEDs x4 + 220Ω x4 Front lighting (D7) activates automatically via LDR. Rear taillights (A3) activate on brake/reverse. Wired in parallel.
Voltage Regulator LM2596 Step-Down Converts Battery 1's 7.4V down to a stable 5V for all logic (MCU, sensors, LCD).
Battery 1 — Logic Rail 2x Murata US18650VTC5C in series 7.4V, 2600 mAh, 30A. Powers L298N and LM2596 (which feeds 5V logic).
Battery 2 — Traction Rail 2x Samsung 25R 18650 in series 7.4V, 2500 mAh, 8C. Dedicated high-current supply exclusively for the ESC.
Chassis Land Buster 1/12 scale Physical base of the rover.

Pin Mapping and Justification

Arduino Pin AVR Register Timer / Peripheral Connected To Why This Pin
D0 (RX) PD0 USART0 RX HC-05 TX Hardware USART — zero-latency interrupt-driven reception (RXCIE0). No bit-banging needed.
D1 (TX) PD1 USART0 TX HC-05 RX via 1kΩ/2kΩ divider Same USART peripheral. 5V output is divided to 3.3V to protect HC-05 RX logic level.
D2 PD2 GPIO Output HC-SR04 Front — TRIG Any GPIO works for the 10 µs trigger pulse. D2 keeps sensor pins grouped together.
D3 PD3 GPIO Input HC-SR04 Front — ECHO Paired with D2 for clean wiring. Reads echo pulse duration via pulseIn().
D4 PD4 GPIO Output HC-SR04 Rear — TRIG Same reason as D2; rear sensor pins grouped on D4/D5.
D5 PD5 GPIO Input HC-SR04 Rear — ECHO Paired with D4. Mirrors front sensor logic for parking assist.
D6 PD6 Timer 0, OC0A (Fast PWM) L298N ENA Only OC0A or OC0B can output Timer 0 PWM. D6 = OC0A — sets steering motor duty cycle (0–255).
D7 PD7 GPIO Output Headlight LEDs + 220Ω Simple digital ON/OFF for the LED array. D7 is free from any timer to avoid conflicts.
D8 PB0 GPIO Output L298N IN1 Direction bit for steering H-bridge. No special hardware needed — plain digital output.
D9 PB1 GPIO Output L298N IN2 Direction bit for steering H-bridge (opposite of IN1 to select left/right).
D10 PB2 Timer 1, OC1B (Phase-correct PWM) ESC Signal Timer 1 is 16-bit — essential for generating the precise 50 Hz (20 ms period) servo-style PWM the ESC requires. ICR1=39999, OCR1B range 2600–3400 for speed control.
A0 PC0 ADC0 LDR Voltage Divider First ADC channel; no mux change needed for single-channel reads. Direct analog measurement of light level.
A1 PC1 GPIO Input HC-05 STATE Reads hardware connection status (HIGH = connected, LOW = disconnected/searching).
A2 PC2 GPIO Output Active Buzzer Moved here from SPI pins to keep PB3/PB4/PB5 free for the Xplained Mini's programming interface (EDBG).
A3 PC3 GPIO Output Rear LED Taillights Dedicated pin for red rear taillights. Activates independently during AEB, reverse, or stop.
A4 PC4 TWI SDA (Hardware I2C) LCD PCF8574 SDA Hardware I2C peripheral — only PC4/PC5 support hardware TWI on ATmega328P.
A5 PC5 TWI SCL (Hardware I2C) LCD PCF8574 SCL Paired with A4. Hardware TWI runs at 100 kHz without CPU intervention.

Key Design Choices & Electrical Schematic

kicad_cucu.pdf

The electrical schematic above illustrates the complete wiring of the Land Buster rover. The hardware architecture is built upon the following core engineering rules:

  • Dual Isolated Power System: The system utilizes two separate battery packs. Battery 1 (Logic Rail) powers the L298N and the LM2596 regulator, which supplies a clean 5V to the MCU, sensors, and LCD. Battery 2 (Traction Rail) is dedicated exclusively to the high-current ESC. This isolation prevents massive voltage drops caused by the main motor from resetting the microcontroller.
  • Common Ground: Despite having two isolated power sources, all ground (GND) connections across the entire system are tied together. This sets a unified 0V reference point, ensuring that PWM and digital logic signals are accurately interpreted by every component.
  • LED Parallel Wiring: To ensure maximum brightness and protect the MCU pins, all 4 LEDs (2 front, 2 rear) are wired in parallel. Each LED connects to its respective MCU pin (D7 or A3) through its own dedicated 220Ω current-limiting resistor before returning to the common ground.
  • HC-05 Level Shifting: The Bluetooth module operates at 3.3V logic. To prevent hardware damage, a simple voltage divider (1kΩ in series from MCU D1, then 2kΩ to GND) safely steps down the 5V USART TX signal to ≈3.3V before it reaches the module.
  • Timer Selection Strategy: Timer 0 (8-bit) is used for the low-resolution steering PWM (Fast PWM, ~980 Hz). Timer 1 (16-bit) is strictly reserved for the ESC because it requires a precise 50 Hz period, which is impossible to achieve accurately with only 8 bits.

Proof of Functionality & Assembly

Photo 1: Power Drop Test\\

This early prototype test was conducted with only the steering system and ESC connected. While running the main traction motor at a low RPM, the output of the LM2596 regulator dropped dangerously to 4.7V. This critical observation proved that a single battery configuration was insufficient to handle the high current spikes, directly justifying the upgrade to the current dual-battery (4-cell) isolated power system.

Photo 2: Full System Test\\

All electronic components—including the ultrasonic sensors, I2C LCD, HC-05 Bluetooth module, and motor drivers—are integrated and tested together. This phase successfully verified the software integration, ensuring that the non-blocking logic, telemetry, and autonomous emergency braking (AEB) functioned simultaneously without interference, proving the system's core functionality.

Photo 3: Clean Build\\

The final hardware assembly mounted on the Land Buster chassis. This image highlights the strict cable management and the use of modular JST connectors. This robust wiring approach prevents connections from vibrating loose during physical operation, ensuring high reliability on the move.

Photo 4: Final Assembly\\

The completed autonomous rover with the original outer car shell successfully mounted. The clean cable management allows the shell to fit perfectly without putting pressure on the sensitive electronics or jumper wires, resulting in a polished and professional final build.

Software Design

Development Environment

  • IDE: PlatformIO (VS Code)
  • Language: Pure AVR C
  • Compiler: avr-gcc
  • Target: ATmega328P Xplained Mini

Source Files

src/
├── main.c          # Main loop, ISR, command dispatcher
├── usart.c / .h    # USART driver + printf via stdout (Lab 1)
├── ultrasonic.c    # HC-SR04 distance measurement (Lab 2)
├── motor.c         # PWM steering control via L298N (Lab 3)
├── adc.c / .h      # ADC driver for photoresistor (Lab 4)
└── task1.c         # ADC read + threshold logic (tested standalone)

Lab 1 - USART: Bluetooth Control

The HC-05 sends bytes from the phone app at 9600 baud. The RX Complete Interrupt (RXCIE0) fires automatically when a byte arrives.

// usart.c
void USART0_init(unsigned int ubrr) {
    UBRR0H = (unsigned char)(ubrr >> 8);
    UBRR0L = (unsigned char)ubrr;
    UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);
    UCSR0C = (1 << USBS0) | (3 << UCSZ00); // 8-bit, 2 stop bits
}
// main.c - ISR
volatile char comanda_bt = 0;
 
ISR(USART_RX_vect) {
    char c = UDR0;
    if (c != '\r' && c != '\n') comanda_bt = c;
}

Commands: F Forward, B Backward, L Left, R Right, S Stop, H Horn, 1/2/3 Speed mode.

Lab 2 - Timers: Ultrasonic Distance

Timer 1 measures the HC-SR04 echo pulse. At 16MHz prescaler 8, one tick = 0.5µs → distance_cm = ticks / 116.

// ultrasonic.c
uint16_t get_distance() {
    PORTD &= ~(1 << PD2); _delay_us(2);
    PORTD |=  (1 << PD2); _delay_us(10);
    PORTD &= ~(1 << PD2);
 
    uint32_t counter = 0;
    while (!(PIND & (1 << PD4))) {
        if (++counter > 100000) return 0;
    }
 
    TCNT1 = 0;
    TCCR1B = (1 << CS11);
    while (PIND & (1 << PD4)) {
        if (TCNT1 > 40000) break;
    }
    TCCR1B = 0;
    return TCNT1 / 116;
}

Lab 3 - PWM: Steering Control

Timer 0 in Fast PWM mode on OC0A (PD6). OCR0A sets duty cycle (0-255). PB0/PB1 select direction.

// motor.c
void motor_steering_init() {
    DDRD |= (1 << PD6);
    DDRB |= (1 << PB0) | (1 << PB1);
    TCCR0A = (1 << COM0A1) | (1 << WGM01) | (1 << WGM00);
    TCCR0B = (1 << CS01) | (1 << CS00); // prescaler 64
    OCR0A = 0;
}
 
void motor_steer(int direction, uint8_t power) {
    OCR0A = power;
    if (direction == 1)       { PORTB |=  (1<<PB0); PORTB &= ~(1<<PB1); }
    else if (direction == -1) { PORTB &= ~(1<<PB0); PORTB |=  (1<<PB1); }
    else                      { PORTB &= ~(1<<PB0); PORTB &= ~(1<<PB1); }
}

Lab 4 - ADC: Automatic Headlights

Photoresistor on PC0 (ADC0) in voltage divider. When dark → LEDs turn on automatically.

// adc.c
void adc_init() {
    ADCSRA = (1 << ADEN) | (7 << ADPS0); // prescaler 128
    ADMUX  = (1 << REFS0);               // AVcc reference
}
 
uint16_t myAnalogRead(uint8_t channel) {
    ADMUX &= 0b11100000;
    ADMUX |= (channel & 0b00000111);
    ADCSRA |= (1 << ADSC);
    while (ADCSRA & (1 << ADSC));
    return ADC;
}

Lab 6 - I2C: LCD Telemetry

🔄 In progress. TWI hardware used at 100kHz. Registers: TWBR, TWSR, TWCR, TWDR. LCD will show speed mode and distance.

Metrics & Targets

What Target How
Command response time < 100 ms Oscilloscope: BT RX → PWM change
Distance accuracy ±1 cm Compare to ruler
Emergency brake 100% at ≤ 15 cm 20 test runs
LCD update rate ≥ 5 Hz Count I2C calls/second
Headlight response < 200 ms Cover/uncover sensor, time LED toggle

Key Features

  1. Collision prevention: Progressive buzzer + automatic emergency brake at 15cm.
  2. Adaptive lighting: Headlights react to environment automatically.

Planned extra: Rear HC-SR04 for reverse parking assist.

Obtained Results

Feature Status
Bluetooth command reception Tested
ADC light reading Tested
Ultrasonic distance Tested
PWM steering (L298N) In progress
Speed modes via ESC In progress
Progressive buzzer In progress
Emergency brake at 15cm In progress
I2C LCD telemetry In progress
Automatic headlights In progress

Conclusions

This project shows that one small 8-bit microcontroller can handle wireless control, sensing, motor driving, and display - all at once -using only hardware registers.

Key lessons:

  • Interrupts keep Bluetooth reception reliable without blocking the main loop.
  • Hardware timers give accurate distance measurement.
  • Separate power rails protect the MCU from motor noise and voltage drops.

Download

All project files (C sources, Makefile / PlatformIO config, and schematics) are available in the GitHub repository: PROIECT_PM_MASINUTA GitHub

Milestone Log

Task                              W1  W2  W3  W4  W5  W6  W7  W8  W9
──────────────────────────────────────────────────────────────────────
Planning & chassis setup          xxx xxx
Validate USART, ADC, Ultrasonic           xxx xxx
PWM speed & steering control                      xxx xxx
I2C LCD + emergency brake logic                           xxx xxx
Final assembly & testing                                          xxx
Phase Weeks Goal
Planning & chassis setup W1-W2 Component list, schematic, chassis
Validate peripherals W3-W4 USART, ADC, Ultrasonic confirmed working
PWM control W5-W6 3 speed modes, steering working
I2C & safety logic W7-W8 LCD + emergency brake at 15cm
Final assembly W9 Clean wiring, all metrics measured

Bibliography and Resources

Hardware Datasheets

Tools

  • PlatformIO + VS Code: Writing and uploading firmware
  • avr-gcc + avr-size: Compiling and checking memory
  • Serial Bluetooth Terminal (Android): Sending commands from phone

Export to PDF

pm/prj2026/vlad.radulescu2901/viorel_cosmin.cucu.1778956011.txt.gz · Last modified: 2026/05/16 21:26 by viorel_cosmin.cucu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0