Introduction: Full Size RC Car

About: I build things, fast!

What is it?

Think RC cars are only for kids? Think again! This tutorial will show you how to fit-out and build a full size 1:1 RC car. By equipping a car with these controls is a good starting platform to build your own fully autonomous car (next phase).

NOTE: This build is based on a non “drive-by-wire” style car. If you would like to read my other tutorial for a “drive-by-wire” car, check it out here.

Step 1: Background

I have always wanted to build my own self driving car and there is no better way to get started than modifying an old car to have all the controls be handled without a human being in the car. So, the first stage is to fit-out a car with these controls and then remotely actuate them via RC.

I decided to document this process to show others that the barrier to entry to build an autonomous car is super low and not very expensive (<$2k). I want thousands of people building these cars so we have a lot more people that have real world experience in mechatronics, computer science and engineering in general.

My skills

  • Built and restored over 8 cars and 10 motorbikes
  • Worked in Manufacturing my whole life
  • Qualified Fitter and Turner
  • Qualified Toolmaker
  • Bachelor of Computer Science
  • Founder of QRMV - specialized in Vision Guided Industrial Robotics
  • Co-founder/CTO of ollo wearables - voice controlled cellphone for seniors/elderly (modern life alert)
  • Multiple patents (awarded and provisional) telephony, geo-positioning and computer vision

Step 2: Skills Needed

I have a very technical background but I think anyone that is a bit hands on should be able to build one of these quite easily. If you don’t have all the skills the easy thing to do is ask others that you know to join in on the build. That way you can teach each other as you go.

Mechanics - know your way around a car and its components and how they work together

Mechanical - be able to use a wide variety of hand and power tools (drill, grinder, lathe, etc)

Electronics - understand, design and build basic circuits (component selection, soldering etc)

Drafting - Be able to draw components in CAD to be machined by 3rd parties

Programming - Be able to build simple Arduino sketches, use git, etc

Step 3: Cost to Build

In short - <$2k. The cost to build one of these cars really comes down to how much you can get the running car for as it is probably the highest and most variable cost component in the project. For the first car I built, I managed to pick-up my little 1991 Honda Civic for $300 and it was still registered.

For all the other components that you will need they are mostly “off the shelf” so the prices won’t vary too much.

Step 4: Parts List

The full parts list and suppliers/manufacturers can be found here.

  • Car (non drive-by-wire style)
  • Linear Actuator (Electric) - Gear Selector
  • Linear Actuator (Electric) - Brakes
  • Servo (High Torque) - Accelerator
  • Electronic Power Steering module - Steering
  • Arduino Uno - Controls system integration
  • High current (5A) 5-6V regulated power supply (for servo)
  • 8/9 Channel RC controller and Receiver
  • Deep Cycle Battery (Optional)
  • Auxiliary Battery - Voltage Sensitive Relay (Optional)
  • Battery Box (Optional)
  • Battery Isolator
  • 60A Motor Driver (Multi-Directional)
  • 2 x 32A Motor Driver (Multi-Directional)
  • 2 x 30A 5V Relay Modules
  • 2 x Sliding Potentiometers
  • 2 x Multi-turn Potentiometers
  • ~50A Circuit Breaker or Fuse
  • Emergency Stop Buttons and contacts
  • Wire (High Current for motors/battery and multicore for hookup)
  • Automotive Fuse box
  • Steel flat bar (25x3mm and 50x3mm)
  • Aluminium plate (3-4mm)
  • ABS enclosure boxes for electronics
  • Car workshop manual

Step 5: Components of the System - Car

Note: For this tutorial I am building on a non “drive-by-wire” style car being a 1990 Honda Civic. If you want to build upon a “drive-by-wire” car, I will be releasing my build info on this in the coming months.

For the car you want to make sure it ticks off the on the following;

  • Car starts, runs and can drive (if not, get it working)
  • Its has automatic transmission
  • Brakes work
  • Alternator is in good working order

Step 6: Components of the System - Auxiliary Battery Setup (Optional)

In this tutorial I will be using a second/auxiliary deep cycle battery but this is optional. I choose to do this in my build as the original battery in the car was super small and there was a deal on to get a deep cycle battery with an auxiliary battery relay setup for the same price as another battery. The key thing here is that you want a good working battery and alternator in the car that can supply high current when needed.

Firstly, disconnect the cars battery as we will be working on both terminals. To setup an auxiliary battery in the car is pretty straight forward. Firstly, find a suitable/safe place to mount the second battery inside the car, trunk or if you have enough space, under the hood.

Mount the Voltage Sensitive Relay as close as possible to the starter battery.

Use some heavy gauge wire (6 AWG) to run from the positive terminal of the starter battery connector to the voltage sensitive relay. Then run another piece of the heavy gauge wire from the voltage sensitive relay to the auxiliary battery and securely connect a battery terminal to it.

The voltage sensitive relay should have a negative wire that needs to be connected to the cars ground. Make sure that this wire/connector has a really good ground contact.

At the auxiliary battery, run a heavy gauge wire (6 AWG) from the negative terminal to part of the cars metal body and ensure it has a solid ground (bare metal). Put appropriate connectors on both ends and test the grounding is correct.

Note: Ensure that your auxiliary battery is securely mounted and will not move around while driving. I recommend putting it into a battery box to keep it secure and tidy.

I highly recommend using a battery isolator in your system to enable simple and quick isolation of power. Place this inline from your battery power to the controller’s fuse box

Step 7: Components of the System - Ignition

Most cars start by a key been rotated in the ignition. This then applies power to different components within the car including the ECU, starter solenoid, radio, fans etc. We are going to replace the key system with relays that we can trigger from our Arudino.

You will need the cars electrical diagrams to perform this work but you can normally find them online by doing a quick Google search or by simply buying one online. I would recommend that you get the cars complete workshop manual as it will also include other information including any tips/tricks on removing certain components. Plus, it is always great to have information on hand to diagnose and fix any other car issues you might encounter.

I would also look at removing the steering column completely (including the ignition barrel, indicator stalk etc) from the rack to give you more space plus you will be replacing it with an electronic power steering system so there is no need for the old setup to be left in the car.

Look at the cars electrical diagrams for the ignition and determine the wire/s that feed into the ignition. Normally there will be a fused positive constant power wire from the battery (IN) and then a bunch of other wires that feed out to power the cars components at the different stages of the cars ignition/power cycle (Off, ACC, IGN1/Run, IGN2/Start). Work out which wires are which as you will only need in most older cars the Main IN positive wire, the IGN1/Run and the IGN2/Start wires to get the car running but this varies from car to car.

For the car I had I only needed 3 wires in total but they were supplying high current so I needed some heavy duty relays to switch the load. The relays that I ended up using are 30A 5V modules that I found online. I wanted something that could handle high current ~30A and be able to be switched simply by a 5V signal.

Wire in the ignition wires to the relays as needed. Always check that the relays work before mounting them as I have had multiple “dead on arrival” relays in my life of building stuff which has literally costed me days of my life fault finding.

You will want these relays to work in different ways. The IGN1/Run relay in my system turned on all the cars ECU, Radiator Fan, Ignition Module which in a sense would allow me to switch the cars power on/off. Simply, without power being supplied to the ignition module the car would crank over but would never start. The IGN2/Start relay was directly connected to the starter solenoid that would actually crank the engine. With this relay you would only want to momentary have this on to get the car running but once it is running you would want to disengage it so not to kill the starter motor.

Testing

Circuit - Make up a simple switch (IGN1/Run Relay) and a momentary button (IGN2/Start) circuit as inputs for your Arduino

Programming - Write a simple test script to test both the relays operate without the starter battery connected. Once confident with your circuit and script, connect the starter battery and test it out. At this point you should be able to start and stop your car.

Milestone

At this point you should have;

  1. IGN1/Run relay wired
  2. IGN2/Start relay wired
  3. control of both the relays on/off operations via Arduino
  4. test circuit to control the relays
  5. be able to start the car
  6. be able to switch the car off

Step 8: Components of the System - Gear Selector

As we are using a car with automatic transmission in this build it makes it relatively easy to change gears as we just need to move the lever in a linear motion to certain points.

