dimanche 3 mai 2020

Porte Motorisée de Poulailler (3ème Partie)




Porte Motorisée de Poulailler (3ème Partie)


Ceci est la suite des articles précédents :
Porte Motorisée de Poulailler (1ère Partie)
Porte Motorisée de Poulailler (2ème Partie)

Nous allons parler aujourd'hui plus en détail de la réalisation électronique. Celle-ci va être découpée en deux parties :
  • la carte alimentation
  • la carte de commande
La carte alimentation regroupe tous les organes de puissance.

1. Les schémas

1.1. La carte de puissance

1.1.1. Alimentation sur batterie

Carte alimentation
Carte alimentation


Les schémas sont réalisés à l'aide de KICAD.

Pour récupérer le projet voir plus bas :  5. Téléchargements.

En fonction de l'option choisie (moteur continu ou servomoteur) cette carte sera pourvue de différents composants.

Les composants suivants sont communs aux deux solutions :
  • batterie
  • TP4056
  • MP1584 5V (sauf panneau solaire 5V ou 6V)
  • Q2 : transistor de commande de puissance
  • XR2981 : convertisseur 5V pour l'ARDUINO
  • P1 connecteur panneau solaire
  • P2 : connecteur pour la carte de commande
  • Q3 + Q4 :  transistors de commande du chargeur
1.1.1.1. Version à servomoteur
Les composants suivants sont prévus pour la version servomoteur :
  • FP6293-5V : convertisseur 5V pour le servomoteur
  • P3 : connecteur MG996R
1.1.1.2. Version à moteur continu
Les composants suivants sont prévus pour la version moteur continu :
  • MT3608 ou SX1308 : convertisseur de tension pour le moteur
  • L293D : pont en H 
  • R8 : résistance de mesure du courant moteur
  • P4 connecteur moteur
  • Q1 : transistor de commande de l'alimentation VCC1 du L293D
Dans sa version à moteur à courant continu la carte est prévue pour recevoir un convertisseur réglable au choix, soit un MT3608 soit un SX1308. Il sera réglé sur 12V ou une autre tension en fonction du moteur.
1.1.1.3. Détails
Comme on le voit sur le schéma j'ai prévu deux emplacements pour les batteries. Cela permettra d'utiliser soit 1 batterie de marque neuve, soit 2 batteries de moindre qualité ou même 2 batteries usagées.

Les deux transistors Q3 et Q4 permettent de connecter ou déconnecter le panneau solaire du chargeur TP4056. Le chargeur est coupé pendant la mesure de la tension du panneau solaire.Si l'option LDR est choisie ces deux transistors sont inutiles, on court-circuitera les pins 2 et 3 de Q3.

Un emplacement est prévu pour un circuit de mesure du courant du panneau, un INA138 suivi d'un amplificateur opérationnel :
Ce module me sera utile pour remonter les informations de courant de charge au serveur DOMOTICZ. Si cette option n'est pas envisagée il faudra court-circuiter les pins 5 et 6 sur la carte (U2 sur le schéma).

On voit également un jumper sur la borne + de la batterie. C'est un simple connecteur DUPONT mâle à deux broches. Celui-ci est utilisé pour la mesure du courant consommé à l'aide d'un câble relié au multimètre :


En fonctionnement normal un jumper doit être mis en place :
1.1.2. Alimentation secteur
Que ce soit dans sa version à moteur continu ou à servomoteur, le montage peut être alimenté par un simple chargeur de téléphone mobile 5V / 1A, à moins que le moteur soit très puissant, auquel cas il faudra adopter une alimentation adaptée.

Rappel : le moteur que je compte utiliser consomme 200mA sous 12V : 2.4W.

1.1.2.1. Version à moteur continu
Si l'on désire alimenter par le secteur il suffira d'un montage de ce type :
Ici aussi dans sa version à moteur à courant continu la carte est prévue pour recevoir un convertisseur réglable au choix, soit un MT3608 soit un SX1308. Il sera réglé sur 12V ou une autre tension en fonction du moteur.
Bien entendu ce montage peut être facilement réalisé sur une plaquette à pastilles.

