Affichage des articles dont le libellé est Mesure. Afficher tous les articles
Affichage des articles dont le libellé est Mesure. Afficher tous les articles

jeudi 29 décembre 2022

STM32 BLUE PILL vs ARDUINO NANO

 


STM32 BLUE PILL vs ARDUINO NANO


Bonjour, aujourd'hui nous allons examiner de plus près la carte BLUE PILL, équipée d'un microcontrôleur STM32F103C8T6.

J'avais déjà parlé de cette carte ici :

STM32 et ARDUINO

A mon sens, la BLUE PILL est une carte très avantageuse par rapport à l'ARDUINO NANO.

Ce tableau décrit les possibilités du STM32F103C8T6 48 pins. D'autres modèles plus puissants intègrent plus de mémoire FLASH, plus de périphériques, etc.

FonctionARDUINO NANOBLUE PILL
Broches3040
Processeur8 bits32 bits
Alimentation du microcontrôleur5V2V - 3.6V
Horloge16MHz72MHz
Mémoire FLASH32Ko64Ko
Mémoire RAM2Ko20Ko
Mémoire EEPROM1Ko4Ko (1)
GPIOs22 (6 PWM)32 (15 PWM) (2)
UARTs13
I2C12
SPI12
CAN01
USB01
JTAG01
ADC1 ADC 10 bits2 ADC 12 bits

(1) l'EEPROM est émulée en mémoire FLASH, comme sur un ESP32.

(2) les GPIOs sont tolérantes au 5V, il n'y a donc pas lieu d'ajouter des protections particulières.

Les 20Ko de RAM sont un avantage certain. Lorsque je développe du logiciel sur une NANO, je suis plus souvent confronté à un manque d'espace en RAM (données) qu'à un manque d'espace en FLASH (programme).

Egalement, la présence de 3 UARTs dispense d'utiliser des objets du genre SoftwareSerial, peu performants, lorsque l'on désire intégrer des périphériques du genre modem, BlueTooth, DfPlayer.

Le prix de la BLUE PILL est sensiblement équivalent à celui de l'ARDUINO NANO sur AliExpress. C'est dire si j'envisage sérieusement de l'utiliser en lieu et place de l'ARDUINO NANO dans mes projets.

Nous allons tout d'abord étudier la carte, et surtout sa mise en oeuvre.

1. La librairie STM32DUINO

Si l'on veut travailler avec la même facilité qu'avec l'ARDUINO, il faut installer un gestionnaire de cartes supplémentaire, comme pour un ESP32. Pour cela, dans l'IDE ARDUINO, il faut ouvrir les préférences (menu Fichiers / Préférences) et ajouter l'URL suivante (URL de gestionnaire de cartes supplémentaires).

https://github.com/stm32duino/BoardManagerFiles/raw/master/package_stmicroelectronics_index.json

Si ce champ comporte déjà une ou plusieurs URLs, il faudra utiliser un séparateur, qui est la virgule.

2. Les connecteurs

2.1. Le connecteur USB

Ce connecteur est bien relié aux GPIOs PA11 et PA12, comme prévu dans la datasheet. On pourrait penser que l'on peut l'utiliser comme le port USB de l'ARDUINO NANO (chargement du code, moniteur série), mais il n'en est rien.

En effet, pour que l'USB soit utilisable pour le chargement du code, il faudrait qu'il soit initialisé par un bootloader. Or il n'y a pas de bootloader prévu pour cette carte. Le chargement est bien réalisé par un bootloader mais il est interne au microcontrôleur, et utilise l'UART1 (PA9 & PA10).

Certains ont cependant écrit un bootloader : https://how2electronics.com/stm32-bootloader-programming-usb/

2.2. UART1 : PA9 et PA10

Ces deux broches permettent le chargement du code. Il faut sélectionner les bonnes options dans le menu Outils :
  • Type de carte : Generic STM32F1 series
  • Board part number : BluePill F103C8
  • Upload Method : STM32CubeProgrammer (Serial)

Ensuite le raccordement de la carte est simple. Il requiert un convertisseur USB / Série : 

Il faut bien entendu utiliser un modèle de convertisseur adapté au 3.3V, comme celui-ci, qui est équipé d'un cavalier permettant de choisir entre 5V et 3.3V :

FT232RL 5V/3.3V

Remarque : si la carte est alimentée par le connecteur USB ou la broche 5V, le fil rouge est inutile.

Avant le chargement il faut déplacer le cavalier boot0 de la carte BLUE PILL sur 1. Avant chaque chargement du code il faudra appuyer sur le bouton RESET.

Si l'on veut que la carte démarre directement l'application, il faudra replacer le cavalier boot0 sur 0.

2.3. Le connecteur SWD

Le connecteur à 4 broches en bout de carte peut être relié à un boîtier ST-LINK, afin de charger le code : 




Le câblage se fait avec 4 fils seulement : 3.3V, GND, SWDIO, SWDCLK.

La vitesse de chargement est supérieure à celle de la liaison série, et il n'y a pas besoin d'appuyer sur le bouton RESET.

Il faut sélectionner les bonnes options dans le menu Outils :
  • Type de carte : Generic STM32F1 series
  • Board part number : BluePill F103C8
  • Upload Method : STM32CubeProgrammer (SWD)

Le boîtier ST-LINK a un autre avantage : il peut permettre de deboguer son application à l'aide d'un debugger, GDB par exemple.

2.3. Moniteur série

Que l'on utilise l'une ou l'autre méthode de chargement, le moniteur série (Serial) utilise l'UART1, donc PA9 et PA10. L'utilisation d'un boîtier ST-LINK ne dispense donc pas de l'achat d'un convertisseur USB / Série si l'on veut afficher des informations sur le moniteur série.

2.4. Alimentation

La carte peut être alimentée de plusieurs manières : 

  • par le connecteur USB, en 5V. La broche 5V, dans ce cas, fournira cette même tension
  • par la broche 5V de la carte
  • par la broche 3.3V de la carte
  • par le convertisseur USB / série. On connectera la broche VCC à la broche 3.3V de la carte
  • par le boîtier ST-LINK. On connectera la broche VCC à la broche 3.3V de la carte

Si la carte est alimentée par l'USB ou la broche 5V, le 3.3V nécessaire au STM32 est fourni par un régulateur RICHTEK RT9193, un bon régulateur LDO, capable de fournie 300mA. Son courant de repos est de 90µA.

Contrairement à une carte ARDUINO il n'y a aucune protection par diode entre le 5V USB et la broche 5V. Cela veut dire que si l'on alimente la carte par la broche 5V, et que l'USB est branché, le 5V de la carte est directement relié au 5V USB. Il peut y avoir danger si les deux tensions sont vraiment différentes.

3. L'ADC

Par rapport à l'ADC de l'ARDUINO, celui de la BLUE-PILL est assez différent :

  • la tension de référence est de 3.3V, la tension d'alimentation du microcontrôleur
  • la résolution est supérieure : 12 bits, donc 4096 points, au lieu de 1024
  • le temps d'échantillonnage est nettement inférieur
  • la broche AREF n'existe pas, sauf sur de plus grosses cartes

3.1. Résolution

La résolution d'un ATMEGA328P est de 10 bits, contre 12 bits pour le STM32, ce qui produira des mesures 4 fois plus précises.

3.2. Temps d'échantillonnage

Le temps d'échantillonnage du STM32 est largement inférieur à celui d'un ATMEGA328P :
  • 740000 samples/s au maximum pour le STM32F401, assez proche du STM32F103C8T6
  • 38470 samples/s pour l'ATMEGA 328P en poussant l'horloge de l'ADC au maximum
On constate aisément que la vitesse d'acquisition sera nettement supérieure avec un STM32.

4. Exercice

Je propose de construire un petit voltmètre, équipé d'un afficheur 4 digits à 7 segments du genre TM1637.

4.1. Schéma

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

Le montage est alimenté par le connecteur USB, car le TM1637 a besoin de 5V pour pouvoir fonctionner.

Le chargement du code peut se faire via le connecteur SERIAL ou par le connecteur SWD en bout de carte.

L'entrée à mesurer peut recevoir une tension variable entre 0V et 3.3V (un simple potentiomètre suffit).

Si l'on désire mesurer des tensions plus importantes, il suffit d'utiliser un pont diviseur à résistances :

U2 = U * R2 / (R2+R1)

4.2. L'IDE ARDUINO

Il faut bien entendu installer le package STM32DUINO, si ce n'est pas déjà fait.

Ensuite il faudra installer la librairie suivante :

TM1637 : https://github.com/RobTillaart/TM1637_RT

Celle-ci est installable depuis l'IDE ARDUINO.

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

4.3. Le code

Le code ressemble beaucoup à ce que l'on pourrait écrire si la carte était une NANO, aux définitions des GPIOs près : 

bluepill-voltmeter.ino

Le croquis utilise 21332 octets (32%) de l'espace de stockage de programmes. Le maximum est de 65536 octets.

Les variables globales utilisent 852 octets (4%) de mémoire dynamique, ce qui laisse 19628 octets pour les variables locales. Le maximum est de 20480 octets.

Comme on peut le constater, le code occupe un espace bien supérieur au même code compilé pour l'ARDUINO NANO : 

Le croquis utilise 4896 octets (15%) de l'espace de stockage de programmes. Le maximum est de 30720 octets.

