Post

Raspberry Pi et surveillance par capteur INA226

Suivi de la tension et du courant d’un onduleur pour Raspberry Pi avec un module I2C INA226.

Raspberry Pi et surveillance par capteur INA226

#

Mini-projet : Raspberry Pi avec UPS et module de tension I2C INA226

Pourquoi ?

Cela fait un moment que je n’ai pas travaillé avec le bus I2C ni écrit de petits programmes pour l’utiliser, mais j’ai une bonne raison de m’y remettre.

Mon objectif est de configurer mon Raspberry Pi comme système de secours pour mon serveur Proxmox principal. Je prévois de lui confier plusieurs fonctions : sauvegarder le site Web et le serveur de fichiers, et fournir un accès VPN à mon réseau si l’hyperviseur Proxmox tombe en panne. Je pourrais aussi essayer d’en faire un SDR à l’avenir.

L’un des avantages du Raspberry Pi est qu’il est alimenté par un onduleur (UPS) équipé de deux batteries Li-Ion. Je veux surveiller ces batteries afin de pouvoir arrêter proprement le Pi si nécessaire et estimer combien de temps il peut fonctionner sur batterie.

Composants

Éléments principaux :

  • Un Raspberry Pi, ici le modèle 4B 2Gb, mais cela importe peu
  • Un module de mesure de courant et de tension INA226
  • Un module UPS bon marché d’AliExpress

En option :

  • Un ventilateur 12v
  • Une plaque d’essai
  • Un module d’alimentation pour la plaque d’essai
  • Un adaptateur NVME vers USB
  • Un disque NVME (surdimensionné pour un rpi4)
  • Un dissipateur thermique pour le processeur

Construire un support pour tout installer

J’avais un morceau d’acrylique et du joli bois, que j’ai assemblés pour créer deux socles reliés entre eux. Cette installation me permet de fixer solidement tous les éléments avec des entretoises et des vis M2. J’y ai placé le SSD NVMe et le module UPS, et réservé de la place pour une petite plaque d’essai afin de faciliter le câblage et d’accueillir le module INA226.

Voici le résultat :

#photo

Preuve de concept sur Arduino

Je préfère généralement tester mes modules sur un Arduino, et parfois sur un STM32 si j’ai un peu de temps. Cela me permet de voir comment les bibliothèques gèrent l’ensemble et de vérifier que l’interface avec le bus I2C fonctionne correctement.

Ainsi, je réduis le risque d’endommager un Raspberry Pi ou un ordinateur : en cas de problème, je ne mets en danger qu’un clone d’Arduino ou le module lui-même.

Cette fois, j’ai décidé d’essayer un clone d’Arduino Mini USB-C acheté sur AliExpress. Je l’ai trouvé pratique visuellement pour réaliser rapidement des interfaces avec différents projets.

#photo

Connecter le module au RPI

L’objectif est de recueillir la consommation électrique de tout le circuit ; nous n’avons donc besoin que de mesurer le courant, puisque le bus fonctionne à une tension fixe de 5V. Le capteur de tension servira à surveiller les batteries Li-ion de mon UPS.

Voici le montage :

  • Courant : mesure le courant sur le bus 5V
  • Puissance (calculée) : courant * 5V
  • Shunt : chute de tension utilisée pour mesurer le courant
  • Tension : mesure la tension des batteries de l’UPS

  • Puissance (module) : non utilisée

Comme le registre de puissance du module suppose que le courant et la tension proviennent de la même source, son utilisation donnerait des calculs de puissance incorrects.

Problèmes avec l’UPS

L’UPS est une carte bon marché d’AliExpress ; « bon marché » signifie qu’elle a parfois de petits problèmes à régler. Pour faire vite, les voici :

  • La chute de tension est assez élevée
  • Il y a du bruit sur le bus 5V

J’ai d’abord remarqué un problème lorsque mon Raspberry Pi a commencé à consigner des avertissements de basse tension dans le journal du noyau. Après enquête, j’ai découvert que la fréquence du processeur chutait considérablement. On peut le vérifier avec la commande suivante :

Pour résoudre le problème, j’ai pensé qu’une chute de tension se produisait lors des pointes de courant et qu’un condensateur de 2200uF devrait y remédier, mais cela n’a pas fonctionné jusqu’à présent.

Après quelques recherches, j’ai trouvé une vidéo de GreatScott! qui traitait du même problème. Dans la vidéo, il analyse le bus de sortie à l’oscilloscope et constate un bruit important sur le bus : https://youtu.be/NjNOGm3sCOQ?

Dans cette deuxième vidéo, il montre comment le corriger : https://youtu.be/6bicunweBAQ?feature=shared&t=351

Il remplace ensuite l’un des condensateurs du bus par un modèle plus petit, mais plus fiable. J’en ai trouvé un de bonne qualité dans un ancien lecteur de DVD, qui utilisait des composants de bonne qualité adaptés aux hautes fréquences : parfait pour ce cas !

Malgré ces efforts, l’avertissement de basse tension persiste. La prochaine étape consiste à faire passer le bus d’environ 4.9V à environ 5.1–5.2V en ajustant le diviseur de tension XR2981.

La fiche technique (page 7, « OUTPUT VOLTAGE PROGRAMMING ») donne :

\[V_{out} = 1.24 \times \left(1 + \frac{R_1}{R_2}\right)\]

Voici les résistances utilisées pour le diviseur de tension.

Puce de l’UPS du Raspberry Pi

Comme je n’avais pas les bonnes valeurs CMS, j’ai ajouté une résistance traversante en parallèle avec la 10k. Ce n’est pas très joli, mais ça fonctionne.

Avec le diviseur d’origine 30k/10k, j’ai gardé R1 à 30k et diminué R2 en ajoutant une résistance de 220k en parallèle :

\[R_2 = 10\,k\Omega \parallel 220\,k\Omega \approx 9.565\,k\Omega\]

On obtient :

\[V_{out} \approx 1.24 \times \left(1 + \frac{30\,k\Omega}{9.565\,k\Omega}\right) \approx 5.13\,V\]

Lien : https://cdn.hackaday.io/files/1829407826904960/Xysemi_XR2981.pdf copie de sauvegarde :

Programme C

J’ai trouvé une base de code solide pour ce que je veux faire ; tous les registres nécessaires y sont déjà définis et écrits en C. Je n’ai qu’à implémenter les fonctionnalités dont j’ai besoin.

Pour l’instant, j’ai ajouté le passage d’arguments afin de recueillir les données de manière plus conventionnelle. Le code que j’ai modifié et le dépôt dérivé se trouvent dans le Readme.

Le programme tourne actuellement assez vite pour servir de démon Linux. J’explorerai cette possibilité une fois l’intégration SQLite terminée.

Exemple de programme

Cet article est sous licence CC BY 4.0 par l'auteur.