Si le moteur choisi est un modèle 5V on pourra se passer de convertisseur et adopter tout simplement un module L293D du commerce :
Les branchements seront les suivants :
  • 0V de l'alimentation
    • GND du module L293D
    • GND de la carte de commande (broche 4)
  • +5V de l'alimentation
    • VCC et VIN du module L293D
    • +5V de la carte de commande (broche 6)
  • IN1 et IN2 du module L293D seront reliés à L293D-1A et L293D-2A de la carte de commande
  • le moteur sera relié à A- et A+ du module L293D

Par contre je déconseille totalement de relier un module L293D avec des fils DUPONT. C'est une source évidente de faux contacts. Il est préférable d'utiliser un boîtier DUPONT 8 contacts :

 
Avec des contacts appropriés (ci-dessous à droite) :


Il faudra une pince à sertir, ou bien souder les contacts sur les fils.

1.1.2.2. Version à servomoteur
Enfin, pour une version à servomoteur sur secteur, il n'y aura besoin d'aucune carte additionnelle. Les branchements seront les suivants :
  • 0V de l'alimentation
    • fil marron du servomoteur
    • GND de la carte de commande (broche 4)
  • +5V de l'alimentation
    • fil rouge du servomoteur
    • +5V de la carte de commande (broche 6)
  • orange : broche 11 de la carte de commande
Il faudra prévoir deux petits branchements en dérivation (un domino ou un petit bornier).

1.2. La carte de commande

Voici le schéma retenu pour la partie commande :

La carte de commande comporte tous les composants et modules basse puissance :

  • ARDUINO PRO MINI 5V 16MHz
  • SHT31D (optionnel)
  • DS3231 (optionnel)
  • NRF24L01 + régulateur HT7533-1 (optionnels)

Les entrées D2 et D3 sont réservées aux boutons d'ouverture et fermeture. Ce sont les seules à pouvoir réveiller le PRO MINI par interruption.

Sur l'entrée A3 on voit un capteur de fin de course pour la version à servomoteur, avec une résistance de PULL-UP de 1MΩ. Cette résistance remplace la PULL-UP interne de l'ATMEGA328, car la valeur de ces résistances internes est trop faible (20kΩ à 50kΩ) et cela occasionnerait une surconsommation lorsque le contact est fermé.

Sur l'entrée A0 un pont diviseur permet de mesurer la tension du panneau solaire. Ce pont est adapté à la mesure d'un panneau 12V (tension à vide environ 20V).

Sur l'entrée A1 un pont diviseur permet de mesurer la tension de la batterie.

La mesure sur ces entrées analogique est faite en utilisant la référence interne de l'ATMEGA328 : 1.1V. La valeur des ponts diviseurs est calculée pour obtenir une tension inférieure  1.1V :

  • 4.4V au maximum sur A0 : OK pour une batterie LITHIUM-ION 4.2V maxi
  • 24V au maximum sur A1 : largement suffisant pour un panneau 12V

Cette carte est reliée à la carte alimentation par un connecteur 11 points.

2. Les photos

La carte de commande (photo ajoutée récemment) :


Voici une photo de la carte de puissance :

En haut à gauche : le connecteur du panneau solaire.

Plus bas : le connecteur 11 points pour la carte de commande et le connecteur 3 points pour le MG996R.

Sur la photo la LED bleue du TP456 est allumée. La batterie est pleine.

J'utilise donc deux batteries chinoises. Elles sont vendues pour 6000mAH alors qu'elles n'en font que 1000, c'est dire le niveau de publicité mensongère.

La carte est équipée de tous les composants pour la version servomoteur, hormis la résistance noire 1W de mesure du courant moteur, inutile pour l'instant. Sous la résistance de 1W se trouve l'emplacement du futur L293D et du convertisseur MT3608 ou SX1308.

Les fonctionnalité suivantes sont assurées :

  • ouverture / fermeture
  • recharge de la batterie
  • mesure de la tension de la batterie
  • mesure de la luminosité (LDR)
  • mesure de la tension du panneau solaire
  • utilisation d'un capteur de fin de course haut

La coupure du panneau solaire pendant la mesure de la tension du panneau est particulièrement efficace. La luminosité pourra facilement être déterminée par ce moyen.

Par contre si un éclairage public est présent dans les parages cette solution sera inexploitable, qu'il s'agisse de mesure de luminosité par LDR ou à l'aide du panneau solaire.

