jeudi 1 novembre 2018

USB : un voltmètre-ampèremètre sensible

USB : un voltmètre-ampèremètre sensible

Cet article décrit la réalisation d'un voltmètre / ampèremètre USB.
Question : pourquoi en fabriquer un alors que les chinois nous inondent de produits de ce genre ?
La plupart de ces petits engins ont une résolution de 10mA.
De plus les faibles valeurs de courant sont surestimées. Celui que je possède affiche 0.03A alors que mon multimètre mesure 13mA.

Comment alors mesurer le courant consommé par notre petit ARDUINO quand on travaille à le rendre sobre ?

Pour cela nous avons besoin d'un instrument de mesure plus sensible. Nous allons nous fixer un objectif à atteindre de 10µA, soit mille fois mieux.

1. Objectif

J'ai déjà décrit sur ce blog un Banc de Mesure de Consommation, capable de mesurer des tensions allant jusqu'à 33V et des courants de 0.5µA à 0.8A. Il est particulièrement adapté à la mesure de consommation de montages à base d'ARDUINO PRO MINI ou STM32 alimentés par batterie.
Il permet de plus de récupérer une courbe de consommation sur l'écran du PC.
Il n'offre pas la possibilité de téléverser le sketch dans la carte en cours de mesure. Il faut pour cela utiliser un autre moyen : un convertisseur USB / série, une UNO en mode ISP, un USBASP, un USBTINY, etc.
Celui que nous allons décrire ici est plus adapté à des cartes ARDUINO UNO, NANO ou autres, alimentées par un port USB.
Il laisse la possibilité de téléverser le sketch dans la carte en cours de mesure.

Il faut savoir qu'un ARDUINO NANO par exemple est capable de descendre à 90µA de consommation, si on le modifie légèrement :
  • retrait de la LED POWER
  • retrait de son régulateur 5V
Si le convertisseur USB de la carte est actif (USB branché), la consommation est de l'ordre de 6 à 8mA.

2. Description

Ce voltmètre / ampèremètre sera développé sur une carte ARDUINO NANO.

L'appareil sera pourvu d'un connecteur USB-B en entrée. Vous pourrez donc le connecter au PC avec un câble USB d'ARDUINO UNO ou MEGA.
La sortie sera faite sur un connecteur USB-A. Vous pourrez donc la connecter à la carte à mesurer avec un câble adapté à celle-ci : USB-B, MINI-USB ou MICRO-USB.
Les pins DATA seront bien sûr connectées entre elles afin de permettre d'utiliser l'IDE ARDUINO (téléversement, moniteur série) sur la carte en cours de mesure.

Voici le schéma de câblage :
Nous allons l'équiper d'un petit afficheur graphique OLED de 128x32 pixels.
Laissons de côté le classique, horrible et encombrant LCD 2x16 caractères en mode ASCII.

Le voltmètre / ampèremètre pourra être alimenté de différentes façons :
  • un cordon MINI-USB relié directement à la NANO
  • une alimentation externe 7.5V à 12V grâce à un connecteur JACK implanté sur le PCB. Vous pourrez directement utiliser une  alimentation prévue pour une UNO ou une MEGA
  • deux batteries LITHIUM-ION 18650. Les deux batteries sont optionnelles et seront placées dans des supports soudés sous le PCB afin de ne pas occuper d'espace sur celui-ci.
Quel principe de mesure allons nous retenir ?

J'ai fait quelques essais infructueux avec l'ADC de l'ARDUINO. La piètre résolution de celui-ci (10 bits) conduirait à employer un shunt de valeur bien trop élevée, de l'ordre de 10Ω, ce qui pénaliserait lourdement la mesure de courants élevés.

Je me suis donc naturellement tourné vers l'INA226 (avec 16 bits c'est nettement plus confortable) précédemment utilisé sur mon banc de mesure. Après quelques essais avec un shunt de 100mΩ il semble bien que l'on puisse atteindre la résolution voulue.

La théorie :
La tension maximale aux bornes du shunt est de 81.92mV, ce qui correspond avec un shunt de 100mΩ à un courant maximal mesurable arrondi de 820mA.
La résolution est donc de 820 / 32768 = 25µA.
Pourquoi 32768 alors que l'ADC de l'INA226 est un 16bits ? Parce qu'il est capable de mesurer des courants négatifs, donc 16 bits moins le bit de signe cela fait 15, et 2 à la puissance 15 = 32768.
Je pense qu'avec un shunt de 250mΩ la résolution serait optimale, au prix d'une baisse du courant maximal mesurable : 330mA. Mais je n'ai que des shunts de 100mΩ sous la main.

