-
Notifications
You must be signed in to change notification settings - Fork 0
/
ballspector.c
105 lines (86 loc) · 2.55 KB
/
ballspector.c
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
#pragma config(Sensor, in1, vis1, sensorReflection)
#pragma config(Sensor, in2, inf1, sensorLineFollower)
#pragma config(Sensor, in3, inf2, sensorLineFollower)
#pragma config(Sensor, dgtl11, enc1, sensorQuadEncoder)
#pragma config(Motor, port1, led1, tmotorVexFlashlight, openLoop, reversed)
#pragma config(Motor, port2, ser1, tmotorServoStandard, openLoop)
#pragma config(Motor, port3, ser2, tmotorServoStandard, openLoop)
#pragma config(Motor, port10, mot1, tmotorVex269_HBridge, openLoop)
#define square(n) n*n
int type;
int dist;
int minDist;
enum sensor { Vis, Inf, nSensors };
enum material { Empty, Blue, Metal, White, Bite, Wood, Clear, nMaterials };
// Known material data to match against
int known[nMaterials][nSensors] = {
{ 107, 84},
{ 578, 1423},
{ 2609, 1119},
{ 875, 957},
{ 416, 1145},
{ 2742, 623},
{ 112, 1229},
};
// Normalization factors for converting sensor data to same range as knowns
int norm[nSensors] = { 300, 4000 };
// Averaging an array of sensor values
#define nSamples 200
int arr[nSamples][nSensors];
int index;
int avg[nSensors];
int sum[nSensors];
int i;
task main()
{ while(1) {
// Raise scanner to catch ball
while(SensorValue[enc1] < 0) motor[mot1] = 128;
wait(0.1);
motor[mot1] = 0;
// Reset encoder
SensorValue[enc1] = 0;
// Release ball from queue
motor[ser1] = -50;
wait(0.11);
motor[ser1] = 10;
wait(1);
// Turn on flashlight
motor[led1] = -127;
type = 0;
// Sample until type is not 0, but have a minimum of samples first
for(index = type = 0; type == 0 || index < nSamples; index++)
{
// Add new samples to arrays
arr[index % nSamples][Vis] = SensorValue[vis1];
arr[index % nSamples][Inf] = SensorValue[inf1] + SensorValue[inf2];
// Find sums of arrays
sum[Vis] = 0;
sum[Inf] = 0;
for(i = 0; i < nSamples; i++)
{
sum[Vis] += arr[i][Vis];
sum[Inf] += arr[i][Inf];
}
// Take averages
avg[Vis] = sum[Vis] * 1000 / norm[Vis] / nSamples;
avg[Inf] = sum[Inf] * 1000 / norm[Inf] / nSamples;
// Find best type match
minDist = 1000000;
type = 0;
for(i = 0; i < (int)nMaterials; i++)
{
dist = square(avg[Vis] - known[i][Vis]) + square(avg[Inf] - known[i][Inf]);
if(dist > minDist) continue;
minDist = dist;
type = i;
}
// Adjust redirector
motor[ser2] = 10*(type - (int)nMaterials);
}
// Turn off flashlight
motor[led1] = 0;
// Lower scanner to drop ball
while(SensorValue[enc1] > -200) motor[mot1] = -128;
motor[mot1] = 0;
wait(1);
} }