Wattmeter – I2C Digital v1.0 DFROBOT

Soyez patient, cet article / partie sera bientôt prêt ! Faites moi savoir votre impatience via les commentaires 😉

Hello world ! Qu’ouis-je, qu’entends-je, qu’acoustiquais-je ? Vous voulez connaitre la consommation temps réel de votre moteur DC ? Vous voulez savoir si votre batterie se charge, ou pas ?

Nous verrons ici comment, à l’aide de ce capteur, mesurer les échanges sur un câble électrique (Courant, Tension, Puissance et Energie). La seule condition : La tension doit être positive ! Notre code sera en C. Matériel :

  • 1 Capteur Wattmètre I2C INA219
  • 1 Potentiomètre
  • 1 ESP32 ou Arduino
  • 1 Batterie LiPo 2S (ou batterie 7 – 8V)
  • 1 Contrôleur de moteur (ou un MOSFET canal N)
  • 1 Moteur 6V
  • 2 Résistances 220 ohms
Vous suivez ce petit tuto à vos risques et périls. Je ne saurais tenu être responsable de la dégradation directe ou indirecte de votre matériel quel qu’il soit 😉
Vous souhaitez une version Python ? Dites le moi en commentaires !

1 – Introduction

Le wattmètre conçu par DFROBOT mesure tensions, courants et puissances à l’aide de sa puce INA219 et peut renvoyer ses informations en I2C à plus de 10 Khz. Il est simple d’usage, compact (3 x 2,2 cm) et léger (4g).

Tant que la tension (câble rouge) mesurée reste positive, inférieure à 26V et que l’intensité mesurée reste entre -8A et 8A, le wattmetre ne risque rien. On remarque donc que le courant mesuré peut osciller, et son flux s’inverser, depuis que la tension reste positive.

Cependant, le wattmetre doit être placé sur le passage du courant. Ainsi, son utilisation implique de couper le câble (ici rouge) sur lequel on souhaite l’installer (en plus de le relier à la masse, ici le câble noir).

Enfin, le wattmetre ne peut mesurer efficacement des tensions et des intensités de l’ordre du mV et du mA. Il n’est donc pas indiqué pour mesurer la consommation des petits capteurs.

Une librairie compatible avec l’IDE Arduino (Langage C) et Raspberry pi (Langage Python) a été publiée par DFROBOT. Ce que j’écris ici est en complément de leur tutoriel.

2 – Caractéristiques

Équipée du capteur INA219, La carte se compose de deux parties. La partie I2C (1 à 5) permet la communication de l’INA219 avec l’Arduino UNO. La partie bornier (6) se place entre la source d’énergie et la charge.

Il est possible de régler le mode de communication I2C, la fréquence des mesures, leur résolution et leur calibration via les registres du wattmètre. Cependant, je n’aborderai pas ce sujet ici !

Partie I2C

La partie I2C est, d’après la doc constructeur, adaptée aux microprocesseurs fonctionnant sous 3,3V et 5V.

  • 1 – VCC, doit être alimenté sous 3,3v ou 5v
  • 2 – GND, c’est à dire 0V (Note : Les GND des deux parties sont reliées)
  • 3 – SCL, partie horloge (clock) du port I2C
  • 4 – SDA, partie données (data) du port I2C

Le port I2C peut être configuré selon plusieurs modes :

  • 5 – Sélecteur de l’adresse (valeurs hexa : 0x40, 0x41, 0x44, 0x45)
  • Registre 0x00 – Configuration du gain, de la fréquence et de la résolution des grandeurs à mesurer
  • mode STANDARD / FAST / HIGH SPEED – vitesse de communication du port I2C(100 / 400 / 2560 kbps)

Partie Bornier

La partie bornier se compose de 3 borniers. Les borniers IN doivent être séparément reliés à la source d’énergie et à la charge. Le bornier du milieu doit être relié à la masse de la source d’énergie et de la charge. La tension sur les borniers IN doivent toujours être positifs.

