Tout connaitre du suivi des charges et tensions avec un microcontrôleur (ESP8266, NodeMCU, Wemos, Arduino)

Afin d'avancer sur les chemins des objets connectés, dans cet article nous allons étudier comment suivre le niveau de charge d'une pile ou d'une batterie avec un microcontrôleur (tels que l'ESP8266 ou un Arduino). Et par extension, nous allons regarder comment utiliser le convertisseur analogique-numérique et s'il est possible que ce dernier puisse suivre le niveau de charge de sa propre alimentation électrique afin de nous alerter en cas d'approche d'une panne sèche. 💪

Dans les mondes de la domotique, de l'IoT (Internet of Things) et des objets connectés, il est fréquent d'avoir besoin de capteurs autonomes, alimentés électriquement sur piles ou accus. Dans le commerce on trouve assez facilement des capteurs de ce genre qui présentent un niveau d'autonomie tout à fait acceptable. Pour ma part j'ai déjà utilisé avec satisfaction des capteurs de température, d'humidité ou d'ouverture de portes comme ceux ci-dessous :


 
Exemple de capteurs RF433 du commerce fiable et abordables.
(si les images et les liens ci-dessus ne s'affichent pas sur votre écran, vous devez désactiver votre bloqueur de publicité sur ce blog. Ne vous faites pas de soucis, vous n'aurez aucun pop-up).

Mise à part le capteur de température premier prix qui nécessite de changer les deux piles LR06 environ une fois par an, les autres ont tenu la charge plus de deux ans. Ces capteurs s’appuient tous sur la fréquence 433Mhz, peu énergivore, pour transmettre les données. Ceci sous entend que coté serveur domotique nous disposions d'un équipement capable de capter les messages dans cette bande de fréquence. Typiquement il faudra un boitier  RFXCom RFXtrx433XL connecté à une box domotique (un Raspberry Pi avec un serveur Domoticz par exemple, comme décrit dans l'article ICI).
Ces capteurs, sur cette bande de fréquence sont pratiques, fiables, permettent une bonne durée de vie des piles et s'appuient sur des protocoles de communication standardisés qui les rendent compatibles avec la quasi totalité des systèmes domotiques. 

Pour ceux d'entre vous qui souhaitent intégrer rapidement, facilement, sans se poser de questions et de manière fiable quelque capteurs à leur solution domotique,  alors dirigez vous les yeux fermés vers ces derniers. 

Par contre, si comme moi, vous avez envie de créer vos propres objets connectés, qui offrent des services plus élaborés, plus personnalisés, plus adaptés à vos besoins spécifiques ou à votre écosystème. Si vous avez envie d'utiliser d'autres fréquences que le 433Mhz, comme le wifi ou le ZWAVE et que vous trouvez que les capteurs du commerce, sur ces longueurs d'ondes sont trop rares ou trop chers. Et surtout, si vous aimez comprendre, apprendre et réaliser les choses par vous même, alors vous aurez à un moment donné besoin de réaliser vos propres objets sur batterie et par conséquent vous aurez besoin de savoir comment en suivre le niveau de charge. Si vous êtes dans ce cas, alors, en lisant cet article, vous êtes exactement là où vous devez être, à faire ce que vous devez faire! 😁










Théorie de la charge


Lorsque je parle de suivre la charge d'une pile ou d'un accu et que je réfléchis ensuite (c'est souvent dans cet ordre que je procède), je me dis qu'en fait, je ne sais pas vraiment de quoi je parle (et c'est souvent la conclusion à laquelle j'aboutis). Je m'explique ....
Qu'est-ce que la charge d'un accu ? Est-ce qu'on la mesure en Volt, en Ampères, en Watt ? Est-ce qu'on considère que l'accu est vide lorsque ces mesures sont à zéro ou alors on considère qu'il est vide quand il ne fourni plus assez d'électricité pour alimenter le circuit sur lequel il est raccordé ? Nous allons essayer de trouver des réponses à toutes ces questions et ensuite nous pourrons regarder s'il est possible de suivre cette charge avec un microcontrôleur.

Caractéristiques d'un accu

Dans cet article je vais essentiellement utiliser le mot "accu" parce que c'est un mot qui me plait! Mais parfois j'utiliserai le terme de "pile", "batterie" ou "générateur". N'étant pas un expert, tous ces termes désignent pour moi des dispositifs équivalents dans le contexte de cet article. Je ne m'occupe que d'une seule fonction: qu'ils soient capables d'alimenter électriquement un circuit sans être raccordés au réseau. Si toutefois vous jugez que ce qui va être développé nécessite un vocabulaire plus précis (et que vous êtes un expert), n'hésitez pas à m'en faire part et j'en tiendrai compte.

Dans ce paragraphe nous allons essayer d'identifier quelles sont les valeurs caractéristiques qu'il faut connaitre lorsque l'on souhaite étudier le comportement des accus. Et comme dans ce blog nous sommes réunis pour cultiver nos connaissances, pour certaines, nous allons essayer de creuser un peu afin d'en comprendre vraiment la signification.

Lorsque l'on souhaite caractériser le potentiel d'un accu, voici les grandeurs qu'il va nous falloir connaitre:

La tension électrique. Exprimée en Volts (V). On l’appelle aussi potentiel car c’est elle qui juge la capacité d’un accu à forcer le déplacement d’électrons de la borne négative vers la borne positive.

L'intensité. Exprimée en Ampères (A), ce qui explique qu'on trouve parfois le nom "ampérage" pour l'évoquer. C’est une valeur qui caractérise la quantité d'électricité (soit le nombre et la rapidité des électrons) qui débite en un temps donné.

La puissance. Exprimée en Watt (W). Cette mesure représente la quantité d'énergie qui peut être délivrée en une seconde. C'est en quelque sorte la mesure de la capacité à fournir un travail. Cette puissance peut se calculer avec une des formules les plus connues dans le monde de l'électricité qui est la loi d'Ohm:

P = U.I (Puissance égale Tension multipliée par Intensité).

La capacité d'alimentation électrique. Exprimée en Ah (Ampère heure). Désigne la capacité d'un accu à fournir une intensité de courant durant une unité de temps. Par exemple un accu d'une capacité de 5Ah pourra (en théorie) délivrer un courant de 5A durant une heure, ou un courant de 0,5A durant dix heures.  L'unité de mesure Ah peut se décliner en mAh (milliampères-heures). Cette capacité veut tout simplement renseigner sur l’électricité que peut fournir l’accu depuis sa charge complète jusqu’à son épuisement complet.

En électricité / électronique on parle souvent de la capacité des condensateurs qui s'exprime en Farad (F). Le Farad se définit comme étant la charge (exprimée en coulomb C), accumulée par le condensateur sous une tension de 1 volt.
Par exemple, un condensateur ayant une capacité de 2 Farad qui est soumis à une tension de 5 Volt, aura une charge de 2*5 = 10 Coulombs.
Par définition, le coulomb représente également une capacité d'alimentation donné par la formule:
1 mAh = 3,6C 

Cette relation permet donc de faire le lien entre la capacité électrique exprimée en Ah et la capacité d'un condensateur exprimée en Farad. Pour reprendre notre exemple (je vous laisse faire le calcul), le résultat sera de 2,77 mAh. Donc, lorsque nous parlons de capacité, même s'il ne faut pas confondre celle d'alimentation électrique d'une pile en Ah et la mesure d'un condensateur en F, nous voyons qu'il y a un lien entre les deux et qu'au final nous parlons bien de la capacité d'un composant à délivrer une quantité de courant.


L'énergie. Exprimée en Wh. Il s'agit de la puissance délivrée durant un temps donné. L'énergie est égale à la puissance multipliée par le temps.  Il est bon de savoir que si la puissance est en watt et le temps en secondes, nous obtiendrons une puissance en Joules (J). Un joule est équivalent à un watt.seconde (W.s). Il faut donc 3 600 000 J pour faire 3 600 000 W.s, soit 1 kW.h.

Quelques nuances concernant la tension

Dans la réalité nous pouvons caractériser plusieurs formes de tension:

  • Tension nominale: U (Unité : le volt, V) : tension moyenne d'une batterie observée sur la plus grande partie de sa courbe de décharge.
  • Tension à vide: tension mesurée aux bornes d'une batterie non connectée à une charge*.
  • Tension en charge: tension mesurée aux bornes d'une batterie connectée à sa charge*. C'est-à-dire délivrant un courant.
*Dans le jargon des électroniciens/électriciens la charge désigne un composant connecté à la batterie: récepteur, moteur, résistance…

Caractérisation de la charge d'un accu

Maintenant que nous connaissons quelques définitions et que nous avons acquis un vocabulaire suffisant pour nous permettre de comprendre et d'exprimer les différentes caractéristiques d'une batterie, nous allons essayer de définir ce qui nous intéresse: qu'est-ce que le niveau de charge et comment le mesurer?

En général, lorsque l'on souhaite suivre le niveau d'une batterie, il y a deux caractéristiques qui vont intéresser l'utilisateur que nous sommes:

  • La tension car cette dernière diminue au fur et à mesure que la batterie est sollicitée et en dessous d'un certain seuil les composants du circuit qu'elle alimente ne vont plus fonctionner. Chacun d'entre nous sait que tout appareil électronique nécessite une tension déterminée pour fonctionner. Par exemple un Raspberry Pi est prévu pour fonctionner avec une prise USB sous 5V. Si je l'alimente en 3,3V il risque de ne pas fonctionner. Et si je l'alimente en 48V il risque d'exploser! Toutefois, en général, les composants électroniques ont des marges de tolérance. Bien qu'il soit donné pour 3,3V, un ESP8266 va fonctionner avec une tension comprise entre 3V et 3,6V. Au delà cela peut fonctionner mais cela sera à vos risques et périls. 
  • La capacité, que j'ai évoqué plus haut sous le nom de "capacité d'alimentation électrique" et qui en simplifiant désigne la quantité de courant contenue dans la batterie. Plus la batterie aura été utilisée, moins elle contiendra de courant (quelle logique!)

Ces deux caractéristiques sont celles qui nous intéressent car utiliser une batterie cela signifie deux choses:

  1. Mettre un circuit/un appareil/un composant sous tension. C'est cette tension qui, en s'opposant à la résistance du circuit, va engendrer le déplacement des électrons et faire fonctionner ce dernier.
  2. Fournir à nos équipements une énergie suffisante sur une période déterminée. Et cette énergie est apportée par la capacité de l'accu à fournir ce courant. 
Nous allons donc étudier s'il est possible de déterminer et suivre l'évolution de ces deux caractéristiques. 

Comment déterminer la capacité d'une batterie ?

Bon je n'irais pas par 4 chemins: a l'heure actuelle de mes recherches je n'ai pas trouvé de méthode simple et fiable qui permette de déterminer la capacité d'un accu. J'ai pu déterminer un certain nombre de possibilités pour arriver à obtenir cette valeur mais elles sont toutes complexes et dépassent le niveau de mes compétences et de cet article qui doit rester dans un cadre où chacun puisse comprendre et mettre en oeuvre les sujets que nous abordons. Pour ceux d'entre vous qui auront envie d'aller plus loin, je vais toutefois lister et dire quelques mots sur les pistes que j'ai pu obtenir. 

Piste 1: utilisation d'un circuit spécialisé. 
Apparemment il existe des circuits intégrés spécialisés dans la surveillance des accu et qui sont capables de communiquer à un micro contrôleur la tension, la température, l'intensité et implémentent un compteur de coulomb. Le compteur de coulomb est ce qui va permettre de calculer la quantité de courant consommée et d'en déduire la quantité de courant restante. Parmi ces circuits qui permettent d'indiquer l'état de charge d'un accu (SoC en Anglais), on trouve le STC3100.

Montage utilisant un STC3100

Le STC3100















Piste 1 bis: utilisation du circuit MAX17043 / MAX17044
MAXIM MAX17043 / MAX17044 Li + sont des dispositifs qui déterminent l'état d'une batterie lithium-Ion. Le MAX17043 est configuré pour fonctionner avec une seule pile au lithium et le MAX17044 est configuré pour deux cellules. Ils permettent des mesures de la tension de la batterie et déterminent son état de charge (SoC) par rapport à sa capacité maximale. Ils sont également en mesure d'émettre un signal d'alerte lorsqu'un seuil critique est atteint. Ce sont des dispositifs utiles dans des situations ou il est impératif de confirmer que les besoins en énergie seront satisfaits. Ce circuit me semble particulièrement intéressant grâce à son prix compétitif (moins de 5€ sur Amazon ICI) et parce que les données de capacité estimée sont accessibles via une interface I2C. Vous trouverez un tuto en Anglais sur son utilisation ICI. Quand à moi je ferais peut être un tuto sur son utilisation quand je pourrai en commander. 
MAX17043: module de détection de charge d'un accu Li-ion


Piste 2: la méthode OCV (Open Circuit Voltage ou Tension en circuit ouvert)
Cette méthode repose sur le constat que toute batterie diminue en tension au fur et à mesure qu'elle se décharge. On pourrait en conclure que la capacité de la batterie est une fonction de sa tension. Mais ce serait trop simple! Dans la réalité, la courbe de la tension en fonction de la charge de la batterie dépend de nombreux facteurs. Parmi ceux ci il y a la température mais surtout le type de batterie. La batterie au plomb présente une courbe quasiment linéaire et sur ce type de modèle on peut presque en déduire sa capacité restante en fonction de la tension mesurées à ses bornes. Mais les accu que nous utilisons pour nos circuits électroniques sont essentiellement de type NiMH ou Li-ion. Et ce type de batterie présente une chute brutale de la tension arrivée à un certain seuil de décharge. 

Le schéma ci-dessous est un exemple du type de courbe que l'on va pouvoir rencontrer:
courbe de la tension en fonction de la décharge sur un accu.Li-ion

Cette courbe nous montre plusieurs choses:
J'ai identifié des seuils mini et max pour la tension et la charge car pour bien utiliser un accu de type Li-ion il ne faut jamais aller au maximum de sa charge quand on le recharge, ni le vider à 100% de sa capacité. Sinon il est fort probable de l'altérer voir de le détruire. Dans la vraie vie on indique qu'il vaut mieux ne pas dépasser 4,2V en charge en 3V en décharge (je travaille avec des accu 18650 à 3,7V comme ICI). En général vous trouvez sur le site marchand les tensions Vmin et Vmax dans la fiche descriptive de l'accu que vous souhaitez acheter.
Cmax correspond à la capacité de l'accu lorsque ce dernier est chargé à sa tension max Vmax.
Cmini est la capacité de l'accu lorsque la tension est à Vmin. 
Cmax et Cmini définissent un intervalle d'utilisation dans lequel il convient de rester. On parle de profondeur de charge et de décharge. Approximativement cela correspond à environ [85%-15%]. Ceci signifie que la quantité de courant utilisable dans un accu est de 70% de sa capacité (en considérant que la capacité indiquée par le fabriquant soir vraie ... ce qui n'est pas toujours gagné!). 
Pour finir, nous observons sur ce schéma que l'écart entre Vmax et Vmin (noté ΔV comme delta V), peut se révéler assez petit. Et que la valeur de la tension va varier faiblement durant la quasi totalité du temps d'utilisation de l'accu. 