Les variables globales utilisent 331 octets (16%) de mémoire dynamique, ce qui laisse 1717 octets pour les variables locales. Le maximum est de 2048 octets.

Ceci est dû au fait que le STM32F103C8T6 est un microcontrôleur 32 bits, mais probablement aussi à la librairie STM32DUINO.

Mais, qu'il s'agisse de mémoire FLASH ou RAM, la quantité restante est supérieure à celle qu'offre la NANO : 

  • FLASH : 44204 octets
  • RAM : 19628 octets
Nous serons donc beaucoup plus à l'aise pour développer de grosses applications, ou utiliser des librairies de taille conséquente.

4.4. Téléchargements

Pour télécharger le projet : https://bitbucket.org/henri_bachetti/bluepill-voltmeter

Cette page donne toutes les informations nécessaires :

https://riton-duino.blogspot.com/p/migration-sous-bitbucket.html

5. Photos


En haut : le convertisseur USB / Série.

A gauche : la BLUE PILL.

A droite : L'afficheur TM1637.

Au milieu : le petit potentiomètre bleu permettant d'ajuster la tension à mesurer.

Le multimètre affiche 3.034V, alors que le montage affiche 3.014V.

Ceci est dû au fait que je n'ai pas mesuré la tension de 3.3V produite par la carte. Or elle vaut 3.33V, contre 3.31V dans le code. En corrigeant cette petite erreur, tout rentre dans l'ordre.

A ce sujet, il faut rappeler que le STM32F103C8T6 possède bien une broche AVDD, permettant de fixer la tension de référence analogique. Mais sur la BLUE PILL, cette broche est reliée au 3.3V. Pour faire des mesures précises, il convient donc de mesurer cette tension avec un multimètre suffisamment précis.

6. Conclusion

Ces cartes, une fois bien prises en main, ont un potentiel comparable à celui de l'ARDUINO NANO, et même largement supérieur si l'on veut profiter des possibilités supplémentaires : 

  • grande quantité de mémoire
  • plusieurs liaisons série
  • double bus I2C, SPI
  • etc.


Cordialement

Henri


jeudi 14 octobre 2021

ADS1256 : ADC Hautes Performances


ADS1256 : ADC Hautes Performances

 

Cet article présente un ADC (Analog to Digital Converter) hautes performances : l'ADS1256 :

  • 8 canaux (ou 4 en différentiel)
  • 24 bits
  • ±0.0010% maxi de non linéarité
  • bruit : 27nV
  • bus SPI
  • 30KSPS : 30000 échantillons par seconde
  • PGA : Amplificateur à Gain Programmable (1 à 64)

Ce convertisseur est un petit monstre dont il conviendrait d'exploiter au mieux les possibilités car son prix est conséquent : 15€.

AliExpress

On peut reprocher à cette carte d'être livrée avec des connecteur mâles déjà soudés sur la carte, ce qui oblige à utiliser des fils DUPONT femelles pour le raccordement. Ce n'est pas le cas de celle-ci :

Avec ce modèle on pourra souder les broches sous la carte et enficher ou souder celle-ci sur un PCB, pour une réalisation plus professionnelle.

Pour mon usage personnel, les 24bits de résolution de cet ADC sont franchement overkill, mais sa vitesse d'échantillonnage importante est un atout indéniable.

Texas Instruments a à son catalogue une foule d'ADCs SPI plus ou moins performants, mais celui-ci a un avantage incontestable : sa disponibilité sous forme de module.

Contrairement à l'ADS1115, on trouve assez peu d'informations sur le WEB concernant l'utilisation de l'ADS1256 avec un ARDUINO. Cela justifie bien un petit effort de ma part.

1. Le câblage

C'est un module SPI, donc il aura besoin d'un peu plus de broches qu'un classique ADS1115 I2C :

2. La librairie

Il faut installer la librairie suivante :

https://github.com/adienakhmad/ADS1256

Elle n'est pas installable depuis l'IDE. Il faudra l'installer en téléchargeant le fichier ZIP, et le décompresser dans le répertoire libraries de l'IDE.

On peut également l'installer avec git :

git clone https://github.com/adienakhmad/ADS1256

3. Testons

Chargeons l'exemple ADS1256_Efficient_Input_Cycling

Cet exemple implémente une mesure différentielle, c'est à dire que la mesure est effectuée entre deux canaux, ce qui réduit le nombre d'entrées possibles, 4 au lieu de 8.

A remarquer : l'ADS115 4 canaux est aussi capable de faire de la mesure différentielle, sur 2 entrées.

ATTENTION : l'ADS1256 possède un buffer d'entrée qui permet d'augmenter l'impédance d'entrée. Il peut être configuré grâce au bit BUFEN du registre de status. En fonction de la configuration, il ne faut pas dépasser une certaine tension d'entrée :

  • BUFEN = 0 la tension d'alimentation
  • BUFEN = 1 la tension d'alimentation moins 2V :

Par défaut BUFEN = 0.

De plus, la tension de référence de l'ADS1256 est de 2.5V. Au delà l'ADC saturera.

Appliquons une petite tension continue entre AIN0 et AIN1.

Le moniteur série devrait afficher ceci :

1.2943882942    -0.0000190735    -0.0000441074    -0.0000452995
1.2945414733    -0.0000226498    -0.0000381470    -0.0000512600
1.2944860458    -0.0000208616    -0.0000476837    -0.0000542402

La stabilité de la mesure différentielle est bien meilleure que ce que j'ai pu observer avec un ADS1115.

4. Conclusion

Cet ADC est à réserver à des applications exigeantes.

4.1. Mesures de précision

Avec son échantillonnage sur 24bits il a une résolution nettement supérieure à un ARDUINO (10bits), un ADS1115 ou un INA226 (16bits).

Pour information la résolution en pourcentage d'un ADC se calcule ainsi :

Pourcentage = 1 / 2^Résolution * 100

  • 10bits : 0.1%
  • 16bits : 0,0015%
  • 24bits : 0,000006%

Ce pourcentage représente le poids d'un bit par rapport à la pleine échelle, tout comme pour un multimètre. Il ne faut pas confondre résolution et précision.

Dans le cas d'un multimètre ayant une résolution de 2000 points, une différence de 1 point dans la mesure représente 0.5% de la pleine échelle, mais sa précision réelle peut aller jusqu'à 3%.

Dans le cas de l'ADS1256, une différence d'un point dans la mesure représente :

Résolution en volts = 3V / 2^Résolution = 3V / 2^24 =180nV

Bien entendu, pour obtenir la véritable précision de l'ADC, il faut ajouter la non linéarité : ±0.0010% maxi dans le cas de l'ADS1256, et également le bruit : 27nV.

4.2. Mesures de signaux rapides

Avec sa vitesse d'acquisition de 30KSPS il sera possible de mesurer des signaux de fréquence relativement élevée, ou des transitions rapides, par exemple mesurer les pointes de consommation d'un microcontrôleur, à l'aide d'une résistance shunt.

Un ADS1115, en comparaison, a une fréquence d'échantillonnage de 860SPS, 35 fois inférieure.

L'ADS1256 n'est pas tout à fait assez rapide pour faire des mesures en audio. Une fréquence d'échantillonnage supérieure à 40KHz serait préférable, mais avec ses 30KSPS, il se défend bien tout de même.

Seul l'ADC d'un gros microcontrôleur, un STM32 par exemple, fera mieux : 

STM32 : l'ADC

4.3. Analyse de signaux

Concernant ce point, il ne faut pas rêver. Avec un ARDUINO, et ses 2Ko de mémoire RAM, il sera difficile d'analyser quoi que ce soit, mis à part faire une moyenne sur un certain nombre d'échantillons ou déterminer la valeur maximale ou minimale d'une tension.

Un ESP32 sera certainement plus adapté pour faire des analyses plus poussées.

4.4. Mesure de tensions élevées

Pour mesurer des tensions supérieures à 3V, il est indispensable d'utiliser un pont diviseur à résistances sur les entrées de l'ADS1256.

On trouve couramment des résistances de précision à 0.1%.

4.5. Mesure de signaux faibles

Son PGA (gain programmable de 1 à 64) est capable d'amplifier les signaux à mesurer. Il sera possible par exemple de mesurer des signaux de 3V / 64 = 47mV à pleine échelle, tout en conservant la précision de 24bits.

Il n'est pas interdit de lui adjoindre un amplificateur d'instrumentation si l'on désire mesurer des signaux plus faibles.

 

Cordialement

Henri


lundi 13 septembre 2021

REW : Faire des Mesures en Audio

 


REW : Faire des Mesures en Audio

 

Lorsque l'on travaille sur des projets audio, il arrive souvent que l'on ait à faire des mesures de courbes de réponse, spécialement dans les cas suivants :

  • enceintes acoustiques
  • salles d'écoute
  • filtres passifs
  • filtres actifs

Il y a longtemps, ces mesures étaient effectuées à l'aide d'appareils dédiés, très chers, ou bien à l'aide d'un générateur basse fréquence et d'un oscilloscope, procédé très fastidieux.

Mais actuellement, un ordinateur équipé d'une carte son peut être une très bonne solution.

Dans et article nous allons parler de REW. Ce logiciel est très connu des amateur de conception d'enceintes DIY, mais peu d'électroniciens le connaissent.

Le but de cet article n'est pas de refaire ce que beaucoup de personnes ont déjà fait et écrit sur le sujet, mais d'orienter vers les tutoriels courants, et donner quelques conseils utiles.

