Suiveur solaire double-axe

Bonjour,

Pour la réalisation d’un projet de fin de cycle, j’ai décidé de réaliser un “tracker solaire” double-axe, mis en marche à l’aide de deux servo-moteurs et commandé par une carte Arduino UNO.

Afin de capter la lumière incidente, mon choix s’est porté vers des LDR, ces dernières ont été montées en pont diviseur de tension avec un potentiomètre pour chaque LDR. En effet, afin de régler l’équilibre à l’état initial en augmentant la sensibilité de l’une et diminuant la sensibilité de l’autre, je n’ai pas pu trouver d’autre solution.

Mon problème se situe au niveau du programme, je dois faire, en valeur absolue, la différence entre le signal émis par la LDR droite et la LDR gauche, cette différence sera comparée à une première valeur seuil, définissant le mode nuit, si elle est supérieure à ce dernier, elle sera comparée à une deuxième valeur seuil, qui définit le démarrage du moteur, si la différence est supérieure, le moteur démarre et s’oriente vers la LDR la plus éclairée.

Problème, le moteur ne démarre même pas et reste à son état initial.

Voici ci-dessous, le code utilisé :

#include<Servo.h>
Servo monServo; //Je déclare mon Servo
int pinLdr1 = A0; //LDR droite
int posServo; //Variable de position du ServoMoteur
int pinLdr2 = A1; //LDR Gauche
int pinServo = 3;
int droite; //Valeur délivrée par la LDR droite
int gauche; //Valeur délivrée par la LDR gauche
int seuilDemarrage = 200; //Seuil de démarrage du moteur, s’il est supérieure à ce dernier, le moteur démarre
int seuilArret = 150; //Ou seuil de nuit
int ponderation = 12; //Afin de définir une marge de sécurité de la lecture de la LDR
int d; //Variable de différence des valeurs des deux LDR
bool mouvement = false; //Si le moteur est en arrêt, mouvement = false
void setup()
{
Serial.begin(9600);
monServo.attach(pinServo);
posServo = 0; //Poisition initiale du servo
monServo.write(posServo);
}
void loop()
{
mouvement = false;
//On lit la valeur des LDR
droite = analogRead(pinLdr1);
gauche = analogRead(pinLdr2);
d = abs(droite-gauche); // On réalise la différence et on affiche le tout
Serial.println(d);
delay(1000);
Serial.println("|");
delay(1000);
Serial.println(abs(d));
delay(1000);
Serial.println(" ");
delay(1000);

//Test du seuil de nuit
if(d < 150)
{
posServo–;
if(posServo < 1)
{
posServo = 1; //pour ne pas descendre en-dessous de 1
}
monServo.write(posServo);
mouvement = true;
}
//sinon, pendant la journée
else if(d > 200)
{
if(gauche > droite + ponderation) // on compare les valeurs des deux LDR
{
posServo++; //le Servo va de 1 à 179° tout en comparant
if(posServo > 179)
{
posServo = 179; //Pour ne pas dépasser le seuil de 179 imposé
}
monServo.write(posServo); //On affecte la valeur de position
mouvement = true; // le Servo est en mouvement
}
//dans le cas contraire, si c’est la droite qui reçoit le plus de luminosité
else if(droite > gauche + ponderation)
{
posServo–; //Dans ce cas, on décrémente le Servo pour aller vers la droite
if(posServo < 1)
{
posServo = 1;
}
monServo.write(posServo);
mouvement = true;
}
}
//Sinon, le moteur ne marche pas, si c’est le cas, rien ne presse pour reboucler rapidement, on temporise

if(mouvement == false)
{
delay(150);
}

}

ayant changé ce programme par un autre programme trouvé sur internet, j’ai eu des réponses très instables, où soit ça défilait rapidement vers la gauche et ce même si j’enlève ma source de lumière durant le déplacement (genre c’est TOR), soit le moteur marche TRES lentement, soit ça ne répond même plus.