En résumé, il est possible d'utiliser la méthode OCV pour déduire la quantité de courant disponible dans l'accu. Mais cette méthode nécessite la connaissance de la courbe de décharge de l'accu et de plus se révèle délicate car:
  • Il va falloir des mesures précises de la tension.
  • Toutes les tensions mesurées vont varier faiblement dans un intervalle relativement petit. 
  • Quand la tension va commencer à chutter brusquement il faudra intervenir rapidement pour ne pas que cette dernière atteigne un seuil qui endommagerait l'accu. 

Piste 3: la manière empirique.
Comme son nom l'indique, cette méthode consiste à faire des expérimentations, prendre des mesures et ensuite se servir de ces dernières afin de générer un suivi. 
Par exemple, après avoir chargé vos accu au maximum (avec un chargeur qui le protège des dépassements de seuil comme CE petit bijou que je me suis offert), vous les placez sur votre circuit cible et vous chronométrez combien de temps il va fonctionner. Vous pouvez ensuite avec une regle de 3 déduire la charge de l'accu en fonction du temps. Si votre circuit à fonctionné 4h, vous pouvez considérer qu'au bout de 2h l'accu dispose de 50% de charge. 
Ceci n'est qu'un exemple. Il y a plusieurs méthodes pour construire une table d'évolution de la charge de manière empirique. Et si vous avez un chargeur comme le miens, vous pouvez à intervalle régulier replacer les accus un court instant dessus afin de contrôler leur niveau.

Pour réaliser des mesures supplémentaires sur votre circuit, vous pouvez également utiliser un circuit qui s'appelle INA219. Ce dernier permet de mesurer simplement la puissance consommée par un appareil mais aussi on peut l'utiliser pour mesurer la puissance délivrée par un panneau solaire ou une batterie. L’INA 219 permet de mesurer un courant continu jusqu’à 26V / 3.2A. Il est équipé d’un bus I2C ce qui permet de récupérer très facilement les mesures à l’aide d’un Arduino, ESP8266 ou d’un Raspberry Pi. Attention car certains modèles présentent des soucis de communication (voir ICI). Vous pouvez le trouver ICI

Comment déterminer la tension d'une batterie ?

La tension d'un accu peut se caractériser par deux niveau:

  • Vmax = Niveau de tension à son maximum lorsque l'accu est chargé au maximum.
  • Vmin = Niveau de tension minimum en dessous duquel il ne faut pas descendre sous peine de dégrader l'accu. 
Lorsque que l'accu sera utilisé, la tension à ses bornes va diminuer de Vmax jusqu'à Vmin. Mais comme nous l'avons vu à l'occasion dans le chapitre précédent, l'évolution de cette tension ne sera linéaire. Certaines batteries, comme celles au plomb, on une courbe de la tension par rapport à leur niveau de décharge presque linéaire. Par contre les accu que nous utiliserons le plus souvent en électronique (Ni-Mh ou Li-Ion) présentent une diminution de la tension relativement lente jusqu'à un seuil et une chute brutale au delà de ce seuil. 
Li-ion en orange et Plomb en vert

Ce comportement de la tension dans les accu va nous empêcher de déduire de manière simple le niveau de charge de ce dernier par rapport à sa tension. Pour cela, il nous faudrait connaitre la courbe de décharge et savoir se positionner dessus. Ce qui sera tout à fait possible. 
Par contre, de manière simple et directe, le suivi de la tension va nous permettre de détecter que l'on approche ou que l'on atteint le seuil Vmin. Et l'approche de ce seuil va nous informer qu'il est temps de recharger notre accu. 
En fonction des cas, il faudra réagir plus ou moins rapidement:
  • En quelques minutes pour un objet fortement consommateur afin d'éviter que la batterie ne soit totalement vidée.
  • En quelques jours pour un objet connecté qui consomme peu.
Nous pourrons nous même fixer Vmin pour que l'alerte nous remonte aux environ de 70% de décharge afin de nous laisser plus de temps pour intervenir et recharger ou changer la batterie.

Contrairement au niveau de charge, nous allons voir qu'il est très facile de mesurer le niveau de tension aux bornes d'un accu ou aux bornes d'un circuit électrique. 

Utilisation d'un microcontrôleur pour suivre une tension

Pour ceux qui se seraient endormis jusqu'ici, c'est le moment de se réveiller car nous allons passer aux choses sérieuses. Je rappel que notre objectif dans cet article est d'étudier comment nous pouvons suivre l'évolution de la charge de la batterie d'un objet connecté que nous aurions construit nous même avec un microcontrôleur. L'objectif étant bien entendu d'être prévenu avant la panne sèche pour changer la batterie, mais aussi de nous permettre d'optimiser la consommation de nos montages, d'estimer combien d'accu nous aurons besoin et au final peut être même de revoir la faisabilité de notre projet. Et toujours pour rappel à ceux qui s'étaient endormis, nous avons vu dans le chapitre précédent qu'à notre niveau, le moyen le plus simple pour réaliser ces fonctions, serait de se baser sur des mesures de la tension. Et devinez quoi ? Hé bien mesurer une tension, en général, nos chers microcontrôleurs vont savoir le faire (trop de bonheur)! Et nous allons voir comment.

Le convertisseur ADC

Certains microcontrôleurs contiennent des Convertisseur Analogique-Numérique (CAN en français ou plus souvent appelés ADC pour Analog to Digital Converter dans la langue de Shakespeare). Comme son nom l'indique, l'ADC* est utilisé pour convertir un signal analogique en une représentation numérique. Où autrement dit pour simplifier: convertir une tension en un nombre. Et d'emblée, en disant cela, nous comprenons que c'est grâce à ce circuit électronique embarqué dans nos microcontrôleurs que nous allons pouvoir "mesurer" une tension.
*Pour comprendre le fonctionnement d'un ADC je vous invite à lire l'excellent article du blog d'Eskimon ICI

Quels microcontrôleurs contiennent un ADC ?

