Wednesday, November 20, 2024

Obstacle_Avoider_Car_(Sunil_Singh)

 #include <SoftwareSerial.h>


// Motor Pins
#define IN1 2
#define IN2 3
#define IN3 4
#define IN4 5

// Enable Pins for PWM Speed Control
#define ENA 9
#define ENB 8

// Ultrasonic Sensor Pins
#define TRIG 6
#define ECHO 7

// Bluetooth TX/RX
SoftwareSerial bt(10, 11); // TX, RX

char data;
int distanceThreshold = 20; // Threshold distance in cm
int motorSpeed = 100; // Speed value (0-255), reduce this to lower the speed

void setup() {
  Serial.begin(9600);
  bt.begin(9600);

  // Motor pins as output
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);

  // Ultrasonic sensor pins
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);

  // Initial motor states
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
}

void loop() {
  // Check distance using ultrasonic sensor
  int distance = getDistance();

  if (distance > 0 && distance < distanceThreshold) {
    // Obstacle detected - avoid it
    stoprobot();
    delay(500); // Brief pause before turning
    avoidObstacle();
  } else {
    // No obstacle detected - respond to Bluetooth commands
    if (bt.available()) {
      data = bt.read();
      Serial.println(data);

      switch (data) {
        case 'F':                              
          forward();
          break;
        case 'B':                
          reverse();
          break;
        case 'L':        
          left();
          break;        
        case 'R':                    
          right();
          break;
        case 'S':                                          
          stoprobot();
          break;    
      }
    }
  }

  delay(100);
}

// Movement Functions
void forward() {
  analogWrite(ENA, motorSpeed); // Set speed for left motor
  analogWrite(ENB, motorSpeed); // Set speed for right motor
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
}

void reverse() {
  analogWrite(ENA, motorSpeed);
  analogWrite(ENB, motorSpeed);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
}

void left() {
  analogWrite(ENA, motorSpeed / 2); // Reduce speed on left motor
  analogWrite(ENB, motorSpeed);     // Full speed on right motor
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
}

void right() {
  analogWrite(ENA, motorSpeed);     // Full speed on left motor
  analogWrite(ENB, motorSpeed / 2); // Reduce speed on right motor
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
}

void stoprobot() {
  analogWrite(ENA, 0);
  analogWrite(ENB, 0);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
}

// Function to avoid obstacles
void avoidObstacle() {
  reverse();    // Move backward slightly
  delay(500);
  stoprobot();  // Stop before turning
  delay(500);
 
  left();       // Rotate left to change direction
  delay(800);   // Adjust delay to fine-tune turning angle
  stoprobot();  // Stop after turn
  delay(500);
}

// Function to get the distance from the ultrasonic sensor
int getDistance() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);

  long duration = pulseIn(ECHO, HIGH);
  int distance = duration * 0.034 / 2; // Convert to cm
  return distance;
}

No comments:

Post a Comment

MUD Three Mode operation Manual Automatic GPS

 Code for three mode operation: /*   3-Mode Headlight Controller   - Manual mode (driver uses a toggle to pick high/low)   - Auto mode (LDR...