Trappe poulaillier sans contacts fin de course

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? :astonished:

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 ?
tensionLDR.gif

Pour l'arrêt automatique sur blocage, j'ai réfléchi. :wink:
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

if ( ( courant_moteur >= ( mem_courant - deltaC ) ) && ( courant_moteur <= ( mem_courant + deltaC ) ) ) { // bloqué

SansCtrlAlimV8.ino (4.47 KB)

tensionLDR.gif

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. :wink:

Je n'étais pas vexé, pas de souci...

Bonsoir

Merci Achess pour ce graphique très parlant, je l'avais fait également sur un brouillon, nous avons bien la même logique :wink:

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!

Bonne soirée

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

Je me rends compte que je n'aurait pas du proposer des possibilités que je n'ai pas essayé. Désolé de vous avoir fait perdre du temps.

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

Bonsoir Achess et Vincentm1,

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) :smiley: mais pour l'instant c'est loin d'être le cas.

A bientôt...

Bonjour,
Je vient de faire le test avec LDR et L293 D. Je revient après avoir corrigé le programme, qui pose problème effectivement.
A+

Vous êtes un super héro Achess!!! :wink:
Je n'en demandais pas tant :-[

De mon coté, je vais profiter de ce week-end pour creuser un peu plus et tenter de résoudre le problème du blocage moteur qui n'est pas détecté...

Merci,
A+

Pas le temps d'en dire plus

/* Trappe automatique poulallier avec Arduino Pro Mini
Ouverture declanchee au seuil "jour"
Peut etre retardee en fonction de la variable "nbCycle" pour eviter les ouvertures 
 intempestives par des phares de voiture ou lampe de poche

Fermeture au seuil "nuit"

Limitation de puissance moteur par resistance serie 10 ohm pour eviter de blesser 
et limiter le courant.

Arret automatique à "delai_max" puis  remise en veille.

Mode économiseur avec reveil tout les 8 secondes, pouvant retarder les actions.
*/

#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
volatile boolean f_wdt = 1;

/* declaration des constantes pour les noms des broches */
const int led = 13; // led du module nano
const int pinldr = A3; // photoresistance
const int pinmoteur = A2; // mesure courant moteur
const int fermer = 2; // commande de fermeture
const int ouvrir = 3; // commande d'ouverture
//const int bat = A1; // surveillance tension batterie

/* declaration des variables */
int nuit = 200; // seuil nuit 0.98 V
int jour = 250;  // seuil jour 1.22 V plus haut que seuil nuit
int LDR; // mesure inverse de luminosite
int courant_moteur;
int retard = 0; 
int nbCycle = 0; // retard a l'ouverture X 8 secondes(25 sec)
boolean trappe; // etat trappe
boolean rotation = 0; //  moteur arrete
unsigned long debut_blocage; // debut du blocage
unsigned long retard_dec; // declenchement jour
int delai_dec;
int mem_courant; // courant moteur au debut du blocage
int delai_max = 4000;// 4 secondes

void setup() {
  // initialisation des broches entree/sortie
  pinMode(pinldr, INPUT);
  // pinMode(bat, INPUT);
  pinMode(fermer, OUTPUT);
  pinMode(ouvrir, OUTPUT);
  pinMode(pinmoteur, INPUT);
  pinMode(led, OUTPUT);

  //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()


// Watchdog Interrupt Service est excite lors d'un timeout du WDT
ISR(WDT_vect)
{
  if (f_wdt == 0)
  {
    f_wdt = 1; // flag global }
  }
}

void setup_watchdog(int ii) {
  byte bb;
  int ww;
  if (ii > 9 ) ii = 9;   // pour 8 secondes
  bb = ii & 7;
  if (ii > 7) bb |= (1 << 5);
  bb |= (1 << WDCE);
  ww = bb;
  // Clear the reset flag
  MCUSR &= ~(1 << WDRF);
  // start timed sequence
  WDTCSR |= (1 << WDCE) | (1 << WDE);
  // set new watchdog timeout value
  WDTCSR = bb;
  WDTCSR |= _BV(WDIE);
}

// active la mise en veille pour 8 secondes
void sommeil(void) {

  // témoin led si la tension de batterie < 6 V
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_mode(); //En mode veille choisi
  //le micro passe en sommeil pour 8 secondes
  sleep_disable();
  // Le pramme va reprendre ici apres le timeout du WDT

}

void ouverture() {
  //Serial.println(retard);
  if (retard > nbCycle) { // environ 2 minutes
    digitalWrite(ouvrir, 1); digitalWrite(fermer, 0); rotation = 1; retard = 0;
    debut_blocage = millis();
  }
  else {
    sommeil();
  }
};

void fermeture() {
  digitalWrite(ouvrir, 0); digitalWrite(fermer, 1); rotation = 1;
  debut_blocage = millis();
};

Bonjour Achess,

Merci, impeccable le programme fonctionne à merveille!! ;D

Je laisse en test quelques jours jusqu'au weekend prochain, histoire de contrôler les heures de fermeture et ouverture en fonction de mes poulettes...

Du coup, qu'est ce qui était bloquant dans le programme?

En tous cas, MERCI BEAUCOUP!
Je posterai quelques photos dès que possible

A bientôt
Bonne journée!

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. :wink:

Bonsoir Achess,

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... :astonished:
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.

Encore un mystère de plus

Bonjour,

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 :wink: 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...

A bientôt

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é. :confused:

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.

Re !

Je comprend mieux petit cachottier ! :smiley:

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é. :confused:

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.

Bonsoir!

Oui effectivement, l'initialisation ne s'était pas faite correctement.

J'ai donc corrigé cette petite erreur.
Tout fonctionne maintenant :smiley:

Merci pour votre grande aide! :wink:

Bonne soirée!


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 :wink:

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. :wink: