Trappe poulaillier sans contacts fin de course

Pour l'instant sur batterie 6 V avec une consommation < 15 mAh / jour
Mise à jour le 25 /02 /2016

/* Trappe automatique poulallier avec Arduino Pro Mini

Arret sur blocage moteur sans contacts de fin de course. Panneau solaire pour la
recharge de la batterie.
Moteur de faible puissance bloqué par une faible résistance mécanique.

La trappe s'ouvre au seuil "jour".
Elle se ferme au seuil "nuit", environ 1/2 heure après que les poules soient rentrées.

- Pour économiser la batterie, le circuit est mis en veille le reste
du temps sauf pendant la rotation du moteur.
Consommation 0.5 mA en veille et 200 mA environ pendant les  2 fois 15 secondes
de fonctionnement moteur journalier.
La led power est coupée (coupure de la piste du circuit imprimé)

- l'ouverture ou la fermeture n'est tentée qu'une fois.
si blocage anormal du moteur, la trappe restera bloquée en position intermédiaire
jusqu'à réparation sans surconsommation(vérifier à chaque visite).

Plage de fonctionnement correct 5.5 V à 7.1 V (6.8 V avec panneau solaire)
Si la batterie est faible, la led du circuit s'allume 300 ms toutes les 8 secondes.
*/

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

/* declaration des constantes pour les noms des broches */
const int led = 13; // led du module nano
const int pinldr = A3; // photorésistance
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 niveau_bat;//
int nuit = 980; // seuil nuit
int jour = 250;  // seuil jour
int LDR; // mesure inverse de luminosité
int courant_moteur;
int retard = 0; // évite de déclencher sur variation de luminosité brève
boolean trappe; // état trappe
boolean rotation = 0; //  moteur arrêté
unsigned long debut_blocage; // début du blocage
unsigned long retard_dec; // déclenchement jour
int delai_dec;
int mem_courant; // courant moteur au début du blocage
int delai_blocage = 100;

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);
 
  LDR = analogRead(pinldr);
  // Pour forcer la trappe à se fermer la nuit ou à s'ouvrir le jour.
  if (LDR < nuit) {
    trappe = 1; // fermée
  }
  if (LDR > nuit) {
    trappe = 0; // ouverte
  }
  // active le compteur watchdog pour interruption toutes les 8 secondes
  setup_watchdog(9);
}

void loop() {
  LDR = analogRead(pinldr);
  niveau_bat = analogRead(bat);

  switch (rotation) {

    case 0 : // moteur arrêté
      if (LDR < jour) { // jour
        switch (trappe) {
          case 0 : sommeil(); break;
          case 1 : retard++; ouverture(); break; // pas ouverte
        }
      }//jour
      if (LDR > jour) {
        retard = 0; // lampe de poche ou pas complètement jour
      }
      if (LDR > nuit) {
        switch (trappe) {
          case 1 : sommeil(); break; // fermée
          case 0 : fermeture(); break;
        }
      }; break;

    case 1 : // moteur tourne
      courant_moteur = analogRead(pinmoteur);
      if (courant_moteur != mem_courant) { // normal
        // sauve le courant moteur et debute le comptage
        mem_courant = courant_moteur;
        debut_blocage = millis();
      }
      // arret moteur si courant moteur invariable depuis delai_blocage
      if (courant_moteur == mem_courant) { // bloqué
        if ((millis() - debut_blocage) > delai_blocage) {
          // bloqué et délai dépassé
          stop();
        }
      }; break;

  }// fin switch rotation
}// 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
  if (niveau_bat < 565) { // 5.6 V
    digitalWrite(led, 1); delay(300); digitalWrite(led, 0);
  }
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_mode(); //Entre dans le mode veille choisi
  //le micro passe en sommeil pour 8 secondes
  sleep_disable();
  // Le programme va reprendre ici après le timeout du WDT
}

void ouverture() {
  if (retard > 15) { // environ 2 minutes
    digitalWrite(ouvrir, 1); digitalWrite(fermer, 0); rotation = 1; retard = 0;
  }
  else {
    sommeil();
  }
};

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

void stop() {
  digitalWrite(ouvrir, 0); digitalWrite(fermer, 0);
  trappe = !trappe; rotation = 0; sommeil();
};

Comme c'est mon premier montage Arduino, si vous voyez une connerie, n'hésitez pas :wink:

