0% found this document useful (0 votes)
26 views

Robocode

The document describes code for an Arduino robot that can follow a line or record a path. It defines motor controls and infrared sensor pins. The robot uses a state machine to drive straight, turn left/right, or reverse based on sensor readings. When recording a path, it stores left/right sensor transitions in an array. It then follows or records the line based on current sensor values.

Uploaded by

Kanishka Yadav
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
26 views

Robocode

The document describes code for an Arduino robot that can follow a line or record a path. It defines motor controls and infrared sensor pins. The robot uses a state machine to drive straight, turn left/right, or reverse based on sensor readings. When recording a path, it stores left/right sensor transitions in an array. It then follows or records the line based on current sensor values.

Uploaded by

Kanishka Yadav
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 4

// BASIC CODE ..............................................

FIRST
TRY THIS ONE AT 1
#define IR_SENSOR_RIGHT 11
#define IR_SENSOR_LEFT 12
#define MOTOR_SPEED 180

int enableRightMotor = 6;
int rightMotorPin1 = 7;
int rightMotorPin2 = 8;

int enableLeftMotor = 5;
int leftMotorPin1 = 9;
int leftMotorPin2 = 10;

// Define states for the robot


enum RobotState {
STRAIGHT,
TURN_LEFT,
TURN_RIGHT,
REVERSE
};

RobotState robotState = STRAIGHT;


unsigned long lastStateChangeTime = 0;
unsigned long turnDuration = 1000; // Adjust as needed for your robot

void setup() {
// Change the PWM frequency
TCCR0B = TCCR0B & B11111000 | B00000010;

// Set up pins
pinMode(enableRightMotor, OUTPUT);
pinMode(rightMotorPin1, OUTPUT);
pinMode(rightMotorPin2, OUTPUT);

pinMode(enableLeftMotor, OUTPUT);
pinMode(leftMotorPin1, OUTPUT);
pinMode(leftMotorPin2, OUTPUT);

pinMode(IR_SENSOR_RIGHT, INPUT);
pinMode(IR_SENSOR_LEFT, INPUT);
rotateMotor(0, 0);
}

void loop() {
int rightIRSensorValue = digitalRead(IR_SENSOR_RIGHT);
int leftIRSensorValue = digitalRead(IR_SENSOR_LEFT);
unsigned long currentTime = millis();

// Implement the state machine


switch (robotState) {
case STRAIGHT:
if (rightIRSensorValue == HIGH && leftIRSensorValue == HIGH) {
rotateMotor(MOTOR_SPEED, MOTOR_SPEED);
} else if (rightIRSensorValue == LOW && leftIRSensorValue == HIGH) {
robotState = TURN_RIGHT;
lastStateChangeTime = currentTime;
} else if (rightIRSensorValue == HIGH && leftIRSensorValue == LOW) {
robotState = TURN_LEFT;
lastStateChangeTime = currentTime;
} else {
robotState = REVERSE;
lastStateChangeTime = currentTime;
}
break;

case TURN_RIGHT:
rotateMotor(MOTOR_SPEED, -MOTOR_SPEED);

// Check if it's time to transition back to STRAIGHT


if (currentTime - lastStateChangeTime >= turnDuration) {
robotState = STRAIGHT;
}
break;

case TURN_LEFT:
rotateMotor(-MOTOR_SPEED, MOTOR_SPEED);

// Check if it's time to transition back to STRAIGHT


if (currentTime - lastStateChangeTime >= turnDuration) {
robotState = STRAIGHT;
}
break;

case REVERSE:
rotateMotor(-MOTOR_SPEED, -MOTOR_SPEED);

// Check if it's time to transition back to STRAIGHT


if (currentTime - lastStateChangeTime >= turnDuration) {
robotState = STRAIGHT;
}
break;
}
}