Mais vous avez le choix :
  •  shunt de 100mΩ : résolution 25µA, courant maxi 820mA
  •  shunt de 200mΩ : résolution 12.5µA, courant maxi 410mA
  •  shunt de 250mΩ : résolution 10µA, courant maxi 330mA
Dans tous les cas, la chute de tension maximale aux bornes du shunt sera celle de l'INA226 : 81.92mV, ce qui est très acceptable.
Si vous avez besoin de 820mA de courant maxi et d'une résolution de moins de 10µA, le Banc de Mesure de Consommation que j'ai développé dispose de deux INA226, et de deux shunts de 100mΩ et 10Ω avec sélection automatique du calibre.

3. Le matériel

Pour réaliser ce montage il vous faudra :
  • un ARDUINO NANO
  • un module INA226
  • un shunt 100mΩ, 200mΩ ou 250mΩ CMS 2010 ou 2512
  • un afficheur SSD1306 0.91 pouces
  • 3 condensateurs de 100nF
  • deux connecteurs 15 broches femelle au pas de 2.54
  • un connecteur 8 broches femelle au pas de 2.54
  • un connecteur 4 broches femelle au pas de 2.54
  • un connecteur USB-A pour PCB
  • un connecteur USB-B pour PCB
  • un connecteur d'alimentation jack 5.5 x 2.1
  • un inverseur pour PCB
  • deux supports pour batterie 18650 (optionnel)
  • quatre colonnettes M3 longueur 10mm ou 30mm si vous installez les supports de batterie
Souvent les modules INA226 sont équipés d'un shunt 10mΩ.
Ils doivent être remplacés. Il s'agit de résistance CMS 2010 ou 2512.

La soudure que vous allez effectuer sur cette résistance ne sera pas aussi bien réalisée que celle d'un module INA226 produit en usine. Je vous conseille de dessouder la résistance d'origine, de  bien nettoyer les pads du module avec de la tresse à dessouder et de souder la nouvelle résistance avec soin en plaquant bien la résistance sur les pads.
Si vous constatez un petit écart entre la valeur affichée et ce que mesure votre multimètre préféré, c'est que votre soudure est imparfaite. Il vous faudra sans doute corriger la mesure dans le logiciel (voir paragraphe 6. Offset et étalonnage).

Si vous pouvez trouver un module INA226 avec un shunt de 100mΩ ou 200mΩ, n'hésitez pas.

4. Le schéma


Le schéma est réalisé à l'aide de KICAD.

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

Vous pouvez aisément essayer ce montage sur une breadboard, avec un ARDUINO NANO, MINI ou UNO.

Comme vous le voyez, le montage est très basique. Le SSD1306 et l'INA226 communiquent par le bus I2C avec la NANO.
Le SSD1306 est alimenté par la broche 3.3V de la NANO.

5. L'IDE ARDUINO

Il vous faudra installer les bibliothèques ARDUINO suivantes :
Librairie INA226 : https://github.com/jarzebski/Arduino-INA226

Dans votre IDE (arduino-cc 1.8.5 par exemple), dans le menu "Outils/Type de Carte" choisir "Arduino NANO".
Dans le menu "Outils/Processeur", en fonction de l'âge de votre carte, il se peut que vous ayez à choisir "ATmega328P" ou "ATmega328P (Old Bootloader)".

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

Dans ce sketch la valeur du shunt est de 112mΩ au lieu de 100mΩ. Ceci est certainement du à la qualité de la soudure que j'ai réalisé.

Si vous choisissez une valeur de shunt différente n'oubliez pas de reporter cette valeur dans le sketch aux lignes 8 et 9 :

#define ina226_OHM                0.200 // ohm
#define INA226_SHUNT              200 // mohm

 

6. Offset et étalonnage

L'INA226 n'est par d'une précision absolue. Il a un petit offset. Lors du premier démarrage, ne branchez rien sur le port de sortie USB-A. Il affiche une petite valeur de courant.
La valeur relevée sur mon exemplaire est de -0.04 mA.
Cette valeur doit être reportée en négatif dans le sketch à la ligne 11 comme ceci :

#define OFFSET                    0.04

Recompiler et recharger le sketch dans la NANO. Maintenant le voltmètre / ampèremètre doit afficher 0.00 ou -0.00.

Après cette opération, les mesures de faible valeurs seront beaucoup plus exactes.

Pour ceux qui le désirent, il est possible aussi d'ajuster la valeur du shunt dans le code par comparaison de la valeur affichée par le voltmètre / ampèremètre avec celle affichée par un multimètre branché en série avec la charge.
Pour cela il vous faudra bricoler un câble USB pour permettre d'insérer le multimètre sur le fil rouge (voir paragraphe suivant).

