Code Tracker Solaire - Explication et
Optimisation
1. Introduction
Ce document présente le code complet pour un tracker solaire à deux axes utilisant des
moteurs pas-à-pas (28BYJ-48) et des photorésistances (LDR). Le système ajuste sa position
en fonction de la direction de la lumière, avec une gestion du seuil de nuit et une routine de
mise à l'est au démarrage.
2. Code Complet avec Explications
Code source commenté :
#include <Stepper.h>
const int stepsPerRevolution = 2048;
const int IN1_H = 8;
const int IN2_H = 9;
const int IN3_H = 10;
const int IN4_H = 11;
const int IN1_V = 4;
const int IN2_V = 5;
const int IN3_V = 6;
const int IN4_V = 7;
const int ldrPins[] = {A0, A1, A2, A3};
const int LDR_HAUT = 0;
const int LDR_BAS = 1;
const int LDR_GAUCHE = 2;
const int LDR_DROITE = 3;
const int seuilLumiere = 50;
const int seuilNuit = 100;
const int microStep = 10;
Stepper motorHorizontal(stepsPerRevolution, IN1_H, IN2_H, IN3_H, IN4_H);
Stepper motorVertical(stepsPerRevolution, IN1_V, IN2_V, IN3_V, IN4_V);
void lireValeursLDR(int val[]) {
for (int i = 0; i < 4; i++) {
val[i] = analogRead(ldrPins[i]);
}
}
int getLuminositeMoyenne(int val[]) {
return (val[LDR_HAUT] + val[LDR_BAS] + val[LDR_GAUCHE] + val[LDR_DROITE]) / 4;
}
void afficherValeursLDR(int val[]) {
Serial.print("H: "); Serial.print(val[LDR_HAUT]);
Serial.print(" | B: "); Serial.print(val[LDR_BAS]);
Serial.print(" | Diff V: "); Serial.print(val[LDR_HAUT] - val[LDR_BAS]);
Serial.print(" | G: "); Serial.print(val[LDR_GAUCHE]);
Serial.print(" | D: "); Serial.print(val[LDR_DROITE]);
Serial.print(" | Diff H: "); Serial.print(val[LDR_GAUCHE] - val[LDR_DROITE]);
Serial.print(" | Moyenne: "); Serial.println(getLuminositeMoyenne(val));
}
void miseALest() {
Serial.println("Mise a l'est...");
motorHorizontal.step(-stepsPerRevolution / 4);
motorVertical.step(-stepsPerRevolution / 8);
Serial.println("Mise a l'est terminee.");
delay(1000);
}
void setup() {
Serial.begin(9600);
Serial.println("Demarrage du tracker solaire 2 axes...");
motorHorizontal.setSpeed(10);
motorVertical.setSpeed(10);
miseALest();
}
void loop() {
int valLDR[4];
lireValeursLDR(valLDR);
int luminositeMoyenne = getLuminositeMoyenne(valLDR);
if (luminositeMoyenne < seuilNuit) {
Serial.println("Luminosite faible. Arret du suivi.");
delay(5000);
return;
}
int diffVerticale = valLDR[LDR_HAUT] - valLDR[LDR_BAS];
int diffHorizontale = valLDR[LDR_GAUCHE] - valLDR[LDR_DROITE];
afficherValeursLDR(valLDR);
if (abs(diffVerticale) > seuilLumiere) {
if (diffVerticale > 0) {
motorVertical.step(-microStep);
} else {
motorVertical.step(microStep);
}
}
if (abs(diffHorizontale) > seuilLumiere) {
if (diffHorizontale > 0) {
motorHorizontal.step(-microStep);
} else {
motorHorizontal.step(microStep);
}
}
delay(100);
}
3. Explications Importantes
- Le programme lit en boucle les valeurs de 4 photorésistances (haut, bas, gauche, droite).
- Il compare la lumière reçue de chaque côté pour déterminer s’il doit ajuster la position.
- Si la lumière moyenne est trop faible, le système ne fait rien (mode nuit).
- Une fonction `miseALest()` permet de repositionner l'appareil vers l'est au démarrage.
- Des fonctions sont utilisées pour organiser le code, le rendant plus lisible et modulaire.
4. Suggestions d'Amélioration
- Ajouter le support des fins de course pour éviter les débattements mécaniques.
- Ajouter un contrôle proportionnel (PID ou simple variation du nombre de pas).
- Sauvegarder la dernière position pour la restaurer après une coupure.
- Optimiser la gestion de l'énergie si le système est sur batterie.