How to Build a Remote-Controlled Car with a Servo Steering System

Building Remote-Controlled Cars / Visits:8

If you’ve ever wanted to build your own remote-controlled car from scratch, there’s one component that can make or break your steering performance: the micro servo motor. These tiny but powerful actuators have become the go-to choice for hobbyists and engineers alike, thanks to their precise angle control, compact size, and affordability. In this guide, I’ll walk you through building a complete RC car with a servo-based steering system, focusing on why the micro servo is the star of the show and how to get the most out of it.

Why Micro Servo Motors Dominate RC Steering

Before we dive into the build, let’s talk about why micro servos are such a hot topic in the RC world. Unlike traditional DC motors that just spin, a micro servo gives you position feedback. You tell it to go to 45 degrees, and it locks there. That’s critical for steering, where you need to turn the wheels exactly the right amount, not just spin them endlessly.

Key advantages of micro servos for steering:

  • Precision: Typical micro servos offer 0.1 to 0.5 degree resolution, meaning you can make tiny steering corrections.
  • Torque-to-size ratio: A standard 9g micro servo can deliver 1.5 to 2.5 kg·cm of torque, enough to turn lightweight RC car wheels.
  • Low power draw: They run on 4.8V to 6V, perfect for battery-powered projects.
  • Standardized control: Using PWM (pulse width modulation), any microcontroller can drive them with a single signal wire.

The most common candidate for this build is the SG90 or MG90S micro servo. The MG90S has metal gears, which I recommend for any RC car that might hit bumps or walls.

Tools and Components: What You’ll Need

Here’s the full shopping list. I’ve broken it into categories so you can source parts easily.

Chassis and Drivetrain

  • RC car chassis kit (or 3D-printed frame) – I used a 1:10 scale buggy chassis
  • Two DC motors (3V to 6V, 200-300 RPM) for rear-wheel drive
  • Wheels and tires (matching your chassis size)
  • Battery holder for 4x AA batteries (6V) or a 2S LiPo (7.4V)

Electronics and Control

  • Microcontroller: Arduino Nano or ESP32 (I prefer ESP32 for built-in Bluetooth)
  • Motor driver: L298N or L9110S dual H-bridge
  • Micro servo motor: MG90S (metal gear, 9g)
  • RC receiver/transmitter: FlySky FS-i6 or similar 2.4GHz system
  • Power supply: 5V voltage regulator (if using LiPo) or direct battery

Mechanical Parts

  • Servo horn (comes with servo)
  • Steering linkage (metal rod, ball joints, or 3D-printed parts)
  • Screws, nuts, standoffs
  • Zip ties and double-sided tape

Step 1: Designing the Steering Mechanism

The steering system is where the micro servo shines. Unlike rack-and-pinion setups in full-size cars, we’ll use a direct-link or bellcrank design.

Understanding the Geometry

The servo’s output horn rotates about 180 degrees. To convert that rotation into linear motion for the wheels, you need a linkage. The key is to match the servo’s travel to the wheel’s steering angle.

Formula for linkage length:

If your servo rotates 90 degrees (from center to full lock), and you want the wheels to turn 30 degrees, the linkage arm length should be:

Linkage length = (Servo horn radius) / tan(Wheel angle)

For a typical servo horn radius of 10mm and 30 degree wheel angle:

Linkage length = 10 / tan(30) ≈ 17.3mm

I designed a simple three-bar linkage using a 3D-printed bracket. The servo mounts perpendicular to the chassis, and a metal rod connects the servo horn to the steering knuckle.

Mounting the Micro Servo

Secure the servo with two M2 screws through the chassis. Important: Never overtighten the screws on a micro servo – the plastic case can crack. Use rubber grommets if your servo came with them, as they dampen vibration.

Step 2: Wiring the Electronics

Now let’s connect everything. The wiring diagram is straightforward, but pay attention to power distribution.

Power Distribution Table

