-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreflectivesensor.ino
137 lines (120 loc) · 3.38 KB
/
reflectivesensor.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
#include <QTRSensors.h>
#include <Wire.h>
QTRSensors qtr;
const uint8_t SensorCount = 4;//use four sensors
uint16_t sensorValues[SensorCount];
int Rmotor= 12;
int RmotorPWM= 13;
int Lmotor= 8;
int LmotorPWM= 5;
void setup()
{
for (int i = 2; i < 6; i++){ pinMode(i, INPUT);}
for (int i = 10; i < 18; i++) {pinMode(i, OUTPUT);}
// configure the sensors
qtr.setTypeRC();
qtr.setSensorPins((const uint8_t[]){3, 4, 5, 6}, SensorCount);
//qtr.setEmitterPin(2);
delay(500);
Serial.begin(115200);
Serial.println("Begin calibrations");
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH); // turn on Arduino's LED to indicate we are in calibration mode
// 2.5 ms RC read timeout (default) * 10 reads per calibrate() call
// = ~25 ms per calibrate() call.
// Call calibrate() 400 times to make calibration take about 10 seconds.
for (uint16_t i = 0; i < 400; i++)
{
qtr.calibrate();
}
digitalWrite(LED_BUILTIN, LOW); // turn off Arduino's LED to indicate we are through with calibration
// print the calibration minimum values measured when emitters were on
//Serial.begin(9600);
for (uint8_t i = 0; i < SensorCount; i++)
{
Serial.print(qtr.calibrationOn.minimum[i]);
Serial.print(' ');
}
Serial.println();
// print the calibration maximum values measured when emitters were on
for (uint8_t i = 0; i < SensorCount; i++)
{
Serial.print(qtr.calibrationOn.maximum[i]);
Serial.print(' ');
}
Serial.println();
Serial.println();
delay(1000);
pinMode(Rmotor,OUTPUT);
pinMode(Lmotor,OUTPUT);
pinMode(RmotorPWM,OUTPUT);
pinMode(LmotorPWM, OUTPUT);
}
void loop()
{
// read calibrated sensor values and obtain a measure of the line position
// from 0 to 5000 (for a white line, use readLineWhite() instead)
uint16_t position = qtr.readLineBlack(sensorValues);
// print the sensor values as numbers from 0 to 1000, where 0 means maximum
// reflectance and 1000 means minimum reflectance, followed by the line
// position
for (uint8_t i = 0; i < SensorCount; i++)
{
Serial.print(sensorValues[i]);
Serial.print('\t');
}
Serial.println(position);
//use sensor values to determine where line is and move accordingly
if ((sensorValues[1] > 500) || (sensorValues[2]> 500)){
Serial.println("Straight");
drive_forward();
}
else if (sensorValues[0] > 500){
Serial.println("right");
right();
}
else if (sensorValues[3] > 500){
Serial.println("left");
left();
}
else{
Serial.println("Straight");
drive_forward();
}
delay(250);
}
//functions for driving car
/*
void steep_left(){
digitalWrite(Rmotor,HIGH);
digitalWrite(Lmotor,HIGH);
analogWrite(RmotorPWM,50);
analogWrite(LmotorPWM, 140);
}
*/
void left(){
digitalWrite(Rmotor,HIGH);
digitalWrite(Lmotor,HIGH);
analogWrite(RmotorPWM,50);
analogWrite(LmotorPWM, 90);
}
/*
void steep_right(){
digitalWrite(Rmotor,HIGH);
digitalWrite(Lmotor,HIGH);
analogWrite(RmotorPWM,140);
analogWrite(LmotorPWM, 50);
}
*/
void right(){
digitalWrite(Rmotor,HIGH);
digitalWrite(Lmotor,HIGH);
analogWrite(RmotorPWM,90);
analogWrite(LmotorPWM, 50);
}
void drive_forward(){
digitalWrite(Rmotor,HIGH);
digitalWrite(Lmotor,HIGH);
analogWrite(RmotorPWM,75);
analogWrite(LmotorPWM, 75);
}