├── 5 IR Sensor Array Testing.ino ├── HC-SR04 Testing.ino ├── Line Follower using 5 sensor Array.ino ├── Line Follower using 8 sensor Array.ino ├── Motor Controller Coding.ino └── README.md /5 IR Sensor Array Testing.ino: -------------------------------------------------------------------------------- 1 | void setup() 2 | { Serial.begin(9600); //Necessary to set up Serial port 3 | } 4 | void loop() 5 | { Serial.print(analogRead(0)); 6 | Serial.print(' '); 7 | Serial.print(analogRead(1)); 8 | Serial.print(' '); 9 | Serial.print(analogRead(2)); 10 | Serial.print(' '); 11 | Serial.print(analogRead(3)); 12 | Serial.print(' '); 13 | Serial.print(analogRead(4)); 14 | Serial.println(' '); 15 | delay(800); //Set the number to change frequency of readings. 16 | } 17 | -------------------------------------------------------------------------------- /HC-SR04 Testing.ino: -------------------------------------------------------------------------------- 1 | #define trigPin 12 2 | #define echoPin 6 3 | 4 | void setup() { 5 | Serial.begin (9600); 6 | pinMode(trigPin, OUTPUT); 7 | pinMode(echoPin, INPUT); 8 | } 9 | 10 | void loop() 11 | { 12 | long duration, distance; 13 | digitalWrite(trigPin, LOW); 14 | delayMicroseconds(2); 15 | digitalWrite(trigPin, HIGH); 16 | delayMicroseconds(10); 17 | digitalWrite(trigPin, LOW); 18 | duration = pulseIn(echoPin, HIGH); 19 | distance = (duration/2) / 29.1; 20 | Serial.println(distance); 21 | delay(1000); 22 | } 23 | -------------------------------------------------------------------------------- /Line Follower using 5 sensor Array.ino: -------------------------------------------------------------------------------- 1 | #define left_motor_forward 8 2 | #define left_motor_backward 9 3 | #define left_motor_pwm 10 4 | #define right_motor_pwm 11 5 | #define right_motor_forward 12 6 | #define right_motor_backward 13 7 | 8 | #define set_point 2000 9 | #define max_speed 200 //set Max Speed Value 10 | #define Kp 0 //set Kp Value 11 | #define Ki 0 //set Ki Value 12 | #define Kd 0 //set Kd Value 13 | 14 | int proportional=0; 15 | int integral=0; 16 | int derivative=0; 17 | int last_proportional=0; 18 | int right_speed=0; 19 | int left_speed=0; 20 | int sensors_sum=0; 21 | int sensors_average=0; 22 | int sensors[5]={0,0,0,0,0}; 23 | int Position=0; 24 | int error_value=0; 25 | void setup() 26 | { 27 | pinMode(right_motor_forward,OUTPUT); 28 | pinMode(right_motor_backward,OUTPUT); 29 | } 30 | void Stop() 31 | { 32 | analogWrite(left_motor_pwm,0); 33 | analogWrite(right_motor_pwm,0); 34 | delay(500); 35 | } 36 | void pid_calc() 37 | { 38 | 39 | 40 | proportional=Position-set_point; 41 | integral = integral + proportional; 42 | derivative = proportional - last_proportional; 43 | last_proportional = proportional; 44 | error_value = int(proportional * Kp + integral * Ki + derivative * Kd); 45 | } 46 | void calc_turn() 47 | { 48 | //Restricting the error value between +256. 49 | if (error_value< -256) 50 | { 51 | error_value = -256; 52 | } 53 | if (error_value> 256) 54 | { 55 | error_value = 256; 56 | } 57 | // If error_value is less than zero calculate right turn speed values 58 | if (error_value< 0) 59 | { 60 | right_speed = max_speed + error_value; 61 | left_speed = max_speed; 62 | } 63 | else 64 | { 65 | right_speed = max_speed; 66 | left_speed = max_speed - error_value; 67 | } 68 | } 69 | void motor_drive (int right_speed,int left_speed) 70 | { 71 | if (right_speed>255) 72 | right_speed=255; 73 | if (right_speed<0) 74 | right_speed=0; 75 | if (left_speed>255) 76 | left_speed=255; 77 | if (left_speed<0) 78 | left_speed=0; 79 | 80 | digitalWrite(left_motor_forward,1); 81 | digitalWrite(right_motor_forward,1); 82 | digitalWrite(left_motor_backward,0); 83 | digitalWrite(right_motor_backward,0); 84 | analogWrite(left_motor_pwm,left_speed); 85 | analogWrite(right_motor_pwm,right_speed); 86 | delay(100); 87 | } 88 | void forward() 89 | { 90 | Serial.println("the bot will move forward"); 91 | digitalWrite(left_motor_forward,1); 92 | digitalWrite(right_motor_forward,1); 93 | digitalWrite(left_motor_backward,0); 94 | digitalWrite(right_motor_backward,0); 95 | analogWrite(left_motor_pwm,150); 96 | analogWrite(right_motor_pwm,150); 97 | delay(1000); 98 | Stop(); 99 | 100 | } 101 | 102 | void loop() 103 | { 104 | int sensors_average = 0; 105 | sensors_sum = 0; 106 | 107 | for (int i = 0; i <=4; i++) 108 | { 109 | sensors[i] = analogRead(i); 110 | sensors_average += sensors[i] * i * 1000 ; 111 | sensors_sum += sensors[i]; 112 | } 113 | if(sensors_sum==0) 114 | { 115 | Stop(); 116 | } 117 | if (sensors_sum >= 3500) 118 | { 119 | forward(); 120 | } 121 | 122 | if(sensors_sum < 3500 && sensors_sum > 0) 123 | { 124 | Position = int(sensors_average / sensors_sum); 125 | pid_calc(); 126 | calc_turn(); 127 | motor_drive(right_speed,left_speed); 128 | } 129 | 130 | 131 | delay(500); 132 | } 133 | -------------------------------------------------------------------------------- /Line Follower using 8 sensor Array.ino: -------------------------------------------------------------------------------- 1 | #define left_motor_forward 8 2 | #define left_motor_backward 9 3 | #define left_motor_pwm 10 4 | #define right_motor_pwm 11 5 | #define right_motor_forward 12 6 | #define right_motor_backward 7 7 | #define input_left 2 8 | #define input_right 3 9 | #define set_point 2000 10 | #define max_speed 100 //Set Max Motor Speed 11 | #define Kp 0 //set Kp Value 12 | #define Ki 0 //set Ki Value 13 | #define Kd 0 //set Kd Value 14 | 15 | int proportional=0; 16 | int integral=0; 17 | int derivative=0; 18 | int last_proportional=0; 19 | int right_speed=0; 20 | int left_speed=0; 21 | int sensors_sum=0; 22 | int sensors_average=0; 23 | int sensors[8]={0,0,0,0,0,0,0,0}; 24 | int Position=0; 25 | int error_value=0; 26 | void setup() 27 | { 28 | Serial.begin(9600); 29 | pinMode(left_motor_forward,OUTPUT); 30 | pinMode(left_motor_backward,OUTPUT); 31 | pinMode(right_motor_forward,OUTPUT); 32 | pinMode(right_motor_backward,OUTPUT); 33 | pinMode(input_left,INPUT); 34 | pinMode(input_right,INPUT); 35 | } 36 | void Stop() 37 | { 38 | analogWrite(left_motor_pwm,0); 39 | analogWrite(right_motor_pwm,0); 40 | 41 | delay(100); 42 | } 43 | 44 | void backward() 45 | { 46 | Serial.println("the bot will move backward"); 47 | digitalWrite(left_motor_backward,1); 48 | digitalWrite(right_motor_backward,1); 49 | digitalWrite(left_motor_forward,0); 50 | digitalWrite(right_motor_forward,0); 51 | analogWrite(left_motor_pwm,75); 52 | analogWrite(right_motor_pwm,75); 53 | delay(150); 54 | Stop(); 55 | } 56 | void pid_calc() 57 | { 58 | 59 | 60 | proportional=Position-set_point; 61 | integral = integral + proportional; 62 | derivative = proportional - last_proportional; 63 | last_proportional = proportional; 64 | error_value = int((proportional * Kp) + (integral * Ki) + (derivative * Kd)); 65 | Serial.println("Error Value="); 66 | 67 | Serial.println(error_value); 68 | 69 | if (error_value< -256) 70 | { 71 | error_value = -256; 72 | } 73 | if (error_value> 256) 74 | { 75 | error_value = 256; 76 | } 77 | 78 | if (error_value< 0) 79 | { 80 | left_speed= max_speed + error_value; 81 | right_speed = max_speed; 82 | } 83 | else 84 | { 85 | left_speed = max_speed; 86 | right_speed = max_speed - error_value; 87 | } 88 | 89 | 90 | if (right_speed>255) 91 | right_speed=255; 92 | if (right_speed<0) 93 | right_speed=0; 94 | if (left_speed>255) 95 | left_speed=255; 96 | if (left_speed<0) 97 | left_speed=0; 98 | Serial.println("Left Speed="); 99 | Serial.println(left_speed); 100 | Serial.println("Right Speed="); 101 | Serial.println(right_speed); 102 | 103 | digitalWrite(left_motor_forward,1); 104 | digitalWrite(right_motor_forward,1); 105 | digitalWrite(left_motor_backward,0); 106 | digitalWrite(right_motor_backward,0); 107 | analogWrite(left_motor_pwm,left_speed); 108 | analogWrite(right_motor_pwm,right_speed); 109 | delay(200); 110 | } 111 | 112 | 113 | 114 | void loop() 115 | { 116 | int i; 117 | sensors_average = 0; 118 | sensors_sum = 0; 119 | 120 | for (i = 0; i <=5; i++) 121 | { 122 | sensors[i] = analogRead(i); 123 | } 124 | sensors[6]=digitalRead(input_left); 125 | sensors[7]=digitalRead(input_right); 126 | for(i=0;i<=5;i++) 127 | { 128 | if(sensors[i]<100) 129 | sensors[i]=0; 130 | 131 | else 132 | sensors[i]=1; 133 | } 134 | for(int i=0;i<=7;i++) 135 | { 136 | sensors_average += sensors[i] * i * 1000 ; 137 | sensors_sum += sensors[i]; 138 | } 139 | Serial.println("Analog Value="); 140 | for(int i=0;i<=7;i++) 141 | { 142 | Serial.println(sensors[i]); 143 | 144 | } 145 | if(sensors_sum==0) 146 | { 147 | Stop(); 148 | backward(); 149 | 150 | } 151 | else 152 | { 153 | Position=int(sensors_average/sensors_sum); 154 | Serial.println("Position="); 155 | Serial.println(Position); 156 | pid_calc(); 157 | Stop(); 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /Motor Controller Coding.ino: -------------------------------------------------------------------------------- 1 | int 2 | left_motor_forward=4, 3 | left_motor_backward=8, 4 | right_motor_forward=2, 5 | right_motor_backward=12, 6 | left_motor_pwm=10, 7 | right_motor_pwm=6; 8 | char c; 9 | void setup() 10 | { 11 | Serial.begin(9600); 12 | pinMode(left_motor_forward,OUTPUT); 13 | pinMode(left_motor_backward,OUTPUT); 14 | pinMode(right_motor_forward,OUTPUT); 15 | pinMode(right_motor_backward,OUTPUT); 16 | } 17 | void loop() 18 | { 19 | while(Serial.available()) 20 | { 21 | c=Serial.read(); 22 | if(c=='f') 23 | forward(); 24 | else if(c=='b') 25 | backward(); 26 | else if(c=='l') 27 | left_turn(); 28 | else if(c=='r') 29 | right_turn(); 30 | else if(c=='s') 31 | Stop(); 32 | } 33 | } 34 | void forward() 35 | { 36 | Serial.println("the bot will move forward"); 37 | digitalWrite(left_motor_forward,1); 38 | digitalWrite(right_motor_forward,1); 39 | digitalWrite(left_motor_backward,0); 40 | digitalWrite(right_motor_backward,0); 41 | analogWrite(left_motor_pwm,150); 42 | analogWrite(right_motor_pwm,150); 43 | delay(1000); 44 | Stop(); 45 | } 46 | void backward() 47 | { 48 | Serial.println("the bot will move backward"); 49 | digitalWrite(left_motor_backward,1); 50 | digitalWrite(right_motor_backward,1); 51 | digitalWrite(left_motor_forward,0); 52 | digitalWrite(right_motor_forward,0); 53 | analogWrite(left_motor_pwm,150); 54 | analogWrite(right_motor_pwm,150); 55 | delay(1000); 56 | Stop(); 57 | } 58 | void right_turn() //hard right turn 59 | { 60 | Serial.println("the bot will take a hard right turn"); 61 | digitalWrite(left_motor_forward,1); 62 | digitalWrite(right_motor_forward,0); 63 | digitalWrite(left_motor_backward,0); 64 | digitalWrite(right_motor_backward,1); 65 | analogWrite(left_motor_pwm,150); 66 | analogWrite(right_motor_pwm,100); 67 | delay(300); //you may have to vary the delay for perfect right turn.. 68 | Stop(); 69 | } 70 | void left_turn() //hard left turn 71 | { 72 | Serial.println("the bot will take a hard left turn"); 73 | digitalWrite(left_motor_forward,0); 74 | digitalWrite(right_motor_forward,1); 75 | digitalWrite(left_motor_backward,1); 76 | digitalWrite(right_motor_backward,0); 77 | analogWrite(left_motor_pwm,100); 78 | analogWrite(right_motor_pwm,150); 79 | delay(300); //you may have to vary the delay for perfect right turn.. 80 | Stop(); 81 | } 82 | void Stop() 83 | { 84 | Serial.println("the bot will stop"); 85 | analogWrite(left_motor_pwm,0); 86 | analogWrite(right_motor_pwm,0); 87 | } 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Line-Follower-Robot 2 | Arduino Based Line Follower Robot using PID Algorithm 3 | --------------------------------------------------------------------------------