void rotateMotor(int rightMotorSpeed, int leftMotorSpeed) {


// Motor control logic
if (rightMotorSpeed < 0) {
digitalWrite(rightMotorPin1, LOW);
digitalWrite(rightMotorPin2, HIGH);
} else if (rightMotorSpeed > 0) {
digitalWrite(rightMotorPin1, HIGH);
digitalWrite(rightMotorPin2, LOW);
} else {
digitalWrite(rightMotorPin1, LOW);
digitalWrite(rightMotorPin2, LOW);
}

if (leftMotorSpeed < 0) {
digitalWrite(leftMotorPin1, LOW);
digitalWrite(leftMotorPin2, HIGH);
} else if (leftMotorSpeed > 0) {
digitalWrite(leftMotorPin1, HIGH);
digitalWrite(leftMotorPin2, LOW);
} else {
digitalWrite(leftMotorPin1, LOW);
digitalWrite(leftMotorPin2, LOW);
}
analogWrite(enableRightMotor, abs(rightMotorSpeed));
analogWrite(enableLeftMotor, abs(leftMotorSpeed));
}

// TO RECORD PATH FOLLOW


LINE ...................................................... TRY IF ABOVE WORKS 2
#define IR_SENSOR_LEFT 11
#define IR_SENSOR_RIGHT 12
#define MOTOR_SPEED 180

int irSensorLeftState = LOW;


int irSensorRightState = LOW;
int recordedPath[100]; // Array to store the recorded path
int pathIndex = 0;

int enableRightMotor = 6;
int rightMotorPin1 = 7;
int rightMotorPin2 = 8;

int enableLeftMotor = 5;
int leftMotorPin1 = 9;
int leftMotorPin2 = 10;

void setup() {
pinMode(IR_SENSOR_LEFT, INPUT);
pinMode(IR_SENSOR_RIGHT, INPUT);
pinMode(enableRightMotor, OUTPUT);
pinMode(rightMotorPin1, OUTPUT);
pinMode(rightMotorPin2, OUTPUT);
pinMode(enableLeftMotor, OUTPUT);
pinMode(leftMotorPin1, OUTPUT);
pinMode(leftMotorPin2, OUTPUT);
Serial.begin(9600);
}

void loop() {
irSensorLeftState = digitalRead(IR_SENSOR_LEFT);
irSensorRightState = digitalRead(IR_SENSOR_RIGHT);

// Detect a transition in either sensor


if (irSensorLeftState != irSensorRightState) {
// Record the transition (1 for left sensor, 2 for right sensor)
recordedPath[pathIndex] = irSensorLeftState == LOW ? 1 : 2;
pathIndex++;
}

// Line following based on sensor readings


if (irSensorLeftState == HIGH && irSensorRightState == HIGH) {
// Both sensors detect the white path, go straight
rotateMotor(MOTOR_SPEED, MOTOR_SPEED);
} else if (irSensorLeftState == LOW && irSensorRightState == HIGH) {
// Right sensor detects the white path, turn right
rotateMotor(-MOTOR_SPEED, MOTOR_SPEED);
} else if (irSensorLeftState == HIGH && irSensorRightState == LOW) {
// Left sensor detects the white path, turn left
rotateMotor(MOTOR_SPEED, -MOTOR_SPEED);
} else {
// Both sensors detect the black background, stop
rotateMotor(0, 0);
}

// Print the recorded path for debugging


Serial.print("Recorded Path: ");
for (int i = 0; i < pathIndex; i++) {
Serial.print(recordedPath[i]);
}
Serial.println();

// You may want to add some delay here to control the recording rate
delay(100);
}

void rotateMotor(int rightMotorSpeed, int leftMotorSpeed) {


// Motor control logic
if (rightMotorSpeed < 0) {
digitalWrite(rightMotorPin1, LOW);
digitalWrite(rightMotorPin2, HIGH);
} else if (rightMotorSpeed > 0) {
digitalWrite(rightMotorPin1, HIGH);
digitalWrite(rightMotorPin2, LOW);
} else {
digitalWrite(rightMotorPin1, LOW);
digitalWrite(rightMotorPin2, LOW);
}

if (leftMotorSpeed < 0) {
digitalWrite(leftMotorPin1, LOW);
digitalWrite(leftMotorPin2, HIGH);
} else if (leftMotorSpeed > 0) {
digitalWrite(leftMotorPin1, HIGH);
digitalWrite(leftMotorPin2, LOW);
} else {
digitalWrite(leftMotorPin1, LOW);
digitalWrite(leftMotorPin2, LOW);
}

analogWrite(enableRightMotor, abs(rightMotorSpeed));
analogWrite(enableLeftMotor, abs(leftMotorSpeed));
}

You might also like