- // IR Sensors
- int sensor1 = A0; // Leftmost sensor
- int sensor2 = A1; // Left sensor
- int sensor3 = A2; // Middle sensor
- int sensor4 = A3; // Right sensor
- int sensor5 = A4; // Rightmost sensor
- int sensor6 = A5; //
- int sensor[5] = {0, 0, 0, 0, 0,0};
- // Motor Variables
- int motorInput1 = 7; // AIN1
- int motorInput2 = 8; // AIN2
- int motorInput3 = 5; // BIN1
- int motorInput4 = 4; // BIN2
- int PWMA = 9;
- int PWMB = 3;
- // Initial Speed of Motor
- int initial_motor_speed = 255;
- // PID Constants
- float Kp = 10;
- float Ki = 0;
- float Kd = 200;
- float error = 0, P = 0, I = 0, D = 0, PID_value = 0;
- float previous_error = 0, previous_I = 0;
- void setup()
- {
- pinMode(sensor1, INPUT);
- pinMode(sensor2, INPUT);
- pinMode(sensor3, INPUT);
- pinMode(sensor4, INPUT);
- pinMode(sensor5, INPUT);
- pinMode(motorInput1, OUTPUT);
- pinMode(motorInput2, OUTPUT);
- pinMode(motorInput3, OUTPUT);
- pinMode(motorInput4, OUTPUT);
- pinMode(PWMA, OUTPUT);
- pinMode(PWMB, OUTPUT);
- Serial.begin(9600);
- Serial.println("Started !!");
- }
- void loop()
- {
- read_sensor_values();
- if (error == 100 || error == 105) {
- do {
- analogWrite(PWMA, 100); // Left Motor Speed
- analogWrite(PWMB, 255); // Right Motor Speed
- sharpLeftTurn();
- read_sensor_values();
- if (error == 0) {
- stop_bot();
- delay(200);
- }
- } while (error != 0);
- } else if (error == 101 || error == 104) {
- analogWrite(PWMA, 255); // Left Motor Speed
- analogWrite(PWMB, 100); // Right Motor Speed
- forward();
- delay(200);
- stop_bot();
- read_sensor_values();
- if (error == 102) {
- do {
- analogWrite(PWMA, 169); // Left Motor Speed
- analogWrite(PWMB, 132); // Right Motor Speed
- sharpRightTurn();
- read_sensor_values();
- } while (error != 0);
- }
- } else if (error == 102) {
- do {
- analogWrite(PWMA, 169); // Left Motor Speed
- analogWrite(PWMB, 132); // Right Motor Speed
- sharpLeftTurn();
- read_sensor_values();
- if (error == 0) {
- stop_bot();
- delay(200);
- }
- } while (error != 0);
- } else if (error == 103) {
- analogWrite(PWMA, 100); // Left Motor Speed
- analogWrite(PWMB, 255); // Right Motor Speed
- forward();
- delay(200);
- read_sensor_values();
- }
- else {
- calculate_pid();
- motor_control();
- }
- }
- void read_sensor_values()
- {
- sensor[0] = !digitalRead(sensor1);
- sensor[1] = !digitalRead(sensor2);
- sensor[2] = !digitalRead(sensor3);
- sensor[3] = !digitalRead(sensor4);
- sensor[4] = !digitalRead(sensor5);
- sensor[5] = !digitalRead(sensor6);
- if
- ((sensor[0] == 1) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 0)) (sensor[5] == 0)
- error = -80;
- else if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 0)) && (sensor[5] == 0)
- error = -70;
- else if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 1) && (sensor[3] == 0) && (sensor[4] == 0)) && (sensor[5] == 0)
- error = -60;
- else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 0)) && (sensor[5] == 0)
- error = 0;
- else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 0)) && (sensor[5] == 0)
- error = 60;
- else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 0)) && (sensor[5] == 0)
- error = 0;
- else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 1)) && (sensor[5] == 0)
- error = 70;
- else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[3] == 1) && (sensor[4] == 0) && (sensor[2] == 1)) && (sensor[5] == 0) // Turn robot left side
- error = 100;
- else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[3] == 1) && (sensor[4] == 1) && (sensor[2] == 1)) && (sensor[5] == 1) // Turn robot right side
- error = 101;
- else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[3] == 0) && (sensor[4] == 0) && (sensor[2] == 0)) && (sensor[5] == 0) // Make U turn
- error = 102;
- else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[3] == 1) && (sensor[4] == 0) && (sensor[2] == 1)) && (sensor[5] == 0) // Turn left side or stop
- error = 103;
- else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[3] == 1) && (sensor[4] == 1) && (sensor[2] == 1)) && (sensor[5] == 1) // Turn right side or stop
- error = 104;
- else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[3] == 1) && (sensor[4] == 0) && (sensor[2] == 0)) && (sensor[5] == 0) // Turn left side or stop
- error = 105;
- }
- }
- void calculate_pid()
- {
- P = error;
- I = I + previous_I;
- D = error - previous_error;
- PID_value = (Kp * P) + (Ki * I) + (Kd * D);
- previous_I = I;
- previous_error = error;
- }
- void motor_control()
- {
- int left_motor_speed = initial_motor_speed - PID_value + 30;
- int right_motor_speed = initial_motor_speed + PID_value - 39;
- left_motor_speed = constrain(left_motor_speed, -255, 255);
- right_motor_speed = constrain(right_motor_speed, -255, 255);
- Serial.print(" | Error: ");
- Serial.print(error);
- Serial.print(" | PID: ");
- Serial.print(PID_value);
- Serial.print(" | Right Speed: ");
- Serial.print(left_motor_speed);
- Serial.print(" | Left Speed: ");
- Serial.println(right_motor_speed);
- analogWrite(PWMB, left_motor_speed);
- analogWrite(PWMA, right_motor_speed);
- forward();
- }
- void forward()
- {
- digitalWrite(motorInput1, HIGH);
- digitalWrite(motorInput2, LOW);
- digitalWrite(motorInput3, HIGH);
- digitalWrite(motorInput4, LOW);
- }
- void reverse()
- {
- digitalWrite(motorInput1, LOW);
- digitalWrite(motorInput2, HIGH);
- digitalWrite(motorInput3, LOW);
- digitalWrite(motorInput4, HIGH);
- }
- void right()
- {
- digitalWrite(motorInput1, HIGH);
- digitalWrite(motorInput2, LOW);
- digitalWrite(motorInput3, HIGH);
- digitalWrite(motorInput4, HIGH);
- }
- void left()
- {
- digitalWrite(motorInput1, HIGH);
- digitalWrite(motorInput2, HIGH);
- digitalWrite(motorInput3, HIGH);
- digitalWrite(motorInput4, LOW);
- }
- void sharpRightTurn() {
- digitalWrite(motorInput1, HIGH);
- digitalWrite(motorInput2, LOW);
- digitalWrite(motorInput3, LOW);
- digitalWrite(motorInput4, HIGH);
- }
- void sharpLeftTurn() {
- digitalWrite(motorInput1, LOW);
- digitalWrite(motorInput2, HIGH);
- digitalWrite(motorInput3, HIGH);
- digitalWrite(motorInput4, LOW);
- }
- void stop_bot()
- {
- digitalWrite(motorInput1, HIGH);
- digitalWrite(motorInput2, HIGH);
- digitalWrite(motorInput3, HIGH);
- digitalWrite(motorInput4, HIGH);
- }