Cet après midi, en bullant dans le jardin, que j’ai repensé à mon petit projet de tracker solaire. L’idée était de réaliser un module à base d’Arduino pour faire suivre le soleil par un panneau photovoltaïque qui alimente la pompe d’un bassin de jardin.
Comme d’habitude avant de réinventer la poudre j’ai fait un petit tour du côté du web et le sujet du tracker solaire semble vaste, il est notamment utilisé pour les fours solaires ou sur le principe de l’Héliostat pour rediriger les rayons du soleil vers un coin sombre grâce à des miroirs.
Finalement il ressort sur une grande partie de ce que j’ai pu lire, que l’utilisation d’un tel procédé pour un panneau solaire n’est pas souvent nécessaire et pas forcément très efficace. Cela ne va pas m’arrêter, j’ai envie de me faire plaisir à bricoler ce module.
Je suis parti sur quelque chose de vraiment basique, l’impératif étant de pouvoir commencer de suite sans avoir à attendre trois semaines une commande venant de chine, donc uniquement avec ce que j’avais sous la main. Voici un récapitulatif des éléments utilisés pour le petit prototype, beaucoup de câbles mais aucune soudure.
-
- 1 Arduino Uno
- 1 Servomoteur
- 2 Photorésistances GL5528
- 2 Résistance 4,7 KΩ
- 1 Plaque d’essai 170 points
- 1 Clip 9v
et pas mal de câbles
- Pistolet à colle, carton, scotch, …
Le montage est relativement simple et ne mérite il me semble aucun commentaire.
Ce prototype est vilain et vraiment cheap mais il fonctionne et sera suffisant pour faire un test en réel de quelques jours.
Le code n’est lui non plus pas bien compliqué, il est largement inspiré des exemples fournis sur Arduino.cc.
Le principe est de récupérer les valeurs des deux photorésistances, de les comparer et d’actionner le servo pour que ces deux valeurs tendent à l’identique. Le hic c’est que le servo a tendance à gigoter sans cesse pour arriver à ses fins, on le soulage donc avec une zone morte dont la valeur est à définir en fonction du projet.
J’ai utilisé une valeur de « 12 » mais cela dépend de la configuration du tracker comme de la positions des cellules photorésistantes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
/* 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 < 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 LedTimer; int Ponderation = 12; int entreePhotoGauche = A0; // Photorésistances sur A0 et A1 int entreePhotoDroite = A1; int LedPower = 13; void setup() { Serial.begin(9600); // Monoteur série MonServo.attach(11); // 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); // 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) < 600) { if (PosServo > 1) PosServo -= 1; 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 < 179) 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); } } // Affichage sur Moniteur Série Serial.print( "Gauche > "); Serial.print(Droite); Serial.print( " | "); Serial.print(Gauche); Serial.println( " < Droite"); // Gestion de la LED d'activité. if ( LedTimer < 20 ) { LedTimer++; digitalWrite(LedPower, LOW); } else { digitalWrite(LedPower, HIGH); LedTimer = 0; } // on attends 150 ms avant la prochaine boucle, rien ne sert de courir.. delay(150); } |
N’ayant pas trouvé d’info pertinente sur le sujet, j’ai placé les photorésistances sous le panneau solaire, avec le même angle d’inclinaison de 30° bien que cela n’est à mon avis pas grande incidence. Elles sont très proches l’une de l’autre mais toute autre configuration est envisageable.
Après quelques réglages en extérieur tout semble correctement fonctionner. La petite inconnue étant la durée de vie de la pauvre petite pile 9V, je ne parie pas sur une grande longévité..
Édit. Voici un lien proposé dans les commentaires, qui présente une autre approche nettement plus convaincante mais aussi plus complexe à mettre en œuvre.
Tracker solaire Arduino d’après la Latitude d’un lieu, la Date et l’heure du jour
Merci monsieur pour votre effort, mais juste j’ai deux questions :
Quel est le rôle de la pondération et a quel pin sera attaché?
Et si tu peut me donner le schéma électrique claire de votre projet ?
Merci en tout cas.
Bonjour,
Impossible de charger le code tel quel dans mon Arduino… erreur de déclaration de servo…pourtant je fais bien un copié collé mais rien à faire..cela ne marche pas…un coup de main…merci. sbria@neuf.fr
Bonjour,
Il manque effectivement le contenu de l’include : #include < Servo.h >
Wordpress ne voulait semble il pas l’afficher sans espace, il faut les supprimer dans l’ide Arduino bien sur
Merci pour l’info effectivement, il manquait la librairie, autre chose à préciser, il est préférable d’utiliser des servos analogique plutôt que du numérique sinon le montage fonctionne bien j’ai rajouté un servo supplémentaire (pour avoir deux orientations (Pan et Tilt) et supprimé la pondération. cela fonctionne pour ma part bien mieux… par la suite mettre deux moteur pas à pas pour piloter le panneau et un afficheur LCD pour avoir un retour de l’orientation…. félicitation pour ton boulot (simple efficace) je débute aussi et c’est pour moi une très bonne approche…….
Salutations
Merci!
L’option du second moteur est tout à fait intéressante, je ne l’avais mis en œuvre pour ce premier essai mais dans l’optique d’un dispositif pérenne c’est certainement un plus.
Bonjour j’ai fait la même chose j’ai acheté une tourelle et rajouté 2 autres photocellules haut et bas.
Mais j’ai des problèmes dans le code. Pouvez vous me communiqué le votre s’il fonctionne.
Salutations.
Bonjour,
Super code, cependant la fonction PosServo++ ou — est telle censé faire tourner le moteur ? Oui il faut rajouter qqchose ?
Merci
Le code est complet et fonctionnel, rien à ajouter si ce n’est pour l’améliorer
« PosServo » est la variable de position du servo, de 0 à 180°, on l’incrémente avec « PosServo++; ». C’est « MonServo.write(PosServo); » qui fait tourner le moteur.
serait il possible d’avoir le schéma électrique ? nizarre.o@gmail.com
Merci beaucoup Siine, je suis en première année de prépa et ce type de montage est exactement ce que je recherchais pour mon tipe. Pourrais-je te solliciter si j’ai quelques questions ? Je te laisse mes coordonnées : alexandre-m.simon@hotmail.com
bonjour
Merci bcp
Quel est le rôle de la pondération?
Salut,
Sans cette pondération le servo était quasiment toujours en action, cela aide donc à le stabiliser. Ceci-dit, j’avais utilisé un servo ultra-cheap-made-in-china pour ce test, on peut imaginer que la pondération perde de son intérêt et puisse même disparaître avec du bon matériel.
Ou, ..on pourrait réfléchir à l’augmenter un peu pour éviter trop de mouvements (même avec un bon servo), je ne suis pas certain que cela aie une influence énorme s’il manque un ou deux degrés d’inclinaison.
Bonjour,
Pour se passer des photorésistances et de l’approximation du pilotage servo, (instabilité), voici un alternative : le tracker suit la course du soleil en permanence, sauf si il n’y a plus de soleil… http://buzzcasonits.blogspot.fr/
On calcul la position du soleil et on en déduit la position des servos Azimuth et Hauteur, on interrompt la pousuite quand il n’y a pas de soleil, (passage de nuages, nuit jour, ou présence d’obstacles, arbres, habitations, etc…).
C’est simple et efficace.
Bravo pour cette réalisation,
Cordialement,
BUZZCASONI
Bonjour,
La mise en œuvre est tout de même nettement plus complexe, mais le résultat est impressionnant, félicitations!
Slt !!!
Svp dans le cas ou l on voudrait rajouter la possibilité de recharge usb bref d’un portable sur notre montage comment faireb
Merci bien!
Bonjour,
je n’ai pas trop compris la signification et l’utilité du ledpower et du ledtimer, donc j ai testé ton programme sans mais je n’obtient qu’une valeur dans le moniteur série sur les deux photorésistances qui varie bien en fonction de la luminosité et l’autre est égale à 0 donc en gros il n’y en a qu’une qui marche je pense. De plus, mon servomoteur ne réagis pas du tout lorsque je téléverse le programme.
Est ce que tu pourrais m’aider?
Merci d’avance
Salut,
La gestion de la LED de l’Arduino n’a pas d’intérêt, tu peux l’enlever sans soucis.
Même si une seule photorésistance réagit le servo devrait aussi le faire, as-tu supprimé les espaces entre les chevrons dans l’appel de la librairie ?
Essaie d’inverser les photorésistances, si c’est toujours la même qui flanche tu peux en changer, sinon c’est ton montage, ou ton code
Merci beaucoup de m’avoir répondu,
j’ai inverser les photorésistances mais c’est toujours celle placée sur la broche A0 qui ne répond pas et dont je n’ai pas la valeur. Et j’ai bien supprimé les espaces pour appeler le servo
j’ai un soucis avec le tracker solaire, il ne tourne que dans un sens, suffit que je débranche une des résistances et là il se met a changer de sens. Il tourne à l’infini j’ai beau tenter tout éclairage, j’ai revu le programme mais rien n’y fait
bonjour, j’ai un soucis avec mon programme qui ne peut être téléverser.