Divyang AroraPamraat Parmar
Published © GPL3+

RC car racing (Arduino interfaced)

Remote controlled cars are one of the most demanded toys for kids especially boys. Even we had a one. 10 years later we made a one.

IntermediateProtip2,189
RC car racing (Arduino interfaced)

Things used in this project

Hardware components

Arduino UNO
Arduino UNO
×2
SparkFun Motor Driver - Dual TB6612FNG (1A)
SparkFun Motor Driver - Dual TB6612FNG (1A)
×1
DC motor (generic)
×2
RF BOARD ENCODER AND DECODER with HT12D & HT12E IC
×1
Jumper wires (generic)
Jumper wires (generic)
×20

Story

Read more

Code

Computer controlled RC car

Arduino
There are two Arduino boards connected one to the receiver side (car) and other to transmitting side (computer) . Code uploaded here is one on the receiver side. Transmitting code is simple arduino code interfaced with JAVA making it compatible to use . 'W', 'A', 'S', 'D' controls used to run car.
#include <VirtualWire.h>  // you must download and install the VirtualWire.h to your hardware/libraries folder

//Undefine unneded types
#undef abs
#undef double
#undef float
#undef round


//Define constants
#define FORWARD '8'
#define BACKWARD '5'
#define STOP '0'
#define LEFT '4'
#define RIGHT '6'
#define STRAIGHT '/'

#define TIMEOUT 500UL

//Set motor pins
int motor1Pin1 = 4;    // pin 2 on L293D
   // pin 7 on L293D
int enablePin1 = 10;    // pin 1 on L293D
int motor2Pin1 = 6;    // pin 10 on L293D
    // pin 15 on L293D
int enablePin2 = 11;    // pin 9 on L293D

//motor speed variables
int motor1Speed = 255;
int motor2Speed = 255;
int angle = 0;   // angle defined
//Counter variable
unsigned long counter;


void setup() 
{  
    //Set pin modes
    pinMode(motor1Pin1, OUTPUT);
   
    pinMode(motor2Pin1, OUTPUT);
   
    
    


    Serial.begin(115200);
    //Initialise the IO and ISR
    vw_set_ptt_inverted(true);    // Required for RX Link Module
    vw_setup(4500);                   // Bits per sec
    vw_set_rx_pin(13);           // We will be receiving on pin 23 (Mega) ie the RX pin from the module connects to this pin. 
    vw_rx_start();                      // Start the receiver 
}
void loop()
{
   
  //variables for Virtual Wire
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  
  //If we got a message from the serial port
  if (Serial.available())
  {
    //Reset the timeout counter
    counter = millis();
    //Drive the requested motor
    drive(Serial.read());
    
    //Otherwise check for a message from the reciever
  } else if (vw_get_message(buf, &buflen)) // check to see if anything has been received
    {
      //Reset timeout counter
      counter = millis();
      int i;
      Serial.println("recieved"); //Debug message
       // Message with a good checksum received.
      
      
      //For each command recieved
      for (i = 0; i < buflen; i++)
      {
          drive(buf[i]); //Drive requested motors
      }
      
      
      //If the counter is greater than the timeout (No signal recieved) then stop the car.
    } else if(millis()-counter >= TIMEOUT) {
      drive(STOP);
      drive(STRAIGHT); 
    }
}


//The drive function
void drive(int dir) {
  //Check which direction is requested (same for below)
  if (dir == FORWARD) {
     Serial.println("Forward");//Used for debugging
     
       //Set motor accordingly (same for below)
     digitalWrite(motor1Pin1, LOW);
     analogWrite(enablePin1, 255);
     digitalWrite(motor2Pin1,LOW);
     analogWrite(enablePin2, 255);
     
  } else if (dir == BACKWARD) {
    Serial.println("Backward");
     digitalWrite(motor1Pin1,HIGH);
     analogWrite(enablePin1, 255);  
     digitalWrite(motor2Pin1, HIGH);
     analogWrite(enablePin2, 255);
    
  } else if (dir == STOP) {
     Serial.println("Stop");
     digitalWrite(motor1Pin1, LOW);
     analogWrite(enablePin1, 0);  
     digitalWrite(motor2Pin1, LOW);
     analogWrite(enablePin2, 0);
  
  } else if(dir == STRAIGHT) {
    Serial.println("Straight");
     digitalWrite(motor1Pin1, HIGH);
     analogWrite(enablePin1, 0);
     digitalWrite(motor2Pin1, HIGH);
     analogWrite(enablePin2,0);
    
  }else if (dir == LEFT) {
    Serial.println("Left");
     digitalWrite(motor1Pin1, LOW);  
     analogWrite(enablePin1, 255);
     digitalWrite(motor2Pin1, HIGH);
     analogWrite(enablePin2, 255);
    
  }else if (dir == RIGHT) {
    Serial.println("Right");
   digitalWrite(motor1Pin1, HIGH); 
   analogWrite(enablePin1, 0);
     digitalWrite(motor2Pin1, LOW);
     analogWrite(enablePin2, 255);
    
  }
}

 

Credits

Divyang Arora
0 projects • 0 followers
Contact
Pamraat Parmar
0 projects • 0 followers
Contact

Comments

Please log in or sign up to comment.