Overview - a 25 year old RC car , an obsolete aged 49 MHz model had been hacked & sitting in a junkpile for decades.....

It is saved from the trash bin, land of misfit toys, recovered and restored it to original working condition,......

then tore it down and rebuilt it with modern 2.4 GHz FHSS RC controller, an infinitely variable steering servo, and variable speed throttle control

using a newer RC controller, an Arduino Nano, and an L298N H bridge.


The original 49MHz control is a  bang bang control, the driving motor slammed the rear wheels into top  speed forward or reverse. The steering was also bang bang, either full left, full right or straight.


Refitted with a 180 degree servo in the steering,the FS-GT3B  transmitter and Arduino Nano, the RC car  features variable speed throttle, variable position steering, adjustable offsets , S curves, adjustable & independent accel, decel........ and whatever other bells & whistles I choose to add....... Brake lights, backup lights, running lights, automatic headlights, anti collision protection.


This rebuild story shows the steps in more detail, and the final results. I hope this inspires others to give this a try.


AND THEN because the original hack had installed a video camera, this one adds an FPV (first person view) video camera, mounted up front with its 200 mW 5.8 GHz transmitter. The 5.8 GHz RGB receiver output is wired back into a Windows PC using a USB video converter to record videos from the RC cars point of view.


Here is a cheat: a video of the rebuilt RC car with wireless video camera taken from the viewpoint of the RC car:



Preface - The Rescue

Earlier this year, sad news in my town, an electrical engineer and licensed ham radio enthusiast had passed away (gone silent key).

He had decades of accumulated radio gear, electronics, hand made and hacked stuff stashed in his basement.


This hacked RC car was covered in mold, mildew, and grime from about 20 years of sitting in a junk pile in that basement. Man it was disgusting.


I rescued the RC car and checked out the previous hack. The RC car was used to inspect attics and crawl spaces.

An analog video camera was mounted on car front, a  phono jack was soldered to the back for the banana plug connection.

3 flashlight bulbs with 20W dropping resistors all in series were the camera's light source. An aluminum frame was made for mounting components.

A  relatively heavy 12V 1200mA hr lead acid battery sat in the rear.

The TO3 transistor mounted on a brass plate on top, was a 5V voltage regulator. The 12V was for the camera, the 5V was hacked into the RC control for  power.

The original battery was a 4.8 v NiCad which was unused. The owner must have not had a NiCad charger. The car body is missing. This guy may have gotten this RC, as is,  at a yardsale as well.






Stripping out the previous hack, a thorough cleanup, recharge the original NiCad battery and hooked up the power circuit.

The car actually works again with the original 49MHz RC controller. Here is a screen shot of the videos where the motor and steering voltages are checked.

There is no variable voltage control on the drive motors.

The steering control has 2 wires, 5V on the yellow wire and COM to the green steers full left, 5V on the green wire and COM to the yellow steers full right.

The steering mechanism has a circular motion, with a pin that loosely fits into the steering tie bar. The pin is spring loaded. Later in this project report is a link that shows the whole teardown and refit.



Recycle  - Keep disassembled parts gathered up together in case you need them later or to reuse the leftovers in another project.


Retrofit - The really fun part

The car chassis was used for the base, keeping the rear drive motor, axle and wheels.

The rear DC motor leads were snipped from the old controller, and the car controller removed.

The steering mechanisms were kept with the exception of the steeringbox gearmotor. It was entirely replaced with a standard 180 degree metal gear servo.



Define, measure, analyze, improve


  1. Define your plan on what you want to accomplish or create
  2. measure - measure voltages under different running conditions, take photos and videos of how the toy works now, make sketches, reverse engineer everything you deem important
  3. analyze - plan how you can make your design come to life. try it out with mockups
  4. improve - the hack you did may not have worked right, time to improve - hopefully your hack is better than the original !

You may need to bounce back between steps 3 & 4 alot :-)   keep testing and retesting, fitting and refitting parts as you go


