#include <NewPing.h>
// Pin definitions
#define TRIG_PIN_FRONT 2
#define ECHO_PIN_FRONT 3
#define LINE_SENSOR_LEFT 6
#define LINE_SENSOR_RIGHT 7
#define MOTOR_LEFT_FORWARD 8
#define MOTOR_LEFT_BACKWARD 9
#define MOTOR_RIGHT_FORWARD 10
#define MOTOR_RIGHT_BACKWARD 11
// Constants
#define MAX_DISTANCE 200 // Maximum distance for ultrasonic sensor
#define ATTACK_DISTANCE 20 // Distance to initiate attack
// Objects
NewPing sonarFront(TRIG_PIN_FRONT, ECHO_PIN_FRONT, MAX_DISTANCE);
// Function to move forward
void moveForward() {
digitalWrite(MOTOR_LEFT_FORWARD, HIGH);
digitalWrite(MOTOR_LEFT_BACKWARD, LOW);
digitalWrite(MOTOR_RIGHT_FORWARD, HIGH);
digitalWrite(MOTOR_RIGHT_BACKWARD, LOW);
}
// Function to move backward
void moveBackward() {
digitalWrite(MOTOR_LEFT_FORWARD, LOW);
digitalWrite(MOTOR_LEFT_BACKWARD, HIGH);
digitalWrite(MOTOR_RIGHT_FORWARD, LOW);
digitalWrite(MOTOR_RIGHT_BACKWARD, HIGH);
}
// Function to rotate left
void rotateLeft() {
digitalWrite(MOTOR_LEFT_FORWARD, LOW);
digitalWrite(MOTOR_LEFT_BACKWARD, HIGH);
digitalWrite(MOTOR_RIGHT_FORWARD, HIGH);
digitalWrite(MOTOR_RIGHT_BACKWARD, LOW);
}
// Function to rotate right
void rotateRight() {
digitalWrite(MOTOR_LEFT_FORWARD, HIGH);
digitalWrite(MOTOR_LEFT_BACKWARD, LOW);
digitalWrite(MOTOR_RIGHT_FORWARD, LOW);
digitalWrite(MOTOR_RIGHT_BACKWARD, HIGH);
}
// Function to stop
void stop() {
digitalWrite(MOTOR_LEFT_FORWARD, LOW);
digitalWrite(MOTOR_LEFT_BACKWARD, LOW);
digitalWrite(MOTOR_RIGHT_FORWARD, LOW);
digitalWrite(MOTOR_RIGHT_BACKWARD, LOW);
}
// Function to read line sensors
bool isOnWhiteLine() {
return digitalRead(LINE_SENSOR_LEFT) == HIGH || digitalRead(LINE_SENSOR_RIGHT) == HIGH;
}
// Function to scan for opponent
bool scanForOpponent() {
int distanceFront = sonarFront.ping_cm();
return distanceFront > 0 && distanceFront < MAX_DISTANCE;
}
void setup() {
// Initialize pins
pinMode(MOTOR_LEFT_FORWARD, OUTPUT);
pinMode(MOTOR_LEFT_BACKWARD, OUTPUT);
pinMode(MOTOR_RIGHT_FORWARD, OUTPUT);
pinMode(MOTOR_RIGHT_BACKWARD, OUTPUT);
pinMode(LINE_SENSOR_LEFT, INPUT);
pinMode(LINE_SENSOR_RIGHT, INPUT);
Serial.begin(9600); // For debugging purposes
// Add a 5-second delay before the robot starts
Serial.println("Starting in 5 seconds...");
delay(5000);
Serial.println("Go!");
}
void loop() {
// Check if the robot is on the white line
if (isOnWhiteLine()) {
moveBackward();
delay(500); // Move backward for 0.5 seconds to avoid going out of the ring
rotateLeft();
delay(500); // Rotate for a short period to change direction
stop();
return; // Exit loop to avoid further actions
}
// Scan for opponent with ultrasonic sensor
if (scanForOpponent()) {
moveForward();
Serial.println("Attacking...");
delay(1000); // Move forward for 1 second to simulate attack
return; // Exit loop to continue attacking
}
// If no opponent is detected, rotate to search
rotateLeft();
Serial.println("Searching for opponent...");
delay(500); // Rotate for a short period to scan the surroundings
}