lumviapanneau.ino (4.45 KB)

Bravo , il manque plus qu'un panneau solaire , vu les caractéristiques du montage c'est jouable , ou une éolienne ........

Merci, j'y songe.

J'ai commandé un Futaba S3003 qui peut soulever 230 g au bout d'un bras de 13 cm (3kg/cm), donc pas de problème avec ma trappe qui pèse 92 gr avec sa tige et se déplace sur 25 cm. En + ça simplifiera le schéma et la mécanique.

Je n'ai jamais pratiqué le servo moteur, mais ça devrait le faire ?

achess:
Merci, j'y songe.

J'ai commandé un Futaba S3003 qui peut soulever 230 g au bout d'un bras de 13 cm (3kg/cm), donc pas de problème avec ma trappe qui pèse 92 gr avec sa tige et se déplace sur 25 cm. En + ça simplifiera le schéma et la mécanique.

Je n'ai jamais pratiqué le servo moteur, mais ça devrait le faire ?

Bonne idée , un servo c'est très facile à programmé avec arduino , donc une bonne amélioration en perspective .

Oui j'ai vu qu'un seul fil de commande suffisait.

J'ai retrouvé le panneau solaire que j'avais depuis longtemps. C'est un 6 V /2 W, pour une batterie 6 V ça va être juste.
Je donnerai des nouvelles quand il y aura de l'avancement.

bonjour , ça fait 12w , sous 6 v , vu la faible consommation de ton circuit cela devrait fonctionner je pense non ?

Bonjour,
Ça correspond à quoi ces 12 w ?
Je vais faire des tests avec ce panneau. Par chez nous y a pas beaucoup de soleil en ce moment.

Comme il n'est pas facile de détecter la fin de charge d'une batterie NIMH en solaire, j'ai pensé à un circuit de surveillance avec une commande via un bistable.

Commutation du panneau seulement quand la luminosité est suffisante.
A chaque réveil du mode économiseur, surveiller et comptabiliser le courant chargé.

Couper le panneau quand le quota de charge journalier est atteint.

Je n'ai pas mis le pont diviseur donnant la tension batterie. C'est un premier jet

Edit : en fait pas besoin de bistable, la commande reste figée en mode veille.

chargenimh.jpg

Bonjour,

ce ne serai pas 1,2W ? en faisan,t quelques recherche je ne trouve pas de photovoltaique de 12 w en 6V.
Si c'est 1,2W tu devrais atteindre les 200 ma.

Ca reste à confirmer, mais on peut tester l'ampérage qu'il fourni en court-cirtuit avec le multimetre.

Les miens sont mort et ne donnent que quelques microampère sauf 2, qui donnent 60 ma autour de 3v chacun, la tronche face au soleil.

Non, mon panneau est bien un : 2W

spécifications:

Matériel: carte de circuit imprimé + monocristallin silicone
Couleur: Noir
Nombre de cellules: 12
Max. courant: 330mA
Max. Tension: 6V
Max. puissance: 2W
Tension en circuit ouvert: 7.2V
Courant de court-circuit: 363mAh
tolérance actuelle: ± 10%
Batterie efficacité de conversion: 15%
Taille: Env. 5.31 * 4.33inch / 13.5 * 11cm

En guise de diode anti-retour, j'ai trouvé a transistor AC127 dans mes fonds de tiroir, tension de déchet 0,12 V, mieux qu'une schottky. :wink:

Bonjour , oui 2 w , désolé j'avais mal lue :o

Bon ça y est, j'ai mis en service le panneau solaire. Reste à voir comment se passe la charge.

Super, merci pour le partage, je me lance dans la création de votre montage.
Pouvez m'apporter des références facile à trouver, sur ebay par exemple, pour les transistors ?
Je ne suis pas un spécialiste dans les pont en H ;).
Merci

Bonjour,
Vous pouvez utiliser des transistors récupérés sur des cartes électroniques du rebut. C'est ce que j'ai fait.

http://moncastel.free.fr/forum/trappePoule/#liste

Bonjour,
Je trouve votre montage très bien, je rajoute de mon coté également 2 boutons pour mémoriser les seuils sans avoir à connecter au PC.

1 pour la mémorisation du seuil jour et 1 pour le seuil nuit qui ne seront utilisé que lors d'un reset dans le setup.