Comme notre objectif est de mesurer une tension et que c'est le circuit ADC qui va nous le permettre, nous allons nous intéresser exclusivement aux μC qui en disposent.
Je ne vais pas essayer ici de faire une liste exhaustive, mais d'emblée, je peux vous dire que c'est le cas des μC que nous rencontreront le plus dans le monde de la domotique et des objets connectés tels que les ATtiny (25/45/85), les Arduino, les NodeMCU, les Wemos et les ESP8266EX* en disposent.
*Pour les ESP8266 il faudra être prudent et bien comprendre de quoi on parle. Je reviendrais sur le sujet un peu plus tard dans cet article.

Comment faire pour savoir si un μC contient un ADC ? 
Si vous utilisez un autre modèle que ceux que je viens d'énumérer, vous devrez regarder le plan de brochage (faire une recherche avec le mot clé anglais "pinout" sur votre moteur de recherche préféré). Le plan de brochage montre de manière schématique toutes les broches du microcontrôleur et leur fonction. Par exemple en faisant une recherche sur "arduino nano pinout" je trouve des images qui ressemblent à ça:

Arduino nano pinout

Si le microcontrôleur dispose d'un ADC, vous allez retrouver dans le plan de brochage un ou plusieurs des éléments suivants:
  • Un code de couleur (comme dans le petit cadre à droite dans l'image ci-dessus) qui fait apparaître un type de broche analogique (Analog Pin). Sur la partie de gauche toutes les broches qui porteront cette couleur porteront une fonction "ADC". 
  • Des broches qui sont identifiées comme "Analog Pin" et qui vont porter un nommage de type A0, A1, A2, ...
  • Des broches qui portent des fonctions nommées "ADC". Comme ici avec les broches vertes ADC0, ADC1, ... 
  • Une broche qui porte le nom de TOUT est une broche analogique comme on peut le voir ci-dessous:
Schéma des broches du ESP8266EX 

Si vous retrouvez cela dans la description du brochage, c'est que vous pourrez accéder à un convertisseur ADC. Par contre, certains circuits intègrent un microcontrôleur disposant d'une broche analogique mais cette dernière n'est pas toujours soudées et utilisable (pour exemple voyez le cas particulier des ESP8266 dans l'encart ci-dessous).

Autre exemple, en faisant la recherche sur les fonctions des broches d'un Raspberry PI, on trouve:

Raspberry PI pinout

Ici on ne retrouve aucun des termes énoncés précédemment. Pas de ADC, pas de A0, pas de Analog PIN, ... On va en déduire que le raspberry n'a pas d'ADC. Et effectivement, pour procéder à des lectures de signaux analogiques avec le RPI, il faudra lui adjoindre un petit circuit externe comme ICI ou encore ICI. Ou alors réaliser à montage à base d'un ADC externe (comme le MCP3004).



Cas particulier des ESP8266:
Nous avons vu que l'ESP8266, en tant que microcontrôleur, dispose d'un ADC. Toutefois il ne faut pas confondre l'ESP8266 en tant que μC et la plaque sur laquel il est livré. On ne se procure jamais la puce seule mais toujours sur une plaque telle qu'ESP01, ESP12E, NodeMCU ESP12E, sur lesquelles les broches sont soudés afin de les rendre accéccibles à l'utilisateur. Bien que la puce 8266 dispose d'un ADC, la broche correspondante n'est pas toujours accessible selon le modèle de carte que l'on se procure. Par exemple, sur le NodeMCU ESP12E ci-dessous (à gauche), nous voyons tout à fait qu'il est possible d'utiliser une broche ADC nommée A0. Par contre, dans le plan de brochage de l'esp01s à droite), nous voyons que l'utilisateur n'a pas accès à une broche ADC. Et cela même si ces deux circuits embarquent une puce ESP8266.


Valeurs retournée par l'ADC en lecture d'une broche analogique

Bon là nous commençons à rentrer dans une partie de cet article dans laquelle je vais avoir du mal à généraliser car chaque microcontrôleur va avoir ses spécificités. Il va donc falloir que je m’appuie sur des exemples et je vais choisir l'ESP8266 et en particulier les NodeMCU ESP12E Lolin v3 et les ESP01s. Pourquoi ce choix ? Tout simplement parce que j'en ai un sous la main et que je les aime 💗!

Comme nous l'avons évoqué, le circuit ADC permet de convertir un niveau de tension analogique en une représentation numérique. Donc en un nombre. Ce nombre sera accessible au μC dans nos programmes avec une variable. Mais l'ADC ne va pas pouvoir convertir n'importe quelle tension. Comme tout composant il fonctionnera pour un intervalle défini entre une tension minimale (presque toujours 0V) et une tension maximale. En général (et c'est le cas sur le 8266) l'ADC va être capable de lire un niveau de tension allant de 0V à 1V. Et la valeur numérique qui sera retournée va être proportionnelle mais dans un intervalle échantillonné par rapport au nombre de bits de précision de l'ADC. Par exemple, avec 8 bits, nous pouvons modéliser 256 valeurs. Avec 10 bits, nous pouvons avoir 1024 valeurs. Ceci signifie qu'un ADC ayant 10 bits de précision, va pouvoir retourner 1024 valeur pour identifier une tension dans l'intervalle de mesure ([0V - 1V] par exemple). La précision dans ce cas sera dans cet exemple de (1 / 1024) Volts (soit en arrondissant un peu: 1mV).


Soyons précis sur l'intervalle d’échantillonnage du convertisseur ADC!


On trouve souvent sur internet des articles qui disent que puisque l'ADC fonctionne avec une précision de 10 bits, la valeur retournée sera dans l'intervalle [0 - 1023] (ce qui représente effectivement 1024 valeurs possibles). Hors dans la réalité j'ai constaté que la fonction qui va lire la broche analogique, la fonction analogRead(), retourne des valeurs jusqu'à 1024 inclus (donc 1025 valeurs). Je n'ai pas trouvé de textes sérieux qui expliquent précisément ce fonctionnement. Mais après avoir réalisé de nombreux essais j'ai déduis que l'ADC va mesurer les tensions sur l'intervalle [0 - Vmax] et renvoi des valeurs sur [0 - 1023]. Mais lorsque la tension dépasse la tension maximale de 1/1024 * Vmax volts, la fonction analogRead() va retourner 1024 au programme. Ce nombre 1024 ne sera pas exploitable pour réaliser une conversion en Volt mais il indique au programme que la tension maximale est dépassée. 

Conversion en tension de la valeur retournée par l'ADC

L'ESP8266 est doté d'un convertisseur analogique-numérique 10 bits intégré avec un seul canal ADC, c'est-à-dire qu'il n'a qu'une seule broche d'entrée ADC, appelée "TOUT" dans les schémas, pour lire la tension analogique externe. Il va lire une tension située entre 0V et 1V et retourner un nombre proportionnel dans l'intervalle [0 - 1023]. La valeur maximale de 1V est appelée la tension maximale de référence théorique de l'ADC. En générale cette valeur est indiquée dans les documentations techniques. Et la valeur que l'on trouve est souvent une valeur théorique que nous serons appelé à corriger dans la réalité pour avoir des mesures précises. Nous détaillerons cela plus loin, mais en attendant, lorsque nous obtenons la valeur retournée par le fonction analogRead, pour en déduire la tension il faudra simplement programmer une règle de trois:
  • N étant le nombre décimal retourné par la fonction analogRead. Vx étant la tension que nous essayons de mesurer sur la broche TOUT. 
  • Si N = Nmax => Vx = Vmax (la tension maximale de référence. Donc ici 1V).
  • Pour N = x => la tension est Vx qu'il faut calculer
  • Nous obtenons donc la formule magique: Vx = Vmax * x / Nmax

Dans le cas de l'ESP80266, Vmax = 1 et Nmax = 1023. Cette formule devient donc :

Vx = 1 * x / 1023

x étant la valeur retournée par la fonction analogRead( A0 ).

Cas particulier des NodeMCU (et autres Wemos D1 mini)

C'est le pont pont 

J'aborde ici un point spécifique concernant des cartes telles que le NodeMCU. On confond souvent le microcontrôleur et la carte sur laquelle il est fourni. Un NodeMCU embarque une puce ESP8266 mais également d'autres composantes (comme par exemple un régulateur de tension, une puce de communication UART, des LED, un port USB,....). 
On confond aussi parfois NodeMCU et le module tel que l'ESP12E. Ce qu'il faut comprendre c'est que le NodeMCU (comme le Wemos) est une carte qui embarque un module de type ESP12E (ou autre ESP) qui lui même embarque un microcontrôleur ESP8266. J'ai trouvé l'image ci-dessous qui illustre cela.

Composition d'un NodeMCU

Par soucis de simplification, on utilise souvent (moi le premier) le terme de microcontrôleur pour désigner parfois la carte complète (NodeMCU) ou le module (ESP). Et cela n'a pas vraiment d'importance. Mais ici j'ai souhaité préciser cela car c'est important pour bien comprendre quelle tension nous allons pouvoir mesurer. Bien souvent on va lire que l'ESP8266 intègre un circuit ADC qui interprète des tensions entre 0 et 3,3V. Dans d'autres cas on va trouver dans les forums des utilisateurs perdus qui détectent une saturation de l'ADC autours de 1V et ne comprennent pas pourquoi. Et moi je vous parle ci-dessus d'une fenêtre de mesure entre 0 et 1V. En réalité l'ESP8266 mesure des tensions dans la fenêtre [0V - 1V]. Les cartes et les modules fonctionnent en général en 3,3V. Donc avoir un ADC qui ne peut mesurer que du 1V maximum rend l'utilisation plus complexe. Afin de simplifier l'usage, certaines cartes, comme le NodeMCU ajoutent entre l'entrée du microcontrôleur et la broche A0, un pont diviseur de tension. Ce dernier, en divisant la tension appliquée à l'ADC par un nombre donné, va permettre de mesurer des tension plus importantes. 

Impact sur les mesures

Un pont diviseur de tension est un circuit linéaire passif produisant une tension de sortie qui est une fraction (donc proportionnelle) de sa tension d'entrée. Je vous laisse chercher sur internet pour en savoir plus sur le fonctionnement exact (par exemple ICI). 
Le schéma ci-dessous présente le pont qui est placé derrière la broche A0 et devant l'entrée TOUT de l'ESP8266 dans un NodeMCU ESP12E.

Pont ADC NodeMCU

Le fonctionnement est simplissime: La tension appliqué en A0 est divisée par un coefficient dépendant de la valeur des deux résistances R1 et R2. Ainsi la broche TOUT de l'ESP8266 reçoit une tension moindre. Et comme nous l'avons vu, la tension sur TOUT ne doit pas dépasser 1V.
La formule permettant de lier toutes ces mesures est la suivante:

