How to Build a Remote-Controlled Car with Obstacle Avoidance

Building Remote-Controlled Cars / Visits:6

The thrill of remote-controlled cars never fades, but what if you could inject a dose of artificial intelligence into your tiny vehicle? Imagine an RC car that doesn't just mindlessly crash into furniture but actively navigates around it, using a simple, clever brain of its own. This project is not only incredibly satisfying but also a fantastic gateway into the worlds of robotics, sensor integration, and embedded programming. At the heart of this intelligent navigation system lies a humble yet crucial component: the micro servo motor. This guide will walk you through building your very own obstacle-avoiding RC car, with a special focus on the pivotal role of the servo in making your car "see" and react.

Why the Micro Servo Motor is a Game-Changer

Before we dive into nuts and bolts, let's talk about our star component. A micro servo motor is a compact, rotary actuator that allows for precise control of angular position. Unlike a standard DC motor that spins continuously, a servo moves to and holds a specific position based on a coded signal. This is what makes it indispensable for our project.

Key Characteristics of Micro Servos for Robotics: * Compact Size & Lightweight: They don't add significant bulk or weight, which is critical for small, agile RC cars. * Precise Positioning: They can be commanded to rotate to exact angles (e.g., 45°, 90°, 180°), perfect for sweeping a sensor across a field of view. * Integrated Gearbox and Control Circuit: They are all-in-one units, requiring minimal external circuitry. You provide power and a Pulse Width Modulation (PWM) signal, and it handles the rest. * High Torque for Size: They provide enough rotational force to move a sensor mount quickly and reliably.

In our obstacle-avoidance system, the servo's job isn't to drive the wheels—it's to become the neck and eyes of our car. It will pan an ultrasonic sensor left and right, allowing our car to scan its environment and make informed decisions, moving beyond simple "stop-and-reverse" logic to true directional avoidance.


Gathering Your Components and Tools

You don't need a professional robotics lab for this project. Most components are readily available online or at electronics hobby stores.

Core Electronics

  • RC Car Chassis: A basic 2WD or 4WD chassis kit. A simple two-motor design is easier to program for beginners.
  • Microcontroller: An Arduino Uno or Nano is the perfect brain for this project, thanks to its simplicity and vast community support.
  • The Star: Micro Servo Motor: A standard 9g micro servo (like the SG90 or MG90S) is ideal. Ensure it has a 180-degree range of motion.
  • Distance Sensor: An HC-SR04 Ultrasonic Sensor is the most common and affordable choice for measuring distance to obstacles.
  • Motor Driver: An L298N or a simpler L9110S dual H-bridge module to interface the Arduino with the car's DC motors.
  • Power: Two power sources are best: a 5V power bank or 4xAA battery pack for the Arduino/servo/sensor, and a separate 7.2V-9V battery for the drive motors (via the motor driver).
  • Breadboard & Jumper Wires: For making connections without soldering during prototyping.

Essential Tools

  • Soldering iron and solder (for permanent connections)
  • Hot glue gun or strong double-sided tape
  • Wire strippers/cutters
  • Screwdrivers
  • Computer with the Arduino IDE installed

The Build: Mechanical and Electrical Assembly

Step 1: Preparing the Chassis

Start by assembling your RC car chassis according to its kit instructions. Ensure the wheels move freely. You'll typically have two DC motors connected to the rear or front wheels and a simple front axle for steering. For this project, we often disconnect the built-in steering (if any) and will control direction by varying the speed of the left and right wheels (differential steering).

Step 2: Mounting the Sensing Apparatus

This is where the micro servo comes into play physically.

  1. Create a Sensor Platform: Use a small piece of plastic, lightweight wood, or even a Lego piece. Mount the HC-SR04 ultrasonic sensor onto this platform. The sensor's "eyes" should face forward.
  2. Attach Platform to Servo Horn: Fix the platform to the rotating horn (the white arm) of the micro servo. You may need to drill a small hole or use strong adhesive.
  3. Mount the Servo to the Car: Position the servo at the very front of the car, on top. Use a small bracket, hot glue, or zip ties to secure it firmly. The goal is to have the sensor sweep the horizon in an arc without hitting the car's body. The servo should be positioned so that its 90-degree position points the sensor straight ahead.

Step 3: Wiring the Nervous System

Follow this connection map. Always disconnect power when making connections.

Micro Servo Motor: * Servo Red Wire (VCC) -> Arduino 5V pin (or regulated 5V on breadboard) * Servo Brown/Black Wire (GND) -> Arduino GND pin * Servo Orange/Yellow Wire (Signal) -> Arduino Digital PWM Pin 9

HC-SR04 Ultrasonic Sensor: * VCC -> Arduino 5V * Trig -> Arduino Digital Pin 10 * Echo -> Arduino Digital Pin 11 * GND -> Arduino GND

L298N Motor Driver: * Out1 & Out2 -> Terminals of Left DC Motor * Out3 & Out4 -> Terminals of Right DC Motor * 12V Input -> Positive of your separate motor battery (7.2-9V) * GND -> Negative of motor battery AND to Arduino GND (to create a common ground). * 5V Output -> Can be left unused or power Arduino if needed. * Input Pins IN1, IN2, IN3, IN4 -> Arduino Digital Pins 5, 6, 7, 8 respectively. * Enable A & Enable B -> For basic control, jumper them to the onboard 5V to enable the motors. For speed control, connect to Arduino PWM pins.

