Étape 7: Arduino Code
DÉFINIRentrée (broches)
#define Capteur1 5 / / capteur sur le gardien à gauche
#define sensor2 0 / / capteur sur la droite du gardien de but
#define Centre 8
#define motor1 10
#define motor2 11
#define distThresh 50
Déclarations de variables globales
int s1Baseline ;
int s1Tolerance ;
const int numRecRead = 10 ;
int recReading [numRecRead] ;
int recReadCur ;
annuler le programme d’installation () {}
Serial.Begin(9600) ; mettre en place une bibliothèque série à 9600 bps
pinMode (Capteur1, entrée) ;
pinMode (motor1, sortie) ;
pinMode (motor2, sortie) ;
resetRecVal() ;
générateur de nombres aléatoires de semences pour Difficulté
randomSeed(analogRead(0)) ;
Étalonner des capteurs et de définir la ligne de base et les tolérances
int s1Cal [2] ;
calibrateSensor (Capteur1, s1Cal) ;
s1Baseline = s1Cal [0] ;
s1Tolerance = s1Cal [1] ;
}
void loop() {}
int s1Val, s1ValAvg ;
double s1Dist ;
Serial.println(digitalRead(Center)) ;
Obtenir des valeurs de capteur
s1Val = checkSensor (Capteur1, s1Baseline, s1Tolerance) ;
s1ValAvg = averageReading(s1Val) ;
Serial.println(s1Val) ;
Si (s1ValAvg > distThresh) {}
s1Dist = sensorToDistance(s1Val) ;
Si moveGoalie(5) (s1Dist < 14) ; déplacer vers la droite
ElseIf (s1Dist > 18 & & s1Dist < 32) moveGoalie(-5) ; déplacer à gauche
resetRecVal() ;
}
}
Retourne la valeur de la sonde s’il y avait une lecture (c'est-à-dire le ballon passé devant)
ou 0.0 si aucune lecture a été effectuée (c'est-à-dire le ballon ne pas passer par)
sensorPin - la broche du capteur à vérifier
base - que capteurs « pas de lecture » valeur
tolérance - le seuil de référence qui doit être considéré comme une lecture
(c'est-à-dire si la valeur se trouve dans (ligne de base +/-seuil ne signalent pas
une lecture)
int checkSensor (int sensorPin, double base, double tolérance) {}
double sVal = analogRead(sensorPin) ; Valeur déclarée par le capteur
Si (abs (base - sVal) < tolérance) / / si la lecture est dans la tolérance
return 0 ; ne retourner à « aucun lecture »
retour sVal ; Sinon, retourner la valeur
}
Retourne la distance correspondant à la lecture de la sonde
sensorVal - valeur lue par la sonde
double sensorToDistance (int sensorVal) {}
double échelle = 2050 ;
l’expon double = 1.0/0,85 ;
double dist = pow((scale/sensorVal), l’expon) ;
Si dist (dist > 35) = 35 ; dist //normalize
retour dist ;
}
Calibrer le capteur (exécuté dans le programme d’installation)
Prend des points d’étalonnage de la sonde pour trouver la valeur moyenne
et le bruit dans les lectures du capteur
sensorPin - broche du capteur à étalonner
calData - int [] pour les valeurs doivent être stockées dans
void calibrateSensor (int sensorPin, int calData[]) {}
int numReadings = 300 ; prendre de 300 points de calibrage
données int [numReadings] ; utilisé pour stocker les points de calibrage
int i ;
minVal int = 10000 ; initialiser la valeur minimale élevée
maxVal int = -1 ; initialiser la valeur maximale basse
pour (i = 0; i < numReadings; ++ j’ai) {
int t = analogRead(sensorPin) ; lire les données de l’échantillon
données [i] = t ; remplir le tableau de données
Min record et lectures de capteurs max
Si (t < minVal) //if t est inférieure à minVal actuel
minVal = t ; remplacer le minVal
Si (t > maxVal) //if t est supérieur à maxVal
maxVal = t ; remplacer le maxVal
}
Trouver la propagation des données
int propagation = maxVal - minVal ;
Trouver la moyenne de l’échantillon de données
double moyenne = 0 ;
pour (i = 0; i < numReadings; ++ j’ai)
donnée de += [i] ;
moyenne / ou = numReadings ;
calculer des écarts-type
stddev double = 0 ;
pour (i = 0; i < numReadings; ++ j’ai)
StdDev += pow ((données [i] - moyenne), 2) ;
StdDev / = numReadings ;
StdDev = sqrt(stddev) ;
retour [moyenne, propagation]
calData [0] = moyenne ;
calData [1] = stddev * 2 ;
retour ;
}
0-stop
10 - rapide
< 0 gauche
> droit 0
void moveGoalie (int dir) {}
int mag = map(abs(dir), 10, 0, 0, 255) ;
int retMag = carte (abs ((dir + 4)/4.0), 4, 14, 100, 255) ; retour plus lentement
Si (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) ;
}
ElseIf (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) ;
}
arrêt de gardien de but
analogWrite (motor1, 0) ;
analogWrite (motor2, 0) ;
}
int averageReading (int newVal) {}
% recReadCur = (numRecRead - 1) ;
recReading [recReadCur ++] = newVal ;
int somme = 0 ;
valide int = 0 ;
pour (int i = 0; i < numRecRead; ++ j’ai) {
Si (recReading [i] > 0) ++ valide ;
somme recReading += [i] ;
}
Si (valide < 7) return 0 ;
retour (somme/valide) ;
}
void resetRecVal () {}
pour (int i = 0; j’ai < numRecRead; ++ j’ai) //initialize recRead
recReading [i] = 0 ;
recReadCur = 0 ;
}