Une sécurité a été ajoutée : après l'ouverture de la porte l'état du capteur de fin de course est contrôlé. S'il n'est pas vu en position haute, une deuxième tentative d'ouverture est lancée, et éventuellement une troisième.

Avec cette version sur PCB le couple moteur est nettement plus élevé qu'avec la version sur breadboard. Même en doublant le poids de la porte le moteur ne cale pas.

Ce n'est pas surprenant. La largeur des piste et les composants et connecteurs soudés contribuent grandement à ce résultat.

La tension de la batterie, qui est de 4.18V à vide, chute à 4.07V pendant l'ouverture de la porte. Sur breadboard il est impossible d'obtenir un résultat équivalent.

A noter : le routage de la carte est fait en double face, mais il est également possible de le graver en simple face (à la CNC par exemple) et de souder des straps pour remplacer les pistes de la face supérieure.

La carte se prête particulièrement bien à la gravure à l'anglaise côté recto. Elle est pourvue d'un large plan de masse.

Il est également possible de la réaliser sur une plaquette à pastilles d'environ 100mm x 100mm, avec des fils rigides de section suffisante pour la partie puissance :

  • batteries
  • TP4056
  • convertisseur FP6293
  • transistor Q1
  • etc.

Les parties faible puissance peuvent se contenter de fil à wrapper.

La carte de commande également peut éventuellement être réalisée sur une plaquette à pastilles, mais elles est plus complexe.

4. Mesures

D'après les premiers essais avec ce servomoteur, j'observe que la batterie fournit une pointe de courant de plus d'1A à mi-ouverture de la porte, lorsque le bras de levier se trouve à l'horizontale, la position où il force le plus. Cela équivaut à environ 4W puisque la batterie a une tension de 4V pendant l'ouverture. Sous 5V le courant moteur devrait donc être de 800mA, c'est qui est très raisonnable.

Comme dit plus haut : même en doublant le poids de la porte le moteur ne cale pas. Il consommera plus de courant mais le temps d'ouverture est suffisamment court pour éviter un échauffement excessif.

Contrairement à ce qui se passait sur breadboard je n'ai pas observé de blocage moteur lors de l'ouverture de la porte.

4. Avancement

4.1. 04/05/2020

Le module RTC DS3231 a été ajouté.

Le calcul de l'heure de lever et de coucher du soleil et donc d'ouverture et de fermeture de la porte est effectué à l'aide d'une API disponible dans la librairie standard ARDUINO :

#include <time.h>
    time_t          sun_rise(const time_t * timer);

    time_t          sun_set(const time_t * timer);

C'est simple et efficace, et cela peut éviter les aléas liés à une variation de luminosité indésirable, due à un éclairage public par exemple.

Bien entendu on peut changer l'heure et la date à l'aide de la console ou d'un terminal quelconque. Il faut donc un convertisseur USB / série branché sur l'ARDUINO MINI.

Comme l'ARDUINO est en sommeil, pour changer l'heure ou la date il faut le réveiller. Pour cela j'utilise une petite astuce :
Si la porte est ouverte appuyer sur le bouton ouvrir. Si la porte est fermée appuyer sur le bouton fermer. Comme la porte est déjà ouverte ou fermée, le logiciel entre dans un mode éveil pendant un certain temps : 30 secondes, le temps nécessaire pour entrer une petite commande sur la console :

date May 04 2020
time 16:25:00

Attention : bien respecter le format. Le jour doit être sur deux chiffres, tout comme l'heure, les minutes et les secondes.

Le mois doit être entré en abrégé :

Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, ou Dec

L'heure doit être entrée en valeur UTC (GMT). C'est important car il n'y a pas de gestion de changement d'heure été / hiver. De plus la librairie calcule les heures de lever et de coucher du soleil en temps UTC, donc le DS3231 doit obligatoirement donner l'heure UTC.
Il faudra donc entrer l'heure courante moins 2 heures en été, et l'heure courante moins 1 heure en hiver.

Le DS3231 est très précis, il possède un oscillateur interne calibré et compensé en température. Il dérivera très peu. On peut parier que l'heure restera exacte même après un an d'utilisation, à quelques secondes près.