Connect your primary Arduino power (USB or 5V battery pack) to the Arduino's Vin or 5V/USB port.


Programming the Intelligence

The code is where logic meets mechanics. The core algorithm involves scanning, measuring, deciding, and moving.

The Core Logic Flow

  1. Scan: Command the servo to sweep through a sequence of angles (e.g., 30°, 90°, 150°).
  2. Measure: At each angle, trigger the ultrasonic sensor to measure the distance to any obstacle.
  3. Decide: Store these distances. Determine which direction has the clearest path (greatest distance).
  4. Act: Command the drive motors to move forward, turn left, or turn right based on the decision.

Key Code Snippets and Explanation

First, include the Servo library and define pins.

cpp

include <Servo.h>

Servo myServo; // Create servo object to control it

// Pin Definitions const int trigPin = 10; const int echoPin = 11; const int servoPin = 9;

// Motor Driver Pins const int in1 = 5, in2 = 6, in3 = 7, in4 = 8;

// Distances int leftDist, centerDist, rightDist;

void setup() { myServo.attach(servoPin); // Attaches the servo on pin 9 pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); // Set all motor control pins as OUTPUTs pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); Serial.begin(9600); // For debugging }

The Scanning Function: This function positions the servo and takes a distance reading.

cpp int getDistance(int angle) { myServo.write(angle); // Command servo to specific angle delay(200); // Give the servo time to reach the position

// Standard HC-SR04 distance measurement digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW);

long duration = pulseIn(echoPin, HIGH); int distance = duration * 0.034 / 2; // Convert to cm return distance; }

The Decision & Movement Functions: Simple logic to choose a path and basic motor controls.

cpp void decideAndMove() { // Define safe distance (in cm) int safeDistance = 20;

if (centerDist > safeDistance) { // Path is clear ahead moveForward(); } else if (leftDist > rightDist && leftDist > safeDistance) { // Left path is clearer turnLeft(); } else if (rightDist > safeDistance) { // Right path is clearer turnRight(); } else { // Nowhere is clear, go backwards moveBackward(); delay(500); turnRight(); // Arbitrary turn to try a new direction delay(300); } }

void moveForward() { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); // Left motor forward digitalWrite(in3, HIGH); digitalWrite(in4, LOW); // Right motor forward } void turnLeft() { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); // Left motor backward digitalWrite(in3, HIGH); digitalWrite(in4, LOW); // Right motor forward } void turnRight() { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); // Left motor forward digitalWrite(in3, LOW); digitalWrite(in4, HIGH); // Right motor backward } void moveBackward() { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); } void stopMotors() { digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); }

The Main Loop: Tying it all together.

cpp void loop() { // 1. Scan three positions leftDist = getDistance(150); // Servo looks left centerDist = getDistance(90); // Servo looks center rightDist = getDistance(30); // Servo looks right

// 2. Decide and Move decideAndMove();

// Small delay to prevent erratic behavior delay(100); }


Testing, Calibration, and Advanced Tweaks

Upload the code, place your car on the floor, and power it up! It should begin scanning and moving.

Troubleshooting Common Issues

  • Servo Jitter or Doesn't Move: Check power connections. The servo may be drawing too much current; ensure your 5V supply can provide at least 1A.
  • Inconsistent Distance Readings: Ensure the sensor is firmly mounted and not vibrating. Add a small capacitor (10µF) between the sensor's VCC and GND pins to smooth power.
  • Car Spins in Circles: Check your motor wiring. Swap the two wires on one motor if it's running backward relative to the other.
  • Erratic Decisions: Adjust the safeDistance variable. Increase the delay() after servo movements to ensure it has settled.

Taking Your Project to the Next Level

  • Smoother Scanning: Implement a slower, more continuous sweep for a more detailed environmental map.
  • Speed Control: Use PWM on the motor driver's enable pins to make turns and movements smoother.
  • Additional Sensors: Add a second ultrasonic sensor pointed straight ahead for instant forward detection while the servo-mounted sensor scans.
  • Data Logging: Implement a Bluetooth module (like HC-05) to send sensor data and decisions to your computer for analysis.
  • Advanced Algorithms: Experiment with state machines or even simple implementations of bug algorithms for more efficient navigation.

Building this remote-controlled car with obstacle avoidance is more than a weekend project; it's a hands-on lesson in mechatronics. The micro servo motor transforms a reactive sensor into an active scout, embodying the principle that sometimes, the smartest solution involves looking around before you leap. The skills you learn—integrating hardware, writing control logic, debugging systems—are the very foundation of modern robotics. So, power up your soldering iron, fire up the Arduino IDE, and start building. Your intelligent, obstacle-avoiding creation is waiting to come to life.

Copyright Statement:

Author: Micro Servo Motor

Link: https://microservomotor.com/building-remote-controlled-cars/rc-car-obstacle-avoidance.htm

Source: Micro Servo Motor

The copyright of this article belongs to the author. Reproduction is not allowed without permission.

About Us

Lucas Bennett avatar
Lucas Bennett
Welcome to my blog!

Tags