Vtout = Va0 * R2 / ( R1 + R2 )

Dans notre cas nous connaissons R1 (220Ω), R2 (100Ω). Nous connaissons aussi la formule de Vtout  car il s'agit du Vx que nous avons calculé dans le paragraphe précédent à partir de la valeur retournée par analogRead. Ce que nous souhaitons c'est connaitre Va0, la tension appliquée sur la broche analogique. Les mathématiques viennent une nouvelle fois à notre secours: 

Va0 = Vtout * ( R1 + R2 ) / R2

En appliquant avec les valeurs des résistances du pont du NodeMCU nous obtenons:

Va0 = Vtout * 3,2

Vtout étant notre Vx dans la formule précédente. x étant le nombre retourné au programme par l'ADC via analogRead(), nous pouvons donc, dans le cas d'un NodeMCU (ou Wemos) déduire la tension appliquée à la broche A0 par le calcul suivant: 

Va0 = 3,2 * x / 1023
ou en arrondissant 
Va0 = 0,003128 * N

Nous voyons donc que vous déterminer la tension appliquée à la broche analogique, il faut simplement multiplier la valeur numérique retournée par l'ADC par un coefficient (que j’appellerais Coef). Ce coefficient que nous venons de calculer est théorique. Et nous savons qu'en électronique il y a souvent pas mal de différences entre la théorie et la mesure réelle. Les résistances du pont ont des précisions qui ne sont pas exactes, l'ADC peut renvoyer des valeurs légèrement différentes en fonction du modèle de microcontrôleur, du montage que vous avez réalisé ou de la tension d'alimentation. Si vous souhaitez mesurer une tension à 5% d'erreur près, la valeur théorique pourrait être suffisante. Et nous allons voir plus tard dans cet article dans quel mesure ce sera la cas. Si vous voulez plus de précision, il faudra que vous calculiez le coefficient correspondant à votre contexte. Nous verrons également comment le réaliser.

Tension maximale sur la broche analogique du NodeMU


Toutes ces belles formules vont nous permettre de lire une tension en utilisant la broche analogique de notre cher microcontrôleur. Mais nous nous doutons bien que nous allons être soumis à des limites. Si vous pensez pouvoir suivre la décharge d'une batterie de 12V en connectant cette dernière directement sur la broche analogique alors vous risquez d'être déçu. Il faut se demander quelle est cette tension maximale supportée par la broche A0.

Nous allons devoir faire la différence entre deux maximum: 

  1. La tension maximale qui pourra être mesurée par l'ADC. C'est à dire la tension pour laquelle la fonction analogRead va retourne 1023. Nous allons appeler cette dernière Vmax (comme tension max). 
  2. La tension maximale qui sera supportée sur la broche. C'est à dire la tension au dessus de laquelle on va endommager les composants. Nous allons appeler cette tension Vcrit (comme tension critique).

Entre Vmax et Vcrit nous allons pouvoir "supporter" des valeurs de tension qui ne seront pas mesurables car la fonction analogRead retournera toujours 1024.

Pour calculer la valeur théorique de Vmax sur un NodeMCU, nous allons demander aux maths de nous aider.

Nous avons vu que l'ESP8266 ne supporte pas une tension de plus d'1V sur sa broche TOUT. Et nous avons vu que Va0 = Vtout * 3,2. Si Vtout ne doit pas être supérieure à 1V nous déduisons que Va0 ne doit pas être supérieure à 3,2V. CQFD! Bien sur ceci est encore une valeur théorique. Dans la pratique, il faudra calculer cette valeur.

Déterminer Vcrit est plus compliqué.
Nous nous doutons bien que nous ne pouvons pas augmenter la tension de chaque NodeMCU jusqu'à trouver celle qui le fait griller! De plus, le nodeMCU contient des dispositifs qui protègent les composants en redirigeant du courant vers la masse en cas de surtension. J'ai par exemple par erreur connecté la broche A0 à une tension de 5,5V. J'ai constaté une chute brutale des mesures qui m'indiquait qu'en continuant encore quelques secondes j'allais faire griller ces protections.
Pour déterminer Vcrit il faut se baser sur les valeurs données par les constructeurs de l'ESP8266. Partout on trouve que les broche analogiques ne doivent pas dépasser une tension de 3,6V. Nous allons donc prendre en compte cette valeur établir Vcrit = 3,6V.







Mesures des tensions réelles


Maintenant que nous avons toutes les connaissances théoriques nécessaires, nous allons pouvoir commencer à réaliser nos premiers montages et nos premières mesures. Nous verrons comment calculer les différents coefficients pour calibrer le microcontrôleur et ainsi obtenir des mesures avec un taux d'erreur acceptable.  Les informations de ce chapitre sont à priori reproductibles pour tout microcontrôleur disposant d'une broche analogique en adaptant les niveaux de tension aux caractéristiques propres à chaque modèle. Ici j'ai réalisé l'ensemble des montages avec un NodeMCU. Nous allons étudier les deux modes de fonctionnement de l'ADC qui mesurent la tension sur la broche analogique pour le premier et la tension de l'alimentation interne pour le second.

Mesure d'une tension externe

Dans ce paragraphe nous allons voir de manière concrète comment mesurer la tension d'un accu qui alimente notre microcontrôleur. Nous allons voir quelles sont les niveaux de précision que nous pouvons obtenir en appliquant les formules théoriques, nous verrons comment faire pour améliorer cette précision et nous étudierons s'il y a des différence entre plusieurs microcontrôleurs de même modèle, entre plusieurs tensions d'alimentation et entre plusieurs mode d'alimentation.


Tout un programme ... allez on se relève les manches et on met les mains dans le cambouis! 

Pré requis 

Pour lire la tension d'alimentation externe il faut utiliser la fonction logicielle "AnalogRead( broche )" et remplir ces conditions:
  1. La broche analogique associée à la mesure (A0 par exemple) doit être connectée  (forcément!)
  2. Dans le cas d'un module ESP8266 qui intègre une connectivité wifi, l'ADC ne peut être utilisé de manière fiable pendant une transmission. Il faudra donc s'assurer que les mesures soient prises en dehors de toute transmission. 
  3. L'ESP doit reconfigurer l'ADC au démarrage pour qu'il fonctionne en mode lecture externe. Cela se fait en ajoutant la ligne suivante n'importe où (mais plutôt tout en haut de votre programme et en dehors de toute fonction): ADC_MODE (ADC_TOUT); Cette instruction sera appliquée à la compilation, donc vous ne pouvez pas la placer dans une fonction ou dans un "if" conditionnel. Par défaut l'ADC est configuré pour lire la tension sur la broche TOUT (mode ADC_TOUT). Donc si vous n'ajoutez pas cette ligne de code cela fonctionnera tout de même. Dans ce mode la fonction getVCC() ne fonctionnera pas. 

Mode opératoire

Nous allons réaliser deux montages ayant chacun pour but de nous permettre de mesurer et faire varier la tension  appliquée sur la broche A0 du NodeMCU avec un potentiomètre.
Nous allons réaliser également un programme qui va, en boucle et toutes les 5 secondes, appeler la fonction analogRead() et afficher la valeur N retournée.
Nous avons vu dans la partie théorique qu'il faut appliquer la formule Va0 = Coef * N pour déduire la tension. Ici, ce que nous allons chercher à déterminer c'est si ce "Coef" théorique est identique à la réalité. Pour faire cette comparaison, nous allons mesurer la tension réelle en A0 car nous allons placer un multimètre précis entre A0 et GND. Nous pourrons donc calculer le Coef réel avec Coef = Va0 réelle / N. Pour chaque mesure nous comparerons ce Coef réel au Coef théorique.
Pour rappel, pour un NodeMCU avec un pond diviseur de tension nous avions un Coef théorique de: Coef_theorique = 3,2 / 1023 (environ 3,128mV).

Pour savoir si votre microcontrôleur contient un pont diviseur de tension devant l'ADC, il faudra débuter les mesures avec le potentiomètre laissant passer une tension légèrement en dessous de 1V (0,95V par exemple). Si l’affichage du programme retourne un nombre proche de 1024 c'est que nous sommes quasiment déjà au maximum et donc qu'il n'y a pas de pont. Par contre si l'ADC retourne une valeur proche de 300, c'est qu'il y a un pont tel que nous l'avons vu sur le NodeMCU. Si la valeur est différente c'est qu'il y a un pont mais les valeurs des résistances qui le constituent ne sont pas identiques à celles du NodeMCU.

Comme source d'énergie je vais utiliser un accu 18650 dans un boitier. Tout ce petit montage sera réalisé avec des breadboard, des câbles dupond et des connecteurs.

Pour connecter le NodeMCU au PC afin d'afficher les informations sur le moniteur série de l'IDE Arduino (ou tout autre moniteur série de votre choix comme Putty), je vais utiliser dans un premier temps un adaptateur FTDI et dans un second un raccordement direct en USB. Passer par l'adaptateur FTDI permet au NodeMCU d'être alimenté sur accu et de ne pas prendre son alimentation sur le câble USB. Comme prérequis je considère que vous avez l'IDE Arduino d'installé et configuré pour l'ESP, que vous savez téléverser un programme et utiliser le moniteur série. Si ce n'est pas le cas, vous trouverez toutes les informations sur l'installation dans mon article ICI, sur la programmation de l'ESP ICI et toutes les informations sur la communication en série entre l'ESP et le PC dans mon article ICI. Si vous souhaitez utiliser Putty comme moniteur série vous trouverez des informations importantes ICI dans le paragraphe qui s'intitule "Tester que l'ESP fonctionne ".

Liste du matériel



Philosophie commerciale: Je ne suis pas actionnaire d'Amazon ou autres eBay. Les liens que je vous donne pointent sur du matériel compatible avec mes montages, que je recommande et que j'ai souvent acheté moi même. Je ne choisi du matériel de bon rapport qualité/prix/service (livraison, SAV,...) Si vous faites un achat en passant par un de mes liens, la (minuscule) commission qui me sera versée ne manquera pas dans les bénéfices (énormes) des sites marchand et m'aidera à investir et rédiger de nouveaux articles. Et si aucun matériel ne vous intéresse, vous pouvez mettre ce lien https://amzn.to/30xd8Ag dans vos favoris et l'utiliser quand vous aurez besoin de quelque chose sur Amazon.

Un GRAND merci à tous ceux qui ont joué le jeu. 


