236 lines
5.0 KiB
C++
236 lines
5.0 KiB
C++
/**
|
|
Sensor Mapping
|
|
Sensor Angle Pin Port
|
|
S1 0 26 PD6
|
|
S2 25 PD4
|
|
S3 19 PD1
|
|
S4 18 PD0
|
|
S5 90 1 PE6
|
|
S6 40 PF1
|
|
S7 39 PF4
|
|
S8 38 PF5
|
|
S9 180 37 PF6
|
|
S10 36 PF7
|
|
S11 32 PC7
|
|
S12 31 PC6
|
|
S13 270 30 PB6
|
|
S14 29 PB5
|
|
S15 28 PB4
|
|
S16 27 PD7
|
|
loop cycle duration: 3.2 millis
|
|
**/
|
|
#define S10 ((PINB & 1))
|
|
#define S9 ((PINB & 2) >> 1)
|
|
#define S8 ((PINB & 4) >> 2)
|
|
#define S7 ((PINB & 8) >> 3)
|
|
#define S6 ((PINB & 16) >> 4)
|
|
#define S5 ((PINB & 32) >> 5)
|
|
|
|
#define S4 ((PINC & 1))
|
|
#define S3 ((PINC & 2) >> 1)
|
|
#define S2 ((PINC & 4) >> 2)
|
|
#define S1 ((PINC & 8) >> 3)
|
|
|
|
#define S16 ((PIND & 4) >> 2)
|
|
#define S15 ((PIND & 8) >> 3)
|
|
#define S14 ((PIND & 16) >> 4)
|
|
#define S13 ((PIND & 32) >> 5)
|
|
#define S12 ((PIND & 64) >> 6)
|
|
#define S11 ((PIND & 128) >> 7)
|
|
|
|
#define NCYCLES 255
|
|
#define BROKEN 230
|
|
#define TOO_LOW 45
|
|
|
|
byte counter[16];
|
|
byte distance;
|
|
byte nmax = 0;
|
|
int sensor = 0;
|
|
|
|
int oldIndex = 0;
|
|
int oldDistance = 0;
|
|
|
|
float xs[16];
|
|
float ys[16];
|
|
|
|
float angle = 0;
|
|
byte dist = 0;
|
|
|
|
unsigned long t = 0;
|
|
byte buf[3];
|
|
|
|
void setup() {
|
|
delay(1000);
|
|
|
|
Serial.begin(57600);
|
|
|
|
|
|
/*For now replace pinMode with writes to the direction register.
|
|
We don't know if pinMode will work on those sensors, and it has proven not be working on digitalWrite for reasons probably relative to compatibility between Arduino and our board,
|
|
but this needs further investigation*/
|
|
|
|
//Set the LEDs as outputs, keep the rest as input by default
|
|
pinMode(A4, OUTPUT);
|
|
|
|
/*pinMode(26, INPUT); //S1
|
|
pinMode(25, INPUT); //S2
|
|
pinMode(19, INPUT); //S3
|
|
pinMode(18, INPUT); //S4
|
|
pinMode(1, INPUT); //S5
|
|
pinMode(40, INPUT); //S6
|
|
pinMode(39, INPUT); //S7
|
|
pinMode(38, INPUT); //S8
|
|
pinMode(37, INPUT); //S9
|
|
pinMode(36, INPUT); //S10
|
|
pinMode(32, INPUT); //S11
|
|
pinMode(31, INPUT); //S12
|
|
pinMode(30, INPUT); //S13
|
|
pinMode(29, INPUT); //S14
|
|
pinMode(28, INPUT); //S15
|
|
pinMode(27, INPUT); //S16*/
|
|
|
|
for (int i = 0; i < 16; i++) {
|
|
xs[i] = cos((22.5 * PI / 180) * i);
|
|
ys[i] = sin((22.5 * PI / 180) * i);
|
|
}
|
|
}
|
|
|
|
void loop() {
|
|
readBallInterpolation();
|
|
//printCounter();
|
|
sendDataInterpolation();
|
|
//test();
|
|
//delay(100);
|
|
}
|
|
|
|
/**--- READ BALL USING SENSORS ANGLE INTERPOLATION ---**/
|
|
|
|
void readBallInterpolation() {
|
|
for (int i = 0; i < 16; i++) {
|
|
counter[i] = 0;
|
|
}
|
|
|
|
//reads from the register
|
|
for (int i = 0; i < NCYCLES; i++) {
|
|
counter[0] += !S1;
|
|
counter[1] += !S2;
|
|
counter[2] += !S3;
|
|
counter[3] += !S4;
|
|
counter[4] += !S5;
|
|
counter[5] += !S6;
|
|
counter[6] += !S7;
|
|
counter[7] += !S8;
|
|
counter[8] += !S9;
|
|
counter[9] += !S10;
|
|
counter[10] += !S11;
|
|
counter[11] += !S12;
|
|
counter[12] += !S13;
|
|
counter[13] += !S14;
|
|
counter[14] += !S15;
|
|
counter[15] += !S16;
|
|
}
|
|
|
|
float x = 0, y = 0;
|
|
for (int i = 0; i < 16; i++) {
|
|
if (counter[i] > BROKEN || counter[i] < TOO_LOW) counter[i] = 0;
|
|
|
|
x += xs[i] * counter[i];
|
|
y += ys[i] * counter[i];
|
|
}
|
|
|
|
angle = atan2(y, x) * 180 / PI;
|
|
angle = ( ((int)(angle) + 360)) % 360;
|
|
|
|
//distance is 0 when not seeing ball
|
|
//dist = hypot(x, y);
|
|
|
|
nmax = 0;
|
|
|
|
//saves max value and sensor
|
|
for (int i = 0; i < 16; i++) {
|
|
if (counter[i] > nmax) {
|
|
nmax = counter[i];
|
|
sensor = i;
|
|
}
|
|
}
|
|
|
|
distance = NCYCLES - nmax;
|
|
|
|
//turn led on
|
|
if (distance == NCYCLES) {
|
|
digitalWrite(A4, LOW);
|
|
} else {
|
|
digitalWrite(A4, HIGH);
|
|
}
|
|
}
|
|
|
|
void sendDataInterpolation() {
|
|
buf[0] = 0b01000000;
|
|
buf[1] = 0b10000000;
|
|
buf[2] = 0b11000000;
|
|
|
|
buf[0] |= ((int)angle) & 0b000111111;
|
|
buf[1] |= (((int)angle) & 0b111000000) >> 6;
|
|
buf[1] |= (distance & 0b11100000) >> 2;
|
|
buf[2] |= distance & 0b00011111;
|
|
|
|
if(Serial.availableForWrite() >= 3) Serial.write(buf, 3);
|
|
}
|
|
|
|
void test() {
|
|
readBallInterpolation();
|
|
|
|
Serial.println("===========");
|
|
Serial.print(S1);
|
|
Serial.print(" | ");
|
|
Serial.print(S2);
|
|
Serial.print(" | ");
|
|
Serial.print(S3);
|
|
Serial.print(" | ");
|
|
Serial.print(S4);
|
|
Serial.print(" | ");
|
|
Serial.print(S5);
|
|
Serial.print(" | ");
|
|
Serial.print(S6);
|
|
Serial.print(" | ");
|
|
Serial.print(S7);
|
|
Serial.print(" | ");
|
|
Serial.print(S8);
|
|
Serial.print(" | ");
|
|
Serial.print(S9);
|
|
Serial.print(" | ");
|
|
Serial.print(S10);
|
|
Serial.print(" | ");
|
|
Serial.print(S11);
|
|
Serial.print(" | ");
|
|
Serial.print(S12);
|
|
Serial.print(" | ");
|
|
Serial.print(S13);
|
|
Serial.print(" | ");
|
|
Serial.print(S14);
|
|
Serial.print(" | ");
|
|
Serial.print(S15);
|
|
Serial.print(" | ");
|
|
Serial.print(S16);
|
|
Serial.print(" --- ");
|
|
Serial.println(sensor);
|
|
Serial.println("===========");
|
|
delay(100);
|
|
|
|
}
|
|
|
|
|
|
void printCounter() {
|
|
for (int i = 0; i < 16; i++) {
|
|
Serial.print(counter[i]);
|
|
Serial.print(" | ");
|
|
}
|
|
Serial.print("\t\t| Angle: " );
|
|
Serial.print(angle);
|
|
Serial.print("||| Distance: " );
|
|
Serial.print(distance);
|
|
|
|
Serial.println();
|
|
delay(100);
|
|
}
|