Stap 7: Arduino Code
DEFINIËRENinput (pins)
#define sensor1 5 / / sensor op keeper links
#define sensor2 0 / / sensor op keeper recht
#define center 8
#define motor1 10
#define motor2 11
#define distThresh 50
GLOBAL declaraties van variabelen
int s1Baseline;
int s1Tolerance;
Const int numRecRead = 10;
int recReading [numRecRead];
int recReadCur;
void setup () {}
Serial.begin(9600); instellen van seriële bibliotheek 9600 bps
pinMode (sensor1, INPUT);
pinMode (motor1, OUTPUT);
pinMode (motor2, OUTPUT);
resetRecVal();
zaad random getal-generator voor de moeite
randomSeed(analogRead(0));
Kalibreren van de sensoren en basislijn en toleranties instellen
int s1Cal [2];
calibrateSensor (sensor1, s1Cal);
s1Baseline = s1Cal [0];
s1Tolerance = s1Cal [1];
}
void loop {}
int s1Val, s1ValAvg;
dubbele s1Dist;
Serial.println(digitalRead(Center));
Krijgen van de sensor-waardes
s1Val = checkSensor (sensor1, s1Baseline, s1Tolerance);
s1ValAvg = averageReading(s1Val);
Serial.println(s1Val);
Als (s1ValAvg > distThresh) {}
s1Dist = sensorToDistance(s1Val);
Als (s1Dist < 14) moveGoalie(5); naar rechts verplaatsen
anders als (s1Dist > 18 & & s1Dist < 32) moveGoalie(-5); Zet links
resetRecVal();
}
}
Retourneert de waarde van de sensor als er een lezing (dat wil zeggen de bal langs infront was)
of 0.0 als geen lezing werd genomen (d.w.z. de bal ging niet voorbij)
sensorPin - de pin van de sensor worden gecontroleerd
basislijn - die sensoren "geen lezing" waarde
tolerantie - de drempel af van de basislijn die moet worden beschouwd als een lezing
(dat wil zeggen als de waarde is binnen (basislijn +/-drempel geen aangifte doen
een lezing)
int checkSensor (int sensorPin, dubbele basislijn, dubbele tolerantie) {}
dubbele sVal = analogRead(sensorPin); Waarde gemeld door de sensor
Als (abs (basislijn - sVal) < tolerantie) / / als de lezing binnen de tolerantie is
keren 0; "geen lezing" retourneren
retourneren sVal; anders de retourwaarde
}
Deze eigenschap retourneert de afstand die overeenkomt met de sensorgegevens
sensorVal - waarde gelezen door de sensor
dubbele sensorToDistance (int sensorVal) {}
dubbele schaal = 2050;
dubbele expon = 1.0/0,85;
dubbele dist = pow((scale/sensorVal), expon);
Als (dist > 35) dist = 35; //normalize dist
retourneren dist;
}
Kalibreert de sensor (uitgevoerd in setup)
Neemt kalibratiepunten van de sensor te vinden van de gemiddelde waarde
en ruis in de sensor lezingen
sensorPin - Pin van de sensor kalibreren
calData - int [] waarden worden opgeslagen in
VOID calibrateSensor (int sensorPin, int calData[]) {}
int numReadings = 300; Neem 300 kalibratiepunten
int gegevens [numReadings]; gebruikt voor het opslaan van kalibratie punten
int i;
int minVal = 10000; initialiseren van hoge minimumwaarde
int maxVal = -1; initialiseren van de maximale waarde laag
voor (ik = 0; ik < numReadings; ++ ik) {}
int t = analogRead(sensorPin); lezen van voorbeeldgegevens
gegevens [i] = t; data matrix te vullen
Record min en max sensor lezingen
Als (t < minVal) //if t is minder dan de huidige minVal
minVal = t; vervangen van de minVal
Als (t > maxVal) //if t groter is dan maxVal
maxVal = t; vervangen van de maxVal
}
Vinden van de verspreiding van de gegevens
int verspreid = maxVal - minVal;
Vind het gemiddelde van de voorbeeldgegevens
dubbele gemiddelde = 0;
voor (ik = 0; ik < numReadings; ++ ik)
bedoel += gegevens [i];
bedoel / = numReadings;
berekenen van de std-dev
dubbele stddev = 0;
voor (ik = 0; ik < numReadings; ++ ik)
stddev += pow ((gegevens [i] - bedoel), 2);
stddev / = numReadings;
stddev = sqrt(stddev);
terugkeer [gemiddelde, spreiden]
calData [0] = gemiddelde;
calData [1] = stddev * 2;
terugkeer;
}
0-stop
10 - snel
< 0 links
> 0 recht
VOID moveGoalie (int dir) {}
int mag = map(abs(dir), 10, 0, 0, 255);
int retMag kaart (abs ((dir + 4)/4.0) = 4, 14, 100, 255); meer langzaam terug
Als (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);
}
anders als (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);
}
Stop keeper
analogWrite (motor1, 0);
analogWrite (motor2, 0);
}
int averageReading (int newVal) {}
recReadCur % = (numRecRead - 1);
recReading [recReadCur ++] = newVal;
int som = 0;
int geldig = 0;
for (int i = 0; ik < numRecRead; ++ ik) {}
Als (recReading [i] > 0) ++ geldig;
som += recReading [i];
}
Als (geldig < 7) 0 keren;
keren (som/geldig);
}
VOID resetRecVal () {}
for (int i = 0; ik < numRecRead; ++ ik) //initialize recRead
recReading [i] = 0;
recReadCur = 0;
}