Traker solaire avec 4 photocellules Problème programme ???

Bonsoir,

Je suis en train de faire un traker solaire avec une tourelle " 2 servomoteurs".

J'ai trouvé le code sur le web mais avec seulement 2 photocellules pour aller à droite ou à gauche.

J' ai amélioré l'application avec 2 autres cellules mais les directions bas et haut ne fonctionne pas.

Je crois que c'est les IF peut être ...

Merci de votre part si quelqu'un à une solution.

PS : code en pièce jointe.

Cordialement Bruno

projet_servo_panneau_ok_droitegauche.ino (2.95 KB)

Qu'est ce que ne marche pas plus précisément?
As tu testé tes cellules IF Haut/bas? Envoie les valeurs lues sur ces cellules dans le moniteur serie, elles sont peut être égales?

slt

je ne connais pas les valeurs de ton servo mais 10° de valeur maxi vers le haut c'est pas beaucoup et tu n'as pas mis la gestion pour faire tourner vers le bas.

Bonjour Messieurs,

Oui les 4 entrées analogique c'est OK, j'utilise ma lampe de vélo pour faire une simulation.

Par contre c'est d'insérer la parti des comparaisons haut et bas en plus de la droite et de la gauche.

J'ai voulu faire un copié coller mais cela ne fonctionne pas bien entendu en changeant les variables qui vont avec. C'est juste dans la structure du programme. Car il ne monte pas et ne descend pas, il fait juste du droite gauche pourtant tout y est.

Si j'utilise d'autres structures comme FOR cela marcherai peux être ????

Je vous transmet le code entier modifié.

/*
MiniTracker Version 0.1
Tracker solaire pour panneau solaire, four, miroir..
http://www.siine.eu
*/
#include <Servo.h> // IMPORTANT: Vous devrez supprimer les espaces avant et après Servo.h
Servo MonServo;
Servo MonServo2;
int PosServo; // Variable de position du servo, de 0 à 180°
int PosServo2;
int Gauche; // Variables de valeur des photorésistances
int Droite;
int Haut;
int Bas;
int LedTimer;
int Ponderation = 20;
int Ponderation2 = 5;
int entreePhotoGauche = A4; // Photorésistances sur A0 et A1
int entreePhotoDroite = A5;
int entreePhotoHaut = A3;
int entreePhotoBas = A2;
int LedPower = 13;
void setup()
{
Serial.begin(9600); // Monoteur série
MonServo.attach(9); // Servo sur pin 11
MonServo2.attach(10); // Servo sur pin 11
pinMode(LedPower, OUTPUT);
LedTimer = 0;
}
void loop()
{
// On voit ce que racontent les photorésistances
Gauche = analogRead(entreePhotoGauche);
Droite = analogRead(entreePhotoDroite);
Haut = analogRead(entreePhotoHaut);
Bas = analogRead(entreePhotoBas);
// 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) <80)
{
if (PosServo < 1)
PosServo = 100;
MonServo.write(PosServo);
}
// 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 < 100)
PosServo++ ;
MonServo.write(PosServo);
}
// Si c'est la valeur de gauche on tourne vers la gauche
if (Gauche > (Droite + Ponderation))
{
if (PosServo > 1)
PosServo -= 1;
MonServo.write(PosServo);
}
//haut et bas

if ( (Haut + Bas) <10)
{
if (PosServo2 < 1)
PosServo2 = 100;
MonServo2.write(PosServo2);
}
// 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 ( Haut > (Bas + Ponderation2))

{
if (PosServo2 < 179)
PosServo2 +=1 ;
MonServo2.write(PosServo2);
}
// Si c'est la valeur de gauche on tourne vers la gauche
if (Bas > (Haut + Ponderation2))
{
if (PosServo2 > 1)
PosServo2 -= 1;
MonServo2.write(PosServo2);
}

// Affichage sur Moniteur Série
// on attends 150 ms avant la prochaine boucle, rien ne sert de courir..
delay(1000);
Serial.print( "Gauche > ");
Serial.print(Gauche);
Serial.print( " | ");
Serial.print( " < Droite");
Serial.print(Droite);
Serial.print( " | ");
Serial.print( "Haut > ");
Serial.print(Haut);
Serial.print( " < Bas");
Serial.print(Bas);
Serial.print( " | ");
Serial.print(PosServo);
Serial.println( " < PosServo");
Serial.print( " | ");
Serial.print(PosServo2);
Serial.println( " < PosServo2");
// Gestion de la LED d'activité.
if ( LedTimer < 20 )
{
LedTimer++;
digitalWrite(LedPower, LOW);
}