Note: I decided to use the existing lever and not link directly to the transmission cable as I wanted to keep the car as stock looking and interior as normal as possible.

The only difficult thing you might think of is that most automatic transmissions require you to depress a button before you can move the transmission lever. As we are using a linear actuator that has a worm screw, we can use its self locking ability to hold the transmission lever in place when it is not moving it. So as for the button, you can go about locking it into the “depressed” state permanently.

The linear actuator used here needed to have enough stroke to change from the Park position through to Reverse, Neutral and then to Drive. In my cars case it was about 100mm from where I was mounting the actuator. The force required to move the lever was very little (<5kg) so I ended up using a 150mm Stroke/70kg force actuator as it was in stock.

To mount the base of the actuator, I welded up a bracket and attached it to a part of steel frame that was used in the centre console. This allowed it to pivot slightly as it extended/retracted through its stroke.

For the attachment to the transmission lever I just cut a couple of pieces of steel flat bar and used a couple of bolts to keep it in place. It is not clamped hard around the lever, it is just containing it. This allows for it to move and not bind up as it moves.

Determining the position of the actuator I used a sliding potentiometer that would send an analog signal back to my Arduino. I made a custom mount for the pot to the actuator out of some flat bar. I then folded over the tabs of the pots slider around the transmission lever attachment bracket bolt. It works but I should change this to be a better attachment for the pots slider.

To power the actuator I used a motor driver that can go forwards and backwards plus be controlled via a microcontroller. I used a 2x32A Sabertooth Motor Driver from Dimension Engineering but feel free to use anything that works similar. The first channel will be used to control the gear selector actuator and the second will control the brake actuator. Wiring and configuring this motor driver up is straightforward and well documented. Wire in the positive and negative of the battery as labelled and attach the actuators wires to the motor output 1. Connect the 0V to your Arduino’s Ground and the S1 wire to a digital output pin.

Note: I used the simple serial configuration on this build and it has seemed to work quite well. Dimension Engineering has also created a couple of libraries to make communicating with their drivers super simple. They also have some simple examples to get you up and running quickly.

Testing

Circuit - To move the actuator forwards and backwards make up a simple circuit with two momentary buttons as inputs. One to extend the actuator and the other to retract the actuator. This will then give you some control on positioning the actuator into the gear positions.

Programming - Write a simple script to move the actuator backwards and forwards and outputting the value from the sliding potentiometer. When running the script, take note of the potentiometer values for the Park, Reverse, Neutral and Drive gear positions. You will need these to tell the actuator move to these positions in the full code.

Milestone

At this point you should have;

  1. actuator securely mounted in car
  2. attachment around gear selector/actuator
  3. motor driver wired in with actuator and Arduino
  4. control of the extension/retraction of the actuator via the Arduino
  5. test circuit to control the extension/retraction of the actuator
  6. know the potentiometer values/positions for each gear position

Note: You can also use a multi-position switch circuit to test the gear selector input on your Arduino once you know the positions. This way you will be able to copy the gear selector code directly over into the completed running car code base.

Step 9: Components of the System - Brakes

Stopping the car is pretty important so you want to make sure you get this bit right. The brakes on a car are normally actuated by your foot which can apply a great amount of force when required. In this build we are using another linear actuator that will act out foot. This actuator had to have a high amount of force (~30kg) but only needed a short stroke ~60mm. I was able to get a 100mm stroke/70kg force actuator as it was in stock.

Finding the right place to mount the actuator was a little difficult but with some trial and error I found a secure position. I welded a piece of steel flat bar onto the side of the brake pedal arm and drilled a hole through it where i ran a bolt from the top of the actuator. I then welded in a pivot mounting bracket on the other end of the actuator to the floor plan of the car.

Determining the position of the actuator I used a sliding potentiometer (same setup as gear selector actuator) that would send an analog signal back to my Arduino. I made a custom mount for the pot to the actuator out of some flat bar. I then folded over the tabs of the pots slider around a small flat bar tab that I mounted at the end of the actuator.

