Dans mon Projet "Apaguard", j'ai besoin de mesurer de façon permanente le poids d'une ruche.

Pour ce faire, j'ai choisi :

Voici mon expérience avec cette configuration. (commencée le 12/07/2015)

Voici les spécifications de la sonde L6E3 et celles du HX711.

Chaque sonde est numérotée et livrée avec un certificat de calibration, qui apparemment ne fait que reprendre les spécifications ci-dessus et n'est pas spécifique à chaque sonde.

Premières réflexions

La variation en sortie de sonde n'est que de 2 mV/V, ce qui suggère d'entrée qu'il faudra travailler avec une tension d'excitation la plus élevée possible. La tension nominale d'excitation est donnée par le constructeur pour être de 10 V, ce qui nous donnerait 20 mV de variation avec la charge maximale de 150 kg ! Avec la tension max supportée par le HX711 de 5 V, ce serait 10 mV max. Première constatation, il va falloir être prudent dans le traitement de ces tensions !

Le circuit HX711 est un convertisseur analogique / numérique de 24 bits qui fonctionne avec une tension maximale de 5,5 V, nominale de 5 V. Un régulateur intégré permet de stabiliser la tension d'excitation qui ne peut donc être supérieure à 5V. La tension de sortie (d'excitation) est déterminée par un pont de résistances R1 et R2.
A noter que la formule de calcul donnée dans le document de référence est fausse !  Il faut inverser les valeurs de R1 et R2 par rapport au schéma !
Ma platine avait des résistances de 20000 et 8200 Ohm, ce qui donne une tension théorique de : 1,25V * (20000+8200)/8200 = 4.298 V, mesurée 4 V.

Ce qui nous donne une variation maximale de 8 mV.

Le HX711 possède un amplificateur analogique avec un gain réglable de 64 ou 128. Les caractéristiques de bruit données sont de 50 nV rms pour un gain de 128 et une cadence de 10 Hz, et 90 nV pour 80 Hz.
Les docs d'application de chez Analog devices, qui sont des mines d'Or nous renseignent sur la précision que l'on peut espérer avec ces données. (références 1 et 2)

Le nombre de comptages sans bruit sera de  :  10mV / 6.6 * 50 nV = 30303  ( 6,6 pour convertir rms en càc)

La résolution sans bruit est donc de 150 kg/30303 = 5 grammes environ, soit une résolution de 15 bits environ !

Première constatation, la platine ne comporte pas de plans de masse et le schéma diffère de celui donnée en exemple dans la documentation. Il manque une résistance de 100 Ohm sur l'entrée A-, et celle sur l'entrée A- est de 1000 Ohm au lieu de 100 Ohm.

Par ailleurs, le concepteur du circuit imprimé semble avoir été un étudiant de 1ère année BTS.. Le condensateur de découplage sur la ligne d'excitation, ainsi que la plupart des autres capas, sont éloignées des pins et la connexion à la masse se fait par un long fil.. Pas de plans de masses, etc...
Par contre, les masses des parties analogique et digitale sont bien séparées.
La pin 15 ( RATE ) est à la masse, ce qui force par défaut la vitesse de mesure à 10 Hz, ce qui semble le plus approprié.

A terme, je pense qu'il va falloir que je redessine un nouveau circuit pour corriger ces erreurs et mettre toutes les chances de mon côté ! Les alimentations sont à soigner, car sources de nombreux problèmes et erreurs de mesures (références 3, 4  et 5).
Peut-être également alimenter la sonde et AVDD via un régulateur faible bruit 5V à partir du 12V et non pas à partir du 5V général afin de grapiller un peu de résolution.

Autres sources de problèmes que j'envisage, les variations en température et les dérives. La sonde est donnée pour une variation de 0,017 % / 10°C pour le zéro et 0,014% / 10 °C à pleine charge.
Le "creep", à savoir la dérive à long terme est donnée pour 0,015% / 30 min. Ce qui est vraiment peu !! Cette dérive devrait diminuer une fois la charge en place pendant suffisamment longtemps.

Mais je crains que ce soit pire que ce qui est annoncé et que le HX711 et les composants alentours ne varient encore plus. Par exemple, apparemment, les résistances implantées sur la platine semblent être d'une tolérance 5 %.

Bref, pas mal d'interrogations avant même de commencer !

Dans l'ordre, je pense :

