-
Notifications
You must be signed in to change notification settings - Fork 1
/
Sabanci_Kod.ino
150 lines (126 loc) · 3.3 KB
/
Sabanci_Kod.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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <Wire.h>
#include <Servo.h>
//REV
int green, blue, red;
byte busStatus;
//Line counter sensor
int line_sensor_pin = 2;
int lineCounter = 0;
byte colorStatus; // 0 for black and 1 for white
byte prevColorStatus;
//Sensor adresses
int sensorAddress = 0x52;
int mainRegister = 0x00;
int greenRegister = 0x0E;
int blueRegister = 0x11;
int redRegister = 0x14;
int init_last = LOW;
int init_state;
int init_pin = 7;
int victor1_pin = 5;
int victor2_pin = 6;
//Victors
Servo victor1;
Servo victor2;
//Speeds
int max_forward = 96;
int max_reverse = 0;
int motor_stop = 92;
//Color sensor
byte cs;
//PID
double kP = 0.20, kI = 0.06, kD = 0.06;
double setpoint = 399, input, output;
double errorSum, lastError;
unsigned long lastTime;
byte robotState;
//Read register
byte readRegister(int deviceAddress, int registerAddress) {
byte registerData;
Wire.beginTransmission(deviceAddress);
Wire.write(registerAddress);
Wire.endTransmission();
Wire.requestFrom(deviceAddress, 1);
registerData = Wire.read();
return registerData;
}
//Write register
byte writeRegister(int deviceAddress, int registerAddress, int newRegisterByte) {
byte result;
Wire.beginTransmission(deviceAddress);
Wire.write(registerAddress);
Wire.write(newRegisterByte);
result = Wire.endTransmission();
delay(5);
if(result > 0)
{
Serial.print("ERROR in I2C register writ. Error code: ");
Serial.println(result);
}
return result;
}
//PID
void PID() {
//unsigned long now = millis();
double timeChange = (double) 0.05; //(double)(now - lastTime);
input = lineCounter;
double error = setpoint - input;
errorSum += (error * timeChange);
double derivError = (error - lastError) / timeChange;
output = (kP * error + kI * errorSum + kD * derivError) + motor_stop;
lastError = error;
//lastTime = now;
}
int c = 0;
//Auto period
void autonomousPeriod() {
int x = 0;
while (true) {
if(x == 1000){
victor1.write(91);
victor2.write(91);
robotState = 0;
return;
}
if(x%4 == 0 && x < 105) max_forward++;
victor1.write(max_forward);
victor2.write(max_forward);
x += 1;
Serial.println(x);
delay(50);
}
}
void setup() {
Wire.begin();
Serial.begin(9600);
busStatus = writeRegister(sensorAddress, mainRegister, 6);
pinMode(init_pin, INPUT_PULLUP);
robotState = 1;
cs = 0;
victor1.attach(victor1_pin);
victor2.attach(victor2_pin);
victor1.write(91);
victor2.write(91);
c = 0;
}
void loop() {
green = readRegister(sensorAddress, greenRegister);
blue = readRegister(sensorAddress, blueRegister);
red = readRegister(sensorAddress, redRegister);
Serial.print("Green:");
Serial.println(green);
Serial.print("Blue: ");
Serial.println(blue);
Serial.print("Red: ");
Serial.println(red);
init_state = HIGH; //digitalRead(init_pin);
if(robotState && init_last == LOW && init_state == HIGH) {
Serial.println("Autonomous period has started");
autonomousPeriod();
if(!robotState) {
Serial.println("Robot has successfully stopped!");
}
}
init_last = init_state;
delay(50);
}