Pour ceux qui le désirent voici des liens pour vous procurer le matériel: 
  • Les connecteurs: pratiques pour faire des montages rapides avec des câbles de diamètre différentes. Ils fonctionnent avec un pince à ressort. ICI.
  • Les NodeMCU v3 ESP12E. Cette carte ne se présente plus. J'en ai plusieurs et je les adore. Vous pouvez les trouver moins chers ICI mais ICI ils arriveront plus rapidement chez vous et compatibles avec le driver PC CH340. 
  • Le potentiomètre que j'ai utilisé proviens d'un kit de composants de chez Elegoo comme ICI. Il dispose d'une résistance de 10kΩ. N'importe lequel fera l'affaire mais privilégiez les modèles prévus pour être placés sur breadboard comme ICI
  • Le multimètre que j'adore et qui ne cesse de m'étonner par toutes ses fonctions et sa précision! Le même modèle est estampillé sous plusieurs marques. Moi j'ai un METERK qui a été remplacé par JANISSA ICI. Franchement il est top et si vous bricolez un peu l'électricité ou l'électronique vous ne serez pas déçu de mettre une trentaine d'euros dans un tel appareil. Si vous voulez voir le test, n'hésitez pas à lire mon article qui lui est dédié ICI.
  • Les câbles Dupont mâle-mâle comme ICI
  • Les batteries 16850 se trouvent un peu partout. Je n'y connais pas grand chose alors j'ai pris des 2500mAh comme ICI. Et pour les recharger je me suis fait plaisir avec un chargeur vraiment top ICI
  • L'adaptateur FTDI. Il y en a plusieurs versions. La mienne est ICI. Mais il en existe une plus pratique qui évite d'avoir à souder deux fils ICI

Voici tout ce matériel en image (si vous ne les voyez pas c'est surement votre AdBlock qui bloque! Vous pouvez le désactiver sur mon blog car je n'envois aucune pub ou aucun popup):

    

Premier montage réalisé

Ce premier montage alimente un circuit avec un accu 18650. L'ESP est raccordé au PC uniquement pour le téléversement du programme et afficher les données sur le moniteur série. 

Pour que ce soit plus clair, je vous ais fait un petit schéma:





Voici les points particuliers numérotés sur le schéma:
  1. Le voltmètre est relié à la ligne - et à la sortie centrale du potentiomètre. Lorsque le potentiomètre sera utilisé c'est cette tension qui va varier. Le potentiomètre étant raccordé au + et au -  de l'accu, la tension pourra varier de 0 jusqu'à la tension de l'accu. 
  2. La sortie régulé du potentiomètre est également connectée à la broche A0 du NodeMCU. C'est cette tension qui sera mesurée par le microcontrôleur. Elle sera également affichée sur le voltmètre. 
  3. La boche D3 du NodeMCU est raccordée GPIO0 du FTDI. Ceci permet de passer le NodeMCU en mode flash au démarrage. Toutefois si vous décidez de téléverser le programme en USB vous n'aurez pas besoin de cette connexion.
  4. Les cables orange et vert représentent respectivement les lignes TX et RX de la liaison série. 
Notez bien:
  • Bien que je ne l'ai pas indiqué sur le schéma, j'ai placé un condensateur 1mF sur la ligne d'alimentation entre le + et le - de la breadboard. Ce dernier m'a permis de stabiliser plus facilement les tensions.
  • Les GND sont raccordé entre eux des GND. Ceci est important pour le bon fonctionnement du montage. 
  • Le NodeMCU est alimenté sur la broche VIN depuis l'accu.

Deuxième montage réalisé

Le second montage a pour but de faire des mesures d'une tension sur A0 mais avec le NodeMCU alimenté en USB. Il est quasiment identique au précédent sauf pour la connexion vers le PC. L'idée est de regarder s'il y a des différences de comportement de l'ADC en fonction de la ligne d'alimentation du microcontrôleur.


Pour que ce soit plus clair, je vous ais fait un petit schéma:


Le matériel utilisé est le même mais la liaison série se fait directement sur l'USB et on n'utilise plus de traducteur FTDI.

Programmation

L'objectif de cet article n'étant pas de faire un cours de programmation, je ne vais pas commenter outre mesure le code que j'ai écrit. Le but de ce programme n'est que de lire le nombre retourné par l'ADC. Pour réaliser cela nous allons utiliser la fonction analogRead( Ax ). Ax étant l'identifiant de la broche analogique que nous souhaitons interroger. Dans notre cas, le NodeMCU n'ayant que la broche A0, Ax sera donc égale à A0. Vous trouverez facilement sur internet (comme ICI) des informations sur cette fonction. Par contre n'oubliez pas que la tension maximale qu'elle mesure dépend du microcontrôleur utilisé (en Arduino fonctionnera en 5V alors qu'un NodeMCU en 3,3V).  

J'ai réalise un petit programme dont l'objectif est de lire la valeur retournée par l'ADC et de l'envoyer pour affichage sur le moniteur série du PC. Etant un ancien développeur, j'ai gardé quelques habitudes d'écriture de code: pourquoi faire simple quand on peut faire plus compliqué! Mais je vous livre mon programme tel quel afin que ceux qui le souhaitent puissent y apprendre des petites astuces. 

/********************************************************************
* Test_ADC
* =========
* Ce programme est destiné à tout microcontroleur disposant d'un convertisseur ADC
* ainsi que d'une broche de lecture analogique en A0. Il permet de lire en boucle
* la valeur en A0 et de l'afficher sur la liaison série.
*
* Versions :
* ==========
* 29/06/2019 - v1 : Création
*
* (c) acampeaux@gmail.com
*********************************************************************/

/*====================================================================
 * CONSTANTES & VARIABLES
 * ==================================================================*/
String stNomProgramme = "Test_ADC";
String stVersion = "v1";

/* Vitesse de transmission de la liaison série: permet de lire les
premiers caractères envoyés par l'ESP lorsqu'il démarre. */
long int liBauds = 74880;

/* Variable pour compter le nombre de lecture d'A0 réalisé */
int iNombre = 0;

/*====================================================================
  * Fonction setup
  * Initialisation de la liaison série
 * ==================================================================*/
void setup() {
  Serial.begin( liBauds );
  delay( 100 );
  Serial.println( String("\nInitialisation liaison serie a ") + liBauds + " Bauds : OK" );
  Serial.println( stNomProgramme + " version " + stVersion );
}

/*====================================================================
 * Fonction loop
 * Lecture de la broche analogique A0 et affichage du résultat.
 * Attente de 5 secondes entre chaque lecture.
 ====================================================================*/
void loop() {
  /* Lecture de la broche A0 */
  int iA0 = analogRead( A0 );
  Serial.println( String("Mesure num: ") + iNombre++ + " Valeur AnalogRead A0: " + iA0 );
  delay( 5000 );
}

Série de mesures numéro 1

Cette série de mesure utilise le montage 1 décrit ci-dessus.
J'ai réalisé des mesures à intervalle régulier à deux reprises. La première (1) avec un accu chargé à 3,75V et la seconde (2) avec un accu chargé à 3.98V. Pour chaque niveau de tension fixé au potentiomètre (Va0) j'ai relevé le nombre (Nb) donné par analogRead. 
J'ai augmenté progressivement la tension jusqu'à trouver la valeur réelle pour 1023 (Vmax_reel) et la première valeur où l'on obtient 1024. 
Toutes ces données ont été entrées dans un fichier excel. 

J'ai tout de suite constaté que pour une même tensions appliqué à A0, la valeur retournée par l'ADC est identique dans le cas ou le NodeMCU est alimenté en 3,75 ou 3,98V. 

J'ai ensuite ajouté une colonne pour calculer le coefficient réel Cr avec tout en bas la valeur moyenne. 

J'ai ajouté une colonne qui compare la valeur réelle à la valeur que nous aurions du obtenir avec un calcul théorique. Pour chaque ligne nous avons donc un taux d'erreur. Nous constatons que dans les petites tensions en deçà de 0,5V ce taux d'erreur est très important (supérieur à 12% ici). Par contre le taux d'erreur se stabilise après 0,5V à un niveau entre 6% et 7%. En moyenne l'erreur est de 7,04%. 

 J'ai ensuite ajouté une nouvelle colonne qui calcul l'erreur que j'aurai eu si au lieu de prendre le coefficient théorique j'avais pris un coefficient obtenu en utilisant la tension Vmax_reel. On constate une diminution immédiate du niveau d'erreur. On obtient même des niveau inférieur à 1%. Ce qui est très satisfaisant. Avec un niveau moyen d'erreur pour toute la série de 0,84%.

La  dernière colonne que j'ai ajouté est en utilisant le coefficient réel moyen que j'avais calculé en bas de la colonne Cr. On constate également un effet immédiat sur le taux d'erreur qui baisse à moins de 1% avec un niveau moyen à 0,83%. 

Tableau des mesures:

Série 1

Conclusions de la série numéro 1:
La tension appliquée à la borne VIN du NodeMCU n'a pas d'incidence sur la mesure prise par l'ADC. 
Le niveau d'imprécision est très important pour les tensions les plus faibles (en dessous de 0,5V). 
Entre 0,5V la tension maximale mesurable le niveau d'erreur est d'environ 6%. De plus, on constate qu'au delà de 0,5V le niveau d'erreur est à peu près constant. Donc on pourra le corriger en appliquant une correction constante. 
On constate que pour avoir un bon niveau de précision il faut appliquer un coefficient moyen réel ou alors en calculant le coefficient sur la base de la tension max réelle. Cette seconde méthode me semble préférable car elle ne nécessite qu'un peu de mesures.

Série de mesures numéro 2

Cette série de mesure utilise le montage 1 décrit ci-dessus.
L'objectif de cette seconde série de mesure était de voir si en prenant un autre NodeMCU nous allions avoir des résultats différents. 
J'ai réalisé les mêmes mesures que précédemment mais en en prenant un peu moins et sans faire une autre série avec une autre tension. On retrouvera les mêmes colonne que dans la série précédente. 
Les valeurs changent c'est évident mais on peut arriver à des conclusions identiques:
  • Le niveau d'erreur est très important en dessous de 0,5V. 
  • En appliquant un coefficient calculé sur la base de la tension maximale réelle ou sur la moyenne des coefficients on arrive à faire revenir le niveau de précision sur un niveau acceptable. Ici moins de 3% d'erreur. En plus quand on est au dessus de 0,5V le niveau d'erreur corrigé retombe en dessous de 1%. Ce qui est acceptable. 
Tableau des mesures:


Série 2

Conclusions de la série numéro 2:
On constate que même avec deux NodeMCU identiques on peut avoir des mesures différentes. 
On retrouve un taux d'erreur d'environ 6% à 7% pour les valeurs au dela de 0,5V.

Série de mesures numéro 3