| Component | Voltage | Current (peak) | Notes | |-----------|---------|----------------|-------| | Arduino/ESP32 | 5V | 500mA | Use regulator if battery >5V | | DC motors | 3-6V | 1-2A each | Direct from battery via L298N | | Micro servo | 4.8-6V | 750mA stall | Do not share 5V rail with motors |

Critical wiring rule: The micro servo must have its own power supply or a dedicated 5V regulator. When the DC motors draw high current, they can cause voltage dips that make the servo twitch or lose position.

Connection Map

  • Arduino 5V → Servo VCC (only if using separate regulator)
  • Arduino GND → Servo GND, L298N GND, battery GND
  • Arduino D9 → Servo signal wire (yellow/white)
  • Arduino D5, D6 → L298N IN1, IN2 (motor A)
  • Arduino D10, D11 → L298N IN3, IN4 (motor B)
  • L298N 12V → Battery positive (7.4V or 6V)
  • L298N 5V → Arduino VIN (if battery >5V)

Step 3: Programming the Servo Control

This is where the micro servo’s personality comes alive. The code needs to read RC receiver signals and map them to servo angles.

Basic Servo Sweep Test

First, let’s verify your servo works. Upload this to your Arduino:

cpp

include <Servo.h>

Servo steeringServo; int servoPin = 9;