if ( LedTimer < 20 && LedTimer > 10 )
{
digitalWrite(LedPower, HIGH);
}
else
{
digitalWrite(LedPower,HIGH);
LedTimer = 0;
}
// on attends 150 ms avant la prochaine boucle, rien ne sert de courir..
delay(1000);

} } }[code][code][/code][/code]

hello, peux tu tester ce code

/*
MiniTracker <span style="font-family: 'Courier 10 Pitch', Courier, monospace; font-size: 8px; font-style: normal;">Version 0.1</span>
Tracker solaire pour panneau solaire, four, miroir..
http://www.siine.eu
*/
#include <LiquidCrystal.h>
#include <Servo.h> // IMPORTANT: Vous devrez supprimer les espaces avant et après Servo.h
Servo MonServo;
Servo MonServo2;
int PosServo;  // Variable de position du servo, de 0 à 180°
int PosServo2;
int Gauche; // Variables de valeur des photorésistances
int Droite;
int Haut;
int Bas;
int LedTimer;
int Ponderation = 20;
int Ponderation2 = 5;
int entreePhotoGauche = A4; // Photorésistances sur A0 et A1
int entreePhotoDroite = A5;
int entreePhotoHaut = A3;
int entreePhotoBas = A2;
int LedPower = 13;



void setup()
{
Serial.begin(9600);  // Monoteur série
MonServo.attach(9); // Servo sur pin 11
MonServo2.attach(10); // Servo sur pin 11
pinMode(LedPower, OUTPUT);
LedTimer = 0;
}
void loop()
{
// On voit ce que racontent les photorésistances
Gauche = analogRead(entreePhotoGauche);
Droite = analogRead(entreePhotoDroite);
Haut = analogRead(entreePhotoHaut);
Bas = analogRead(entreePhotoBas);

// 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) <80)
{
if (PosServo < 1)
PosServo = 100;
MonServo.write(PosServo);
}
// 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 < 100)
      PosServo++  ;
     MonServo.write(PosServo);
     }
     // Si la valeur de gauche est plus haute on tourne vers la gauche
     if (Gauche > (Droite + Ponderation))
     {
     if (PosServo > 1)
     PosServo -= 1;
     MonServo.write(PosServo);
     }
     
}

//haut et bas


if ( (Haut + Bas) <10)
{
if (PosServo2 < 1)
PosServo2 = 100;
MonServo2.write(PosServo2);
}
// 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 ( Haut > (Bas + Ponderation2))
     
     {
     if (PosServo2 < 179)
    PosServo2 +=1 ;
     MonServo2.write(PosServo2);
     }
     // Si c'est la valeur de gauche on tourne vers la gauche
     if (Bas > (Haut + Ponderation2))
     {
     if (PosServo2 > 1)
     PosServo2 -= 1;
     MonServo2.write(PosServo2);
     }
}

     

// Affichage sur Moniteur Série
// on attends 150 ms avant la prochaine boucle, rien ne sert de courir..
delay(1000);
Serial.print( "Gauche/Droite    ");
Serial.print(Gauche);
Serial.print( " _ ");
Serial.print(Droite);
Serial.print( " ___ ");
Serial.print( "Haut/Bas    ");
Serial.print(Haut);
Serial.print( " _ ");
Serial.print(Bas);
Serial.println( " ");

Serial.print( "PosServo/PosServo2   ");
Serial.print(PosServo);
Serial.print( "           _          ");
Serial.println(PosServo2);

// Gestion de la LED d'activité.
if ( LedTimer < 20  )
{
LedTimer++;
digitalWrite(LedPower, LOW);
}

if  ( LedTimer < 20 && LedTimer > 10 )
{
digitalWrite(LedPower, HIGH);
}  
else
{
digitalWrite(LedPower,HIGH);
LedTimer = 0;
}
// on attends 150 ms avant la prochaine boucle, rien ne sert de courir..
delay(1000);

}

Bonsoir Dfgh,

Je te remercie infiniment çà fonctionne bien.

Je mets une petite photo.

Cordialement BRUNO.

cool :slight_smile: