#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