void setup() { steeringServo.attach(servoPin); steeringServo.write(90); // Center position }

void loop() { // Sweep from 0 to 180 degrees for (int angle = 0; angle <= 180; angle++) { steeringServo.write(angle); delay(15); } for (int angle = 180; angle >= 0; angle--) { steeringServo.write(angle); delay(15); } }

Note: Most micro servos have a physical stop at 0 and 180 degrees. Forcing them beyond can strip gears. Always test your mechanical range first.

Integrating RC Receiver Input

For a real RC car, we read PWM signals from the receiver. Each channel outputs a pulse between 1000µs (full left) and 2000µs (full right), with 1500µs as center.

cpp

include <Servo.h>

Servo steeringServo;

int ch1Pin = 3; // Receiver channel 1 (steering) int ch2Pin = 4; // Receiver channel 2 (throttle) int servoPin = 9;

void setup() { steeringServo.attach(servoPin); pinMode(ch1Pin, INPUT); pinMode(ch2Pin, INPUT); }

void loop() { int steeringPulse = pulseIn(ch1Pin, HIGH); int throttlePulse = pulseIn(ch2Pin, HIGH);

// Map 1000-2000 to 0-180 degrees int servoAngle = map(steeringPulse, 1000, 2000, 0, 180); servoAngle = constrain(servoAngle, 10, 170); // Safety limits

steeringServo.write(servoAngle);

// Control motors based on throttle int motorSpeed = map(throttlePulse, 1000, 2000, -255, 255); // ... motor driver code here ...

delay(20); // 50Hz refresh rate }

Step 4: Mechanical Assembly – Getting the Linkage Right

This is the most finicky part. A poorly aligned linkage will cause binding, servo stall, or uneven steering.

Alignment Checklist

  1. Servo horn at 90 degrees – Before connecting any linkage, power the servo and command write(90). The horn should be perpendicular to the servo body.
  2. Wheels straight ahead – Manually align both wheels so they point straight.
  3. Linkage length adjustment – Use adjustable turnbuckles or threaded rods. Shorten or lengthen until the servo horn and wheels are both centered.
  4. Check for binding – Manually rotate the servo horn through its full range. If you feel resistance at any point, adjust the linkage geometry.

Common Micro Servo Issues in Steering

  • Jittering: Usually caused by insufficient power. Add a 470µF capacitor across the servo’s power pins.
  • Oscillation: The servo hunts back and forth. This happens if the PID loop in the servo’s internal controller is unstable. Try reducing the load or adding a small amount of friction.
  • Gear stripping: Metal gears (MG90S) help, but if you hit a curb at full speed, even metal can break. Consider adding a servo saver (a spring-loaded horn) to absorb shocks.

Step 5: Tuning the Servo for Real-World Driving

A micro servo isn’t just “set and forget.” You need to adjust its behavior for different driving conditions.

Speed vs. Precision Trade-off

Micro servos have a transit time – typically 0.1 to 0.2 seconds per 60 degrees. For racing, you want fast response. For crawling, you want slow, precise movements.

Adjusting servo speed in software:

cpp // Slow steering for crawler int targetAngle = map(steeringPulse, 1000, 2000, 0, 180); int currentAngle = steeringServo.read();

if (currentAngle < targetAngle) { currentAngle += 2; // Increment slowly } else if (currentAngle > targetAngle) { currentAngle -= 2; } steeringServo.write(currentAngle);

Endpoint Adjustments

Most RC transmitters allow you to set steering endpoints (EPA). Use this to prevent the servo from over-rotating and hitting mechanical limits. On the FlySky FS-i6, set EPA to 80% initially, then increase gradually.

Step 6: Advanced Features with Micro Servos

Once your basic car runs, you can push the micro servo further.

Dual Servo Steering

For heavy cars, use two micro servos – one per wheel. Wire them in parallel (same signal, separate power) and program them to mirror each other. This doubles the torque without changing the control code.

Servo Feedback for Self-Alignment

Some micro servos (like the MG996R) have a feedback pin that reports actual position. You can use this for closed-loop control:

cpp int actualPosition = analogRead(feedbackPin); // 0-1023 int error = targetPosition - actualPosition; steeringServo.write(servoAngle + error * 0.1); // Proportional correction

This compensates for load changes when the car is turning on loose gravel.

Bluetooth Control via ESP32

If you’re using an ESP32, ditch the RC receiver and control the car from your phone:

cpp

include <BluetoothSerial.h>

BluetoothSerial SerialBT;

void loop() { if (SerialBT.available()) { char command = SerialBT.read(); if (command == 'L') steeringServo.write(0); else if (command == 'R') steeringServo.write(180); else if (command == 'C') steeringServo.write(90); } }

Real-World Testing: What to Expect

I built two versions of this car – one with a plastic-gear SG90 and one with a metal-gear MG90S. Here’s what I found:

Performance Comparison

| Metric | SG90 (Plastic) | MG90S (Metal) | |--------|----------------|----------------| | Torque | 1.8 kg·cm | 2.5 kg·cm | | Gear durability | Stripped after 3 crashes | Survived 20+ crashes | | Price | $2.50 | $4.00 | | Weight | 9g | 13g |

Verdict: Spend the extra $1.50 for the MG90S. The plastic gears in the SG90 will fail the first time you hit a wall at speed.

Common Failure Modes

  1. Servo horn slipping – The splines on the horn wear out. Solution: Use a metal servo horn with set screws.
  2. Binding at full lock – The linkage hits the chassis. Solution: Add physical stops with 3D-printed bumpers.
  3. Servo burnout – If stalled for more than 2 seconds, the internal motor can overheat. Solution: Add a current limiter or software timeout.

Final Tweaks for Maximum Performance

  • Lubrication: Apply a tiny drop of silicone grease to the servo output shaft. This reduces friction and improves centering accuracy.
  • Vibration damping: Mount the servo on foam tape. This isolates it from chassis vibrations, which can cause false position readings.
  • Waterproofing: If driving outdoors, coat the servo PCB with conformal coating and seal the case seams with hot glue.

Building an RC car with a micro servo steering system is one of the most rewarding projects you can tackle. The servo gives you that satisfying “snap” when you turn the wheel, and the precision control makes even a budget car feel like a high-end racer. Whether you’re building for speed, crawling, or just tinkering, the micro servo is the unsung hero that turns your creation from a toy into a precision instrument.

Copyright Statement:

Author: Micro Servo Motor

Link: https://microservomotor.com/building-remote-controlled-cars/rc-car-servo-steering.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