La résolution et la fréquence dépendent de la configuration du capteur INA219 via le port I2C.

minmaxRésolution minFréquence max
Tension0 V26 V4 mV11,9 kHz
Courant– 8 A8 A1 mA11,9 kHz
Puissance– 206 W206 W4 mW11,9 kHz

Librairie DFrobot

Retrouvez ci-dessous les fonctions en C de la classe DFRobot_INA219_IIC.

bool begin();
void linearCalibrate(float ina219Reading_mA, float extMeterReading_mA),
void reset();

eIna219_Status lastOperateStatus;

float getBusVoltage_V(),
float getShuntVoltage_mV(),
float getCurrent_mA(),
float getPower_mW();

void  setBRNG(eIna219BusVolRange_t value),
void  setPGA(eIna219PGABits_t bits),
void  setBADC(eIna219AdcBits_t bits, eIna219AdcSample_t sample),
void  setSADC(eIna219AdcBits_t bits, eIna219AdcSample_t sample),
      setMode(eInaMode mode);

3 – Préparation

On suppose ici que vous savez coder en C / Python

Comme dit au début, nous allons mesurer les échanges sur un câble électrique, par exemple entre une batterie et sa charge, ici un moteur. Dans un premier temps, installons la librairie, puis vérifions le bon fonctionnement du capteur et enfin montons un projet plus complet.

Installation de la librairie

  • Télécharger la librairie INA219 sur le GitHub de DFROBOT
  • Décompressez la dans le dossier librairies de votre IDE Arduino (%USERPROFILE%\Documents\Arduino\libraries)

Test du capteur

Cette opération a été testée avec un Arduino UNO et un ESP32

Dans cette partie, nous allons tester le fonctionnement du capteur. Vous aurez besoin du matériel suivant :

  • Le wattmetre
  • La carte Arduino UNO (ou ESP) et son câble USB
  • 4 fils de liaison

Branchement du capteur au microcontrôleur (ici un ESP32 et un Arduino UNO)

  • Reliez la borne + à la tension de travail du microprocesseur (En général 5V pour Arduino, 3.3V pour ESP)
  • Reliez la borne – à la masse GND du microcontrôleur
  • Reliez la borne C à la broche SCL du microcontrôleur
  • Reliez la borne D à la broche SDA du microcontrôleur

Ouvrir le code exemple :

  • Ouvrez / Réouvrez l’IDE Arduino
  • Allez dans Fichier>Exemples>DFRONOT_INA219>example>getVoltageCurrentPower
  • Branchez le microcontrôleur au PC
  • Renseignez les bons paramètres dans outils>type de carte et outils>port
  • Envoyez votre code.
  • Une fois le code envoyé, ouvrez outils>moniteur série

Si vous observez des valeurs légèrement fluctuantes, bravo ! Vous avez réussi ! Notez que vos valeurs sont quasiment nulles car les borniers du capteurs sont laissés vides. On va y remédier dans la partie suivante.

Mesure de la consommation moteur

Je vais majoritairement ici utiliser un Arduino UNO associé au contrôleur. Il se peut que vous deviez adapter le code aux ESP et / ou au MOSFET. Demandez moi par commentaire si vous voulez plus de contenu

Réalisons un circuit complet. Vous avez ici deux exemples dans lesquels le potentiomètre permet de diriger la tension envoyée au moteur :

  • Grâce à un MOSFET canal N et un signal PWM
  • Grâce à un contrôleur de moteur DC et un signal Servo

Vous pouvez retrouver ci-dessous le schéma électrique de ces deux situations avec une petite carte Arduino et une carte ESP32. Vous retrouverez les codes dans la partie suivante.

Carte Arduino

Carte ESP32

Soyez patient, cet article / partie sera bientôt prêt ! Faites moi savoir votre impatience via les commentaires 😉

4 – Premiers essais

Soyez patient, cet article / partie sera bientôt prêt ! Faites moi savoir votre impatience via les commentaires 😉

