Bordsskiva fotbollsspel (7 / 9 steg)
Steg 7: Arduino kod
DEFINIERAinput (stift)
#define sensor1 5 / / sensorn på målvakten vänster
#define sensor2 0 / / sensor målvakt höger
#define centrum 8
#define motor1 10
#define motor2 11
#define distThresh 50
GLOBALA variabeldeklarationer
int s1Baseline;
int s1Tolerance;
CONST int numRecRead = 10;
int recReading [numRecRead];
int recReadCur;
Ogiltiga inställningar () {
Serial.BEGIN(9600); Ställ in följetong bibliotek på 9600 bps
pinMode (sensor1, ingång);
pinMode (motor1, produktionen);
pinMode (motor2, produktionen);
resetRecVal();
utsäde slumptalsgeneratorn för svårigheten
randomSeed(analogRead(0));
Kalibrerar sensorer och ange originalplan och toleranser
int s1Cal [2];
calibrateSensor (sensor1, s1Cal);
s1Baseline = s1Cal [0];
s1Tolerance = s1Cal [1];
}
void loop() {
int s1Val, s1ValAvg;
dubbla s1Dist;
Serial.println(digitalRead(Center));
Får sensorn värden
s1Val = checkSensor (sensor1, s1Baseline, s1Tolerance);
s1ValAvg = averageReading(s1Val);
Serial.println(s1Val);
om (s1ValAvg > distThresh) {
s1Dist = sensorToDistance(s1Val);
om (s1Dist < 14) moveGoalie(5); flytta höger
annars om (s1Dist > 18 & & s1Dist < 32) moveGoalie(-5); flytta åt vänster
resetRecVal();
}
}
Returnerar värdet sensor om det fanns en behandling (dvs bollen passerat infront)
eller 0,0 om inte behandlingen togs (dvs bollen klarade inte)
sensorPin - pin av sensorn som ska kontrolleras
Originalplan - att sensorer "ingen läsning" värde
tolerans - tröskeln av baslinjen som bör anses vara en behandling
(dvs. om värdet ligger inom (originalplan +/-tröskel rapporterar inte
en läsning)
int checkSensor (int sensorPin, dubbel baslinje, dubbel tolerans) {
dubbel sVal = analogRead(sensorPin); Värde som rapporterats av sensorn
om (abs (baslinje - sVal) < tolerans) / / om läsning är inom toleransen
Return 0; returnera "ingen läsning"
returnera sVal; annars returnera värdet
}
Returnerar avståndet motsvarar den sensor behandlingen
sensorVal - värdet läsa av sensorn
dubbla sensorToDistance (int sensorVal) {
dubbel skala = 2050.
dubbel expon = 1,0/0,85;
dubbel dist = pow((scale/sensorVal), expon);
om (dist > 35) dist = 35. //normalize dist
returnera dist;
}
Kalibrerar sensorn (springa setup)
Tar kalibreringspunkter från sensorn för att hitta medelvärdet
och brus i sensormätningar
sensorPin - Pin av sensor kalibrera
calData - int [] för värdena kunna lagras i
void calibrateSensor (int sensorPin, int calData[]) {
int numReadings = 300; ta 300 kalibreringspunkter
int data [numReadings]; används för att lagra kalibreringsmönstret poäng
int i;
int minVal = 10000; initiera minimivärdet hög
int maxVal = -1; initiera högsta värde låg
för (jag = 0; jag < numReadings; ++ jag) {
int t = analogRead(sensorPin); Läs exempeldata
data [i] = t; fylla i data array
Spela in min och max sensormätningar
om (t < minVal) //if t är mindre än nuvarande minVal
minVal = t; ersätta minVal
om (t > maxVal) //if t är större än maxVal
maxVal = t; ersätta maxVal
}
Hitta spridningen av data
int sprida = maxVal - minVal;
Hitta medelvärdet av exempeldata
dubbel medelvärde = 0;
för (jag = 0; jag < numReadings; ++ jag)
menar += data [i];
menar / = numReadings;
beräkna STDAV
dubbel stddev = 0;
för (jag = 0; jag < numReadings; ++ jag)
StdDev += pow ((data [i] - menar), 2);
StdDev = numReadings;
StdDev = sqrt(stddev);
återkomst [menar, sprida]
calData [0] = medelvärde;
calData [1] = stddev * 2;
hemkomst.
}
0-stop
10 - snabb
< 0 har lämnat
> 0 rätt
void moveGoalie (int dir) {
int mag = map(abs(dir), 0, 10, 0, 255);
int retMag = karta (abs ((dir + 4)/4.0), 4, 14, 100, 255); returnera långsammare
om (dir > 0) {
analogWrite (motor1, mag);
analogWrite (motor2, 0);
Delay(100);
analogWrite (motor1, 0);
analogWrite (motor2, 0);
Delay(1000);
analogWrite (motor1, 0);
analogWrite (motor2, retMag);
Delay(200);
}
annars om (dir < 0) {
analogWrite (motor1, 0);
analogWrite (motor2, mag);
Delay(300);
analogWrite (motor1, 0);
analogWrite (motor2, 0);
Delay(1000);
analogWrite (motor1, retMag);
analogWrite (motor2, 0);
Delay(300);
}
stoppa målvakten
analogWrite (motor1, 0);
analogWrite (motor2, 0);
}
int averageReading (int newVal) {
recReadCur % = (numRecRead - 1);
recReading [recReadCur ++] = newVal;
int summa = 0;
int giltiga = 0;
för (int jag = 0; jag < numRecRead; ++ jag) {
om (recReading [i] > 0) ++ giltiga.
summa += recReading [i];
}
om (giltig < 7) return 0;
tillbaka (summan/giltig);
}
void resetRecVal () {
för (int jag = 0; jag < numRecRead; ++ jag) //initialize recRead
recReading [i] = 0;
recReadCur = 0;
}