Il faut modifier la valeur dans le sketch aux lignes 8 et 9 :

#define ina226_OHM                0.112 // ohm
#define INA226_SHUNT              112 // mohm


Lorsque la valeur affichée correspond à celle donnée par le multimètre, c'est que votre étalonnage est correct. La précision dépendra bien entendu de celle de votre multimètre.

Inutile de chercher à atteindre les 0.1%. La précision de la mesure d'un courant n'est pas aussi cruciale que celle d'une tension. On cherche à avoir une bonne estimation de la consommation afin d'être capable de dimensionner correctement la capacité de l'alimentation ou de la batterie qui va fournir l'énergie au montage, rien de plus.

7. Utilisation

Maintenant que le voltmètre / ampèremètre est réalisé, comment s'en servir ?

Alimentons le voltmètre / ampèremètre. Vous avez le choix :
  • un câble  / mini-USB directement sur la NANO du voltmètre / ampèremètre
  • une alimentation 7.5V à 12V sur le JACK du voltmètre / ampèremètre
  • deux batteries LITHIUM-ION
Nous allons relier maintenant le port USB-B à un port USB du PC ou un HUB. Ensuite le port USB-A va être relié à l'aide d'un autre câble à la carte à tester, une NANO dans mon cas, donc un câble MINI-USB :


En bas : le câble MINI-USB d'alimentation du voltmètre / ampèremètre.
En haut à droite :  le câble USB-A / MINI-USB reliant le voltmètre / ampèremètre à la carte à mesurer (la NANO à gauche de la carte).
En haut à gauche :  le câble USB-A / USB-B reliant le voltmètre / ampèremètre au PC.

On aura pris soin de modifier cette NANO pour nos essais, car nous allons essayer de mesurer sa consommation en mode veille :
- retrait de la LED POWER
- retrait de son régulateur 5V

Chargeons ce petit sketch dans la carte à tester :

#include <LowPower.h>

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
}

Il ne s'agit pas de charger ce sketch dans la NANO située sur le voltmètre / ampèremètre bien entendu. Il faut être certain de choisir le bon port USB.
Si vous alimentez le voltmètre / ampèremètre par la prise JACK ou deux batteries, pas de confusion possible.

Si vous utilisez un câble USB-A / MINI-USB pour relier la NANO du voltmètre / ampèremètre au PC le plus simple est d'utiliser le port de charge d'un HUB USB, comme le port jaune de celui-ci :
Qu'affiche le voltmètre / ampèremètre ?
Tension = 5.29V et courant 5.8mA en veille, et quelques 25mA quand la LED clignote. Jusque là rien d'anormal. Les 5.8mA correspondent à la consommation du convertisseur USB / série de la NANO.

On ne peut donc éviter de mesurer ce courant non voulu, alors que plus haut nous disions que "Il faut savoir qu'un ARDUINO NANO par exemple est capable de descendre à 90µA de consommation, si on le modifie légèrement" ?

Mais comment allons nous mesurer la consommation réelle de la carte à tester en mode veille ?
Il faut donc rendre le convertisseur USB / série inactif, simplement en omettant de l'alimenter.

Nous allons nous aider d'un petit câble, que vous pouvez acheter ou fabriquer vous-même :
Si vous fabriquez ce câble vous-même vous utiliserez de préférence quatre connecteurs DUPONT à 1 broche séparés. Ce sera plus pratique. Dans le cas contraire, vous utiliserez deux fils DUPONT même / femelle pour le raccordement au 5V et GND de la carte à mesurer.

Il suffit de brancher ce câble sur le port USB-A du voltmètre / ampèremètre et de connecter uniquement le fil noir à la pin GND de la carte à tester et le fil rouge à la pin +5V.

Oh magie, un beau petit 0.08mA apparaît sur l'afficheur :


Par contre vous ne pouvez plus charger de sketch dans la NANO, et pour cause, les deux fils data ne sont pas branchés. Retour au câble USB normal donc, car vous avez besoin de poursuivre votre travail.

Mais vous avez au moins validé le fait que votre carte consomme peu. Il faudra simplement faire cette vérification une dernière fois lorsque votre application sera terminée.

8. Photos

Ci-dessous deux photos du montage réalisé :


Oui, l'afficheur est en haut à droite, c'est tout petit. A sa gauche, l'INA226.
 

9. Téléchargements

Le projet est disponible ici :

https://bitbucket.org/henri_bachetti/ina226-usb-amperemeter.git

Cette page vous donne toutes les informations nécessaires :
https://riton-duino.blogspot.com/p/migration-sous-bitbucket.html

10. Conclusion