1. Principe

La mesure d'une courbe de réponse s'effectue à l'aide d'un générateur d'onde sinusoïdale, qui applique un signal de fréquence variable à l'entrée du circuit à tester, 20Hz à 20000Hz par exemple. Ce balayage s'appelle SWEEP en anglais.

Sur un PC, on peut parfaitement générer un sweep et l'envoyer sur la sortie ligne.

Pour chaque changement de fréquence on mesure le signal en sortie. Une entrée de la carte son permettra de faire cette mesure.

1.1. Mesures d'enceintes acoustiques

C'est l'utilisation la plus courante. Ces mesures nécessitent l'utilisation d'un microphone. Il en existe deux types :

  • microphone USB
  • microphone XLR

Le MiniDSP UMIK-1 est un microphone USB. Il se raccorde directement au PC.

Le Superlux ECM999 et le Behringer ECM8000 sont des microphones XLR. Comme tous les microphones de ce type ils ont besoin d'une alimentation fantôme, fournie par la majeure partie des cartes son professionnelle.Une Focusrite Scarlett 2i2 peut parfaitement faire l'affaire :

Focusrite Scarlett 2i2

Si le niveau sonore réel fait partie des mesures à effectuer, un sonomètre sera nécessaire. On trouve des modèles bon marché sur AliExpress :

UNI-T UT353

Ce modèle fonctionne très bien pour des niveaux supérieurs à 38dB, mais il n'est cependant pas apte à mesurer des niveaux sonores plus faibles.

Si je calibre mon micro avec ce sonomètre, ma chaîne d'acquisition ECM999 + Focusrite Scarlett 2i2 est capable de mesurer des bruits inférieurs à 30dB, alors que le sonomètre n'en est pas capable. Je pense que son électronique doit être sérieusement bruitée.

Avec le Digital Sound 8922 il sera possible de mesurer des bruits ambiants en dessous de 30dB. Il est beaucoup plus cher, mais il est livré avec un certificat de calibration.

Sur pas mal de sites, on trouve des échelles de niveau sonore pour différents bruits courants :

Exemple : https://www.loos.fr/sites/default/files/2017-10/Echelle%20du%20bruit%20au%20quotidien_0.pdf

Avec le UNI-T UT353 je mesure 38dB au minimum dans mon habitation, avec le Digital Sound 8922 plutôt 28dB, ce qui est beaucoup plus proche de la réalité. Tout dépend donc des besoins de chacun.

ATTENTION : lors de la mesure d'enceintes acoustiques, celles-ci vont émettre des sons d'une puissance plus ou moins élevée en fonction du réglage de volume de l'amplificateur. Il est utile de procéder par étape, en commençant par un volume faible, et augmenter le volume petit à petit. Le niveau sonore doit être suffisant pour ne pas être noyé dans le bruit ambiant, mais suffisamment modéré pour ne pas devenir sourd.

Si l'on désire faire des mesures avec un niveau acoustique élevé, un bon casque anti-bruit est recommandé.

1.2. Mesures de circuits électroniques

La mesure de circuit électroniques ne requiert aucun matériel particulier, si ce n'est quelques câbles.

Le type de carte son à utiliser dépend du type de circuit à mesurer :

  • asymétrique (entrées / sorties RCA ou JACK stéréo)
  • symétrique (entrées / sorties XLR ou JACK symétrique)

Dans un câble asymétrique le signal est transporté par un seul fil, le retour étant assuré par le blindage (masse).

Dans un câble symétrique le signal est transporté par deux fils : point chaud et point froid. Le blindage a pour seul rôle de protéger les fils des perturbations électromagnétiques extérieures. Si un parasite traverse le blindage, il va affecter les deux fils de la même manière. On obtient donc deux parasites, un sur le point chaud, un sur le point froid. Comme au bout du câble il y a un appareil symétrique avec un circuit différentiel en entrée, les deux parasites s'annulent.

1.2.1. Utilisation en Hi-FI

Dans la majeure partie des cas, en HI-FI, le matériel est asymétrique. On utilisera les entrées / sorties audio du PC :

  • entrées sorties audio de la carte mère
  • entrées sorties d'une carte son interne

Si le matériel à mesurer est équipé de prises RCA, et la carte son de JACK 3.5mm, deux câbles adaptateurs RCA / JACK 3.5mm mâle suffiront.

Remarque : les sorties lignes peuvent très bien être les sorties RCA d'un DAC relié au PC par USB, si on est équipé de ce genre de matériel.

1.2.1. Utilisation en sonorisation

En sonorisation le matériel est symétrique, des câbles XLR ou JACK TRS (symétriques) seront nécessaires, ainsi qu'une carte son professionnelle adaptée, comme pour la mesure d'enceintes.

Il sera impossible de faire des mesures avec les entrées / sorties JACK d'un PC, à moins de dé-symétriser les signaux, à l'aide de circuits dé-symétriseurs ou de transformateurs.

2. REW

REW (RoomEqWizard) est un logiciel de mesure audio utilisable sous Windows, Mac et Linux. Il est gratuit. On peut le télécharger ici :

https://www.roomeqwizard.com/

On trouve des traductions de son manuel utilisateur :

http://koopstribe.free.fr/REW_V5_Manuel_FR_V2_0.pdf 

Beaucoup de tutoriels existent, y compris sous forme vidéo :

https://www.youtube.com/watch?v=2v-sz7z1-jU

L'auteur en a publié plusieurs.

2.1. Calibration

L'étape de calibration permet d'adapter REW au matériel (microphone et carte son). 

2.2.1. Calibration de la carte son

Cette calibration s'effectue en reliant entre elles une entrée et une sortie de la carte son. On parle de LoopBack.

Si l'on utilise les entrées / sorties son de la carte mère d'un PC, qui sont en règle général des JACK 3.5mm, un simple câble mâle / mâle stéréo suffit.

Attention de bien relier la sortie ligne (verte) sur entrée ligne (bleue), et non pas sur l'entrée microphone (rose).

S'il s'agit d'une carte son professionnelle, un câble adapté est nécessaire. Il faut savoir que les entrées de la majeure partie des cartes son professionnelles sont mixtes (combo XLR / JACK).

Il faut bien lire le manuel de la carte son pour savoir comment brancher un microphone, un instrument, ou un équipement délivrant un niveau ligne.

Un bon tutoriel de calibration se trouve ici :

ProjetHomeStudio

La calibration va également permettre de vérifier que l'on a bien choisi les bonnes entrées / sorties dans les préférences de REW. Si le logiciel estime que le signal mesuré est beaucoup trop faible, il le fera remarquer, et il faudra corriger l'erreur. Il peut aussi estimer qu'il est trop fort (saturation), et il sera préférable de réduire le volume en sortie.

Il faut bien veiller à régler les niveaux d'entrée et de sortie du PC à des valeurs correctes. Envoyer sur une sortie un signal trop fort sur une entrée trop sensible créera de la saturation. Envoyer sur une sortie un signal trop faible sur une entrée trop peu sensible donnera des mesures imprécises, noyées dans le bruit.

2.2.2. Calibration du microphone

Certains microphones haut de gamme sont livrés avec un fichier de calibration personnalisé. Dans la majorité des cas, si le microphone est de bonne qualité, cette calibration est inutile.

Superlux ECM999

Comme on le voit sur ce graphique, la courbe de réponse d'un ECM999 comporte quelques irrégularités après 3000Hz. La courbe de réponse tient dans une fourchette de -0.5dB (en dessous de 25Hz) et +2dB (quelques bosses entre 3000 et 20000Hz).

https://www.hometheatershack.com/threads/superlux-ecm-999-calibration-file.173210/

Sur ce fil de discussion, un intervenant fournit un fichier de calibration, tout en affirmant que la différence avec ou sans calibration est inaudible. Effectivement il faut au moins 3dB à une oreille exercée pour qu'une différence soit décelable, 5dB pour qu'elle soit vraiment significative.

2.2. Mesure

Le même tutoriel que précédemment indique comment effectuer une mesure.

2.2.1. Mesures sur des enceintes acoustiques

Lorsqu'on lance une première mesure, REW annonce "SPL not calibrated". Si l'on possède un sonomètre, il est possible de calibrer le niveau sonore en cliquant sur "Calibrate SPL". Lorsque l'on fera ensuite des mesures avec un microphone les graphiques indiqueront un niveau réel en décibels :

Sur ce graphique, la mesure indique une soixantaine de décibels de niveau acoustique réel, ce qui est très raisonnable. Si le niveau est nettement supérieur, on se fatigue vite, surtout lorsque le sweep arrive dans l'extrême aigu.

Avec REW il est possible de mesurer la courbe de réponse d'une enceinte, mais pas seulement. On peut mesurer sa courbe d'impédance.

Il suffit d'insérer une résistance entre l'amplificateur et l'enceinte :

Et on envoie deux signaux sur deux entrées de la carte son :

  • le signal de sortie de l'amplificateur
  • le signal en aval de la résistance

Cet article de Dominique Pétoin indique comment faire :

https://www.petoindominique.fr/php/mesurematos.php

2.2.2. Mesures sur des circuits électroniques

Bien entendu, ici le niveau acoustique réel n'est pas utile, puisqu'il est inexistant. Le réglage du niveau est également moins critique que pour la mesure d'enceintes, en tous cas la mesure ne casse pas les oreilles, et pour cause. On pourra en toute tranquillité faire des mesures à niveau maximal.

