Bluetooth Controlled Car and Obstacle Avoiding Robot

I want to make a obstacle avoiding robot with a bluetooth control. Heres the code:

#include <AFMotor.h>  
#include <NewPing.h>
#include <Servo.h> 
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>

#define STATE_PIN A5 

SoftwareSerial bluetoothSerial(9, A4); // RX, TX

int speed = 255;
AF_DCMotor motor1(1, MOTOR12_1KHZ);
AF_DCMotor motor2(2, MOTOR12_1KHZ);
AF_DCMotor motor3(3, MOTOR34_1KHZ);
AF_DCMotor motor4(4, MOTOR34_1KHZ);
Servo myservo;   

#define TRIG_PIN A1 
#define ECHO_PIN A0 
#define MAX_DISTANCE 200 
#define MAX_SPEED 190 // sets speed of DC  motors
#define MAX_SPEED_OFFSET 20

NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE); 

boolean goesForward=false;
int distance = 100;
int speedSet = 0;

void setup() {
  pinMode(STATE_PIN, INPUT);
  pinMode(buzzerPin, OUTPUT);
  pinMode(frontLightPin, OUTPUT);
  pinMode(backLightPin, OUTPUT);
  bluetoothSerial.begin(9600);  // Set the baud rate to your Bluetooth module.
  myservo.attach(10);  
  myservo.write(115); 
  delay(2000);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
}

void loop() {
    if(digitalRead(STATE_PIN) == HIGH) {
        // If state pin is high (connected), control the car via Bluetooth
        controlCar();
    } else if (digitalRead(STATE_PIN) == LOW){
        // If state pin is low (disconnected), perform obstacle avoidance
        performObstacleAvoidance();
       
    }
}

void controlCar() {
    
    if (bluetoothSerial.available() > 0) {
        char command = bluetoothSerial.read();

        Stop(); // Initialize with motors stopped
        b = false;
        switch (command) {
          case 'F':
            forward(speed);
            break;
          case 'B':
            back(speed);
            b = true;
            break;
          case 'L':
            left(speed);
            break;
          case 'R':
            right(speed);
            break;
          case 'G':
            forwardLeft(speed);
            break;
          case 'I':
            forwardRight(speed);
            break;
          case 'H':
            backLeft(speed);
            break;
          case 'J':
            backRight(speed);
            break;
          case 'S': // Stop
            Stop();
            break;
          case 'W': // Front Lights On
            digitalWrite(frontLightPin, HIGH);
            frontLightOn = true;
            break;
          case 'w': // Front Lights Off
            digitalWrite(frontLightPin, LOW);
            frontLightOn = false;
            break;
          case 'U': // Back Lights On
            digitalWrite(backLightPin, HIGH);
            backLightOn = true;
            break;
          case 'u': // Back Lights Off
            digitalWrite(backLightPin, LOW);
            backLightOn = false;
            break;
          case 'V': // Horn On
            digitalWrite(buzzerPin, HIGH);
            break;
          case 'v': // Horn Off
            digitalWrite(buzzerPin, LOW);
            break;
          case 'X': // Extra On (Emergency blink)
            if (frontLightOn || backLightOn) {
              for (int i = 0; i < 5; i++) {
                digitalWrite(frontLightPin, HIGH);
                digitalWrite(backLightPin, HIGH);
                delay(500);
                digitalWrite(frontLightPin, LOW);
                digitalWrite(backLightPin, LOW);
                delay(500);
              }
            }
            break;
          case 'x': // Extra Off
            // No specific action needed for Extra Off
            break;
          case '0'...'9':
            setSpeed(command - '0' * 50);
            break;
          case 'q':
            setSpeed(255); // Maximum speed
            break;
          case 'D':
            StopAll();
            break;
          default:
             break;
        }
    }
}

void performObstacleAvoidance() {
    int distanceR = 0;
    int distanceL =  0;
    delay(40);
   
    if(distance<=15)
    {
      moveStop();
      delay(100);
      moveBackward();
      delay(300);
      moveStop();
      delay(200);
      distanceR = lookRight();
      delay(200);
      distanceL = lookLeft();
      delay(200);
    
      if(distanceR>=distanceL)
      {
        turnRight();
        moveStop();
      }else
      {
        turnLeft();
        moveStop();
      }
    }else
    {
      moveForward();
    }
    distance = readPing();
}

int lookRight()
{
    myservo.write(50); 
    delay(500);
    int distance = readPing();
    delay(100);
    myservo.write(115); 
    return distance;
}

int lookLeft()
{
    myservo.write(170); 
    delay(500);
    int distance = readPing();
    delay(100);
    myservo.write(115); 
    return distance;
    delay(100);
}

int readPing() { 
  delay(70);
  int cm = sonar.ping_cm();
  if(cm==0)
  {
    cm = 250;
  }
  return cm;
}

void moveStop() {
  motor1.run(RELEASE); 
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);
} 

void moveForward() {

 if(!goesForward)
  {
    goesForward=true;
    motor1.run(FORWARD);      
    motor2.run(FORWARD);
    motor3.run(FORWARD); 
    motor4.run(FORWARD);     
   for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // slowly bring the speed up to avoid loading down the batteries too quickly
   {
    motor1.setSpeed(speedSet);
    motor2.setSpeed(speedSet);
    motor3.setSpeed(speedSet);
    motor4.setSpeed(speedSet);
    delay(5);
   }
  }
}