la partie code n'est pas écrite mais dans le principe ca ressemblerai à ca :

setup(){
int jour = eeprom.read(1); // lecture de ce qui est mémorisé
if (bouton1 == HIGH){jour = analogRead(LDR); EEPROM.Write(1, LDR);} // memorisation du seuil si bouton pressé (pas de rebond car exécuté qu'une fois lors du setup)
}

Pour le moment je n'ai fait que les soudures mais je continue à suivre votre post de près. Votre sujet et le principe de récupération j'adore !

Bonjour,
Oui, en effet, ingénieux votre idée de mémoriser les seuils comme ça.
Pour que la fermeture fonctionne correctement, bien après la rentrée des poules, la LDR doit être à l'extérieur et orientée au soleil couchant (mes essais cellule à l'intérieur n'avait pas été très concluants).

Le AC127 a une tension de déchet > 0.6 V, j'ai du me résoudre à mettre quand même une diode schottky en série avec le panneau, sinon quand la tension de batterie est supérieure à celle du panneau, elle se décharge dans le panneau.

Avec la diode, la batterie se stabilise à environ 6.8 v, donc apparemment pas besoin de régulation de charge, la diode suffit. Dans mon cas, la tension max du panneau est de 7.2 V - 0.3 v de tension de déchet de la diode, ça correspond (soleil voilé aujourd'hui).
Pour ne pas user prématurément cette batterie, est-il préférable de ne pas la recharger en permanence ?
Et d'attendre un seuil bas (6.4 V par exemple) avant une nouvelle charge ?

J'ai changé la trappe par une tôle galva, poids ~ 300 gr ... le moteur la soulève sans sourciller http://moncastel.free.fr/forum/trappePoule/#fab

Bonjour et pas mal ce montage je n'ai pas poules à garder .
J'ai un panneau solaire qui charge une batterie et la nuit m'allume une lampe par contre pour détecter la nuit j'utilise la tension du panneau solaire pas de LDR.
C'était juste une remarque qui pourrait simplifier un peux le montage et éviter un composant dehors et risque d'oxydation.

Bonjour et merci du conseil.
L'idée du panneau est venue après mais si c'est aussi précis par le panneau pourquoi pas ?
Ce serait une simplification.

As-tu prévu une régulation de charge ou seulement une diode ?

Dans cette FAQ, ils écrivent ceci :

Installations auto régulées

Dans certains cas, les panneaux solaires photovoltaïques peuvent fonctionner sans régulateur de charge, utilisant simplement une diode anti-retour pour empêcher le courant de circuler dans le sens inverse sous les conditions suivantes:

Le courant de charge des batteries est égal au courant produit par les panneaux solaires photovoltaïques; La température est relativement constante.
Les batteries ont une capacité au moins 30 fois plus grande que le courant de court-circuit pouvant être délivré par les panneaux solaires photovoltaïques.

Comme il s'agit de NIMH pouvant encaisser plus en début de charge que des batteries plomb, ça ne doit pas poser de problème. Si elles se déchargent peu, le courant de charge est limité et on peut toujours ajouter une résistance en série.
Sinon j'ai pensé ne prévoir de recharger la batterie que quand elle descend en dessous d'un certain seuil, mais est-ce que ça augmentera vraiment sa durée de vie ?

je ne suis pas sur que les batteries NIMH soient adaptées à une recharge par panneau solaire puisqu'il faut piloter précisément le courant de charge, un panneau solaire est plutôt à tension "presque" constante et c'est le courant qui varie en fonction de l’irradiance donc plutôt adapté pour les batteries qu'on charge en tension (voir même des batteries supportant une tension de floating permanente)

Bonjour,

avez vous essayé le montage avec un servomoteur ?
Je suis en train de faire les essaie mais sur les watchdog quelque soit la valeur envoyé au servo il tournera dans le meme sens alors que sur un sketch sans watchdog il n'y a pas de soucis.

Savez vous d'ou vient le probleme ?
je ne trouve pas grand chose sur le sujet concernant watchdog et servo

Cordialement,
Ludo

Non, pas encore reçu.

Pendant le fonctionnement moteur, le mode économiseur doit être désactivé et n'être réactiver qu'après fin de course.

On peut se tutoyer :wink: Donnes le code pour pouvoir en discuter.