Je n'envisage pas d'alternative du genre PCF8523, DS1307 ou autre. La précision de ces modules est trop dépendante de leur fabrication, en particulier du quartz utilisé, et de plus ils dériveront forcément beaucoup plus qu'un DS3231 en fonction de la température.

Un détail : certains modules DS3231 sont équipés d'une LED allumée en permanence. Elle doit être retirée afin d'éviter cette consommation inutile, environ 4mA. On peut la dessouder ou la faire sauter à l'aide d'une pince coupante.

Après retrait de la LED le module DS3231 consomme tout de même 800µA, ce qui va porter notre consommation totale à environ 1mA.
Cela ne m'inquiète pas étant donné que cela nous laisse tout de même 2500 heures d'autonomie avec une batterie de 2500mAH, c'est à dire plus de 3 mois.

4.2. 06/05/2020

4.2.1. Le NRF24L01
Le module NRF24L01 a été ajouté.

Le système remonte bien les informations :
  • porte ouverte ou fermée
  • état de charge de la batterie
  • tension du panneau solaire
Il reçoit également la date et l'heure de la part du serveur DOMOTICZ.

La mauvaise nouvelle est que la librairie time standard C ne gère pas l'heure de manière automatique, il faut la mettre à jour toutes les secondes à l'aide d'un appel à la fonction system_tick(). Comme l'ARDUINO est endormi pendant de longues périodes, cela ne sera pas possible.

Il est à noter que la fonction millis() ne fonctionne pas non plus pendant les périodes de sommeil. J'ai déjà été contraint de gérer certains aspects temporels en comptant le nombre de secondes d'endormissement à l'aide d'un compteur.

Le circuit RTC DS3231 doit donc être conservé. On pourra récupérer l'heure du serveur DOMOTICZ une fois par mois pour mettre à jour le DS3231, ce sera amplement suffisant.

Ici deux copies d'écran DOMOTICZ :

Historique des ouvertures et fermetures

Dispositifs

Sur la page dispositifs on voit la porte, la tension du panneau, le capteur de température & humidité, avec la capacité de la batterie.


4.2.2. Le SHT31D
Un capteur de température et humidité SHT31D a été également ajouté.
Ces informations sont également remontées au serveur.

5. Options

Le logiciel étant bien avancé il est largement utilisable.

Le fichier options.h regroupe toutes les options. Actuellement la configuration par défaut est :
  • servomoteur
  • pas de capteur de température
  • ouverture et fermeture en fonction du panneau solaire
  • réveil toutes les 30 secondes
  • utilisation du capteur de fin de course haut
Les options sont facilement modifiables. Il suffit de changer quelques constantes :
  • moteur :
    • #define MOTOR             SERVO_MOTOR : version servomoteur
    • #define MOTOR             DC_MOTOR : version moteur continu (non disponible actuellement)
  • capteur de température :
    • #define SENSOR      NONE : aucun
    • #define SENSOR      HDC2080 : utilisation d'un HDC2080
    • #define SENSOR      SHT31D : utilisation d'un SHT31D
    • #define SENSOR      HTU21D : utilisation d'un HTU21D
  • ouverture et fermeture :
    • #define OPEN_CLOSE_METHOD USE_PANEL : utilisation du panneau solaire comme capteur de luminosité
    • #define OPEN_CLOSE_METHOD USE_LDR : utilisation d'une LDR comme capteur de luminosité
    • #define OPEN_CLOSE_METHOD USE_RTC : utilisation d'un circuit RTC
    • #define OPEN_CLOSE_METHOD USE_DOMOTICZ : utilisation d'un circuit RTC + DOMOTICZ
  • réveil
    • #define SLEEP_TIME        30 : réveil toutes les 30 secondes
  • utilisation du capteur de fin de course haut :
    • #define USE_LIMIT_SWITCH : avec capteur
    • //#define USE_LIMIT_SWITCH : sans capteur
La LDR sera reliée à la carte par un connecteur, donc facilement exposée à la lumière à travers un trou de 5mm dans la paroi extérieure.

L'option RTC nécessite l'approvisionnement d'un circuit RTC DS3231.

L'option DOMOTICZ requiert un module NRF24L01 (avec son régulateur HT7533-1) et également un DS3231.