Dans mon cas, j’utilise un Shield Grove et des nappes de câbles grove trafiquées pour faciliter les branchements.

Cette partie fait suite à la partie précédente. Ici, toutes les fonctions crées sont non bloquantes.

Test du capteurArduino : ControllerESP32 : Controller
#include <Wire.h>
#include "DFRobot_INA219.h"

DFRobot_INA219_IIC  ina219(&Wire, INA219_I2C_ADDRESS4);

float ina219Reading_mA = 1000;  
float extMeterReading_mA = 1000;

long old_time = 0;
long delai = 100;

float tension   = 0;
float intensite = 0;
float puissance = 0;
float energie   = 0;

void printMesures()
{
    if(millis() - old_time < delai) return;
    old_time += delai;

    tension   = ina219.getBusVoltage_V();
    intensite = ina219.getCurrent_mA()*0.001;
    puissance = ina219.getPower_mW()*0.001;
    energie  += puissance * delai * 0.001;
    
    Serial.print(tension,   3); Serial.print("V\t");
    Serial.print(intensite, 3); Serial.print("A\t");
    Serial.print(puissance, 3); Serial.print("W\t");
    Serial.print(energie,   3); Serial.print("J\n");
}

void setup(void) 
{
    //Initialisation du port série
    Serial.begin(115200);
    while(!Serial);

    //Initialisation du wattmetre
    while(ina219.begin() != true) {
        Serial.println("INA219 begin faild");
        delay(2000);
    }
    ina219.linearCalibrate(ina219Reading_mA, extMeterReading_mA);
    Serial.println();

    //Initialisation des parametres temps
    delay(2000);
    old_time = millis();
}

void loop(void)
{
    printMesures();
}
#include <Servo.h>
#include <Wire.h>
#include "DFRobot_INA219.h"

#define PIN_CONTROLLER    3
#define PIN_POTENTIOMETER A0

Servo controller;
DFRobot_INA219_IIC  ina219(&Wire, INA219_I2C_ADDRESS4);

float ina219Reading_mA = 1000;  
float extMeterReading_mA = 1000;

long old_time = 0;
long delai = 100;

float tension   = 0;
float intensite = 0;
float puissance = 0;
float energie   = 0;

void printMesures()
{
    if(millis() - old_time < delai) return;
    old_time += delai;

    tension   = ina219.getBusVoltage_V();
    intensite = ina219.getCurrent_mA()*0.001;
    puissance = ina219.getPower_mW()*0.001;
    energie  += puissance * delai * 0.001;
    
    Serial.print(tension,   3); Serial.print("V\t");
    Serial.print(intensite, 3); Serial.print("A\t");
    Serial.print(puissance, 3); Serial.print("W\t");
    Serial.print(energie,   3); Serial.print("J\n");
}

void setMotorTension()
{
    float value   = (float)analogRead(PIN_POTENTIOMETER);
    float curseur = map(value, 0, 1024, 0, 180);
    controller.write(curseur);
}

void setup(void) 
{
    pinMode(PIN_POTENTIOMETER, INPUT);
    
    //Initialisation Servo
    controller.attach(PIN_CONTROLLER);
    controller.write(90);
  
    //Initialisation du port série
    Serial.begin(115200);
    while(!Serial);

    //Initialisation du wattmetre
    while(ina219.begin() != true) {
        Serial.println("INA219 begin faild");
        delay(2000);
    }
    ina219.linearCalibrate(ina219Reading_mA, extMeterReading_mA);
    Serial.println();

    //Initialisation des parametres temps
    delay(2000);
    old_time = millis();
}

void loop(void)
{
    setMotorTension();
    printMesures();
}

5 – Sources

  • https://github.com/DFRobot/DFRobot_INA219
  • https://wiki.dfrobot.com/Gravity%3A%20I2C%20Digital%20Wattmeter%20SKU%3A%20SEN0291
  • https://www.gotronic.fr/art-module-wattmetre-i2c-gravity-sen0291-29538.htm

Votez cet article :

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?

Laisser un commentaire