Cette série de mesure utilise le montage 2 décrit ci-dessus.
L'objectif était comme précédemment de calculer le niveau d'erreur et la tension maximale mais en alimentant le NodeMCU différemment que sur la broche VIN. J'ai choisi d'alimenter par USB et j'ai obtenu la série de mesure suivante. 

Tableau des mesures:

Série 3

Conclusions de la série numéro 3:
On constate cette fois que la source d'alimentation a un impact sur les mesures. 
Mais on retrouve les mêmes caractéristiques que dans toutes les séries précédentes, sauf pour le  niveau d'erreur en dessous de 0,5% qui cette fois est même un peu mieux qu'au delà. 
En calculant le coefficient à partir de la tension maximum mesurable réelle, on arrive bien à diminuer le taux d'erreur pour le passer de 5,06% en moyenne à moins de 1%. 

Conclusions sur les mesures de tensions externes

De manière théorique nous avions établi que pour mesurer une tension V sur la broche analogique il fallait appliquer la formule suivante:
V = analogRead( A0 ) * 3,2 / 1023

Toutes ces séries de mesures nous ont permis de constater que la formule théorique présente un niveau d'erreur moyen allant de 5% à 9% . Avec des pics d'erreurs parfois supérieurs à 20% pour des niveaux de tension en dessous de 0,5V. 

Nous avons constaté que l'ADC remonte des résultats légèrement différents en fonction du microcontrôleur et de la manière choisie pour l'alimenter. Par contre, lorsqu'il est alimenté sur VIN, le régulateur de tension semble faire son travail et l'ADC retourne les mêmes résultats pour une ten,sion données sur A0 quelques soient les variations de tension de l'accu sur VIN. 

Nous avons réussi à montrer qu'en se basant sur la valeur réelle de la tension maximale mesurable par l'ADC (V_reelle_max), nous pouvions corriger la formule théorique et atteindre un niveau de précision de l'ordre de 1%. La formule de calcul de la tension à implanter dans nos programmes sera donc:
V = analogRead( A0 ) * V_reelle_max / 1023

Pour obtenir V_reelle_max il faudra placer le microcontrôleur tel qu'il sera utilisé dans votre montage définitif (même composants, même alimentation) et mesurer la tension nécessaire pour que la fonction analogRead( A0 ) retourne 1023. 

Nous avons aussi remarqué qu'en moyenne, dans tous les cas, les niveau d’imprécision sur les tensions supérieures à 0,5V était entre 6% et 7%. La tension réelle étant quasiment toujours supérieure à la tension théorique, si vous ne pouvez calculer V_reelle_max, vous pouvez appliquer un coefficient correcteur de 6% pour avoir une valeur plus juste. Une formule approximative sera donc: 

V = analogRead( A0 ) * 3,2 * 1,07 / 1023
ou
V = analogRead( A0 ) * 0,003347

Mesure de la tension interne 

Jusqu'ici nous avons vu que le convertisseur analogique-numérique (l'ADC que l'on appelle CAN en Français), nous permettait de lire une tension externe sur la broche analogique du μC. Mais l'ADC peut aussi fonctionner dans un mode où il va lire la tension interne, sans connecter quoi que ce soit à une broche analogique! Et ça c'est fort!

Il faut toutefois être vigilant et savoir ce que l'on mesure. En mesurant la tension externe de l'accu connecté à la borne A0, nous avons mesuré la tension de charge de la batterie. En mesurant la tension interne, nous allons mesurer une tension interne au microcontrôleur qui est prise après avoir subie une chute de tension due à des composants tels que des résistances internes ou au régulateur de tension!. Cette tension n'est donc pas la tension de la pile, de l'accu ou de l'alimentation aux bornes VIN/VCC. Toutefois, comme ce que nous cherchons à superviser c'est le niveau de charge de l'accu qui alimente notre montage, nous allons voir qu'il est possible d'établir un rapport entre cette tension interne et la tension réelle de la batterie. Nous allons étudier comment réussir à déterminer ce rapport.

Mode opératoire

Afin de déterminer le rapport entre tension d'alimentation et tension interne, nous allons réaliser une série de mesure dans des contextes différents et ensuite essayer de déduire des résultats de ces expérimentations.

Pour lire la tension d'alimentation interne il faut utiliser la fonction logicielle "ESP.getVcc()" et remplir ces conditions:
  1. La broche physique vers l'ADC (A0 ou TOUT) doit être non connectée (on dit flottante). TRÈS important ça! 
  2. Dans le cas d'un module ESP8266 (qui intègre une connectivité wifi), l'ADC ne peut être utilisé de manière fiable pendant une transmission. 
  3. L'ESP doit reconfigurer l'ADC au démarrage pour qu'il fonctionne en mode lecture interne. Cela se fait en ajoutant la ligne suivante n'importe où dans votre programme (mais plutôt tout en haut de votre programme et en dehors de toute fonction): ADC_MODE (ADC_VCC); De plus il faut savoir que cette instruction sera appliquée à la compilation, donc vous ne pouvez pas non plus l'encadrer par un "if" conditionnel. Par défaut l'ADC est configuré pour lire la tension sur la broche TOUT (mode ADC_TOUT) avec la fonction analogRead(). Dans ce mode la fonction getVCC() ne fonctionnera pas. 
La fonction getVcc() retourne un entier qui correspond à la tension mesurée en mV. Il faudra donc diviser par 1000 pour avoir la tension équivalente en V. Mais rappelez vous bien que la tension obtenue n'est pas la tension de l'accu, ni celle de VIN (ou VCC). Il s'agit seulement d'une tension interne au microcontrôleur et qui va dépendre de la manière dont ce dernier est construit.

Astuce: si les chiffres que vous récupérez en utilisant la fonction getVcc sont trop variables, il peut s'agir soit d'un problème de connexion de câbles. Dans ce cas vérifiez que tous vos câbles et connexions sont réalisées avec soins. Soit d'un problème de stabilité de votre alimentation. Dans ce cas il faudra la réguler en utilisant un condensateur (1000uF ou même plus ) à raccorder entre VCC et GND.


Cas des microcontrôleurs avec pont diviseur de tension devant l'ADC:


Comme nous l'avions vu précédemment, certains microcontrôleurs tels que les Wemos mini et les NodeMCU ESP12E intègrent entre la broche A0 et TOUT un pont diviseur de tension. Hors nous venons de dire que pour utiliser la fonction getVCC() il faut que la broche A0 soit flottante. La figure à droite montre que cela ne sera pas possible s'il y a un pont car une connexion d'A0 vers GND sera toujours présente. La fonction getVCC sera donc théoriquement inexploitable sur ce type de microcontrôleurs.

Dans la suite de ce chapitre tous les tests seront réalisés sur la base d'une carte ESP-01s qui ne dispose pas de pont régulateur de tension. Sur cette carte la broche A0 est libre car non soudée et non accessible à l'utilisateur. 

Liste du matériel


Philosophie commerciale: Je ne suis actionnaire d'aucun site marchand tels qu'Amazon ou eBay. Les liens que je vous donne pointent sur du matériel compatible avec mes montages, que je recommande et que j'ai souvent acheté moi même. Je du matériel de bon rapport qualité/prix/service (livraison, SAV,...) Si vous faites un achat en passant par un de mes liens, la (petite) commission qui me sera versée ne manquera pas dans les (gros) bénéfices  des sites marchand et m'aidera à investir pour rédiger de nouveaux articles. Et si aucun matériel ne vous intéresse, vous pouvez mettre ce lien https://amzn.to/30xd8Ag dans vos favoris et l'utiliser quand vous aurez besoin de quelque chose sur Amazon.


Un GRAND merci à tous ceux qui ont joué le jeu. 


Pour ceux qui le désirent voici des liens pour vous procurer le matériel: 
  • Les connecteurs: pratiques pour faire des montages rapides avec des câbles de diamètre différentes. Ils fonctionnent avec une pince à ressort. ICI.
  • Les ESP01s qui sont les cartes microcontrôleurs à base de 8266. N'hésitez pas à en prendre un lot car il arrive que par erreur on en grille quelques uns. On peut les trouver pas très chers ICI. Mais si vous êtes pressé de recevoir vous trouverez un lot de 5 ICI
  • La diode 1N4007 que j'ai utilisé est là uniquement pour la chute de tension qu'elle présente. Je vous conseille de prendre un coffret comme ICI pour avoir différents modèles. 
  • Le multimètre que j'adore et qui ne cesse de m'étonner par toutes ses fonctions et sa précision! On trouve le même modèle estampillé sous plusieurs marques. Moi j'ai un METERK qui a été remplacé par JANISSA ICI. Franchement il est top et si vous bricolez un peu l'électricité ou l'électronique vous ne serez pas déçu de mettre une trentaine d'euros dans un tel appareil. Si vous voulez voir le test, n'hésitez pas à lire mon article qui lui est dédié ICI.
  • Les câbles Dupont mâle-mâle comme ICI
  • Les batteries 16850 se trouvent un peu partout. Je n'y connais pas grand chose alors j'ai pris des modèles de base comme ICI. Et pour les recharger je me suis fait plaisir avec un chargeur universel vraiment top ICI
  • L'adaptateur FTDI. Il y en a plusieurs versions. La mienne est ICI. Mais il en existe une plus pratique qui évite d'avoir à souder deux fils ICI


Voici tout ce matériel en image (si vous ne les voyez pas c'est surement votre AdBlock qui bloque! Vous pouvez le désactiver sur mon blog car je n'envois aucune pub ou aucun popup):


Montage

Pour prendre des mesures j'ai réalisé le montage tel que ci-dessous.


Montage pour mesures sur ESP01s

Si vous souhaitez plus d'informations concernant la câblage et la programmation de l'ESP01s je vous invite à lire avec attention mon article qui parle de ce microcontrôleur et c'est ICI.
J'ai placé une diode 1N4007 ici car elle présente une chute de tension de 0,8V. Bien que l'ESP01s (et le 8266) semblent supporter des tensions d'alimentation de 4,2V (pas sur les broches digitales qui elles sont limitées à 3,6V)  sans problèmes, j'ai préféré ici lui fournir un courant plus proche des spécifications officielles. L'ESP01s est réputé pour fonctionner jusqu'à une tension basse de 2,5V. La diode permet donc une baisse de tension de l'accu 18650 jusqu'à environ 3,4V (4,2 - 0,8). Elle va me permettre également de faire des séries de mesures avec des tensions différentes car faire varier la tension d'alimentation avec un potentiomètre et/ou un transistor ne fonctionne pas.
Le condensateur 1mF permet de stabiliser la tension de l'alimentation. Ce dernier est important sinon les mesures que nous allons relever seront tellement variables qu'elles deviennent inexploitables.

