Un truc bizarre s'est produit alors que je m'apprêtais à téléverser une nouvelle version du programme, donc toute alimentation externe coupée sauf l'USB de mon PC : le moteur s'est mis en rotation. Comment est-ce possible puisque le +12 V n'étais pas connecté au circuit de puissance?
Pas grave, c'est le 5 V qui le fait tourner
Je suis donc revenu à la dernière version qui donnait le meilleur résultat (fichier ci-joint)
Qu'est-ce qui reste comme problème alors ?
Pour l'arrêt automatique sur blocage, j'ai réfléchi.
En fait, si il y a une variation de plus de 5 mV en A2, le programme considère que le moteur tourne.
Votre moteur étant plus petit et alimenter en 12 V, le 12 V sortie LOAD n'est peut-être pas très stable.
Pour augmenter la tolérance, je propose de modifier le code ainsi.
Ajout de cette variable au début
int deltaC = 1; //variation moteur fois 5 mV à la louche ;)
En mettant 1, on tolère 10 mV.
Et une ligne à remplacer à la suite de // arret moteur si courant moteur invariable depuis delai_blocage
Vincentm1:
bonjour
vu la petite moquerie d Achess, je dois laver mon honneur
voici les quelques modifs que j'ai faites (c equi n'enlève rien au fait que je ne sais pas programmer mais bon ...
Excusez, je ne voulais pas vexer.
Les valeurs d'initialisation de "jour" et "nuit" sont inversées.
Vos valeurs jour et nuit sont mémorisées dans la RAM et pas en dur.
Merci Achess pour ce graphique très parlant, je l'avais fait également sur un brouillon, nous avons bien la même logique
J'ai testé la V8 que vous m'avez fourni :
Pour le blocage moteur intégrant la variable tolérance DeltaC, pas d'amélioration, l'arrêt se fait toujours avec la séquence Delai_max malheureusement
J'en suis donc toujours au même point :
Initialisation de jour ou de nuit ok le moteur agit bien en conséquence du seuil nuit fixé.
Par contre, à la suite de ça, l'automatisme ne fonctionne pas avec la variation jour ou nuit
J'ai essayé également de faire varier les valeurs des paramètres délai_blocage (en plus et en moins) et deltaC, sans succès
Peut-etre, pour simplifier la logique de fonctionnement, faudrait-il ne garder que le seuil nuit comme seule référence?
Ca occupe mes soirée... mais j'ai hâte de faire fonctionner ce système!
Bonsoir,
Le programme pour la LDR ne fonctionnait pas bien à l'origine.
En fait je l'ai refait à partir du programme qui prends la mesure sur le panneau.
Celle du panneau fonctionne bien, par contre je n'ai pas vérifié avec la LDR.
Prendre la mesure sur le PV ne pose pas de problème, il faut juste recalculer le pont diviseur. Il faut mesurer la tension maximale aux bornes du panneau.
Si c'est 18 V, suffit de calculer les résistances pour ne pas dépasser 5 V en A0
Avec une 10 k côté 0V : 5 V / 10 =0.5; 18/0.5 = 36
Entre A0 et le PV, une résistance de 36-10 = 26 k ... 27 k en normalisé. Voir le schéma en page 1 pour le cablage
J'ai essayé également de faire varier les valeurs des paramètres délai_blocage (en plus et en moins) et deltaC, sans succès
Est-ce que la résistance de 10 ohm est bien en série avec le moteur ??? Je doute.
Les broches 4, 5 , 13 et 12 ne doivent pas être reliées directement au 0V ... quoique normalement, la résistance doit être insérée dans la partie puissance uniquement (12 V), mais ce n'est pas différencié dans le datasheet
Les broches 12 et 13 concernent l'autre pont H
Peut être que le broche 4 serait le 0 V commande et 5 le 0 V puissance... ou inversement.
Faudrait tester de laisser 12-13 et 4 à la masse et insérer la résistance uniquement à la broche 5 ?
Une autre façon de voir le schéma
Bonjour,
Une petite sujétion qui vaut ce qu'elle vaut, moi qui ai beaucoup de souci pour le montage et le fonctionnement, un moment donné j'ai repris le programme en le simplifiant au maximum. C'est-à-dire uniquement faire marcher le moteur dans un sens et ensuite dans l'autre et j'ai essayé de voir les avancées avec la console.Après j'ai essayé de le faire fonctionner avec le programme complet et la ldr.
Ce qui m'a permis d'éliminer beaucoup d'erreur de ma part (petit trait d'humour, en plus de ne pas savoir programmer je ne suis pas un très bon monteur…)
Je n'ai pas non plus fait de programme avec le servo moteur, j'ai juste fait un test.
Le synoptique n'est pas difficile, mais avec une LDR la courbe du jour est en U alors que celle du PV est parabolique:
A l'initialisation (setup) on lit la valeur de luminosité et on vérifie par rapport au seuil "nuit".
Si c'est la nuit, on ferme la trappe.
Si c'est le jour on l'ouvre.
Ensuite ( loop), le tag "trappe" conserve l'état ouvert ou fermé de la trappe
Trappe fermé, on ouvre dès que le seuil "jour" est atteint.
Trappe ouverte, on ferme au seuil "nuit".
Le reste n'est qu'amélioration : gestion fin de course, retard à l'ouverture, économie d'énergie, charge batterie ...
On pourrait, en effet ne tenir compte que du seuil nuit, mais les poules se trouveraient privées d'accéder à l'extérieur pendant un temps long ... que je n'ai pas mesuré ??
Le langage de programmation, je l'avait appris en m'intéressant au javascript qui est sur la même base du langage C.
En fait, il n'est pas difficile et assez intuitif et il y a plein du tuto sur internet comme le blog d'Eskimon
achess:
Est-ce que la résistance de 10 ohm est bien en série avec le moteur ??? Je doute.
Je vous confirme que la R 10 Ohm est bien en série entre les masses du L293D et le GND du pro mini.
Je vais revérifier tout ça...
achess:
Le langage de programmation, je l'avait appris en m'intéressant au javascript qui est sur la même base du langage C.
En fait, il n'est pas difficile et assez intuitif et il y a plein du tuto sur internet comme le blog d'Eskimon
Moi aussi j'aimerais bien savoir programmer... 8) mais pour l'instant c'est loin d'être le cas.
Bonsoir,
J'avait un L293d et un petit moteur dans les tiroirs.
En fin de compte la courbe du jour est la même qu'en prenant l'info sur PV. Du coups, j'ai repris un programme qui marchait sur mon système actuel avec pont H à transistor et vérifié fonction par fonction avec le moniteur série, tout en simplifiant et optimisant.
Le plus gros problème est que ce qui marchait avec mon moteur de jouet (depuis 2015) ne fonctionne pas sur ce petit moteur de récup, non réducteur.
Je n'ai donc conservé que l'arrêt sur durée programmée, mais on peut en ajouter une si la fermeture est plus rapide.
Le problème vient peut être de ne pouvoir différencier la masse du circuit de puissance de la commande ? Ou que le moteur ne peine pas autant à la tache ? La consommation du mien est presque qu'au maximum en ouverture ?
Le principal est que la fermeture soit efficace Quand je voit les systèmes du commerce, ou la trappe est simplement suspendue à une ficelle, pas sur que ça résiste à la détermination du renard.
Oui effectivement, les deux masses sont connectées ensemble, cela vient probablement de là...
Je pense que le moteur ne force pas trop car la trappe est montée sur une glissière à roulement à billes de tiroir d'agencement. De plus, la course ouverture et la course fermeture sont égales au niveau force vu que la trappe se déplace sur un axe horizontal.
Par contre, je vais me procurer tout de suite un moteur identique à celui que j'ai commandé sur ebay en cas de défaillance... Vu la mécanique de précision que j'ai dû préparé au niveau de l'axe d'enroulement de la cordelette, je préfère éviter de le refaire...
A l'heure même ou j'écrit ce poste, je sors voir où en est la trappe, et là, surprise plutôt moyenne:
Elle se ferme et s'ouvre en boucle...
J'ai pris la tension aux bornes de la LDR, elle est de 1,77 V
Vu que je ne sais pas depuis quand elle fonctionne comme ça, je soupçonne que ce problème intervient dans la zone de tension entre seuil jour et seuil nuit.
Il est maintenant 21h10, la tension de la LDR est de 2,55 V, et mes cocottes ne sont pas encore couché (faudra que je réajuste le seuil nuit), l'état de la trappe est stable, fermée.
Pour la 1ere phase de test, j'ai laissé les valeurs telles qu'elles étaient dans votre programme.
J'ai joué le frileux… je me suis dis :" ne pète pas le programme pour le moment, teste le tel qu'il a été écrit" 8)
J'ai fais mes relevés hier soir et ce matin :
Au seuil nuit : 4500 mV, donc définir à 918 seuil nuit.
Au seuil jour : 2000 mV, donc définir à 408 seuil jour.
Pour la sécurisation de la trappe, pas de soucis, on ne voit pas bien sur la photo mais en position fermé elle rentre dans une petite gorge ménagée dans le poteau de droite J'avais prévu le coup!
Si le problème persiste malgré l'ajustement des seuils, je tenterais d'ajouter une ligne de code pour éviter d'ouvrir et fermer en boucle entre les valeurs seuil jour et seuil nuit, c'est pas pas gagné mais j'essayerais de moi même...
Bonjour,
Oupss ! j'ai oublié de préciser que pour que la courbe soit la même que pour le panneau; c'est à dire en cloche, j'ai disposé la LDR( 20 kohm) entre A3 et Vcc et une résistance entre A3 et 0V. (Je n'avais pas fait attention), d'ou le problème d'ouverture- fermeture en boucle que vous avez rencontré.
Peut-être que 150 k par rapport à votre 4.7 k risque de ne pas convenir...
Pour simplifier le test, j'ai tout alimenté en 5 V et essayé avec un petit moteur de récup.
achess:
Oupss ! j'ai oublié de préciser que pour que la courbe soit la même que pour le panneau; c'est à dire en cloche, j'ai disposé la LDR( 20 kohm) entre A3 et Vcc et une résistance entre A3 et 0V. (Je n'avais pas fait attention), d'ou le problème d'ouverture- fermeture en boucle que vous avez rencontré.
De cette manière, vous obtenez la tension aux bornes de votre résistance 150 K et non à celles de la LDR, ce qui explique l'inversion de la courbe qui suit celle de la luminosité... dito le PV.
Dans mon cas, c'est l'inverse (voir croquis joint)
J'ai donc adapté le programme en conséquence :
Séquence d'origine suivant votre code :
//Serial.begin(9600);
LDR = analogRead(pinldr);
// Pour forcer la trappe à se fermer la nuit ou a s'ouvrir le jour.
if (LDR > nuit) {// le jour
trappe = 1; // fermee
}
else {//la nuit
trappe = 0; // ouverte
}
// active le compteur watchdog pour interruption toutes les 8 secondes
setup_watchdog(9);
}
void loop() {
if (rotation == 1) { // moteur tourne
if ((millis() - debut_blocage) > delai_max) {
digitalWrite(ouvrir, 0); digitalWrite(fermer, 0);
trappe = !trappe; rotation = 0; sommeil();
}
}
else {
LDR = analogRead(pinldr);
if (LDR > jour) { // jour
switch (trappe) {
case 0 : sommeil(); break;
case 1 : retard ++; ouverture(); break;
}
}//jour
else {
retard = 0; // éclairage momentane
}
if (LDR < nuit) {
switch (trappe) {
case 1 : sommeil(); break; // fermee
case 0 : fermeture(); break;
}
}
}
}// fin de loop()
Nouvelle séquence adaptée pour mon montage :
//Serial.begin(9600);
LDR = analogRead(pinldr);
// Pour forcer la trappe à se fermer la nuit ou a s'ouvrir le jour.
if (LDR > nuit) {// la nuit
trappe = 1; // fermee
}
else {//le jour
trappe = 0; // ouverte
}
// active le compteur watchdog pour interruption toutes les 8 secondes
setup_watchdog(9);
}
void loop() {
if (rotation == 1) { // moteur tourne
if ((millis() - debut_blocage) > delai_max) {
digitalWrite(ouvrir, 0); digitalWrite(fermer, 0);
trappe = !trappe; rotation = 0; sommeil();
}
}
else {
LDR = analogRead(pinldr);
if (LDR < jour) { // jour
switch (trappe) {
case 0 : sommeil(); break;
case 1 : retard ++; ouverture(); break;
}
}//jour
else {
retard = 0; // éclairage momentane
}
if (LDR > nuit) {
switch (trappe) {
case 1 : sommeil(); break; // fermee
case 0 : fermeture(); break;
}
}
}
}// fin de loop()
Ne vendons pas la peau de l'ours avant de l'avoir tué... je laisse en test pendant 2 ou trois jours avant montage définitif en place.
Je donnerai des nouvelles d'ici peu de temps
A suivre...
Bravo, vous avez compris le principe, sauf qu'il faut aussi inverser l'initialisation.
Sans l'inverser, ça fonctionne parce que vous initialisez le jour, porte ouverte. Mais le programme ne le sait pas que c'est ouvert. Sans contact fin de course, il fonctionne à l'aveugle.
Par exemple, si vous initialisez porte fermée ou pour une raison ou une autre le programme se réinitialise à n'importe quel moment, la trappe risque de se fermer au jour et inversement.
En programmant
if (LDR > nuit) {// la nuit
trappe = 0; // ouverte
}
else {//le jour
trappe = 1;
}
A l'initialisation, si il fait jour et que la trappe est ouverte, le système tente quand même de l'ouvrir, pour se mettre en concordance avec l'état réel de la trappe en fin du cycle d'ouverture, puis se met en attente du seuil "nuit" et inversement s'il fait nuit.
Question mécanique, vous êtes un pro. Je n'avais pas pensé à cette astuce. De mémoire j'avais ovalisé un tube. Je fait bricolo à côté de ça
On pourrait compléter le programme avec un contact fin de course, mais si un obstacle quelconque empêche la porte de se fermer, ça ne changerait rien.
Et puis des poules, on vient les voir au moins une fois par jour, donc la panne n'est jamais bien grave.
Les seuls problèmes qui me soient arrivées étaient batterie déchargée une fois, suite à du temps couvert sans soleil 2 mois de suite (décembre, janvier).
Une autre fois suite à une panne du PV.
Dans les 2 cas, les cocotes étaient restées enfermées. Avec ma trappe verticale, le moteur peine à l'ouverture et pas à la fermeture.