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!