This is an old revision of the document!
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:
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:
The ATmega328P is the brain of the system. Everything connects to it.
| 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. |
| 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. |
The electrical schematic above illustrates the complete wiring of the Land Buster rover. The hardware architecture is built upon the following core engineering rules:
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.
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)
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.
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; }
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); } }
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; }
🔄 In progress. TWI hardware used at 100kHz. Registers: TWBR, TWSR, TWCR, TWDR. LCD will show speed mode and distance.
| 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 |
Planned extra: Rear HC-SR04 for reverse parking assist.
| 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 |
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:
All project files (C sources, Makefile / PlatformIO config, and schematics) are available in the GitHub repository: PROIECT_PM_MASINUTA GitHub
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 |