Librairie HX711

Il n'existe pas beaucoup de librairies pour Arduino et le HX711. Toutes dérivent de celle écrite par "Aguegu" et disponible ici. La méthode de décodage des informations issues du DAC est particulièrement astucieuse et concise !
La plus complète est celle écrite par "Bogde" et disponible sur Github, mais l'originale est parfaitement suffisante et très compacte. 

Les données envoyées sont au format "complément à 2" et en 24 bits série. Les commandes de changement de facteur d'amplification, de mise en marche et arrêt sont simples.

Les informations disponibles sur la librairie originale étant plus que limitée, je choisis d'utiliser celle de Bogde.

La première phase consiste, comme le décrit le fichier README de la librairie, à déterminer le facteur de correction à introduire avec le fonction set_scale() avant les mesures avec get_units().
J'ai pour cela écrit un sketch de calibration qui permet de déterminer ce facteur de correction. A voir si je pourrais intégrer la fonction calibration dans le skecth Apaguard... (taille, etc...)

La technique de calibration consiste à :

  • envoyer la commande set_scale()   (sans aucun paramètre)
  • envoyer la commande tare()   (sans aucun paramètre)
  • placer un poids connu sur la balance
  • faire une lecture avec get-units(10)  ( 10 mesures consécutives ) et afficher le résultat.
  • diviser la valeur obtenue par le poids référence en utilisant la bonne unité ( kg, g, lbs... )
  • le résultat x de cette division est la valeur à envoyer par set_scale(x) avant de faire les mesures, mais une seule fois pour l'ensemble des mesures, jusqu'à une éventuelle nouvelle calibration.

Pour cette phase de calibration, il faudra trouver une charge d'un poids connu (peson testé) ou avoir accès à une balance calibrée.

En écrivant ceci, il apparait que chaque balance devant être calibrée et ayant donc un facteur de correction individuel, il faudra que le sketch soit compilé avec cette valeur.... Ce qui me fait pencher pour l'intégration dans le sketch de la fonction de calibration et de stocker cette valeur en EEPROM et de la lire à chaque RESET de la carte. Ceci permettrait d'éviter d'avoir un sketch particulier par balance.. ;-)

Par ailleurs, en lisant la documentation du HX711 et le code de la librairie, il apparaît que la sélection du gain (32, 64 ou 128) détermine non seulement cette valeur mais aussi sélectionne l'entrée A ou B du HX711, et ce à l'aide de la fonction set_gain(). Si le gain choisi est 32 ce sera l'entrée B, 64 et 128 sélectionne l'entrée A.
Le changement du gain et donc de l'entrée utilisée se fait à l'aide des bits 24 à 26 de la fonction scale_read() et donc APRES avoir lu la valeur du convertisseur. En conséquence, si le gain est changé, la première lecture retournera la valeur du convertisseur avec l'ancienne valeur du gain et de l'entrée A ou B. Il faut donc refaire une lecture et ne conserver que cette 2ème valeur.
 

Plateau de mesure

La sonde L6E doit être fixée mécaniquement de manière solide, stable et avec certaines contraintes. 
En effet, une extrémité de la sonde est à fixer sur un plateau qui est posé au sol, et l'autre extrémité au plateau sur lequel reposera la ruche. Cette dernière extrémité est repérée par une flèche qui indique le sens de déplacement de la sonde, elle doit être dirigée vers le bas !
En pleine charge, les 2 extrémités ne doivent jamais être en contact avec les plateaux (en butée). Il faut donc intercaler une épaisseur (cale) entre la sonde et les plateaux.

Le TOUT doit être stable et ne pas vibrer, par exemple avec le vent... 
Pas simple à priori avec mes moyens amateurs.... 

Plusieurs solutions sont possibles.

Autre précaution à prendre que j'ai lue dans un forum et confirmée par la lecture d'une note d'application, il ne faut JAMAIS couper le câble de raccordement d'une sonde à 4 fils. Ce câble fait partie du système de compensation thermique et le raccourcir ou le rallonger modifierait la calibration. Les sondes 6 fils qui ont 2 fils supplémentaires qui permettent de mesurer à distance la tension d'excitation présente sur la sonde peuvent être coupés à la longueur voulue.
 

Comme j'aime le travail bien fait et souhaitais faire des plans du plateau, j'en ai profité pour m'initier au logiciel de dessin 3D Sketchup.

