Go Down

Topic: Trappe poulaillier sans contacts fin de course (Read 27275 times) previous topic - next topic

achess

Feb 16, 2016, 11:09 am Last Edit: May 27, 2016, 11:14 pm by achess
Pour l'instant sur batterie 6 V avec une consommation < 15 mAh / jour
Schéma :


Mise à jour le 25 /02 /2016

Code: [Select]
/* 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();
};

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

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

ARTNOW

#1
Feb 18, 2016, 11:18 pm Last Edit: Feb 19, 2016, 10:46 pm by ARTNOW
Bravo , il manque plus qu'un panneau solaire , vu les caractéristiques du montage c'est jouable , ou une éolienne ........

achess

#2
Feb 19, 2016, 07:02 pm Last Edit: Feb 19, 2016, 10:42 pm by 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 ?

ARTNOW

#3
Feb 20, 2016, 11:24 pm Last Edit: Feb 21, 2016, 12:34 pm by ARTNOW
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 .

achess

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.

ARTNOW

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

achess

#6
Feb 21, 2016, 05:45 pm Last Edit: Feb 28, 2016, 10:50 pm by achess
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.

Ludoland64

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.


achess

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. ;)

ARTNOW

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

achess

#10
Feb 25, 2016, 10:30 pm Last Edit: Feb 26, 2016, 08:42 pm by achess
Bon ça y est, j'ai mis en service le panneau solaire. Reste à voir  comment se passe la charge.

Shiva64

#11
Feb 26, 2016, 09:00 am Last Edit: Feb 26, 2016, 09:13 am by Shiva64
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

achess

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

Ludoland64

#13
Feb 27, 2016, 02:21 pm Last Edit: Feb 27, 2016, 09:41 pm by Ludoland64
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 :

Code: [Select]

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 !

achess

#14
Feb 28, 2016, 01:51 am Last Edit: Feb 28, 2016, 02:15 am by achess
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

Go Up