samedi 17 août 2019

Un Logger Analogique et Digital




Un Logger Analogique et Digital


Cela faisait un moment que j'avais en tête la réalisation d'un voltmètre / ampèremètre capable d'enregistrer l'évolution d'une ou plusieurs tensions ou courants continus, et éventuellement de sorties digitales.

Comme je suis en ce moment bien occupé par l'étude d'un chargeur de batterie NI-MH, je sens que cet outil capable de tracer une courbe de charge ou de décharge de batterie devient de plus en plus indispensable.

Le but n'est pas simplement de créer un outil spécifique à la charge des batteries mais plutôt un outil assez générique de surveillance de tensions, courants et de sorties digitales.

Il ne s'agit pas non plus de fabriquer un oscilloscope avec une bande passante de plusieurs MHz.
L'ADC de l'ARDUINO est peu rapide et ne le permettrait pas.
Un ADC ADS1115 16bits est utilisé pour apporter plus de précision, mais il est encore moins rapide.

Il ne s'agit pas non plus de fabriquer un analyseur logique. Cette fonction sera mieux assurée par un outil spécialisé, par exemple un clone Saleae Logic.

Mais par contre, moyennant l'écriture de sketches plus ou moins simples nous serons capable de relever des variations de tension et de courant, de les enregistrer et de les traiter ensuite avec un tableur ou un script.
Il sera également possible d'agir en fonction des valeurs de tension et courants lues, et de prendre des décisions en fonction de simples signaux logiques.

1. Les besoins

Commençons par établir la liste des besoins :

Lorsque l'on charge une batterie, le voltmètre / ampèremètre doit avoir au moins 3 entrées :
  • tension de la batterie
  • tension aux bornes de la résistance de mesure de courant
  • tension de l'alimentation du chargeur
Il enverra ses données à un PC par sa liaison USB. Celui-ci enregistrera les valeurs sous forme de fichier CSV et les affichera sous forme de courbes.

Le fichier CSV pourra être exploité de la manière la plus adéquate :
  • calcul de moyennes, valeurs minimale et maximale
  • calcul de puissance, de capacité
  • affichage de graphes
  • etc.

Le logiciel PC d'affichage de la courbe devra disposer de quelques facilités comme le zoom, l'enregistrement d'image, etc.

1.1. Cas d'utilisation

Plusieurs cas d'utilisation peuvent se présenter :
  • surveillance de tensions
  • surveillance de courants
  • décharge de batterie
  • charge de batterie
1.1.1. Surveillance de tensions
Pour mesurer les tensions on pourra utiliser les entrées analogiques de l'ATMEGA328p, mais pour des mesures plus précises, je compte utiliser un ADS1115.

Il est absolument indispensable de ne pas dépasser 5V sur les entrées de l'ARDUINO et de l'ADS1115.
Si les tensions à surveiller sont supérieures à 5V il faudra intercaler un ou plusieurs pont diviseurs entre les sources de tension à mesurer et les entrées analogiques.
On pourra même ajouter des diodes zener de protection 4.7V ou des transils.

Cet ADC 16bits permet de mesurer des tensions faibles et possède un amplificateur à gain variable :
  • gain = 000 : 6.144V à pleine échelle
  • gain = 111 : 0.256V à pleine échelle
La surveillance est activée par l'appui sur un bouton START. Le montage envoie les valeurs de tension en mV (en virgule flottante) au PC qui les enregistre.
Le buzzer peut être utilisé pour signaler la fin de la mesure si celle-ci se déroule sur une longue période. Un bouton STOP permet de couper le buzzer.
Il peut être intéressant d'ajouter une fonction d'alerte tension trop basse ou tension trop haute.

1.1.2. Surveillance de courants
La surveillance d'un courant se fait à l'aide d'une résistance shunt en série avec la charge, aux bornes de laquelle on mesure la tension.

L'ADS1115 16bits permet de mesurer des courants faibles aux bornes d'un shunt de faible valeur.
De plus l'amplificateur à gain variable de l'ADS1115 permet d'adapter la sensibilité au courant à mesurer :
Pour un courant de 200mA dans un shunt de 1Ω on obtiendra 200mV aux bornes du shunt. Si le PGA est réglé au maximum, on aura 256mA à pleine échelle, et donc 256mA / 65536 = 4µA de sensibilité.

Si le courant à mesurer est très faible ou si l'on désire une sensibilité plus élevée on pourra intercaler un amplificateur :
  • un INA138 suivi d'un AOP suiveur
  • un INA213
  • un INA219 ou INA226 sur bus I2C
