-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathPID_V1.ino
127 lines (118 loc) · 2.86 KB
/
PID_V1.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define FORWARD_RM 11 // RIGHT MOTORS FORWARD MOVEMENT
#define FORWARD_LM 6 // LEFT MOTORS FORWARD MOVEMENT
#define BACKWARD_RM 10 // RIGHT MOTORS BACKWARD MOVEMENT
#define BACKWARD_LM 9 // LEFT MOTORS BACKWARD MOVEMENT
#define BUTTON 4 // ON/OFF BUTTON
int IR[5] = { A0, A1, A2, A3, A4 };
int IR_READ[5],speed,currentPos,setPos=12,currentError,prevError,I,D,Flag=1;
String serial_input= "";
float kp,kd,ki,PIDOut;
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
void getSerial(){
while (Serial.available())
{
char x=Serial.read();
serial_input +=x;
delay(2);
}
if (serial_input.length()>0)
{
getpidvalue();
}
}
void getpidvalue()
{
if(serial_input.substring(0,2)=="kp")
{serial_input.remove(0,2);
kp=serial_input.toFloat();
serial_input= "";
}
if(serial_input.substring(0,2)=="ki")
{serial_input.remove(0,2);
ki=serial_input.toFloat();
serial_input= "";
}
if(serial_input.substring(0,2)=="kd")
{serial_input.remove(0,2);
kd=serial_input.toFloat();
serial_input= "";
}
if(serial_input.substring(0,2)=="sp")
{serial_input.remove(0,2);
speed=serial_input.toInt();
serial_input= "";
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("kp=");
lcd.print(kp,4);
lcd.setCursor(0,1);
lcd.print("ki=");
lcd.print(ki,4);
delay(1500);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("kd=");
lcd.print(kd);
lcd.setCursor(0,1);
lcd.print("speed=");
lcd.print(speed);
}
void readIR()
{
for (int i = 0; i < 5; i++)
IR_READ[i] = digitalRead(IR[i]); //STORE IR READINGS IN ARRAY
}
void STOP() {
analogWrite(FORWARD_RM, LOW);
analogWrite(FORWARD_LM, LOW);
}
void FollowLine(){
readIR();
currentPos=IR_READ[0]*1+IR_READ[1]*2+IR_READ[2]*3+IR_READ[3]*4+IR_READ[4]*5;
if(currentPos==0)
{
STOP();
Flag=1;
}
else if(currentPos==15)
{
}
else
{
currentError= setPos-currentPos;
I+=currentError;
D=currentError-prevError;
prevError=currentError;
PIDOut=kp*currentError+ki*I+kd*D;
analogWrite(FORWARD_RM,constrain(speed-PIDOut,0,255));
analogWrite(FORWARD_LM,constrain(speed+PIDOut,0,255));
}
}
void setup()
{ Serial.begin(9600);
pinMode(FORWARD_RM, OUTPUT);
pinMode(FORWARD_LM, OUTPUT);
pinMode(BACKWARD_RM, OUTPUT);
pinMode(BACKWARD_LM, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
lcd.init(); // initialize the lcd
lcd.backlight();
lcd.print("kp=");
delay(1000);
}
void loop()
{
getSerial();
if(digitalRead(BUTTON)==LOW)
Flag=0;
if(Flag==0){
FollowLine();
}
I=0;
}