void moveBackward() {
    goesForward=false;
    motor1.run(BACKWARD);      
    motor2.run(BACKWARD);
    motor3.run(BACKWARD);
    motor4.run(BACKWARD);  
  for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // slowly bring the speed up to avoid loading down the batteries too quickly
  {
    motor1.setSpeed(speedSet);
    motor2.setSpeed(speedSet);
    motor3.setSpeed(speedSet);
    motor4.setSpeed(speedSet);
    delay(5);
  }
}  

void turnRight() {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);     
  delay(500);
  motor1.run(FORWARD);      
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);      
} 

void turnLeft() {
  motor1.run(BACKWARD);     
  motor2.run(BACKWARD);  
  motor3.run(FORWARD);
  motor4.run(FORWARD);   
  delay(500);
  motor1.run(FORWARD);     
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
}  

void buz() {
    if (b) {
        digitalWrite(buzzerPin, HIGH); // Activate back buzzer
        delay(100); // Adjust as needed
        digitalWrite(buzzerPin, LOW); // Deactivate back buzzer
        delay(500); // Delay before stopping
        
    } else {}
    
}

void forward(int speed)
{
  motor1.setSpeed(speed);
  motor1.run(FORWARD);
  motor2.setSpeed(speed);
  motor2.run(FORWARD);
  motor3.setSpeed(speed);
  motor3.run(FORWARD);
  motor4.setSpeed(speed);
  motor4.run(FORWARD);
}

void back(int speed)
{
  motor1.setSpeed(speed);
  motor1.run(BACKWARD);
  motor2.setSpeed(speed);
  motor2.run(BACKWARD);
  motor3.setSpeed(speed);
  motor3.run(BACKWARD);
  motor4.setSpeed(speed);
  motor4.run(BACKWARD);
}

void left(int speed)
{
  motor1.setSpeed(speed);
  motor1.run(BACKWARD);
  motor2.setSpeed(speed);
  motor2.run(BACKWARD);
  motor3.setSpeed(speed);
  motor3.run(FORWARD);
  motor4.setSpeed(speed);
  motor4.run(FORWARD);
  
}

void right(int speed)
{
  motor1.setSpeed(speed);
  motor1.run(FORWARD);
  motor2.setSpeed(speed);
  motor2.run(FORWARD);
  motor3.setSpeed(speed);
  motor3.run(BACKWARD);
  motor4.setSpeed(speed);
  motor4.run(BACKWARD);
  
}

// Additional movements
void forwardRight(int speed)
{
  motor1.setSpeed(speed);
  motor1.run(FORWARD);
  motor2.setSpeed(speed);
  motor2.run(FORWARD);
  motor3.setSpeed(speed/3.1);
  motor3.run(FORWARD);
  motor4.setSpeed(speed/3.1);
  motor4.run(FORWARD);
}

void forwardLeft(int speed)
{
  motor1.setSpeed(speed/3.1);
  motor1.run(FORWARD);
  motor2.setSpeed(speed/3.1);
  motor2.run(FORWARD);
  motor3.setSpeed(speed);
  motor3.run(FORWARD);
  motor4.setSpeed(speed);
  motor4.run(FORWARD);
}

void backRight(int speed)
{
  motor1.setSpeed(speed);
  motor1.run(BACKWARD);
  motor2.setSpeed(speed);
  motor2.run(BACKWARD);
  motor3.setSpeed(speed/3.1);
  motor3.run(BACKWARD);
  motor4.setSpeed(speed/3.1);
  motor4.run(BACKWARD);
}

void backLeft(int speed)
{
  motor1.setSpeed(speed/3.1);
  motor1.run(BACKWARD);
  motor2.setSpeed(speed/3.1);
  motor2.run(BACKWARD);
  motor3.setSpeed(speed);
  motor3.run(BACKWARD);
  motor4.setSpeed(speed);
  motor4.run(BACKWARD);
}

void setSpeed(int newSpeed)
{
  speed = newSpeed;
}

void Stop()
{
  motor1.setSpeed(0);
  motor1.run(RELEASE);
  motor2.setSpeed(0);
  motor2.run(RELEASE);
  motor3.setSpeed(0);
  motor3.run(RELEASE);
  motor4.setSpeed(0);
  motor4.run(RELEASE);
}

void StopAll()
{
  Stop();
 }

Connections:
Ultrasonic:
Echo to A1
Trig to A0
GND to GND
VCC to 5v

Servo:
Signal to 10
Gnd to Gnd
Vcc to 5v

Hc-05:
State to A5
Gnd to Gnd
Vcc to 5v
RxD to None
TxD to 9

On the obstacle avoiding mode, it just goes straight. When I tried the code without the bluetooth things, it worked perfectly, bluetooth control also works fine but when disconnected just stays on bluetooth. Thanks!

could it be the pin being used to select the mode?

buttons are typically connected between the pin and ground, the pin configured as INPUT_PULLUP to use the internal pullup resistor which pulls the pin HIGH and when pressed, the button pulls the pin LOW.

a button press can be recognized by detecting a change in state and becoming LOW

The state pins connected to the state of the bluetooth hc05. It works fine. But I think the problem is the code.

aren't you using STATE_PIN to determine the mode?

Yep, since hc05 module sends HIGH to determine that it has been connected

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.