Remarque : la résistance shunt est placée en low-side (côté GND).
Voir plus loin :  6.1. Surveillance de tension et courant.
L'ADS1115 est capable de mesurer une tension différentielle. Cette méthode requiert deux entrées. Dans ce cas, la résistance shunt peut être placée en high-side (côté VCC).

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

1.1.4. Décharge de batterie
La décharge d'une batterie doit se faire à travers une résistance et doit être stoppée quand la tension atteint une certaine valeur : 1V par élément pour une batterie NI-MH par exemple.

La décharge est activée par l'appui sur un bouton START. Elle commence en faisant débiter à la batterie un courant important (C / 3 par exemple). Lorsque la tension limite est atteinte, on continue la décharge avec un courant inférieur (C/10 par exemple). Lorsque la tension limite est à nouveau atteinte, la décharge est stoppée.

On peut à ce moment émettre un son à l'aide d'un buzzer. Un bouton STOP permet de couper le buzzer.

1.1.5. Charge de batterie
La charge est activée par l'appui sur un bouton START. Pendant celle-ci, il faut surveiller la tension et le courant de charge, et éventuellement la tension d'alimentation du chargeur. Pendant la charge, on fait clignoter une LED.

Il faut surveiller l'indication fin de charge qui est souvent une LED connectée sur une sortie du chargeur, dans le cas d'un MAX712 par exemple.

Le buzzer peut être utilisé pour signaler la fin de charge. Un bouton STOP permet de couper le buzzer.

1.1.5. Évènements et actions
On voit déjà que l'ARDUINO, en toute autonomie, peut réagir à certains événements :
  • appui sur un bouton
  • dépassement de tension ou de courant
  • détection d'un niveau logique
  • etc.
Il pourra engager des actions correspondant à ces événements :
  • actionner le buzzer
  • allumer la LED
  • envoyer un ordre au PC
  • etc.
Un tas de possibilités en perspective.

1.1.6. Performances
L'ADS1115 n'est pas un foudre de guerre. Il pourra fournir 860 échantillons par seconde.
L'ARDUINO, quant à lui, environ 8900, et même 38000 moyennant un petit effort de codage :
https://riton-duino.blogspot.com/2018/11/arduino-les-performances-de-ladc.html
Paragraphe 3. Augmenter la vitesse

Quant aux entrées digitales, elles peuvent être écrites ou lues en 4 à 5µS.

1.1.7. Inventaire
A partir de ces besoins et constats on peut déjà établir une petite liste de matériel :
  • un ARDUINO
  • un ADC précis (16 bits): ADS115 par exemple
  • deux relais
  • un buzzer
  • deux boutons
  • une LED
On peut compléter les possibilités en ajoutant quelques connecteurs utiles sur les entrées / sorties digitales et analogiques de l'ARDUINO.

Un montage du type shield à enficher sur un ARDUINO UNO serait assez pratique, pour peu que l'on ait l'espace suffisant pour placer tout ce matériel.

Une carte ARDUINO MEGA offirait encore plus de possibilités.

Les entrées et sorties utilisent des connecteurs de ce type :

Sur ces connecteurs on enfiche des fils DUPONT, éventuellement  terminés par des grip-fils si l'on veut prendre des points de mesure sur les composants d'une carte :

On pourrait aussi utiliser des barrettes mâles avec des fils DUPONT femelle, mais les connecteurs DUPONT femelle sont peu fiables. Je ne les recommande pas.

1.1.4. Alimentation
Le montage sera alimenté en 5V pour plusieurs raisons :
  • L'ADS1115 peut être alimenté entre 2V et 5.5V
  • la plupart des circuits de charge peuvent être alimentés en 5V
5V conviendront donc à tous les composants.
 

2. Le schéma

Comme on le voit sur cette image, les principaux connecteurs de la carte UNO sont reportés sur le montage, et le logiciel peut les utiliser à sa convenance.
Le montage comporte deux relais, mais il est possible d'en connecter d'autres sur les sorties digitales.

Les relais FINDER-36.11.9.005.4011 peuvent être remplacés par des SONGLE SRD-05VDC-SL-C ou des JQC-3F-5V QIANJI ou BESTEP, relais chinois bien connus.

Attention : les relais statiques provoquent une chute de tension non négligeable. Il faut bien lire les datasheets et déterminer si cette chute de tension est nuisible ou pas.