Rapport entre tension mesurée et tension lue avec getVcc()

Nous allons regarder si nous pouvons faire un lien entre la tension mesurée sur la broche VIN et la tension retournée par le fonction getVcc(). Pour cela j'ai réalisé une série de mesures durant tout le cycle de décharge de l'accu, en notant le résultat de la fonction getVcc() ainsi que la mesure au voltmètre de la tension de la broche VIN. Ensuite, pour chaque mesure, j'ai calculé la différence des deux (VIN - getVcc) et le ratio (VIN/getVcc). Et pour finir, j'ai réalisé ces mesures avec deux types de microcontrôleurs:
  1. Avec un ESP01s dont la broche A0 est libre. 
  2. Avec un NodeMCU ESP12e, dont la broche A0 est raccordée à un pont diviseur de tension. Ce qui signifie qu'elle n'est pas "libre" et donc que les résultats de la fonction getVcc seront faussés. Mais malgré tout, il se peut qu'une proportionnalité soit conservée et dans ce cas, en trouvant le bon coefficient, nous puissions retrouver la bonne valeur de VIN. 
L'ESP est alimenté par un accu 18650 chargé avec une tension à vide de 4,08V (dans un premier temps j'ai enlevé la diode 1N4007). Une fois en charge la tension aux bornes de VIN est d'environ 3,94V (nous verrons plus bas dans cet article pourquoi il y a cette différence entre tension à vide et tension de charge). 
Afin de stabiliser un peu la tension, j'ai placé un condensateur 1000µF entre les bornes VIN et GND. 


Tableau de mesures avec l'ESP01:

Différence et ratio entre tension lue sur VIN et retournée par getVcc sur ESP01s

En dessous de 1,93V sur la broche VIN, l'ESP a commencé à devenir instable. Ce qui est déjà remarquable car comme nous l'avons déjà évoqué, l'ESP8266 n'est reconnu pour fonctionner que jusqu'à une tension minimale de 2,5V. 
Nous pouvons constater que la différence de tension entre les deux mesures n'est pas stable.
Par contre le ratio lui, reste plutôt constant. En faisant une moyenne des valeurs arrondies on obtient une valeur de 1,07. Ce qui signifie qu'en multipliant la valeur lue par getVcc par 1,07, nous pourrons avoir une bonne estimation de la tension VIN.


Tableau de mesures avec le NodeMCU:

Différence et ratio entre tension sur VIN et retournée par getVcc
sur NodeMCU

Cette fois c'est en dessous de 2,65V sur la broche VIN, que l'ESP a commencé à devenir instable. 
La différence de tension entre les deux mesures (VIN - getVcc) n'est pas linéaire.
Par contre le ratio lui, reste plutôt constant. En faisant une moyenne des valeurs arrondies on obtient une valeur de 1,42. Ce qui signifie qu'en multipliant la valeur lue par getVcc par 1,42, nous pourrons avoir une bonne estimation de la tension VIN.

Toutefois il faudra prendre des précautions car étant donné la présence du pont diviseur de tension, je ne sais pas si ce ration sera généralisable. De plus, selon les mesures, il existe des différences importantes sur ce ratio. Il est de 1,51 pour 2,65V sur VIN et de 1,37 pour 3,585V. Ce qui signifie que même en appliquant un coefficient moyen de 1,42, nous aurons encore une imprécision de 5%.

Programme utilisant getVcc()

Pour finir ce chapitre sur la mesure de la tension interne, voici un exemple de code tout simple qui réalise une lecture de la tension interne avec la fonction getVcc().
Toutefois, vous remarquerez que si votre alimentation n'est pas parfaitement stabilisée, la fonction getVcc() va présenter des sauts qui peuvent vite rendre toute utilisation difficile. Afin de lisser les lectures de la tension interne, j'ai réalisé un programme qui réalise plusieurs lectures et déduis une moyenne ainsi qu'une valeur médiane. Vous trouverez ce programme amélioré à la fin de l'article.


/********************************************************************
* Test_ADC_getVCC
* =================
* Ce programme est destiné à tout microcontroleur disposant d'un convertisseur ADC.
* Il interroge l'ADC avec la fonction getVCC qui retourne la tension d'alimentation VCC
*
* Versions :
* ==========
* 02/07/2019 - v1 : Création
*
* (c) acampeaux@gmail.com
*********************************************************************/
/*====================================================================
 * Place de convertisseur ADC dans un mode de lecture interne
 * plutot que lecture d'une broche analogique.
 * ==================================================================*/
ADC_MODE(ADC_VCC);

/*====================================================================
 * CONSTANTES & VARIABLES
 * ==================================================================*/
String stNomProgramme = "Test_ADC_getVCC";
String stVersion = "v1";

/* Vitesse de transmission de la liaison série: permet de lire les
premiers caractères envoyés par l'ESP lorsqu'il démarre. */
long int liBauds = 74880;

/* Variable pour compter le nombre d'affichage réalisé */
int iNombre = 0;

/*====================================================================
  * Fonction setup
  * Initialisation de la liaison série
 * ==================================================================*/
void setup() {
  Serial.begin( liBauds );
  delay( 100 );
  Serial.println( String("\nInitialisation liaison serie a ") + liBauds + " Bauds : OK" );
  Serial.println( stNomProgramme + " version " + stVersion );
}

/*====================================================================
 * Fonction loop
 * Appel de la fonction getVCC et affichage du résultat.
 * Attente de 5 secondes entre chaque lecture.
 ====================================================================*/
void loop() {
  /* Lecture de la broche A0 */
  int iVcc = ESP.getVcc();
  Serial.println( String("Mesure num: ") + iNombre++ + " Valeur getVCC: " + iVcc );
  delay( 5000 );
}

Conclusions

Nous avons vu dans ce chapitre comment lire la tension interne au microcontrôleur en utilisant la fonction getVcc(). Nous avons vu que pour en déduire ma tension d'alimentation réelle aux bornes VIN, il fallait calibrer le composant afin d’obtenir un coefficient. Nous aurons donc la formule:

Tension_VIN = getVCC() * Coef

Sur les modèles ayant la broche A0 libre, comme les ESP01/ESP01s,  ce coefficient est d'environ 7% (Coef = 1.07). Il est de 1,42 sur les NodeMCU. Toutefois, sur ces derniers, nous avons mesurer certains sauts dans ce coefficients qui génèrent pour certaines tensions des imprécisions de l'ordre de 5%. Ce niveau d’imprécision peut se révéler pénalisant pour une mesure fine de la tension.

J'ai mesuré ce coeficient sur plusieurs modèles de microcontrôleurs à base d'ESP8266. Vous pouvez les utiliser tels quels mais n'hésitez pas à vérifier leur niveau de précision dans votre propre montage. Si vous obtenez une erreur de plus de 2% je vous conseille de refaire votre propre étalonnage en suivant la méthodologie que j'ai utilisé.







Questions et réponses et trucs et astuces


Ce dernier paragraphe va être l'occasion d'évoquer quelques petites choses diverses et variées dont un beau programme et une FAQ que je compléterai au fil du temps. 

Tension à vide et tension de charge

Lorsqu'un microcontrôleur est alimenté par une pile, on pense souvent que sa tension de fonctionnement est celle que l'on a mesuré sur la pile à vide. J'ai fait cette erreur et j'ai du me creuser la tête pour comprendre. Je m'explique. 
J'ai pris un accu 18650 chargé et avant de l'utiliser j'ai mesuré la tension avec mon magnifique multimètre PM18C. J'ai mesuré une tension de 4,03V. Ensuite je réalise un montage tout simple: j'alimente un NodeMCU ESP12E avec l'accu et je place le multimètre aux bornes VIN et GND. 


Et là à mon grand étonnement je ne retrouve pas les 4,03V mais je lis 3,96V. Je débranche et je retrouve une tension aux bornes de la pile lorsqu'elle n'est pas utilisée de 4,03V. 

A quoi est due cette différence ? 

En réalité toute pile ou accu contient un effet de résistance interne. Un peu comme s'il y avait une petite résistance dans l'accu entre les bornes qui induit une chute de tension. De plus, tout câble et toute connexion entre câbles peut présenter plus ou moins de résistance qui également produit une chute de tension. Nous pouvons donc dire que la tension délivrée par la pile quand elle est alimente un circuit est de V = Vp - Vr. Avec: 
  • V = tension délivrée réellement
  • Vp = tension de la pile hors montage.
  • Vr = Tension de résistance du montage qui en réalité est la somme de la chute de tension due à la résistance interne de l'accu et la perte de tension du aux câblage. 

Pourquoi la chute de tension a lieu uniquement lorsque la pile est sollicitée ?
Comme nous l'avons vu au début de cet article U = RI. Donc pour calculer Vr nous pouvons écrire: Vr = R*I. Avec:
  • R = la résistance interne avec la résistance des câbles. 
  • I = le courant qui traverse le circuit. 

Nous voyons tout de suite que si I = 0 alors Vr = 0 => il n'y a pas de chute de résistance et donc la tension qui alimente le circuit est la tension aux bornes de la pile à vide. 
Mais si le microcontrôleur fonctionne, I ≠ 0 et dans ce cas Vr ≠ 0.  

Combien représente cette chute de tension ? 
La résistance interne d'un accu ou d'une pile dépend beaucoup du modèle. Dans mon cas, après avoir mesuré un courant de 68mA qui passait dans le circuit, j'ai pu calculer combien elle représente avec la formule: R = ( V - Vp ) / I. Ce qui me donne environ 1,03Ω (ce qui représente une perte de 0,07V). Dans un premier temps j'avais des mesures qui faisaient apparaître 10Ω. Ce qui n'est pas "normal" pour un accu 18650. J'ai constaté que l'anomalie venait de connexions qui étaient mal réalisées. En rebranchant tout proprement j'ai pu arriver à ce résultat.

Qu'est-ce que cela implique pour nos mesures ?
Cette chute de tension est à connaitre lorsque l'on souhaite suivre la décharge d'un accu. Si nous partons d'une tension de pile mesurée hors montage, les premières mesures en fonctionnement vont faire apparaître une différence qui en réalité ne sera pas une anomalie mais bien un phénomène normal. 

Programme améliorer pour l'utilisation de getVcc()