Voici ce programme :

#include <Servo.h> // IMPORTANT: Vous devrez supprimer les espaces avant et après Servo.h
Servo MonServo;
int PosServo; // Variable de position du servo, de 0 à 180°
int Gauche; // Variables de valeur des photorésistances
int Droite;
int Ponderation = 12;
int entreePhotoGauche = A0; // Photorésistances sur A0 et A1
int entreePhotoDroite = A1;
bool mouvement = false;
void setup()
{
Serial.begin(9600); // Monoteur série
MonServo.attach(3); // Servo sur pin 11
}
void loop()
{
mouvement = false;
// On voit ce que racontent les photorésistances
Gauche = analogRead(entreePhotoGauche);
Droite = analogRead(entreePhotoDroite);
// Si la luminosité générale n’est pas suffisante on le replace à sa position de départ.
// Idéalment c’est la nuit il sera en position pour le matin, au pire c’est un manque de luminosité et il retrouvera son chemin
if ( (Droite + Gauche) < 500)
{
if (PosServo > 1)
{
PosServo -= 1;
MonServo.write(PosServo);
mouvement = true;
}
}
// Sinon il vit sa vie…
else
{
// Si la valeur de droite est plus haute on tourne vers la droite
// On peut faire varier la valeur de la zone de pondération, mais si on la supprime le servo aura tendance à se trémousser sans fin
if ( Droite > (Gauche + Ponderation))
{
if (PosServo < 179)
{
PosServo++;
MonServo.write(PosServo);
mouvement = true;
}
}
// Si c’est la valeur de gauche on tourne vers la gauche
if (Gauche > (Droite + Ponderation))
{
if (PosServo > 1)
{
PosServo -= 1;
MonServo.write(PosServo);
mouvement = true;
}
}
}
// Affichage sur Moniteur Série
Serial.print( "Gauche > ");
Serial.print(Droite);
Serial.print( " | “);
Serial.print(Gauche);
Serial.println( " < Droite”);

if (mouvement == false)
{
delayMicroseconds(50); //si on suit le soleil on peut mettre un long delay, sinon pour plus de reactivité, un faible delay
}

}

J’aimerais réellement que quelqu’un puisse m’aider.

Je vous remercie d’avance.

Salut
Tu as lu le poste de l'autre suiveur ? ^^

Pour répondre à ton problème, fais un petit programme pour caler ton servo sur 0, puis sur 90, puis sur 180, par exemple.
Je soupçonne une inversion du sens de rotation.
Si tu fais -- et que ton servo tourne en sens inverse par exemple.
Vérifie.

kammo:
Tu as lu le poste de l’autre suiveur ? ^^

yaplus… pas dans les clous.

Salut ^^

kammo:
Tu as lu le poste de l'autre suiveur ? ^^

Faut dire que je n'ai pas trop eu le temps de consulter les autres topics mais j'ai cherché je ne crois pas que quelqu'un puisse avoir le même problème...

kammo:
Pour répondre à ton problème, fais un petit programme pour caler ton servo sur 0, puis sur 90, puis sur 180, par exemple.
Je soupçonne une inversion du sens de rotation.
Si tu fais -- et que ton servo tourne en sens inverse par exemple.
Vérifie.

Mon moteur tourne, effectivement, seul problème, c'est assez lent, ce n'est pas problématique vu que je suis entrain de suivre le "soleil" mais je voulais savoir, et connaître la raison de ce ralentissement de rotation.

Merci de m'avoir répondu ^^

"moteur": un servomoteur? lequel?
"lent": par rapport à quoi?^^
En fonction de la référence du servo, tu cherches la datasheet, sa vitesse et indiquée (pour un SG90 n est à 0.3s/60° de mémoire)
Tu verras aussi ce dont il a besoin: tension et courant
Si tu as récupéré un servo qui consomme 400mA sous 12v, change, ou alimente le avec une source extérieure.
Là, je peux pas faire davantage.