La LED est  branchée sur la sortie D13, en parallèle donc sur celle de la carte ARDUINO, car si l'on réalise ce montage sous forme de shield, la LED de la carte sera cachée.
Par contre elle fonctionne en logique inverse : 0 pour allumer, 1 pour éteindre.

3. La réalisation

Différentes solutions sont possibles pour réaliser ce montage :
  • réalisation d'un PCB shield pour une carte UNO ou MEGA
  • réalisation d'un PCB pouvant accueillir une carte NANO
  • utilisation d'un shield prototype du commerce
  • montage volant avec des modules du commerce
La réalisation d'un PCB n'est pas forcément à la portée de tout un chacun, et c'est pour cette raison que d'autres solutions sont proposées.

3.1. Le PCB shield maison

Principe de précaution : Voici un moyen simple de voir si un shield maison va s'enficher sur la carte prévue :


Imprimer sur papier, percer les pastilles avec une pointe, placer les connecteurs et enficher le tout sur la carte. Gagné, ça tombe bien en face !


On peut aussi placer les composants principaux. En haut à droite on peut voir que les deux boutons sont  suffisamment espacés pour pouvoir être manipulés sans avoir des doigts de fée. La carte a été légèrement allongée dans ce but.

Voici une photo de la réalisation finale, enfichée sur une carte UNO :


Une petite étiquette sur chaque connecteur pour s'y retrouver plus facilement (O pour "normally Open", C pour "normally Closed") :


Je bricole pas mal avec des batteries, et la solution du shield m'a paru la plus pratique, mais cela impose de réaliser un PCB. Pour une utilisation plus ou moins occasionnelle il y a plus simple.

3.2. Le shield prototype

On peut facilement utiliser un shield prototype du commerce à 2€ pour faire la même chose :
Je doute que la petite breadboard puisse contenir la totalité des composants mais la carte prototype à souder a de bonnes chances d'y parvenir. Par contre les relais prévus ne pourront pas être utilisés. Il faudra les remplacer par des relais 5V de petite taille au pas de 2.54mm :
Relais HF7520-005 HONGFA
Si l'on a besoin de courants faibles des relais REED de 1A seront suffisants :

Ces relais, s'ils ont une consommation de bobine inférieure à 20mA, n'auront même pas besoin de transistor de commande.
Exemples :
  • CELDUC D71A2100 (5V, 1A, courant de bobine 10mA)
  • RAYEX ELECTRONICS R2-1A05 (5V, 1A, courant de bobine 10mA).
  • etc.
Certains modèles intègrent la diode de roue libre.

3.3. Le montage volant

On peut également envisager un montage volant avec des modules tout faits branchés sur les connecteurs de la carte ARDUINO :

Il existe même des modules boutons et buzzer actif :
Dans le cas d'un montage volant, la LED utilisée dans le logiciel sera celle de la carte (sortie D13). La seule différence par rapport à la version shield est qu'elle est câblée au +5V et qu'elle fonctionnera à l'envers.
Si l'on trouve cela trop perturbant, rien n'empêche d'en ajouter une comme sur le schéma.

Enfin, on pourra même utiliser une carte NANO ou MEGA, ce que l'on a sous la main.

4. La partie logicielle

Récupérer la repository complète : https://bitbucket.org/henri_bachetti/usb-analog-logger.git

Cette repositiory contient deux répertoires :
  • arduino : les sketches
  • python : les scripts PYTHON

4.1. Les sketches

Quelques skectches ARDUINO sont fournis :
  • regulator-test.ino : test en charge d'un régulateur
  • battery-discharge.ino : test de décharge de batterie
  • battery-charge.ino : test de charge de batterie
Il est possible d'utiliser un buzzer actif au lieu du buzzer passif :

void beep(int time)
{
  tone(BUZZER, BUZZER_FREQ);
  delay(time);
  noTone(BUZZER);
}

// remplacer par :

void beep(int time)
{
  digitalWrite(BUZZER, HIGH);
  delay(time);
  digitalWrite(BUZZER, LOW);
}

Il est possible d'envisager de regrouper ces sketches en un seul, et de lancer la fonction voulue sur réception d'une commande venant du PC.

4.2. Le logiciel PC

Le logiciel côté PC permet d'afficher les valeurs mesurées sous forme de courbes.
Il est possible d'utiliser au moins deux solutions :
  • un script PYTHON
  • le logiciel Processing
  • toute autre langage, y compris C++, capable de lire une ligne série et d'afficher des courbes
4.2.1 Script PYTHON
C'est la solution que j'ai adopté. L'affichage est réalisé avec MATPLOTLIB.

Si ce n'est pas déjà fait installer python 2.7