Voici la courbe de réponse d'un filtre Linkwitz&Riley passe-haut calé sur 90Hz.


Il peut arriver que la mesure semble ne correspondre à rien de concret, ou qu'elle ne soit pas répétitive. Dans ce cas, il ne faut pas incriminer forcément le circuit que l'on est en train de tester. Le bug se situe souvent entre l'écran et la chaise, l'être humain :

  • mauvais choix des entrées / sorties dans la configuration de l'ordinateur
  • mauvaise calibration
  • etc.

3. Autres logiciels

Il existe d'autres logiciels, pas forcément gratuits : ARTA par exemple, installable seulement sous WINDOWS

4. Conclusion

REW est un logiciel assez complexe au premier abord. Il faut expérimenter pour l'avoir bien en main. Ensuite il rend de grands services.

Imaginez que vous deviez relever la courbe de réponse d'un filtre à l'aide d'un générateur de fréquences et d'un oscilloscope. Il vous faudra noter chaque valeur dans un tableur et afficher un graphe. Cela prendra un certain temps.

Et s'il faut refaire la mesure après une correction du circuit électronique, cela prendra le même temps.

Avec REW, l'apprentissage et les réglages prennent aussi du temps, mais ensuite chaque mesure dure 5 secondes.

Ceux qui lisent mes articles consacrés à l'audio auront probablement deviné mes intentions : tester un certain nombre de filtres actifs, et à terme, tester le résultat final sur des enceintes multi-amplifiées.


Cordialement

Henri


jeudi 2 juillet 2020

INA138 et MAX4372 : Current Monitoring



INA138 et MAX4372

Current Monitoring


Nous allons aujourd'hui mettre en œuvre L'INA138 et le MAX4372, deux amplificateurs de courant.

Ces composants permettent d'amplifier la tension présente aux bornes d'un shunt de mesure afin d'envoyer une tension mesurable sur l'entrée analogique d'un microcontrôleur.

La sortie de l'INA138 est un générateur de courant. Le gain est donc réglable à l'aide d'une simple résistance.

La sortie du MAX4372 est un générateur de tension. Le gain est fixe et dépend du modèle :

  • MAX4372T : 20
  • MAX4372F : 50
  • MAX4372H : 100

La première question que l'on peut se poser : pourquoi utiliser un amplificateur analogique alors que des modèles numériques existent ? :

  • INA219 (12 bits)
  • INA226 (16 bits)

Ces composants nous apporteraient une précision supérieure, mais ils ont un inconvénient majeur : leur temps de conversion est élevé, 140µS au minimum. Si l'on désire s'affranchir du bruit il est même recommandé d'adopter un temps de conversion supérieur : 1.1ms ou 8.244ms.

Deuxièmement le dialogue se fait en I2C, ce qui n'améliore pas les choses.

Bref le handicap est important si l'on a des variations de courant rapides à observer.

Petit avantage supplémentaire pour l'INA 138 : il consomme 25µA, contre 330µA pour l'INA226. Le MAX4372 est à peine plus gourmand : 30µA.

D'autre part, lorsque l'on mesure un courant, la précision n'est pas le critère principal. Il s'agit souvent de mesurer la consommation d'un montage ou d'un composant et de tracer sa variation dans le temps. Une précision de 0.1% ou 0.5% est totalement inutile.

Le montage suivant pourra être utilisé pour mesurer un courant avec une rapidité qui dépendra uniquement de celle de l'ADC du microcontrôleur.

On peut facilement obtenir plus de 38000 échantillons par seconde avec un ATMEGA328 :

https://riton-duino.blogspot.com/2018/11/arduino-les-performances-de-ladc.html

Certains gros STM32 peuvent offrir plus d'un million d'échantillons par seconde !

https://riton-duino.blogspot.com/2019/04/stm32-ladc.html

La deuxième question que l'on peut se poser : un simple AOP monté en amplificateur ne pourrait-il pas faire le même travail ?

La réponse est non, car l'INA138 et le MAX4372 peuvent accepter sur leurs entrée des tensions largements supérieures à leur tension d'alimentation, ce que ne pourra pas tolérer un AOP.

1. L'INA138

Ce composant est capable de mesurer un courant côté "high side" (rail positif) uniquement. Il peut être alimenté entre 2.7 V à 36 V.
Un autre modèle, l'INA168, peut être alimenté entre 2.7 V à 60 V.


La résistance shunt RS produit une chute de tension proportionnelle au courant traversant la charge. Il convient donc de choisir sa valeur judicieusement, afin de ne pas perturber la charge.
Pour une mesure précise, il est recommandé également de ne pas dépasser 0.5V entre les entrées de l'INA138.

La résistance RL permet de fixer le gain de l'amplificateur (voir figure 9 de la datasheet) :
  • RL=50KΩ pour un gain de 10
  • RL=100KΩ pour un gain de 20
  • RL=250KΩ pour un gain de 50
  • etc.
Imaginons que l'on désire mesurer un courant maximal d'un ampère.
Si l'on admet 100mV de chute de tension dans le shunt, celui-ci aura une valeur de :

RS = 0.1V / 1A = 0.1Ω

Si l'on fixe le gain à 20, la résistance RL doit avoir une valeur de 100KΩ.

La tension maximale en sortie de l'INA138 vaudra :

Vo = Is * RS * RL / 5KΩ = 1A * 0.1Ω * 100KΩ / 5kΩ = 2V

L'entrée analogique du microcontrôleur mesurera donc 2V à pleine échelle.

On peut utiliser différentes références de tension (VREF) pour l'ADC :
  • référence par défaut : 5V ou 3.3V suivant la tension d'alimentation
  • référence interne 1.1V
  • référence interne 2.56V (ARDUINO MEGA)
Si l'on utilise la référence par défaut, la précision s'en ressentira légèrement.
Avec une référence 3.3V, la perte de précision sera faible.
Avec une référence 5V on perdra un bit sur les 10 de l'ADC. On peut augmenter le gain à 50 avec une résistance RL de 200KΩ. La tension maximale à mesurer sera de 5V. C'est limite.

Si l'on utilise la référence interne 1.1V l'ADC sera saturé. Il conviendra de diminuer la valeur du gain. On le fixera à 10 avec une résistance de 50KΩ. La tension maximale à mesurer sera de 1V.
Enfin, avec la référence interne 1.1V, si l'on conserve le gain de 20, le courant maximal que l'on pourra mesurer sera de 0.55A.

Sur une MEGA, la référence 2.56V sera le meilleur choix.

Il faut également tenir compte de la puissance dissipée par le shunt. La modèle que j'ai utilisé est une résistance 100mΩ CMS 2010 pouvant dissiper 1W.
Le courant maximal qu'elle pourra supporter est de :

I = √(P / R) = 3.16A

Comme c'est une limite absolue à ne pas dépasser, si l'on veut éviter un échauffement excessif, il serait bon d'appliquer une marge de sécurité.
Dans le cas où l'on dépasse le courant maximal admissible, il faudra adopter une résistance de puissance plus importante, mais cela se fera au détriment de la chute de tension dans RS :

U = R * I = 0.1 * 3.16 = 0.316V

On est loin des 100mV que l'on s'était fixé au départ. Il serait plus judicieux d'adopter un shunt de plus faible valeur, et d'augmenter le gain.

On peut résumer avec un petit tableau :

VREF
RS RL Gain Courant maxi Résolution
(ADC 10 bits)
5V 0.1Ω 200KΩ 50 1A 0.97mA
5V 0.1Ω 100KΩ 20 2.5A 2.44mA
5V
0.1Ω (*) 50KΩ 10 5A 4.88mA
5V
0.02Ω 200KΩ 50 6.25A 6.1mA
3.3V 0.1Ω 200KΩ 50 0.66A 0.64mA
3.3V 0.1Ω 100KΩ 20 1.65A 1.61mA
3.3V
0.1Ω (*) 50KΩ 10 3.3A 3.22mA
3.3V
0.02Ω 200KΩ 50 4.125A 4mA
1.1V 0.1Ω 200KΩ 50 0.22A 0.21mA
1.1V 0.1Ω 100KΩ 20 0.55A 0.53mA
1.1V 0.1Ω 50KΩ 10 1.1A 1.07mA
2.56V 0.1Ω 100KΩ 20 1.28A 1.07mA

(*) Ces deux configurations nécessiteront l'adoption d'un shunt d'au moins 3W, ou de diminuer sa valeur et d'augmenter le gain (voir ligne suivante dans le tableau).

Bien entendu avec d'autres microcontrôleurs possédant par exemple un ADC 12 bits ou des références internes de valeurs différentes ces paramètres seront différents.

On peut utiliser une référence de tension externe si l'on désire une plus grande précision ou une stabilité en température supérieure.


2. Le MAX4372

Le MAX4372 est plus simple. Il n'y a aucune résistance de réglage, mais les calculs restent les mêmes, et le tableau précédent reste valable.


3. Les schémas

3.1. L'INA138

Voici le schéma que j'utilise :
La sortie de l'INA138 est redirigée vers l'entrée d'un AOP OPA363 monté en suiveur (gain = 1), ceci afin de diminuer fortement l'impédance de sortie.
Cet étage est nécessaire si l'on désire faire des mesures de courant subissant des variations rapides ou utiliser plusieurs canaux ADC simultanément. Voir cet article :