To power the actuator I used the other channel of the 2x32A Sabertooth Motor Driver. To control both motors you only need to use the one wire (S1).

Note: I used the simple serial configuration on this build and it has seemed to work quite well. This motor driver can be configured in multiple ways so choose a method that you prefer.

Testing

Positioning - Before connecting the actuator directly to the brake pedal you will want to have some idea of how far the pedal needs to travel to apply the brakes. I pushed my foot down on the brakes to get the car to stop (holding stop, not full brakes). I then moved the actuator to align its connection mount with the welded brake attachment. I recorded the output value of the potentiometer so I then knew my max brake depression position.

I did the same as above for the brake off position.

Circuit - To move the actuator forwards and backwards make up a simple circuit with two momentary buttons as inputs. One to extend the actuator and the other to retract the actuator. This will then give you some control on positioning the actuator into the gear positions.

Programming - Write a simple script to move the actuator backwards and forwards and outputting the value from the sliding potentiometer. When running the script, take note of the potentiometer values for the Brake on and off positions. You will need these to tell the actuator move to these positions in the full code.

Milestone

At this point you should have;

  1. actuator securely mounted in car
  2. attachment for the brake pedal to the actuator
  3. motor driver wired in with actuator and Arduino
  4. control of the extension/retraction of the actuator via the Arduino
  5. test circuit to control the extension/retraction of the actuator
  6. know the potentiometer values/positions for the brake off and on positions

Note: In the final code I use the RC controllers signal from the channel to control how much pressure to apply to the brake proportionally to its stick position. This gave me the range from completely off all the way through to fully on.

Step 10: Components of the System - Accelerator

Now let’s get those engines revving and to do that we need to hookup the accelerator. As we are using a non “drive-by-wire” car we actually will be pulling on a cable that is connected to the throttle body. Throttle bodies normally have a strong spring that close the butterfly very quickly when the accelerator is released. To overcome this force I used a high torque servo (~40kg/cm) to pull on the cable.

I bolted this servo on a piece of steel flat bar and mounted off to the side of the center console with some right angle brackets. I also needed to buy a longer accelerator cable (2m) as the stock cable that was used in the car was too short. This also gave me a lot more mounting options which saved me a lot of time.

Be aware that these high torque servos normally pull higher than normal current so be sure you can supply it appropriately. I used a 5V 5A regulated power supply for it which easily gives it enough current to run at full torque. The signal wire from the servo was then fed back to a digital output of the Arduino.

Testing

Programming - Write a simple script to rotate the servo from the accelerator off position to fully on (if you are game). I added an accelerator config parameter that would limit the amount of movement the servo would have to allow me to quickly adjust the accelerator feel.


Milestone

At this point you should have;

  1. servo securely mounted
  2. accelerator cable connected from throttle body to servo control arm
  3. power supply wired in to provide enough current to servo
  4. control of the servo position via Arduino
  5. known positions for servo for accelerator off and fully on

Note: In the final code I use the RC controllers signal from the channel to control how much movement to apply to the accelerator proportionally to its stick position. This gave me the range from completely off all the way through to fully on with the accelerator config parameter as a limiter.

Step 11: Components of the System - Steering

Being able to steer the car where we want it to go is pretty important. Most cars made in the past (pre ~2005) used hydraulic power steering to make turning the steering wheel very light for the user. Since then, due to technology and the automotive manufacturers being asked to reduce emissions they have developed electronic power steering (EPS) systems. These systems use an electric motor and a torque sensor to to assist the driver with turning the wheels. By removing the hydraulic power steering pump, there is now less strain put on the engine which in turns allows the car to run at lower engine revs (reducing emissions). You can read more about EPS systems here.

In the setup to steer my little car I used an electronic power steering (EPS) system from a 2009 Nissan Micra. I purchased it from a car wrecker/scrapyard for $165. I mounted this EPS module to the existing steering column mounting bolts via a mount that I bent up out of some steel flat bar.

I also needed to purchase the lower steering column shaft (~$65) to connect the EPS to the spline of the steering rack. To make this fit in my car I modified the steering column shaft by cutting and welding the spline of the original steering column that I cut out of the Honda to this shaft.