Je me suis fait la main en dessinant la sonde ZEMIC L6E et le plateau.

Stabilité et répétabilité

Dans un monde parfait, la balance devrait pouvoir mesurer le même poids un nombre de fois infini et toujours donner la même valeur.
A vide, après un nombre infini de mesures, la valeur lue devrait toujours être à zéro à chaque fois.
La mesure d'un poids sur une longue période devrait toujours donner la même valeur stable, quelles que soient les conditions environnementales. ( température, etc... )

Pour tester tous ces paramètres, il n'y a pas d'autre moyen que de surveiller les paramètres poids et température dans le temps et de réaliser des mesures avec et sans charge.

Il faudra trouver une charge d'un poids connu (peson testé) pour la calibration et ensuite une charge stable dans le temps. On élimine un bac rempli d'eau par exemple.... ;-)
 

Premiers tests...

Pour les premiers tests, j'ai écrit un petit sketch qui mesure la température avec un BS1820 et j'ai raccordé la sonde L6E fixée sur le plateau décrit ci-dessus. Un afficheur LCD affiche en permanence la température ambiante et le poids. Un poids fixe de 18,5 kgs est posé sur le plateau. J'ai calibré le logiciel afin qu'il affiche 18,500 kgs.

Sous tension depuis 15 jours, le poids affiché varie entre 18,496 et 18,510 pour une température ambiante qui a varié de 31 à 20 °C. Je me suis rendu compte que le simple fait de souffler sur la platine avec le HX711 faisait galoper la mesure ! Je pense donc que la principale variation est due à la platine. A incriminer le HX711 et/ou les composants annexes qui déterminent la tension d'excitation du capteur.

La précision est cependant excellente, une feuille de papier posée sur la charge de 18 kgs est immédiatement détectée ! 

La stabilité à long terme à température constante est également excellente !

Plus ennuyeuse est la stabilité mécanique de l'ensemble. L'élasticité induite par le capteur fait bouger la plateau. Je pense qu'avec une ruche Dadant + une ou 2 hausses rendra le tout instable... 

Il faudra donc soit trouver un système mécanique sans frottements qui éliminera le problème d'oscillations mécaniques ou adopter un plateau avec plusieurs sondes afin de répartir la charge mécanique et ainsi augmenter la stabilité..

Retour d'expérience après plusieurs mois de tests et mesures :

- Les platines vendues en Chine ne sont pas spécialement bien conçues.
- Le remplacement du régulateur intégré au HX711 par un régulateur externe faible bruit genre LT1761 apporte une nette amélioration dans la stabilité et le bruit. Les mesures sont plus stables à long et court terme !
- Si la sonde de poids peut être déconnectée (connecteur) , il est judicieux de rajouter une résistance de tirage au +5V sur la pin DOUT. La librairie teste en effet l'état de DOUT pour savoir si le HX711 a fini la mesure. Sans HX711, DOUT est à l'état bas permanent et on rentre dans une boucle.
- Pour économiser l'énergie, je coupais aussi bien AVDD et DVDD, mais curieusement le montage consommait bien plus que si je laissais les tensions présentes et passais en mode powerdown(). La ligne PD_SCK restant à l'état haut permanent, le HX7111 doit avoir un défaut interne qui fait "remonter" cette tension vers AVDD et DVDD ! Je n'ai pas encore testé, mais forcer PD_SCK à zéro après voir coupé les alimentations pourrait régler le problème.
- Testée avec des poids référence précis, la sonde révèle une bonne linéarité. Calibrée avec une charge précise de 50 kgs, la linéarité est très bonne à 10, 20, 30 et 40 kgs (quelques grammes) . En tous cas, largement suffisante pour mon usage !
- J'ai modifié la fonction read_average() de la librairie afin de faire une moyenne glissante, ce qui améliore un peu la répétabilité des mesures.

 Références :

1) http://www.analog.com/media/en/reference-design-documentation/reference-designs/CN0107.pdf
2) http://www.analog.com/media/en/training-seminars/tutorials/MT-004.pdf
3) http://www.analog.com/media/en/technical-documentation/technical-articles/MS-2210.pdf
4) http://www.analog.com/media/en/training-seminars/tutorials/MT-031.pdf
5) http://www.analog.com/media/en/training-seminars/tutorials/MT-101.pdf