Etant un ancien développeur j'aime bien écrire des programmes qui soient à la fois beaux à voir et en même temps qui ajoutent plein de fonctionnalités parfois inutiles. 
Mais dans le cas du programme ci-dessous, nous allons améliorer grandement l'utilisation de la fonction getVCC et cela va être très utile. La fonction getVCC() présente parfois des sauts dans les valeurs qu'elle retourne. Par exemple sur 5 lectures successives nous pouvons lire 2500, 2502, 2700, 2500 et 2498. On voit tout de suite que la valeur 2700 est disproportionnée par rapport aux autres valeurs. Et si l'on fait une moyenne cette dernière va même modifier à elle seule cette moyenne de manière à fausser la mesure. Ainsi, si par exemple vous souhaitez déclencher une alerte sur la passage d'un seuil, ce saut de mesure peut déclencher l'alerte alors qu'il n'aurait pas lieu. 
Le programme ci-dessous donne un exemple de comment lisser les mesures prises pour avoir quelque chose d'acceptable. Il consiste à prendre plusieurs mesures et d'en calculer la moyenne en ayant exclus les deux extrêmes ainsi qu'extraire une valeur médiane. Dans mon expérience j'ai constaté que la médiane est en générale la valeur la plus proche de la réalité. 


/********************************************************************
* Test_ADC_getVCC-v3
* ==================
* Ce programme est destiné à tout microcontroleur disposant d'un convertisseur ADC.
* Il interroge l'ADC avec la fonction getVCC qui retourne la tension d'alimentation interne
*
* Versions :
* ==========
* 02/07/2019 - v1 : Création
* 13/07/2019 - V2 : Calcul d'une moyenne de plusieurs mesures pour chaque cycle.
* 14/07/2019 - v3 : Renomage et refonte du programme pour utiliser un tableau
*   afin de stocker, classer les valeurs de la tension et ne prendre que les valeurs
*    medianes.

* (c) acampeaux@gmail.com
*********************************************************************/
/*====================================================================
 * Place le convertisseur ADC dans un mode de lecture interne
 * plutot que lecture d'une broche analogique.
 * ==================================================================*/
ADC_MODE(ADC_VCC);

/*====================================================================
 * CONSTANTES & VARIABLES
 * ==================================================================*/
String stNomProgramme = "Test_ADC_getVCC";
String stVersion = "v2";

/* Constantes & variables pour le tableau de valeurs: doit être supérieur à 3 */
#define NB_VAL  11
int tiMesures[ NB_VAL ];

/* Constantes pour définir les temps d'attente entre deux mesures et deux cybles (en ms) */
#define MESURE_DELAIS 50
#define CYCLE_DELAIS 4000
int iNombreCycle = 0;

/* Vitesse de transmission de la liaison série: permet de lire les
premiers caractères envoyés par l'ESP lorsqu'il démarre. */
long int liBauds = 74880;

/*====================================================================
  * Fonction setup
  * Initialisation de la liaison série
 * ==================================================================*/
void setup() {
  Serial.begin( liBauds );
  delay( 100 );
  Serial.println( String("\nInitialisation liaison serie a ") + liBauds + " Bauds : OK" );
  Serial.println( stNomProgramme + " version " + stVersion );
}

/*====================================================================
 * Fonction loop
 * Appel de la fonction getVCC pour NB_VAL lectures
 * Classe le tableau
 * Supprime les extreme
 * Calcul la moyenne. Affiche la moyenne et la mediane.
 * Attente entre chaque cycle.
 ====================================================================*/
void loop() {
  /* realise le nb de mesures demandees avec delais entre chaque */
  for ( int iCompteur = 0; iCompteur < NB_VAL; iCompteur++ ){
    /* Lecture de la tension en ms */
    tiMesures[ iCompteur ] = ESP.getVcc();
    delay( MESURE_DELAIS );
  }

  /* Classe le tableau */
  for (int i = 0; i < NB_VAL; i++)
    for (int j = 0; j < NB_VAL; j++){
      if ( tiMesures[ i ] > tiMesures[ j ]){
        int iMem = tiMesures[ i ];
        tiMesures[ i ] = tiMesures[ j ];
        tiMesures[ j ] = iMem;
      }
    }

  /* recherche la médiane */
  int iMediane = tiMesures[ int( ( NB_VAL / 2.0 ) + 0.5 ) - 1 ];

  /* calcul la moyenne sans les deux extremes */
  float fMoyenne = 0.0;
  for (int i = 1; i < NB_VAL - 1; i++){
    fMoyenne += tiMesures[ i ];
  }
  fMoyenne = fMoyenne / (NB_VAL - 2);

  /* Affichage et attente nouveau cycle */
  Serial.println( String( "Valeurs exclues: " ) + tiMesures[ 0 ] + " " + tiMesures[ NB_VAL - 1 ] );
  Serial.print( String("Mesure num: ") + iNombreCycle++ );
  Serial.println( String(" Valeur Mediane: ") + iMediane + " Valeur Moyenne: " + int(fMoyenne) );
  delay( CYCLE_DELAIS );
}


FAQ ou le petit jeu des questions Q et réponses R

Q: Est-ce que la connexion du microcontrôleur en USB au pont UART (liaison série) consomme de l'énergie ?

R: Oui. Un accu qui alimente le microcontrôleur se déchargera plus rapidement si ce dernier est connecté en liaison série. 

Q: Quelle est la tension maximum applicable à VIN sur un ESP01? 

R: L'ESP01 et ESP01s ne disposent pas de régulateurs de tension. Il est prévu pour fonctionner avec une tension entre [3V et 3,6V].  Mais il existe des marges de tolérance qui sont assez importantes. En ce qui me concerne, j'alimente avec des accu 4,2V et cela fonctionne parfaitement. Je déconseille d'aller au delà (en 5V par exemple). 

Q: Quelle est la tension maximum applicable à VIN sur un NodeMCU ? 

R: Le NodeMCU ESP12e dispose d'un régulateur de tension NCP1117 sur la broche VIN capable de supporter jusqu'à 20V. Toutefois étant donné la quantité de chaleur qui serait à dissiper avec un tel niveau de tension, la puce va rapidement chauffer et brûler. Ce régulateur génère une chute de tension de 1,2V. Donc pour la stabilité du microcontrôleur évitez d'alimenter le NodeMCU en seulement 3,3V sur l'entrée VIN. 

Q: Est-ce que les broches (I/O) des ESP8266 sont tolérantes à des tensions supérieures à 3,3V ? 

R: Cette question anime de nombreux débats dans les forums. Un des plus actifs que j'ai trouvé est ICI. La réponse n'est pas encore tranchée de manière définitive. Le PDG d'Espressif, le constructeur de l'ESP, indique sur Facebook que "Je peux répondre officiellement ici: il est 5V tolérant à l'IO si la tension d'alimentation est à 3,3 V". Malgré tout de nombreux utilisateurs ont montré des problèmes et des destructions de puces à cette tension. Pour ma part je dirais qu'il est préférable de se cantonner à la tension indiquée dans les spécifications techniques et qui vont de 1,8V à 3,6V pour un état "High" de la broche digitale. Les broches analogiques sont données pour une tolérance allant jusqu'à 3,6V.

Q: Est-ce que la consommation de courant augmente avec la tension?

R: Oui. Et cela peut devenir problématique en mode sommeil car cette augmentation est exponentielle à partir de 3,8V. Dans un ESP01, lorsque la tension approche 4,5V, le courant de veille augmente à environ 2,5 mA, soit environ 100 fois moins plus qu'a 3,3V où il est à 30µA. 

Tableau normes des piles et accu


Il existe deux systèmes de normes ANSI et CEI:


Note : dans la classification CEI, R représente les piles zinc-carbone, LR les piles alcalines, RC les accumulateurs. Les autres technologies sont généralement écrites en toutes lettres sur l'emballage.

Liens vers des sites qui m'ont aidé

Mesurer la tension VIN sur un Arduino Genuino:
https://www.carnetdumaker.net/articles/mesurer-la-tension-sur-la-broche-vin-dune-carte-arduino-genuino/

Mesurer la tension d’une batterie ou d’une pile avec un Arduino ou un ESP8266:
https://projetsdiy.fr/mesurer-tension-alimentation-batterie-esp8266-arduino/

NodeMCU : entrée analogique A0
https://itechnofrance.wordpress.com/2018/01/14/nodemcu-entree-analogique-a0/ 
(ajouter le lien vers mon article dans les réponses en bas de page).

Les entrées analogiques de l’Arduino
https://eskimon.fr/tuto-arduino-401-les-entr%C3%A9es-analogiques-de-larduino

L’ADC de l’ESP8266 (nodeMCU) et micropython
https://laurentblogs.wordpress.com/2016/12/27/ladc-de-lesp8266-nodemcu-et-micropython/




Soutenez la blogoculture ...


Le plus simplement du monde, si vous avez un achat à faire sur Amazon, accédez au site à partir de ce lien (que vous pouvez ajouter dans vos favoris)https://amzn.to/2nbe4sm





Soutenez la blogoculture ...


Le plus simplement du monde, si vous avez un achat à faire sur Amazon, accédez au site à partir de ce lien (que vous pouvez ajouter dans vos favoris)https://amzn.to/2nbe4sm


... mais aussi ...


Vous appréciez les articles frais et vitaminés de ce blog et vous voulez faire un geste pour encourager ce partage, saluer le travail, ou parce que vous y avez trouvé des choses utiles ( et que vous êtes sympa ) ?

... c'est possible et vous avez le choix !
Si vous avez un compte Paypal et quelques euros à offrir sans vous mettre sur la paille, subventionnez la culture domotique à l'ancienne !
Vous ne dépenserez pas un radis de plus en faisant un achat sur eBay à partir de ce lien.
Economisez du blé avec Amazon Prime ! Offre d'essais 1 mois gratuit (et renouvelable).
Soyez chou et aidez les petits producteurs de blog à se faire connaitre auprès de vos amis facebook !

Merci

Commentaires

  1. Il me semble que l'erreur de lecture analogique avec un ESP8266 est vraiment grande par rapport à celle d'un ATMega 328. Perso ,je préférerais utiliser un CAD externe .

    RépondreSupprimer
    Réponses
    1. Bonjour. Vous avez tout à fait raison et ça a été montré dans cet article, l'ESP8266 n'est pas très précis sur ses lectures des tensions. Je ne sais pas s'il s'agit du convertisseur interne, d'un problème de précision sur les résistances de rappel ou alors un peu de tout ça à la fois ;-). Par contre, comme je le montre dans le paragraphe sur les mesures réelles, l'erreur est relativement constante au dessus d'une tension de 0,5V. Il est donc tout à fait possible de calculer un coefficient correcteur, obtenu par étalonnage qui permet d'arriver à une erreur entre 3% et 1%. Ce qui commence à être acceptable pour des usages domotiques.
      Merci à vous pour ce partage.

      Supprimer

Enregistrer un commentaire