in this case the steering mechanical linkage was the most difficult & time consuming part. It took 4 iterations to find the right parts for the best robust solution tuse with the new steering servo. 


These are the new electrical parts. I always need at least one power distribution terminal board card in my projects., often several.

Electrical parts laid out                                                                            RC car refit with new RC controls and a new steering servo


The RC car refit with new RC controls and a wireless FPV camera system installed as well.



RC car wiring schematics

THEN because the original hack had installed a video camera, an FPV (first person view) video camera was added and mounted with its 200 mW 5.8 GHz and wired back into a Windows PC to record videos from the RC cars point of view.



This complete video is the start to finish on hacking & revamping this RC car, start to finish:




The Arduino Nano program:  


// ---------------------------------------------------------------------------

// This code started from BuzzLightYearPowerWheel_Ver0.

// The code was generally working pretty well.


// Rememeber to set the IDE Tools/Board = Arduino Nano,

// and set the IDE Tools/Processor = ATMega328P(old bootloader)


// The original program was writen to interface to a FlySky FS CT6B

// This code assumes the RC channels have no mixing, strictly reflecting the position of the joystick.

// if an airplane transmitter - The RC transmitter is selected for MODE 2 , right hand side joystick controls speed (RC receiver Channel 2) and direction (RC recevier channel 1).

// The approach allows the signals to be zeroed and also scaled, since the joystick output doesnt go full scale.

// Use the Arduino serial monitor to get CH1_PWMtime and CH2_PWMtime center and endpoint value to normalize values.


// This program and Nano interfaces the L298N H bridge to a FlySky FS=GT3B




unsigned long CH2_PWMtime; //pulsewidth time of Channel 2 (into pin 4) RC in microseconds, 1000 = full REV (or -90 degress), 1500=zerospeed or 0 degrees, 2000=full FWD (or +90 degrees)

unsigned long timeout = 23000; //timeout of PWM , set timeout for reading a pulsewidth at 15% moree than max expected 20ms (tried 2300 and caused problems)



int CH2_PWMtime_int; // CH1_PWMtime is an unsigned long, convert it to integer



int LHSFWD=0; // LHS forward bit  driver side the H bridge uses a FWD and REV signal

int LHSREV=0; //LHS reverse bit driver side the H bridge uses a FWD and REV signal



int RHSFWD=0; // RHS forward bit  passenger side  the H bridge uses a FWD and REV signal

int RHSREV=0; //RHS reverse bit   passenger side the H bridge uses a FWD and REV signal



int LHS_PWM_REF_usec ; // magnitude of microseconds pulse width from 1500 usec centerpoint

int RHS_PWM_REF_usec ; // magnitude of microseconds pulse width from 1500 usec centerpoint

int CH2_PWM_REF_usec ; // magnitude of microseconds pulse width from 1500 usec centerpoint

int CH1_PWM_REF_usec ; // magnitude of microseconds pulse width from 1500 usec centerpoint



int LHS_PWM_SpdRef ; // RHS speed reference scaled for 255 = 100%

int RHS_PWM_SpdRef ; // RHS speed reference scaled for 255 = 100%

int CH2_PWM_SpdRef ; // RHS speed reference scaled for 255 = 100%

int CH1_PWM_SpdRef ; // RHS speed reference scaled for 255 = 100%



int LHS_Spd_Ratio=100; // RHS speed reference scaled for 100 = 100%

int RHS_Spd_Ratio=100; // RHS speed reference scaled for 100 = 100%



int Joystick_Right_Pos = 1500; //

int Joystick_Left_Pos = 1500; //





int FWD=LOW; // direction of Channel 2 speed ref

int REV=LOW; // direction of Channel 2 speed ref