Un condensateur de 100nF permet de découpler l'alimentation.

3.2. Le MAX4372

Voici le schéma que j'utilise :
Le MAX4372 a une impédance de sortie très faible, il n'a nul besoin d'un AOP suiveur pour abaisser celle-ci.

Ici aussi un condensateur de 100nF permet de découpler l'alimentation.

Que dire de plus ? Il est temps de passer aux essais.

3.3. Les branchements

Le connecteur IN-OUT des deux modules a le brochage suivant :
  • 1 : sortie
  • 2 : alimentation 5V ou 3.3V (l'OPA363 supporte au maxi 5.5V)
  • 3 : GND
  • 4 et 5 : V-
  • 6 et 7 : V+
La tension d'alimentation pour la charge doit être appliquée sur les broches 6-7. La charge est câblée entre les broches 4-5 et GND.

Les broches 4-5 et 6-7 sont doublées afin d'augmenter le courant admissible.

Sur ce schéma la charge est une résistance de 47Ω, elle consommera donc environ 100mA sous 5V.

On pourrait imaginer remplacer cette charge par un microcontrôleur quelconque pour en mesurer la consommation. Il est facilement imaginable également que le microcontrôleur reçoive lui-même l'information à mesurer sur une de ses propres entrées analogiques. Il pourra donc mesurer sa propre consommation en temps réel.

Un module de ce type peut être mis en place pendant la phase de test d'un projet et retiré ensuite, une fois que la consommation est connue.
On peut par exemple prévoir un connecteur femelle à 7 points sur la carte pour enficher le module, et le remplacer ensuite par un cavalier entre les pins 5 et 6.

4. Le sketch

4.2. L'INA138

Voici un petit sketch pour un ARDUINO :

#define VREF          1.073
#define SHUNT         0.100
#define INA138_GAIN   19

void setup()
{
  Serial.begin(115200);
  analogReference(INTERNAL);
}

void loop()
{
  unsigned int adc = analogRead(A0);
  Serial.print(F("ADC: ")); Serial.println(adc);
  float voltage = adc * VREF / 1023;
  Serial.print(F("voltage: ")); Serial.print(voltage, 3);  Serial.println(" V");
  float current = voltage / SHUNT / INA138_GAIN;
  Serial.print(F("current: ")); Serial.print(current, 3); Serial.println(" A");
  delay(2000);
}


On voit que la tension de référence vaut 1.073V. Cette tension est mesurée sur la sortie AREF de l'ARDUINO.

Sur une PRO MINI cette broche n'existe pas, mais on pourra la fixer à 1.1V sans problème. On ajustera la valeur du gain dans le code afin de compenser.

Dans ce sketch la valeur du gain est de 19. Pourquoi cette valeur alors que sa valeur théorique est de 20 ?
Ce n'est qu'une histoire de précision de composants. Le shunt de 0.1Ω a été acheté chez un fournisseur sérieux. Il a une précision de 1%. La résistance RL que j'ai utilisé fait partie d'un jeu de résistances CMS dont j'ignore la précision (AliExpress).

J'ai donc ajusté la valeur du gain dans le code afin que le résultat affiché soit identique à la valeur du courant mesuré par mon multimètre.
Si l'on utilise une résistance RL à 1% la correction à réaliser sera plus faible.

L'ARDUINO, après avoir ajusté ces constantes affiche ceci :

ADC: 168
voltage: 0.176 V
current: 0.099 A
ADC: 167
voltage: 0.175 V
current: 0.098 A
ADC: 167
voltage: 0.175 V
current: 0.098 A
ADC: 166
voltage: 0.174 V
current: 0.098 A

Le voltage affiché est celui lu sur l'entrée A0. Comme le gain de l'INA138 est fixé à 20, la tension aux bornes du shunt est donc 20 fois inférieure.

La mesure est très stable.

4.2. Le MAX4372

Le sketch est légèrement différent (j'ai utilisé un MAX4372F avec donc un gain de 50) :

#define VREF          1.073
#define SHUNT         0.100
#define MAX4372_GAIN  50

void setup()
{
  Serial.begin(115200);
  analogReference(INTERNAL);
}

void loop()
{
  unsigned int adc = analogRead(A0);
  Serial.print(F("ADC: ")); Serial.println(adc);
  float voltage = adc * VREF / 1023;
  Serial.print(F("voltage: ")); Serial.print(voltage, 3);  Serial.println(" V");
  float current = voltage / SHUNT / MAX4372_GAIN;
  Serial.print(F("current: ")); Serial.print(current, 3); Serial.println(" A");
  delay(2000);
}

Ici il n'y a aucun besoin d'ajuster quoi que ce soit, mis à part la tension VREF.
Voici le résultat :

voltage: 0.514 V
current: 0.103 A
ADC: 487
voltage: 0.511 V
current: 0.102 A
ADC: 505
voltage: 0.530 V
current: 0.106 A
ADC: 490
voltage: 0.514 V
current: 0.103 A


La mesure est un peu moins stable, ceci étant dû probablement au gain plus élevé. Le modèle MAX4372T avec un gain de 20 serait probablement moins bruité.
Mais cela reste tout à fait exploitable.

5. Photos

Voici une photo des 2 modules :

INA138

MAX4372

Les 2 cartes font respectivement 23mm x 20mm et 20mm x 15mm.

On peut donc les utiliser comme des module ARDUINO classique, y compris sur une breadboard si le courant à mesurer est faible.

Si le courant à mesurer est supérieur à 1 ou 2 ampères il serait plus convenable d'opter pour un connecteur plus approprié.

6. Téléchargements

Ces deux projets sont téléchargeables ici :


7. Liens utiles

Les amplificateurs de courants.
Chez TEXAS :
Chez MAXIM :

8. Conclusion

La mesure de courant est largement facilitée par ces petits composants, avec un peit avantage pour le MAX4372, plus simple à mettre en oeuvre.
Il ne reste plus qu'à les exploiter sur une vraie application.

Une dernière chose : le MAX4372, l'INA138 et l'OPA363 se trouvent facilement sur AliExpress.
Le module INA138 a coûté 1.60€, le MAX4372 1.10€.


Cordialement
Henri

9. Mises à jour

03/07/2020 : le MAX4372

dimanche 19 avril 2020

La référence de tension MAX6225, MAX6241 & MAX6250



La référence de tension MAX6225

MAX6241 & MAX6250

J'ai reçu il y a peu un petit circuit fort intéressant : une référence de tension 5V MAX6250.

Sa datasheet se trouve ici :
https://datasheets.maximintegrated.com/en/ds/MAX6225-MAX6250.pdf

Il s'agit d'une référence de tension ayant une grande précision :
  • MAX6225A : 0.04%
  • MAX6241A : 0.04%
  • MAX6250A : 0.02%
Sa stabilité en température est de :
  • MAX6225A : 2ppm
  • MAX6241A : 2ppm
  • MAX6250A : 1ppm
1ppm /°C = 1 partie par million par °C
Ce circuit existe en 3 versions :
  • MAX6225A : 2.5V
  • MAX6241A : 4.096V
  • MAX6250A : 5V
La datasheet présente différents modèles ayant une précision et un coefficient de température plus ou moins élevé.
Il existe des versions CMS et DIP.

Une version plus récente (MAX6325, MAX6341 & MAX6350) :

https://datasheets.maximintegrated.com/en/ds/MAX6325-MAX6350.pdf

1. Utilisation

L'utilisation est très simple :

Si l'on désire utiliser ce composant en tant que référence de tension pour un ARDUINO, il faudra relier la sortie à l'entrée AREF du microcontrôleur :

Ensuite dans le code  de la fonction setup() on écrira :

analogReference(EXTERNAL);

Remarque : une carte ARDUINO PRO MINI ne possède pas de broche VREF.

2. Résultats

Je l'ai alimenté en 12V et le résultat est très éloquent :

C'est l'occasion de vérifier que le multimètre ANENG AN870 (20000 points) tient ses promesses, malgré son prix de vente de 20 ou 30€.

Il a été acheté en juillet 2018 ici : https://fr.aliexpress.com/item/32855502736.html?spm=a2g0s.9042311.0.0.27426c379JWQi9

Le VoltCraft VC870 (40000 points acheté 100€ en 2012 chez Conrad) que je possède également affiche 4.992V.

Cette petite différence est tout à fait excusable étant donné son âge vénérable.

Cela nous confirme également qu'un multimètre a besoin d'être étalonné  régulièrement si l'on veut conserver sa précision.

Ce MAX62XX est bien entendu utilisable en tant que référence de tension externe pour un convertisseur ADC, ou dans toute application exigeante de comparaison de tension.

Il offre peu d'intérêt en tant que référence de tension pour un ARDUINO étant donné que l'ADC de l'ATMEGA328P n’échantillonne que sur 10 bits (1023 points), mais il offrira tout de même quelques avantages de taille par rapport à la référence interne 1.1V :

  • une précision de 0.02% au lieu de 10%
  • stabilité en température de 1ppm
  • stabilité en fonction de la tension d'alimentation

Pour info voici les courbes de variation de la référence interne d'un ATMEGA328P en fonction de la tension d'alimentation et de la température :

Ce circuit est donc intéressant pour faire des mesures de tension dans des conditions de température variables, et sans étalonnage.

Avec un convertisseur 12 bits minimum il sera parfaitement à l'aise.

Pour information on trouve aussi des références de tension ayant une précision de 1mV, comme le AD588 d'ANALOG DEVICES.

Pour une application moins exigeante on pourra se tourner vers un TL431 (1% de précision), couramment utilisé dans les alimentation à découpage de PC par exemple, ou un LM4040 (0.1%).

Voici la page de sélection de MAXIM :

https://para.maximintegrated.com/search.mvp?fam=volt_ref&tree=master


Cordialement
Henri

mardi 21 janvier 2020

Un logger analogique et digital (version WEB)



 Un logger analogique et digital

(version WEB)



Cet article d'août 2019 décrivait un logger analogique et digital :

https://riton-duino.blogspot.com/2019/08/un-logger-analogique-et-digital.html

Cet outil a une limitation : si l'on veut observer l'évolution des sorties d'un montage sur table à proximité d'un PC tout va bien, mais dans le cas d'un montage éloigné, il est difficile d'utiliser un câble USB de grande longueur. Et tout le monde ne possède pas un PC portable que l'on peut dédier à cette tâche.

Et si l'on étudiait une version WIFI ?

Ce projet est assez vaste et les sujets abordés sont plutôt variés :
  • sujet ESP32 :
    • serveur et client WEB
    • utilisation d'un INA226
    • créer un formulaire WEB
    • envoi de données à un serveur
  • sujet PC ou RASPBERRY PI : 
    • serveur WEB en PYTHON avec CHERRYPY
    • génération d'une page WEB à partir d'une template
    • utilisation de graphes HICHARTS
    • génération d'un fichier CSV et export

1. Le besoin

Mes besoins concernent principalement la mesure de différentes grandeurs :
  • tension d'alimentation et courant
  • sorties digitales
  • tensions diverses
Le système doit être capable de faire des relevés de mesures et de permettre la visualisation de graphes via un navigateur.

Il ne s'agit pas ici de bâtir un analyseur logique. Cet outil n'est pas fait pour observer des variations rapides de signaux, mais plutôt de tracer des variations sur la durée :
  • charge ou décharge d'une batterie
  • allumage d'une LED
  • activation d'un relais
  • etc.
La première idée qui vient à l'esprit est d'utiliser un ESP32, celui-ci possédant un grand nombre d'entrées / sorties et en particulier plusieurs canaux analogiques.

1.1. Mesure de la tension d'alimentation et du courant

Il s'agit ici de suivre l'évolution de la tension et du courant d'alimentation d'un montage, qu'il s'agisse d'une alimentation secteur ou d'une batterie.

Le système doit être capable de mesurer des tensions supérieures à celle de la tension 3.3V d'alimentation de l'ESP32.

Il doit également être capable de mesurer le courant circulant dans une batterie, aussi bien en décharge qu'en charge, ce qui implique une capacité à mesurer un courant négatif.

Pour réaliser cette opération un module INA226 est un bon choix :
C'est un composant I2C capable de mesurer une tension jusqu'à 36V et un courant positif ou négatif.
Généralement le shunt soudé sur la carte est un 10mΩ (marquage R010). Le courant maximal mesurable sera de 8A. Avec un shunt de 100mΩ (marquage R100) il sera de 800mA.

Avec un shunt de 100mΩ on obtiendra plus de résolution pour mesurer des courants faibles.
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.
Avec un shunt de 10mΩ elle sera 10 fois supérieure (250µA).
Tout dépend donc de ce que l'on cherche à mesurer. Personnellement je ne mesure jamais de courants forts, donc je remplace systématiquement le shunt 10mΩ par un 100mΩ (résistances CMS 2010 ou 2512).

A noter : le premier module INA226 que j'ai utilisé mesurait une tension de 4.3V sur une batterie LITHIUM-ION, pour une tension réelle de 4.1V. Je l'ai remplacé et j'ai bien obtenu 4.1V avec un deuxième module. Le premier exemplaire est probablement défectueux.

Afin de minimiser le bruit le temps de conversion choisi est de 8.144ms.
Une moyenne sur 16 échantillons est effectuée.

1.2. Entrées / sorties digitales

La surveillance de signaux logiques se fera à l'aide des entrées digitales de l'ESP32. Attention certaines ne sont pas libres. Voir le schéma plus bas.

1.3. Entrées analogiques

Les entrées analogiques de l'ESP32 pourront être utilisées pour la surveillance de tensions diverses.

1.4. Stockage des mesures

Afin de ne pas encombrer la FLASH de l'ESP32, et ne pas être limité en capacité de stockage,  la tâche de stockage des mesures est confiée à un serveur écrit en PYTHON. Ce logiciel peut être exécuté sur tout ordinateur : PC, MAC ou RASPBERRY PI.
Les données sont stockées en mémoire RAM. Une fonction d'export vers un fichier CSV existe.

Ce serveur de stockage et visualisation est appelé HOST dans la suite de l'article.

L'intérêt d'utiliser une RASPBERRY PI pour héberger ce serveur est assez clair : pouvoir enregistrer des mesures sur la durée sans monopoliser un PC, gros consommateur d'énergie.
Le PC pourra être utilisé uniquement pour la visualisation.

Les tâches sont donc réparties comme suit :

ESP32 :
  • serveur de mesure
  • interface homme machine
    • sélection adresse IP et port du serveur de stockage
    • choix de la période de mesure
    • sélection des mesures à effectuer
    • lancement des mesures
  • envoi des informations au host
HOST :
  • serveur de stockage
  • interface homme machine
    • visualisation des graphes
    • remise à zéro des données
    • export vers un fichier CSV
Comme on le voit l'ESP32 est donc implémenté sous la forme d'un serveur et d'un client WEB.

1.5. Visualisation des mesures

La visualisation se fait via un navigateur.

Si le serveur host tourne sur le même PC on utilisera l'URL 127.0.0.1:80.
S'il tourne sur un autre PC ou une RASPBERRY PI on utilisera l'adresse IP de cette machine.

Côté host l'affichage des graphes est confié à des objets HighCharts. Il s'agit d'une librairie JavaScript que j'utilise depuis pas mal d'années avec beaucoup de satisfaction.

Attention : cette librairie est gratuite pour les particuliers mais pas pour les entreprises.

Cette librairie a déjà été présentée dans cet article :
https://riton-duino.blogspot.com/2019/02/un-web-server-sur-ethernet.html

1.6. Conservation des mesures

Le logiciel est capable d'exporter les résultats sous forme de fichier CSV. Ils seront donc stockés sur le PC sur lequel est lancé le navigateur.

2. 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.

Le connecteur P1 permet le raccordement d'un convertisseur USB / série pour la programmation du module et les boutons EN et BOOT doivent être utilisés pour effectuer le chargement.

Le bornier P2 permet la mesure tension / courant via l'INA226, et le connecteur P3 regroupe les entrées / sorties du module ESP32.

3. Le matériel

Ce projet peut être réalisé soit avec un module ESP32 soudé sur PCB ou avec une carte ESP32.
Pour cette réalisation le matériel nécessaire est le suivant :
  • solution sur PCB :
    • 1 module ESP32-WROOM
    • 2 boutons poussoirs 6x6
    • 2 résistances de 10KΩ
    • 3 condensateurs film polyester de 100nF
    • 1 condensateur électrochimique 10µF 10V 
    • 1 connecteur 3 points au pas de 2.54
    • 1 connecteur JACK d'alimentation 
    • 1 LM3940
    • 1 condensateur film polyester de 470nF
    • 1 condensateur électrochimique 33µF 10V
  • ou
    • 1 carte ESP32
  • 1 module INA226
  • 1 condensateur film polyester de 100nF
  • 1 connecteur 20 points au pas de 2.54
  • 1 bornier 4 points au pas de 5.08

3.1. Solution avec PCB :

Si l'on désire réaliser un PCB il est préférable d'utiliser un module ESP32-WROOM :
Il est assez peu judicieux de choisir une carte ESP32 pour l'implanter sur un PCB car il existe une quantité de modèles importante et leur pérennité n'est pas forcément assurée.

Un montage sur plaquette à pastilles est parfaitement envisageable. Dans ce cas on peut utiliser une carte adaptatrice :
Si la solution PCB ou plaquette  à pastilles est choisie un convertisseur USB / série 3.3V ou 5V / 3.3V sera nécessaire :

3.2. Solution avec carte ESP32

On peut choisir une carte du type ESP32-DEVKIT :
Dans ce cas le schéma sera réduit à sa plus simple expression :
  • carte ESP32 (ESP32-DEVKIT, WEMOS D1, etc.)
  • module INA226
  • connecteurs P1 à P3.

3.3. Alimentation

L'énergie est fournie au montage par un adaptateur secteur 5V à 9V 1A grâce à la présence d'un connecteur JACK et d'un régulateur 3.3V.

3.3.1. Adaptateur secteur 5V
Le LM3940 est un régulateur Low Drop Out (sa tension de chute est de 800mV). Un LM7833 ne conviendra pas (sa tension de chute est de 2V).
Un MCP1827S ou un LF33CV peuvent convenir également.

3.3.2. Alimentation par batterie
Sur ce même JACK on peut raccorder aussi une ou plusieurs batteries 18650 en parallèle ou une batterie LIPO. Il faudra compter 2000mAH par journée de fonctionnement, ce qui est plutôt conséquent.

3.3.3. Adaptateur secteur 6V à 9V
Si l'on désire alimenter avec un adaptateur secteur de plus de 5V le LM3940 ne suffira pas (il supporte 5.5V maxi). Il faudra le remplacer par un LM7833 par exemple.

3.3.4. Adaptateur par USB
Si l'on adopte une carte ESP32 on pourra l'alimenter directement par le cordon USB.

4. La réalisation

Si l'on envisage d'utiliser une carte ESP32 on peut d'abord essayer très facilement ce montage sur breadboard, et passer ensuite sur une plaquette à pastilles.

Attention : pas mal de module INA226 sont mal sérigraphiés (SDA et SCL sont inversés).

Si l'on préfère la version PCB, il sera difficile de faire des essais sur breadboard, les cartes adaptatrices, avec leurs doubles rangées de broches, étant inadaptées :

Les modèle dual-in-line (deux rangées de 15 broches) existent mais sont plus difficiles à dénicher :
Par défaut il reste toujours la solution de faire les essais avec une carte ESP32 et de réaliser la solution finale avec un module nu sur PCB.

5. IDE ARDUINO

Il faudra installer la bibliothèque suivante :
Librairie INA226 : https://github.com/jarzebski/Arduino-INA226

Dans l'IDE ARDUINO on devra sélectionner les options suivantes :
  • Outils : type de carte : ESP32 Dev Module
  • Outils : Partition Scheme : Minimal (2MB FLASH)
On peut être amené à choisir une autre carte, WEMOS D1 par exemple, en fonction du modèle acheté.

6. Le code

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

Le code de l'ESP32 est situé dans le répertoire arduino qui contient deux fichiers source :
  • un sketch
  • un fichier HTML
Avant de charger le sketch il faudra modifier quelques constantes :
  • ssid : le SSID de la box
  • password : le mot de passe WIFI
  • INA226_I2CADDR : l'adresse I2C de l'INA226 
  • INA226_OHM : la valeur du shunt en ohms
  • INA226_AMP : le courant maximal mesurable
  • INA226_OFFSET :  l'offset de l'INA226
Il se peut que l'adresse I2C de l'INA226 (0x40) ne convienne pas. Pour la déterminer facilement je conseille d'exécuter ce sketch :
https://gist.github.com/tfeldmann/5411375

La valeur du shunt peut être ajustée en modifiant INA226_SHUNT. Lorsque l'on a affaire à un module équipé d'un shunt de 10mΩ la résistance des soudures intervient fortement. Il vaut mieux comparer la valeur mesurée à celle affichée par un multimètre.

Le courant maximal mesurable est dépendant du shunt soudé sur le module :
8A pour un shunt de 10mΩ (marquage R010).
0.8A pour un shunt de 100mΩ (marquage R100).

L'offset de l'INA226 à vide peut être obtenu en effectuant une mesure sans charge (voir plus loin : 8.3. Offset de l'INA226).

Le fichier HTML pourra être chargé à l'aide du menu :
Outils / ESP32 Sketch Data Upload

Le plugin permettant cette opération se trouve ici :
https://github.com/me-no-dev/arduino-esp32fs-plugin/releases/tag/1.0
Les explications :
https://github.com/me-no-dev/arduino-esp32fs-plugin

7. Le HOST

La repository BitBucket contient également un répertoire raspberry :
  • deux scripts PYTHON : index.py et template.py
  • un fichier HTML
  • un fichier favicon

7.1. Les templates

Une petite explication pour ceux qui ne connaissent pas les templates s'impose, bien que ce ne soit pas indispensable à la mise en service du serveur.
Cela peut intéresser certaines personnes pour le développement de leurs propres applications.

Le fichier template.py permet de générer une page WEB à partir d'un fichier HTML template, c'est à dire un fichier contenant des identifiants (voir le fichier HTML) :
  • $XDATA : les données de l'axe des X
  • $CURRENT_DATA : les données de mesures de courant
  • $VOLTAGE_DATA : les données de mesures de tension
  • $GPIO_SERIES : les données de mesures de GPIOs
  • $ADC_SERIES : les données de mesures de ADC
Lorsque le serveur rencontre un mot clé commençant par $ il remplace cet identifiant par les données correspondantes. En d'autres termes il s'agit de générer des listes JavaScript :
Dans le code si le serveur trouve ceci :

        {
          name: 'Voltage',
          type: 'spline',
          data: [$VOLTAGE_DATA],
          yAxis: 0,
          tooltip: {
              valueSuffix: 'V'
          }
        }


Après interprétation on obtiendra ceci :

        {
          name: 'Voltage',
          type: 'spline',
          data: [4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08, 4.08],
          yAxis: 0,
          tooltip: {
              valueSuffix: 'V'
          }
        }


8. Installation et utilisation

8.1. L'ESP32

8.1.1. Chargement et configuration
Une carte ESP32 se charge via son connecteur USB.
Le module ESP32 nu nécessite d'être chargé via un convertisseur USB / série.
Pour le branchement du convertisseur USB / série voir plus bas :  11. Photos

Comme sur une carte ESP32 le sketch est chargé en utilisant la séquence habituelle :
  • appuyer sur le bouton BOOT
  • appuyer brièvement sur le bouton EN
  • relâcher le bouton BOOT
  • charger le sketch
Après avoir chargé le sketch dans l'ESP32 celui-ci affiche sur la console l'adresse IP par laquelle on va pouvoir communiquer avec lui :

Connected to ROUTER_XXXX
IP address: 192.168.1.18
MAC address: 3C:71:BF:47:A5:B0
MDNS responder started
HTTP server started 


Grâce à l'adresse MAC il est possible de fixer une adresse IP statique par configuration de la box internet. On sera ainsi certain de conserver toujours la même adresse. Sur une LiveBox : voir "Configuration Avancée".

8.1.2. La page de configuration
Dans le navigateur entrons l'URL : http://192.168.1.18/index.html en remplaçant 192.168.1.18 par la vraie adresse IP de l'ESP32 :

Cette page permet de sélectionner les valeurs à mesurer :
  • Power Monitor (INA226)
  • GPIOs
  • canaux ADC
A noter : lorsqu'une GPIO est cochée, le sketch de l'ESP32 configurera cette entrée en entrée avec PULLUP :

      pinMode(gpioNumber, INPUT_PULLUP);

Attention : si l'on a des sorties de microcontrôleur 5V à surveiller il est préférable de passer par des ponts diviseurs afin de ne pas risquer de griller les entrées de l'ESP32.

8.1.3. Le montage de test
Voici le montage de test utilisé :

Pour cet exemple j'ai raccordé une alimentation 5V sur la GPIO35 à travers un pont diviseur de tension 10KΩ + 10KΩ.

J'ai également relié GPIO26 à la broche 3.3V et GPIO27 à la broche GND.
On peut également connecter deux boutons poussoirs entre les GPIOs et GND pour faire varier les valeurs mesurées.

Les entrées de l'INA226 sont raccordées comme suit :
  • VBUS et V+: le pôle + d'une batterie 3.7V
  • V- : une résistance de charge entre V- et GND
  • GND : le pôle - de la batterie
R3 et RV1 forment une résistance de charge ajustable pour la batterie et il sera possible de jouer avec le potentiomètre pour faire varier le courant.

Le shunt de l'INA226, situé sur le module entre V+ et V-, est placé côté VBUS (high-side) sur le schéma ci-dessus. L'INA226 offre la possibilité de placer son shunt côté GND (low-side) :
Cela revient strictement au même.
8.1.4. Le formulaire
Dans le formulaire affiché par l'ESP32 nous allons devoir entrer certaines informations :
  • l'adresse IP du HOST et le port d'écoute (8080 dans mon cas)
  • la période de mesure
  • l'unité de temps (millisecondes, secondes, minutes)
  • Power Monitor : indique si l'on désire utiliser l'INA226
  • GPIOS :
    • cocher les GPIOs à surveiller
    • on peut entrer un libellé (ALIAS)
  • ADC
    • cocher les GPIOs à surveiller
    • on peut entrer un libellé (ALIAS)
    • renseigner le rapport de division éventuel
Les alias permettront de mieux se repérer dans les graphes produits. Plutôt que d'afficher GPIO26 et GPIO27, les libellés utilisés seront LED et RELAY, ce qui est plus parlant.

Le rapport de division est le coefficient multiplicateur à utiliser si l'on mesure une tension à travers un pont diviseur. Dans mon cas je mesure une tension de 5V à travers un pont diviseur 10KΩ + 10KΩ, donc un rapport de division de 2.
Si l'on n'utilise pas de pont diviseur on peut laisser ce champ vide.

Malgré qu'il soit alimenté en 3.3V l'INA226 n'a pas besoin de pont diviseur sur ses entrées. Il est capable de mesurer des tensions jusqu'à 36V.

8.1.5. Lancement des mesures
Après validation par le bouton OK le serveur est démarré :

On peut observer le déclenchement des mesures sur le moniteur série :

INA226: 4.100V, 3.400mA
ADC: 2953
DIVIDER: 2.00
GET /log?VOLTAGE=4.1&CURRENT=3.40&GPIO_RELAY=1&GPIO_LED=0&ADC_VCC=5.06& HTTP/1.1
Host: 192.168.1.121
Connection: close  


192.168.1.121:8080: unable to connect to host

Tant que le host n'est pas démarré, l'ESP32 ne parviendra pas à se connecter à lui. Le message "unable to connect to host" sera affiché, mais ce n'est pas important, on le lancera plus tard.

Voilà c'est tout pour l'ESP32.

8.2. Le HOST

8.2.1. Installation et configuration
On pourra installer les différents fichiers du répertoire raspberry dans un répertoire quelconque du PC ou de la RASPBERRY PI.

Le script PYTHON utilise le framework CHERRYPY. Il sera donc nécessaire d'installer ce module.

Sous DEBIAN ou UBUNTU c'est facile :
$ sudo aptitude install python-cherrypy

Sous Windows il faut télécharger l'archive et l'installer manuellement.

Le script PYTHON est configurable. Il est facile par exemple de changer le N° de port d'écoute dans le fichier web-power-monitor.conf :

[global]
server.socket_host = "0.0.0.0"
server.socket_port = 8080
server.thread_pool = 10


L'adresse IP 0.0.0.0 permet l'accès depuis n'importe quel poste du réseau.
Un serveur APACHE occupe déjà le port 80 sur mon PC. J'ai donc choisi 8080.

8.2.3. Lancement
Ensuite il suffit de lancer le script :

python ./index.py

8.2.4. Visualisation
Il ne reste plus qu'à lancer un navigateur pour visualiser les résultats. Si le script python tourne sur le même PC l'URL est 127.0.0.1:80 ou 127.0.0.1:8080 suivant le port choisi.

Au début - tant qu'il n'aura pas reçu de données de l'ESP32 - le navigateur va afficher une page pratiquement vide. Seul un titre et le bouton RESET apparaissent.
Lorsque l'on estime qu'il a reçu suffisamment de données, il suffit de rafraîchir la page :

Pour cet essai la période de mesure est de 2 secondes. L'axe des X représente le temps en secondes.

Si le Power Monitor n'a pas été sélectionné dans l'interface de l'ESP32, le premier graphe est absent.
Il en est de même pour les graphes GPIOs et ADC.

Cette image est incomplète. Un bouton d'export vers un fichier CSV est ajouté dans la version définitive :
Le nom du fichier, s'il n'est pas renseigné est "log.csv".
Lorsque l'on clique sur le bouton export, une boîte de dialogue apparaît :


On peut ainsi directement visualiser les données avec un tableur ou enregistrer le fichier.

En plaçant la souris sur un graphe on obtient les informations conçernant un point du graphe :

Il est possible également de zoomer en sélectionnant une zone :


En relâchant le bouton de la souris on obtient ceci :


Pour revenir à l'affichage précédent, utiliser le bouton "Reset Zoom".

Ces diverses possibilités sont offertes par la librairie HighCharts.

8.3. Offset de l'INA226

La mesure de courant de l'INA226 présente un offset faible de quelques 100µA.
On peut mesurer cet offset en effectuant une mesure sans charge. Il suffit ensuite de modifier la valeur de INA226_OFFSET dans le sketch, puis de le recharger dans l'ESP32.
On obtiendra ainsi une mesure plus exacte.

8.4. Vitesse de l'INA226

Comme dit plus haut :
Afin de minimiser le bruit le temps de conversion choisi est de 8.144ms.
Une moyenne sur 16 échantillons est effectuée.
Cela veut dire clairement que le temps de mesure est assez important, environ 260ms.

Si l'on désire diminuer le temps de mesure il est possible de modifier cette ligne de configuration dans le sketch ESP32 :

ina226.configure(INA226_AVERAGES_16, INA226_BUS_CONV_TIME_8244US, INA226_SHUNT_CONV_TIME_8244US, INA226_MODE_SHUNT_BUS_CONT);

Si l'on désire un temps de mesure inférieur à 5ms on pourra configurer l'INA226 comme ceci :

ina226.configure(INA226_AVERAGES_4, INA226_BUS_CONV_TIME_588US, INA226_SHUNT_CONV_TIME_588US, INA226_MODE_SHUNT_BUS_CONT);

Cela se fera cependant au détriment du bruit.

La datasheet de l'INA226 sera utile, en particulier le paragraphe :
7.4.1 Averaging and Conversion Time Considerations.

9. Téléchargements

Pour télécharger le projet :
https://bitbucket.org/henri_bachetti/web-power-monitor

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

10. Essais

Voici un petit essai réalisé avec une batterie 28650 et un chargeur TP4056 suivi d'un convertisseur step-up :
Voici les branchements :


L'INA226 mesure donc la tension de la batterie et le courant circulant entre la broche B- du TP4056 et la borne -  de la batterie.
La broche GPIO35 mesure la tension de sortie du convertisseur 5V à travers un pont diviseur.

Voici un zoom de la première partie :


Première partie de la manipulation (de 0 à 90 secondes) :
  • le port USB du TP4056 n'est pas branché
  • la sortie du convertisseur est chargée avec une résistance de 10Ω
Le convertisseur débite donc 500mA.
La tension batterie est de 3.7V et elle débite 780mA, ce qui est normal étant donné quelle doit fournir :
5V x 0.5A = 2.5W
2.5W / 3.7V = 0.675A
C'est en dessous de 780mA, mais le rendement du convertisseur n'est pas de 100%. Il a donc un rendement de 86%.

Deuxième partie de la manipulation (de 100 à 160 secondes) :
  • la sortie du convertisseur n'est plus chargée
Le convertisseur ne débite plus que 250µA dans le pont diviseur.
La tension batterie remonte à 3.97V puis à 4.01V. Elle ne débite que 600µA dans le convertisseur.

Troisième partie de la manipulation (à partir de 170 secondes) :
  • le port USB du TP4056 est branché
  • la sortie du convertisseur reste non chargée
Le convertisseur débite toujours 250µA dans le pont diviseur.
Au début de la charge la tension de la batterie est à 4.12V et le courant est de 255mA.
La tension batterie remonte lentement, et le courant diminue progressivement.
A la fin de la charge la tension de la batterie est à 4.2V et le courant est de 98mA.

Lorsque le TP4056 coupe la charge (à 1530 secondes) la tension de la batterie chute à 4.15V et celle-ci débite 500µA. La tension chute à 4.12V et se stabilise.

Quelques premières constatations à propos de cette manipulation :

Après avoir rafraîchi la page au bout d'une heure, la tension de la batterie est de 4.11V. Il va falloir attendre très longtemps pour que le TP4056 démarre une nouvelle charge de la batterie.
Le but de la manipulation est justement de déterminer la valeur de tension pour laquelle la charge va être déclenchée, ainsi que le temps que cela va prendre.

On peut remarquer que lorsque le convertisseur est chargé sa tension de sortie est au dessus de 5.5V, contre 5.3V sans charge.

Le courant de repos du convertisseur est faible ce qui confirme ce que j'ai déjà constaté ici au paragraphe 1.10 :
https://riton-duino.blogspot.com/2019/11/convertisseurs-stepup-stepdown.html
Ce courant est encore plus faible avec un pont diviseur 100KΩ + 100KΩ : 200µA.

Voici donc le genre de manipulation que l'on peut effectuer en très peu de temps avec cet outil de mesure. C'est extrêmement pratique et précis.

11. Photos

Voici une photo de la carte :


Ce prototype est réalisé sur un PCB simple face, ce qui est assez problématique pour les soudures de l'ESP32. Pour ce faire j'ai utilisé des broches fines traversantes soudées sur les pastilles sous le PCB et sur l'ESP32. L'ESP32 est rehaussé à l'aide d'une petite plaquette d’époxy :


C'est assez peu recommandable je l'avoue. Mais cela fonctionne.
Que l'on se rassure, dans le dossier KICAD, le routage est bien fait en double face avec trous métallisés.


Quelques petites étiquettes pour s'y retrouver dans les futurs branchements et les boutons.


Le bornier de raccordement INA226 est à gauche. Les branchements sont décrits aux paragraphes suivants :
  • 8.1.3. Le montage de test
  • 10. Essais.
Le connecteur de chargement de l'ESP32 est à droite. Les branchement sont les suivants (de gauche à droite) :
  • TX de l'ESP32 -> RX du convertisseur USB / série
  • RX de l'ESP32 -> TX du convertisseur USB / série
  • GND 
Bien entendu il faut un convertisseur 3.3V :

Câble FTDI TTL-232R-3V3


Ou un modèle supportant 5V et 3.3V :
FT232RL 5V / 3.3V
CH340 5V / 3.3V

12. Conclusion

Il n'y a plus qu'à installer le serveur sur la RASPBERRY PI où il tournera en permanence.
La première application envisagée est la surveillance d'une carte UPS DFRobot DFR0494, d'une UPS RPI PowerPack et d'autres solutions UPS, afin de vérifier leur comportement, en particulier le courant débité ou reçu par la batterie lorsque le secteur est présent.

Trois cas peuvent se présenter :
  • la batterie subit une recharge permanente (peu recommandé)
  • la batterie débite un courant plutôt faible et elle est rechargée périodiquement (c'est mieux)
  • la batterie ne débite aucun courant - ou celui-ci est extrêmement faible - et elle est rechargée très rarement (c'est encore mieux)
Voilà qui promet des séances de mesures longues et pleines d'enseignement.


Cordialement
Henri

13. Mises à jour

25/01/2020 : petite correction de schéma : le connecteur d'alimentation P5
                     était inversé (pôle - au milieu du JACK)
26/01/2020 : 10. Essais