Je reconnais que cet article est un peu long mais il faut bien expliquer comment concevoir ce genre d'appareil, et justifier les choix par un peu de théorie.

Sur ce blog vous avez certainement remarqué mon intérêt pour tout ce qui touche à l'alimentation par batterie de nos petits processeurs préférés. Ce genre d'appareil est précieux et indispensable quand il s'agit de mener à bien un projet basse consommation.

Bonnes bidouilles.
Cordialement
Henri

11. Mises à jour

04/11/2018 : ajout d'informations dans les paragraphe 2, 3, 6 et 10
17/11/2018 : ajout schéma de câblage et photos paragraphe 7. Utilisation


12 commentaires:

  1. Bonjour,
    Pardonnez moi pour cette "intrusion tardive". Je m'intéresse de près à vos publication et tente de réaliser votre voltmètre/Ampèremètre et je me heurte déjà à un problème dans le code.
    Sur le ligne "long shuntVoltage = ina226.readRegister16(INA226_REG_SHUNTVOLTAGE) * 25L / 10;" l'IDE me laise ce message laconique "within this context", que je suis bien incapable d'interpréter.
    Pourriez-vous m'aider?
    Bien cordialement.
    Alain

    RépondreSupprimer
  2. Il faudrait fournir l'ensemble des messages de l'IDE.

    RépondreSupprimer
  3. OK j'ai vu le problème.
    J'avais modifié la librairie INA226 pour pouvoir appeler la méthode readRegister16, qui est privée dans cette librairie.
    J'ai fait la modification nécessaire dans mon code et j'ai re-testé.
    Le code est à jour sur bitbucket.
    Merci pour la remarque.
    Cordialement
    Henri

    RépondreSupprimer
  4. Bonjour,
    Merci de m'avoir répondu. Voici l'ensemble des messages.

    In file included from D:\CloudStation\Arduino\USB-power-meter\USB-power-meter.ino:2:0:

    D:\CloudStation\Arduino\libraries\Arduino-INA226-master/INA226.h: In function 'float readShuntCurrent()':

    D:\CloudStation\Arduino\libraries\Arduino-INA226-master/INA226.h:151:10: error: 'int16_t INA226::readRegister16(uint8_t)' is private

    int16_t readRegister16(uint8_t reg);

    ^

    USB-power-meter:107:68: error: within this context

    long shuntVoltage = ina226.readRegister16(INA226_REG_SHUNTVOLTAGE) * 25L / 10;

    ^

    USB-power-meter:108:9: error: redeclaration of 'float shuntCurrent'

    float shuntCurrent = (float)shuntVoltage / INA226_SHUNT + OFFSET;

    ^

    D:\CloudStation\Arduino\USB-power-meter\USB-power-meter.ino:106:9: note: 'float shuntCurrent' previously declared here

    float shuntCurrent = ina226.readShuntCurrent() * 1000;

    ^

    exit status 1
    within this context

    RépondreSupprimer
  5. Nos messages se sont croisés ...
    Le problème est résolu.

    RépondreSupprimer
  6. Merci beaucoup pour votre réactivité. En effet le problème est résolu avec la mise à jour.
    Cordialement.
    Alain

    RépondreSupprimer
  7. Je tenais aussi à vous féliciter pour la tenue de votre blog, qui sans aucun doute nécessite beaucoup de travail et de compétences.
    Bon dimanche.
    Alain

    RépondreSupprimer
  8. Bonjour,
    Pour commencer, bravo et merci pour cet article, complet et précis.
    Je suis actuellement en train de me lancer dans ce projet et j'ai juste une question par rapport à l'intervalle d’échantillonnage de la mesure : Est-il paramétrable ?, sioui quel en sont les limites (temps minimum d'exécution de la loop principale)?
    Car j'aimerais mesurer une consommation avec un temps d’échantillonnage de l'ordre de la dizaine de us.

    Merci D'avance !
    Théo.

    RépondreSupprimer
    Réponses
    1. Comment voulez-vous obtenir un intervalle de mesure de 10µs, donc 100K échantillons à la seconde avec un INA226 sur bus I2C à 100KHz?
      Si une résolution de 12 bits suffisent, orientez-vous plutôt sur l'ADC interne d'un STM32.
      Voyez ici : https://riton-duino.blogspot.com/2019/04/stm32-ladc.html

      Supprimer
    2. Qu'allez-vous faire d'un tel flux de données ?
      1) afficher une moyenne ?
      Pour cela il faut une certaine quantité de mémoire.
      Un afficheur, même SPI, vous ralentira fortement.
      2) transmettre les échantillons à un PC ?
      A l'aide de quel média ? Ethernet ?

      Supprimer