Le capteur de température qui sera implanté sur la carte sera un SHT31D alimenté en 5V.
La modification du schéma et du routage pour implanter un HDC2080 ou un HTU21D est minime. Ce sont tous des composants I2C.
Attention à l'alimentation du HDC2080 ou un HTU21D qui est de 3.3V (le régulateur HT7533-1 sera nécessaire).
Si la carte est réalisée sur une plaquette à pastilles la modification sera encore plus aisée.

Il y a d'autres options moins importantes :
  • les horaires été / hiver (France par défaut)
  • la latitude et longitude ( à renseigner si l'option RTC est utilisée)
  • TIME_REQUEST_PERIOD : la période de demande de l'heure au serveur DOMOTICZ (30 jours par défaut)
  • MANUAL_TIMEOUT : le temps maximal au bout duquel l'ouverture et fermeture automatique reprend le contrôle après une action manuelle
  • MANUAL_WAKEUP : le temps de réveil pour la saisie de l'heure avec un terminal

6. Téléchargements

Cette troisième version est disponible ici : 

https://bitbucket.org/henri_bachetti/mysensors-gate/src/v0.3/

Le code prévu pour un moteur continu n'est bien entendu pas finalisé.

7. Liens utiles

La quatrième partie : le moteur continu
https://riton-duino.blogspot.com/2020/06/porte-motorisee-de-poulailler-4eme.html

8. Conclusion

Il me semblait indispensable de ne pas continuer à faire du prototypage sur breadboard pour la partie puissance. Le résultat est là et il est très encourageant.

Les différentes options fonctionnent et donnent un résultat très satisfaisant.
J'ai une légère préférence pour la solution à horloge RTC avec calcul du lever et coucher du soleil, qui sera forcément moins tributaire de la luminosité ambiante, éclairage de rue en particulier.

Je recommande particulièrement l'utilisation du capteur de fin de course haut. Depuis que je l'ai mis en place le comportement est plus rationnel, en particulier lors des redémarrages.

L'occupation mémoire de la PRO MINI est assez rassurant (avec les options DOMOTICZ + capteur de température activées) :
  • 74% de l'espace en mémoire FLASH
  • 51% de l'espace en RAM
C'est fou ce que l'ont peut faire avec ces petites cartes.


Cordialement
Henri

6. Mises à jour

04/05/2020 : ajout du DS3231
06/05/2020 : ajout du NRF24L01 et SHT31D

16 commentaires:

  1. Bonjour,
    Tout d’abord un grand merci pour ces articles super et bien très bien détaillés. Mais je ne suis pas un pro de la programmation et j’ai une difficulté de compréhension sur la class L293D. Entre la version 3 et 4 de la class L293D, tu définis dans la fonction public « set » un 2ème paramètre : void (*callback(void)

    Peux-tu me dire ce qu’il apporte et comment il fonctionne. Merci d’avance pour ton aide
    Pour votre information j’ai fait ce printemps une couveuse automatique en partant avec comme contrôleur un ESP32 qui fonctionne avec pour l’instant un rendement de 50% d’éclosion, et donc maintenant je compte équiper mon poulailler d’une ou 2 portes automatiques pour plus de liberté.

    RépondreSupprimer
    Réponses
    1. Dans le sketch la méthode motor.set() est appelée avec un paramètre getBattVoltage, qui représente l'adresse d'une fonction qui va mesurer la tension de la batterie pendant l'ouverture ou la fermeture. En fonction de la tension mesurée, une LED rouge clignotera si celle-ci descend en dessous de 3V. Cela peut indiquer une fatigue de la batterie, spécialement en hiver.

      Supprimer
  2. Bonjour et merci pour ce super projet (et tout le site également). Je voudrais me lancer dans la réalisation de ce montage et finalement, plutôt que d'adapter et utiliser des cartes à pastilles, pourquoi pas faire fabriquer le PCB chez jlcpcb ?
    J'ai téléchargé la branche master du projet (celle avec la résistance R9) et vu que je n'ai pas encore étudié la création de PCB avec kicad j'ai procédé comme suit: après avoir dézippé et lancé le fichier projet sous Kicad 6, j'ai ouvert le fichier PCB. Ensuite en cliquant sur Tracer j'ai un premier avertissement à propos du masque de soudure supérieur à 0; là j'avoue ne pas savoir si je dois le mettre à 0 ou ignorer l'avertissement.
    En exécutant le DRC comme préconisé, j'ai quelques avertissements concernant des recouvrement de sérigraphie, mais surtout l'erreur "aucun contour trouvé sur la couche Contour", l'avertissement "Trous forés co-localisés" et des pistes avec des extrémités non connectées. Est-ce que ces erreurs et avertissements sont connus et à ignorer ou dois-je effectuer des modifications ?
    Merci pour votre aide.

    RépondreSupprimer
    Réponses
    1. Oui, effectivement, "aucun contour trouvé sur la couche Contour" veut dire que le contour de carte (edge cuts) n'est pas dessiné.
      Comme je grave moi-même ce n'est pas dérangeant, mais JLCPCB ne l'acceptera pas.
      Je viens d'ajouter les "edge cuts", y compris sur la carte de puissance. Pour le reste je fonctionne sous KICAD 5 version anglaise. Je ne vois pas d'avertissements en DRC.

      Supprimer
    2. A noter que la dimension de la carte de puissance dépasse légèrement les 100mm x 100mm permettant d'avoir des tarifs intéressant chez JLCPCB.
      Réduire la longueur de la carte pour passer de 100,33 à 100mm, en déplaçant légèrement le support de batterie par exemple.

      Supprimer
    3. J'ai fait la modification. La longueur est passée à 99,69mm.

      Supprimer
    4. Merci pour les modifications. J'ai testé avec Kicad 5.0.2 puis 5.1.9 pour être en phase avec la documentation de jlcpcb et en effet aucune erreur dans le DRC. Il doit y avoir des règles plus strictes dans la version 6 et 7 sortie récemment j'imagine.
      J'ai pu générer les fichiers gerber pour la carte principale et la carte d'alimentation et les charger chez jlcpcb sans souci.
      Au départ je voulais faire une modification mais j'ai abandonné car il n'y avait plus de pin libre sur l'arduino et je ne me voyais pas me lancer dans de grandes modifications. Suggestion pour une éventuelle nouvelle version: utiliser un bus 1wire pour des sondes de température DS18B20. L'avantage c'est qu'on peut en mettre plusieurs et qu'il existe les modèles étanches avec une bonne longueur de câble. Ceci-dit il est peut-être possible d'utiliser le mcp23008 ?

      Supprimer
    5. Oui, le MCP23008 est là pour ajouter des entrées / sorties supplémentaires en cas de besoin.

      Supprimer
    6. Salut.
      J'ai ajouté aujourd'hui une photo de la carte de commande. Cela peut aider à placer les modules dans le bon sens.
      Pour ma part j'avais placé le module DS3231 à l'envers, pile apparente. Il était donc à l'envers. J'ai dessoudé son connecteur et l'ai ressoudé de l'autre côté.
      Il fonctionne !
      Le routage de la carte de commande a été légèrement modifié. Le connecteur 11 broches a été déplacé pour tomber pile en face de celui de la carte de puissance, ce qui permet d'empiler les deux cartes.
      La nouvelle version est la v1.1 :
      https://bitbucket.org/henri_bachetti/mysensors-gate/src/v1.1/

      Je suis en train d'écrire un article qui décrit la mise en oeuvre et l'installation complète.

      Supprimer
  3. Dossier très détaillé merci. Question: j’utilise des mosfets sur des modules que je n’active que qd nécessaire. Comment cela se passe avec celui du régulateur en aval du panneau qd on est en deep sleep. ? Comment maintenir un statut sur un GPIO H/B entre 2 cycles de sleep/alive.

    RépondreSupprimer
    Réponses
    1. Bonjour. Il n'y a aucun problème, la GPIO reste dans le même état en mode sleep.

      Supprimer
  4. C ce que je me disais contrairement à ESP32
    Merci

    RépondreSupprimer
    Réponses
    1. Sur ESP32, je ne saurais rien affirmer. Il faut essayer.

      Supprimer
    2. De toutes façons, un ESP32 en deep sleep, lorsqu'on le réveille, redémarre, donc la GPIO va retomber. Cela peut poser un problème, effectivement.

      Supprimer
  5. PS il y’a un pb de timing sur les posts 4:50 AM/PM ? au lieu de 13:50

    RépondreSupprimer
  6. Je vais regarder la mise en place de latch.

    RépondreSupprimer