Étape 5: L’Arduino code
#define TILTL 2#define TILTH 3
#define bas 2
#define TOPLEFT 0
#define TOPRIGHT 1
#include < Servo.h >
#include « math.h »
Servo hservo ;
Servo vservo ;
int tlsense ;
int trsense ;
int bsense ;
tavg int ;
int diff ;
int spd ;
int diviseur ;
sensibilité de l’int ;
tiltl int ;
ameublissement int ;
annuler le programme d’installation () {}
vservo.Attach(9) ; attache le servo sur la broche 9 à l’objet de servo
hservo.Attach(10) ; s’adapte sur le servo sur la broche 10 l’objet de servo
diviseur = 10 ; il contrôle la vitesse du servo. abaisser le nombre = grande vitesse
sensibilité = 5 ; Cela contrôle la sensibilité du tracker. abaisser le nombre = une sensibilité plus élevée. Si votre tracker est sautillement constamment en arrière, augmenter le nombre
Serial.Begin(19200) ; ouvrir la série com
Serial.Print (SolarTracker ready!") ;
pinMode (en bas, entrée) ; définir les entrées
pinMode (entrée, TOPLEFT) ;
pinMode (TOPRIGHT, entrée) ;
pinMode (entrée, TILTL) ;
pinMode (entrée, TILTH) ;
}
void loop () {}
tiltl = digitalRead(TILTL) ; lire le capteur d’inclinaison
ameublissement = digitalRead(TILTH) ;
tlsense = analogRead(TOPLEFT) ; lire les capteurs de lumière
trsense = analogRead(TOPRIGHT) ;
bsense = analogRead(BOTTOM) ;
bsense = bsense * 1.05 ; J’ai dû ajuster la valeur de ce capteur pour le rendre plus précis. vous devrez peut-être faire la même chose mais commencer en le laissant seul
tavg = (tlsense + trsense) / 2 ; obtenir une valeur moyenne pour les capteurs haut 2
diff = abs (tavg - bsense) ; ce juge dans quelle mesure le tracker doit tourner
SPD = diff/diviseur ; et adapte la vitesse de la réaction en
SPD = max (spd, 1) ; définit la vitesse minimale à 1
Serial.Print ("\nTOP:") ; Serial.Print (tavg, DEC) ; imprimer les valeurs de capteur pour la série com
Serial.Print("\tBOTTOM:") ; Serial.Print (bsense, DEC) ;
Serial.Print("\tLEFT:") ; Serial.Print (tlsense, DEC) ;
Serial.Print("\tRIGHT:") ; Serial.Print (trsense, DEC) ;
Si ((tavg < bsense) & & (diff > sensibilité) & & (tiltl == faible) & & (tilth == faible)) {/ / si la valeur moyenne des capteurs haut de la page est plus petite (plus de la lumière) que le capteur de bas et le capteur d’inclinaison est dans la plage correcte
vservo.Write (90 - spd) ; Envoyer commande servo de tourner vers le haut plus ajouter Vitesse
Serial.Print ("\tState:") ; Serial.Print("up!") ;
} ElseIf ((tavg < bsense) & & (diff > sensibilité) & & (tiltl == HIGH) & & (tilth == faible)) {/ / si la valeur moyenne des capteurs haut de la page est plus petite (plus de la lumière) que le capteur de bas et le capteur d’inclinaison est dans la plage correcte
vservo.Write (90 - spd) ; Envoyer commande servo de tourner vers le haut plus ajouter Vitesse
Serial.Print ("\tState:") ; Serial.Print("up!") ;
} ElseIf ((tavg > bsense) & & (diff > sensibilité) & & (tiltl == HIGH) & & (tilth == faible)) {/ / si la valeur de la sonde du bas est plus petit (plus léger) que la valeur moyenne des capteurs haut de la page et le capteur d’inclinaison est dans la plage correcte
vservo.Write (90 + spd) ; Envoyer commande servo de tourner vers le bas plus ajouter Vitesse
Serial.Print ("\tState:") ; Serial.Print("Down!") ;
} ElseIf ((tavg > bsense) & & (diff > sensibilité) & & (tiltl == faible) & & (tilth == HIGH)) {/ / si la valeur de la sonde du bas est plus petit (plus léger) que la valeur moyenne des capteurs haut de la page et le capteur d’inclinaison est dans la plage correcte
vservo.Write (90 + spd) ; Envoyer commande servo de tourner vers le bas plus ajouter Vitesse
Serial.Print ("\tState:") ; Serial.Print("Down!") ;
} else {/ / pour tous les autres cas
vservo.Write(90) ; arrêter le moteur d’axe y
Serial.Print ("\tState:") ; Serial.Print("Stop!") ;
}
tlsense = analogRead(TOPLEFT) ; relire les capteurs 2 meilleurs parce qu’ils ont probablement changé
trsense = analogRead(TOPRIGHT) ;
trsense = trsense * 1.03 ; encore une fois j’ai dû ajuster la valeur d’un capteur à fiabiliser le tracker
diff = abs (tlsense - trsense) ; réinitialiser la variable diff pour les nouvelles valeurs
SPD = diff/diviseur ; et de générer une vitesse en conséquence
SPD = max (spd, 1) ; régler la vitesse minimale à 1
Si ((tlsense < trsense) & & (diff > sensibilité)) {/ / si la valeur du capteur gauche supérieure est plus petite (plus de la lumière) que le capteur haut droit
hservo.Write (90 + spd) ; Envoyer commande servo de virer à gauche
Serial.Print ("\tState:") ; Serial.Print("left!") ;
} ElseIf ((tlsense > trsense) & & (diff > sensibilité)) {/ / si la valeur du capteur gauche supérieure est plus grande (moins de lumière) que le capteur haut droit
hservo.Write (90 - spd) ; Envoyer commande servo de tourner à droite
Serial.Print ("\tState:") ; Serial.Print("Right!") ;
} else {/ / pour tous les autres cas
hservo.Write(90) ; arrêter le moteur de l’axe des abscisses
Serial.Print ("\tState:") ; Serial.Print("Stop!") ;
}
Delay(10) ; retard de 10 ms
}
Arduino interroge les capteurs et réagit en conséquence en s’assurant que jamais s’incliner trop loin vers le bas ou vers le haut. La différence de lumière détermine à quelle vitesse le tracker devrait réagir.