To power/control the EPS motor left or right I used a 2x60A Sabertooth Motor Driver Controller from Dimension Engineering. I only used one of the channels but you need to make sure that you use a motor driver that can supply ~60A+ continuously, work in forward/reverse directions and can also be controlled via a microcontroller.

To know the position of the steering angle I designed a custom steering angle position sensor. Most cars use a digital version that works over the CAN bus which I couldn’t be bothered reverse engineering. For my analog position sensor I used 2 multiturn potentiometers (5 turn), 3 timing belt pulleys, a timing belt and an aluminium plate to mount the components to. Each timing gear I drilled and tapped holes for grub screws and then on the pots and EPS I machined flats to stop the gears from spinning freely. These were then connected via a timing belt. When the steering wheel was centred, the pots would be at 2.5 turns. When it was at full left steering lock it would be at 0.5 turns and full right lock it would be at 4.5 turns. These pots were then wired into analog inputs on the Arduino.

Note: The reason for using two pots was if the belt slipped or broke that I could read the differences between the pots and throw an error.

Testing

Positioning - Before connecting the EPS to the lower steering column and steering rack of the car it is best to test your code for the EPS and steering angle sensor disconnected.

Circuit - To rotate the EPS left or right make up a simple circuit with two momentary buttons as inputs. One to rotate the EPS left and the other to rotate right. This will then give you some control on positioning the EPS into the steering positions.

Programming - Write a simple script to position the steering wheel in the centre, left and right. You will want to control the amount of power that is given to the motor as I found that 70% was more than enough to turn the wheels while the car was still. The power delivery to the EPS will also require an Acceleration/Deceleration curve to smoothly position the steering.

Milestone

At this point you should have;

  1. Electronic Power Steering (EPS) system securely mounted
  2. lower steering column modified to drive from the EPS to the steering rack
  3. steering angle position sensor providing angle of steering rack to Arduino
  4. motor driver wired in with EPS and Arduino
  5. control of the rotation of the EPS via the Arduino
  6. test circuit to control the rotation direction of the EPS
  7. turn the car steering full left lock, centre and full right lock positions via Arduino

Step 12: Components of the System - Receiver/Transmitter

Now to the fun bit that ties all the work that you have done so far. The remote control is the first phase of removing the human component of driving as the commands will now be sent to the receiver and then fed into the Arduino to be actioned. In the second phase of this series we will replace the human and RC transmitter/receiver with a computer and sensors to control where it goes. But for now let's walk through how to setup the RC transmitter and receiver.

To control the components that we have built inside the car so far we need to wire up the output channels of the RC receiver to the Arduino. For this build I ended up only using 5 channels (Accelerator and Brake on the same channel), steering, gear selector (3 position switch), Ignition stage 1 (car power/run) and Ignition stage 2 (car starter). These were all read by the Arduino using the PulseIn function where required.

Testing

Programming - Write a simple script to read all the receiver channels that you are using to control your systems inside the car. Once you can see all the receiver channels working correctly you can start to integrate the code you created previously with the receiver code. A good place to start is with the Ignition System. Replace reading the inputs from the switch and button in the test circuit you created with the RC receiver channels you have setup to control the Ignition System (IGN1/Run and IGN2/Start).

Note: If you use the Turnigy 9x Transmitter like I did you will want to take it apart and move a couple of the switches around. I swapped the momentary “Trainer” switch with the toggle “Throttle Hold” switch to control the IGN2/Start input. I did this as you could not program the “Trainer” switch as an auxiliary switch but you could with the “Throttle Hold” switch. Having a momentary switch for the IGN2/Start input allowed me to not destroy the starter motor as it would only latch the relay high while

Milestone

At this point you should have;

  1. All the receiver outputs wired to the Arduino
  2. Arduino able to read the inputs for each channel
  3. Each channel is able to control each car component (brakes, gear selector etc)

Step 13: Final Program

This bit is up to you but below you will find a link to my code that will help you as a basic starting point to get your car up and running.

Step 14: EXTRA: Autonomous - GPS Waypoint Driving

Check out the vids of it driving between GPS waypoints