Sous UBUNTU ou DEBIAN python2.7 est normalement déjà installé.

Installer les modules PYTHON suivants :
Sous UBUNTU ou DEBIAN c'est simple :

apt-get install python-serial
apt-get install python-matplotlib

Pour l'instant il n'y a qu'un seul script PYTHON : log-voltage-current.py
Il est capable de recevoir des informations de tension et de courant.
Si l'information de courant est absente, une seule courbe sera tracée.

4.3. Exemples

4.3.1. Surveillance de tension et courant
Nous allons tester ici un régulateur en fonction de son courant de sortie. Les deux relais sont utilisés pour commuter des résistances de charge.

Bien entendu les résistances devront être adaptées au courant maximal supporté par le régulateur et devront pouvoir dissiper la puissance demandée.

Voici le schéma de branchement :
La sortie du régulateur est branchée sur l'entrée A0 de l'ADS1115.
Les deux points communs des relais sont connectés sur GND à travers une résistance shunt.
Une résistance de 22Ω est connectée entre la sortie du régulateur et le contact normalement ouvert du relais 1.
Une résistance de 82Ω est connectée entre la d=sortie du régulateur et le contact normalement ouvert du relais 2.
Une résistance shunt de 1Ω permet de mesurer le courant par l'entrée A1 de l'ADS1115.

Et voici le sketch qui va charger le régulateur en trois temps :
  • 1ère phase sans charge
  • 2ème phase avec une charge de 82Ω
  • 3ème phase avec une charge de 22Ω
https://bitbucket.org/henri_bachetti/usb-analog-logger/src/master/arduino/regulator-test/regulator-test/regulator-test.ino

Déroulement :
  • appuyer sur le bouton START pour démarrer
    • le titre est envoyé par la ligne série
    • un beep est émis
    • la LED émet des flashs pendant le test
    • les mesures de tension et courant sont envoyées toutes les secondes
    • il se passe 3 secondes
    • le relais N°1 est activé
    • il se passe 3 secondes
    • le relais N°1 est désactivé
    • le relais N°2 est activé
    • il se passe 3 secondes
    • le relais N°2 est désactivé
Mode opératoire :
Charger le sketch regulator-test.ino dans l'ARDUINO
Côté PC, lancer le script PYTHON log-voltage-current.py

log-voltage-current.py <port> <csvfile>

port : le port USB où est connecté l'ARDUINO
csvfile : nom du fichier csv à générer

L'ARDUINO redémarre. Attendre quelques secondes.

Appuyer sur le bouton START.
Le script affiche sur la console les mesures reçues.

Au bout de 9 secondes le sketch envoie STOP au script PYTHON et celui-ci affiche la courbe obtenue :


On peut sauvegarder la courbe en .png en cliquant sur l'icône disquette.
Le fichier csv est chargeable dans Excel ou OpenOffice Calc.

4.3.2. Décharge de batterie
Nous allons tester ici une décharge de batterie NI-MH 3.6V ou LITHIUM-ION 3.7V. Les deux relais sont utilisés pour commuter des résistances de charge.

Bien entendu les résistances devront être adaptées au courant maximal supporté par la batterie et devront pouvoir dissiper la puissance demandée.

Attention, certaines batteries NI-MH préfèrent que l'on ne descende pas en desssous de 1.1V par élément.
Ce sketch fonctionnera aussi pour une batterie LITHIUM-ION.

Voici le schéma de branchement :
Ce montage permet de vider une batterie en un minimum de temps. Si l'on veut simplement relever une courbe de décharge, il suffit d'utiliser un seul relais dans le sketch, ou de relier les deux contacts NO ensemble en éliminant la résistance inutile.

La batterie est branchée entre GND et l'entrée A0 de l'ADS1115. Les deux points communs des relais sont connectés sur GND.
Une résistance de 22Ω est connectée entre la borne + de la batterie et le contact normalement ouvert du relais 1.
Une résistance de 82Ω est connectée entre la borne + de la batterie et le contact normalement ouvert du relais 2.

Après plusieurs essais sur breadboard (et ses faux contacts) j'ai fait un petit montage sur plaquette à pastilles, bien plus fiable et rapide à câbler. Le connecteur DUPONT mâle 6 points vient s'enficher sur le connecteur P5 de la carte. Un petit jumper permet de doubler le courant de décharge :


Et voici le sketch qui va vider la batterie NI-MH en deux temps :
  • 1ère phase à C / 3
  • 2ème phase à C / 10
