How to control an RC car with an arduino

A while ago me, @thijsc and @jkreeftmeijer each bought an arduino starters kit and after the first blinking light it ended up somewhere on my desk. Today i thought it would be fun to actually do something with it, so i went to the local Intertoys and bought a cheap RC car.

Requirements

If you want to do the same i suggest you first try it with the cheapest RC car you can find that has:

  • 7 way control (forward - left & right, backwards - left & right and stop)

  • Runs on 6 volts

  • Is big enough to house the arduino and board.

  • Doesn’t go to fast (it gets really hard to control movement)

  • See if the steering wheels return to the center automatically

I ended up with the “Wild Hopper”, an offroad buggy.

Insides

Next step was to take the damn thing apart!

Inside i unscrewed the PCB to see if i could recognize anything. (Click for larger image with pin layout)

Wiring

I Googled for the numbers on the PCB (SW188 top right on the PCB) and it turns out there is a Chinese (i’m assuming this by the look of the signs) document with the pin layout of the chip! Download the pdf here.

Now i had the pin layout it was just a matter of putting current on the pins and the wheels started moving! I also found out the front weels return to the center position after i disconnected the current. This is really great and saves me a lot of code. Next i soldered wires to the right pins and a wire to the ground. I added LEDs to all the channels so i could see if the right action was triggered.

As you can see from the photo, I used digital pin 3 to 6 for the four channels (forwards, backwards, left, right)

With everything connected it was time to write the code. I wanted to achieve a simple 3 point turn, this would require all actions (forward, left, right backwards and stop) so i could see that everything was working ok.

The code

The code is really simple, I initialize the pins for output and use that and delays to move the car around.

/*
  3 point turn, attempt 1
*/

void setup() {
  // initialize the digital pins as outputs.
  pinMode(3, OUTPUT);   // Forward
  pinMode(4, OUTPUT);   // Backwards
  pinMode(5, OUTPUT);   // Left
  pinMode(6, OUTPUT);   // Right

}
// Three point turn

void loop() {
  digitalWrite(3, HIGH);   // Forward for 1 second
  delay(500);
  digitalWrite(3, LOW);
  delay(2000);              // wait for a second

  digitalWrite(4, HIGH);   // Back left for half a second
  digitalWrite(5, HIGH);
  delay(500);

  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  delay(2000);            // wait for 2 seconds

  digitalWrite(3, HIGH);   // Back left for half a second
  digitalWrite(6, HIGH);
  delay(500);

  digitalWrite(3, LOW);
  digitalWrite(6, LOW);
  delay(2000);            // wait for 2 seconds
}

Result

The end result of the day

What’s next?

The next step will be adding sensors so it doesn’t crash into every object in the room. More about that in another post!