A Simple Bluetooth Controlled Vehicle with Line Following and Obstacle Avoiding Capability.

The vehicle can be manually controlled from any Bluetooth enabled device. If commanded, it can also follow any dark line on a bright surface. It also has obstacle avoiding capability through its ultrasonic distance sensor which prevents any collision with any obstacle in front of the vehicle.

 

https://www.youtube.com/watch?v=q10WCCDGaHo

Code for Manual Bluetooth Control from Android Application

//Works only with Uno/Diavolino
//Does not work with Leonardo/Duino 328 Custom

int dataIn = 'S';        //Character/Data coming from the phone.

int LeftMotorPlus = 8;
int LeftMotorMinus = 9;
int LeftMotorEnable = 10;

int RightMotorPlus = 12;
int RightMotorMinus = 13;
int RightMotorEnable = 11;

int determinant;         //Used in the check function, stores the character received from the phone.
int det;                 //Used in the loop function, stores the character received from the phone.

void setup()
{
  //*************NOTE: If using Bluetooth Mate Silver use 115200 btu
  //                   If using MDFLY Bluetooth Module use 9600 btu
  Serial.begin(9600);  //Initialize serial communication with Bluetooth module at 115200 btu.
  //while (!Serial) {
  //    ; // wait for serial port to connect. Needed for Leonardo only
  //  }
  pinMode(LeftMotorPlus, OUTPUT);
  pinMode(LeftMotorMinus, OUTPUT);
  pinMode(LeftMotorEnable, OUTPUT);

  pinMode(RightMotorEnable, OUTPUT);
  pinMode(RightMotorMinus , OUTPUT);
  pinMode(RightMotorPlus , OUTPUT);

}

void loop()
{

  det = check();
  while (det == 'F')   //if incoming data is a F, move forward
  {

    digitalWrite(LeftMotorEnable, HIGH);
    digitalWrite(RightMotorEnable, HIGH);

    digitalWrite(LeftMotorPlus, HIGH);
    digitalWrite(LeftMotorMinus, LOW);

    digitalWrite(RightMotorPlus, LOW);
    digitalWrite(RightMotorMinus, HIGH);

    det = check();
  }
  while (det == 'B')   //if incoming data is a B, move back
  {
    digitalWrite(LeftMotorEnable, HIGH);
    digitalWrite(RightMotorEnable, HIGH);

    digitalWrite(LeftMotorPlus, LOW);
    digitalWrite(LeftMotorMinus, HIGH);

    digitalWrite(RightMotorPlus, HIGH);
    digitalWrite(RightMotorMinus, LOW);

    det = check();
  }

  while (det == 'L')   //if incoming data is a L, move wheels left
  {
    digitalWrite(LeftMotorEnable, HIGH);
    digitalWrite(RightMotorEnable, HIGH);

    digitalWrite(LeftMotorPlus, HIGH);
    digitalWrite(LeftMotorMinus, LOW);

    digitalWrite(RightMotorPlus, HIGH);
    digitalWrite(RightMotorMinus, LOW);

    det = check();
  }
  while (det == 'R')   //if incoming data is a R, move wheels right
  {

    digitalWrite(LeftMotorEnable, HIGH);
    digitalWrite(RightMotorEnable, HIGH);

    digitalWrite(LeftMotorPlus, LOW);
    digitalWrite(LeftMotorMinus, HIGH);

    digitalWrite(RightMotorPlus, LOW);
    digitalWrite(RightMotorMinus, HIGH);

    det = check();
  }

  while (det == 'S')   //if incoming data is a S, stop
  {
    digitalWrite(LeftMotorEnable, LOW);
    digitalWrite(RightMotorEnable, LOW);

    det = check();
  }

  while (det == 'U')   //if incoming data is a U, turn ON front lights
  {
    //digitalWrite(pinfrontLights, HIGH);
    det = check();
  }

  while (det == 'u')   //if incoming data is a u, turn OFF front lights
  {
    // digitalWrite(pinfrontLights, LOW);
    det = check();
  }
  while (det == 'W')   //if incoming data is a W, turn ON back lights
  {
    //digitalWrite(pinbackLights, HIGH);
    det = check();
  }
  while (det == 'w')   //if incoming data is a w, turn OFF back lights
  {
    //digitalWrite(pinbackLights, LOW);
    det = check();
  }
  while (det == 'V')   //if incoming data is a V, turn ON Horn
  {
    //digitalWrite(pinHorn, HIGH);
    det = check();
  }
  while (det == 'v')   //if incoming data is a v, turn OFF Horn
  {
    //digitalWrite(pinHorn, LOW);
    det = check();
  }
  while (det == 'X')   //if incoming data is a V, turn ON Horn
  {
    //digitalWrite(pinHorn, HIGH);
    det = check();
  }
  while (det == 'x')   //if incoming data is a v, turn OFF Horn
  {
    // digitalWrite(pinHorn, LOW);
    det = check();
  }
}

int check()
{
  if (Serial.available() > 0)    //Check for data on the serial lines.
  {
    dataIn = Serial.read();  //Get the character sent by the phone and store it in 'dataIn'.
    if (dataIn == 'F')
    {
      determinant = 'F';
    }
    else if (dataIn == 'B')
    {
      determinant = 'B';
    }
    else if (dataIn == 'L')
    {
      determinant = 'L';
    }
    else if (dataIn == 'R')
    {
      determinant = 'R';
    }
    else if (dataIn == 'I')
    {
      determinant = 'I';
    }
    else if (dataIn == 'J')
    {
      determinant = 'J';
    }
    else if (dataIn == 'G')
    {
      determinant = 'G';
    }
    else if (dataIn == 'H')
    {
      determinant = 'H';
    }
    else if (dataIn == 'S')
    {
      determinant = 'S';
    }

    else if (dataIn == 'U')
    {
      determinant = 'U';
    }
    else if (dataIn == 'u')
    {
      determinant = 'u';
    }
    else if (dataIn == 'W')
    {
      determinant = 'W';
    }

    else if (dataIn == 'w')
    {
      determinant = 'w';
    }
  }
  return determinant;
}