https://bitbucket.org/henri_bachetti/usb-analog-logger/src/master/arduino/battery-discharge/battery-discharge.ino

Déroulement :
  • appuyer sur le bouton START pour démarrer
    • le titre est envoyé par la ligne série
    • un beep est émis
    • le relais N°1 est activé
    • la LED émet des flashs pendant toute la décharge
    • les mesures de tensions sont envoyées toutes les 2 secondes
    • lorsque la tension chute à 3V
      • le relais N°1 est désactivé
      • le relais N°2 est activé
      • la tension remonte à environ 3.2V
    • lorsque la tension chute à nouveau à 3V
      • le relais N°2 est désactivé
      • le buzzer émet un beep toutes les secondes
      • le bouton STOP arrête le buzzer
Mode opératoire :

Charger le sketch battery-discharge.ino dans l'ARDUINO
Côté PC, lancer le script PYTHON log-one-voltage.py

log-voltage-current.py <port> <csvfile>

port : le port USB où est connecté l'ARDUINO
csvfile : nom du fichier csv à générer

L'ARDUINO redémarre. Attendre quelques secondes.

Appuyer sur le bouton START.
Le script affiche sur la console les mesures reçues.

Lorsque la batterie est déchargée, le sketch active le buzzer et envoie STOP au script PYTHON et celui-ci affiche la courbe obtenue :


La batterie utilisée était presque vide : 3.9V. On voit bien la première descente jusqu'à 3V, ainsi que la seconde.
On peut sauvegarder la courbe en .png en cliquant sur l'icône disquette.
Le fichier csv est chargeable dans Excel ou OpenOffice Calc.

4.3.3. Charge de batterie
Avec un sketch différent nous allons pouvoir tester une charge de batterie NI-MH 3.6V ou LITHIUM-ION 3.7V.

Voici le schéma de branchement :
Ce montage permet de relever la courbe de charge d'une batterie.
Il faut pouvoir prendre deux points de mesure sur la carte chargeur :
  • résistance shunt de mesure du courant
  • LED de charge 
Sur le chargeur que j'utilise la résistance shunt est placée côté GND (low-side).
Le sketch envoie les mesures de tension en soustrayant de la tension batterie la tension aux bornes du shunt.
Si cette résistance est placée côté high-side, le sketch devra être adapté.

Le signal CHARGE est à 0 pendant la charge, à 1 lorsque la charge est terminée.

Voici le sketch qui va permettre de surveiller la charge :

https://bitbucket.org/henri_bachetti/usb-analog-logger/src/master/arduino/battery-charge/battery-charge.ino

Déroulement :
  • brancher la batterie sur le chargeur
  • appuyer sur le bouton START pour démarrer
    • le titre est envoyé par la ligne série
    • un beep est émis
    • la LED émet des flashs pendant toute la charge
    • les mesures de tensions sont envoyées toutes les 2 secondes
    • lorsque l'entrée D5 tombe
      • le buzzer émet un beep toutes les secondes
      • le bouton STOP arrête le buzzer
Mode opératoire :

Charger le sketch battery-charge.ino dans l'ARDUINO
Côté PC, lancer le script PYTHON log-one-voltage.py

log-voltage-current.py <port> <csvfile>

port : le port USB où est connecté l'ARDUINO
csvfile : nom du fichier csv à générer

L'ARDUINO redémarre. Attendre quelques secondes.

Appuyer sur le bouton START.
Le script affiche sur la console les mesures reçues.

Lorsque la batterie est chargée, le sketch active le buzzer et envoie STOP au script PYTHON et celui-ci affiche la courbe obtenue :
On peut sauvegarder la courbe en .png en cliquant sur l'icône disquette.
Le fichier csv est chargeable dans Excel ou OpenOffice Calc :


Voici un graphe OpenOffice de la fin de charge.

5. Téléchargements

Pour télécharger le projet : https://bitbucket.org/henri_bachetti/usb-analog-logger.git
  
Cette page vous donne toutes les informations nécessaires :
https://riton-duino.blogspot.com/p/migration-sous-bitbucket.html

6. Conclusion

Cet outil est évolutif et mes premières impressions sont bonnes. L'ADS1115 n'est pas un ADC rapide mais il est très précis.
Voilà qui va me permettre de relever des courbes de charge et de décharge de batterie, et bien d'autres choses, avec plus de facilité.


Cordialement
Henri

7. Mises à jour

18/08/2019 : corrections de bugs et améliorations
21/08/2019 : 4.3.3. Charge de batterie

Aucun commentaire:

Enregistrer un commentaire