void setup() {



pinMode(4, INPUT); // RC receiver Channel 2 motor speed control input


//pinMode(2, INPUT); // Limit Speed forward input

//pinMode(3, INPUT); // Limit Speed reverse input



pinMode(5, OUTPUT); // running FWD bit

pinMode(6, OUTPUT); // running REV bit

//pinMode(7, OUTPUT); // zerospeed output bit



pinMode(9, OUTPUT); // PWM motor FWD, bit low in reverse

pinMode(10, OUTPUT);  // PWM motor REV, bit low in FWD








void loop() {



//   Reads a pulse (either HIGH or LOW) on a pin. For example, if value is HIGH, pulseIn() waits for the pin to go HIGH, starts timing, then waits for the pin to go LOW and stops timing. Returns the length of the pulse in microseconds. Gives up and returns 0 if no pulse starts within a specified time out.

// Works on pulses from 10 microseconds to 3 minutes in length.


   CH2_PWMtime = pulseIn(4, HIGH, timeout); // pulseIn(pin, value, timeout)  value is HIGH or LOW, timeout and value are long int

//   Serial.print("CH2 Time: ");

//    Serial.println(CH2_PWMtime);



  //  The cast operator translates one variable type into another and forces calculations to be performed in the cast type.

  // Syntax (type)variable   Parameters: type: any variable type (e.g. int, float, byte)


//     CH1_PWMtime_int = (int) CH1_PWMtime; //convert unsigned long to int



     CH2_PWMtime_int = (int) CH2_PWMtime; //convert unsigned long to int


//  Serial.print("CH1 Time: ");

//   Serial.println(CH1_PWMtime_int);

//    Serial.print("CH2 Time: ");

//    Serial.println(CH2_PWMtime_int);


     /// create fwd and reverse direction bits 


  if ((CH2_PWMtime_int - 1500) >= 50 ){ FWD = HIGH; } else {(FWD=LOW);} // 10 allows some deadband switching bridges

  if ((CH2_PWMtime_int - 1500) <= -50 ){ REV = HIGH; } else {(REV=LOW);} // -10 allows some deadband switching bridges

  if (CH2_PWMtime_int==0) {FWD = LOW; REV =LOW;} // 0 is a missed scan , zero directions


//      Serial.print("FWD = ");

//    Serial.println(FWD);

//     Serial.print("REV= ");

//    Serial.println(REV); 


/// create a speed reference in microsends

CH2_PWM_REF_usec = abs(CH2_PWMtime_int - 1500); // zero to 500usecs = 0 to 100 % speed

CH2_PWM_SpdRef = (CH2_PWM_REF_usec/2); // cheap and dirty way to make speed reference, top = 500 microseconds, which corresponds to an analogWrite value 255. divie by 2 makes it just a tad slower.

//    Serial.print("255 is top speed reference ");

  //  Serial.println(CH2_PWM_SpdRef);                




// output logic for the H Bridge           


      if (FWD==HIGH)


      analogWrite(9, (CH2_PWM_SpdRef));  // analogWrite values from 0 to 255

      analogWrite(10, 0);


    else if (REV==HIGH)


      analogWrite(9, 0) ;  // analogWrite values from 0 to 255





      analogWrite(9, 0);  // analogWrite values from 0 to 255

      analogWrite(10, 0) ;


//      delay (250);



if (FWD==HIGH){ digitalWrite (5,HIGH); } else {(digitalWrite(5,LOW));}

if (REV==HIGH){ digitalWrite (6,HIGH); } else {(digitalWrite(6,LOW));}

//if ((FWD==LOW)&&(REV==LOW))

//      { digitalWrite (7,HIGH);

//     }

//  else

//    {

//      digitalWrite(7,LOW);

//    }




details on the wireless video system


I like to have a modular FPV camera and transmitter. At a moments notice the camera system can be popped off one robot vehicle or RC car, and effortlessly popped onto another.

The 5.8 GHz system shown here is getting on age, now integrated cameras and transmitters can be purchased.  The transmitter came with harnesses that matched up to the camera, and another for the battery, I just built an adapter to fit the different styles of battery connectors.




The receiver side into the PC consists of a video to USB converter, the 5.8 GHz receiver , a 5V power supply, and an antenna ( the antenna that comes with it is crappy)

This EASYCAP USB device converts the analog audio & video for bringing into the PC.