Recherche de l’autonomie maximum d’une balise
|
Introduction |
Maj : 14/09/2024 Abstract : Résumé : |
Dans un système domotique tel que décrit ici, Domotique via Internet , plusieurs balises transmettent les données de leurs capteurs à un système central pour traitement. Dans cette section, nous explorerons les moyens d'économiser l'énergie sur les balises autonomes. Il est crucial de réduire drastiquement la consommation moyenne, avec l'ambition audacieuse de faire fonctionner une balise autonome pendant un an avec une seule batterie 18650. Divers modèles de LiPo 18650 |
|
Pour commencer, voici le schéma de base des balises autonomes qui communiquent avec le maître via ESPNow ou WiFi. La plupart des périphériques, tels que le BMP280, le DS3231, l'AHT41, l'OLED, etc., utilisent le bus I2C. D'autres dispositifs utilisant OneWire, SPI, radio, etc., pourront être ajoutés à la demande et seront intégrés dans le circuit imprimé final, mais ne sont pas inclus ici pour simplifier. Attention : les résistances de tirage (pull-up) sur les lignes SDA/SCL du bus I2C doivent être comprises entre 4,7 et 10 kOhms au total. Toutefois, les divers modules ajoutés comportent souvent déjà des résistances de 4,7 kOhms (comme le DS3231, par exemple). Il est essentiel de retirer ces résistances superflues pour respecter les impédances d'entrée de l'ESP32. Schéma de la carte balise | |
Pourquoi choisir un ESP32-S2 plutôt qu'un STM32 ? Les deux projets sont envisageables avec une base logicielle similaire, bien qu'ils présentent quelques différences notables. L'ESP32 intègre le WiFi, ce qui lui permet de supporter nativement ESPNow. Cependant, son convertisseur analogique-numérique (CAN) est loin d'être performant. En revanche, le STM32 nécessite un module WiFi externe, mais offre un CAN de bien meilleure qualité. La documentation très abondante d'Espressif met en évidence les nombreuses variantes de l'ESP32, disponibles en version chip nu ou intégré dans une petite carte (Devkit) avec des circuits annexes. Faire un choix dans cette jungle complexe peut s'avérer difficile. Compte tenu de la consommation des différentes variantes, il est évident que seul le modèle ESP32 nu, monté sur une platine carrée, permettra d'optimiser au maximum l'autonomie de la batterie. Le DevKit classique, qui intègre un circuit FTDI très énergivore et incapable de passer en mode sommeil, est donc à proscrire. L'image ci-contre montre quelques périphériques I2C mentionnés plus haut, actuellement en cours de tests de consommation. Vue du premier prototype avant production du circuit | |
Recharge annuelle de la LiPo et programmation de l'ESP32 Faites attention à la subtilité du montage, notamment avec l'alimentation à prise 3 pins réversible, qui permet une isolation complète lorsque la batterie n'est pas en charge. Cette isolation est cruciale, car le circuit présente une légère fuite de courant même lorsqu'il n'est pas alimenté |
|
Cette carte ne sera connectée que pendant les phases de programmation, d'auto-démarrage, ou lors du débogage via le terminal. Une fois ces étapes terminées, il est essentiel de la débrancher pour éviter toute consommation inutile. |
|
Les oscillogrammes ci-dessous illustrent les signaux DTR et RTS qui contrôlent les deux transistors, générant ainsi les signaux <EN> et <IO0> nécessaires pour passer en mode programmation et pour le démarrage automatique. Timings ESP32 FTDI : RTS _ DTR _ Enable (reset) _ IO0 |
|
Une autre manière de voir les mêmes signaux (plus TX et RX), avec l’excellent petit analyseur Salae qui permet de capturer en une seule fois huit voies, alors que l’oscilloscope ne peut en capturer que deux. Timings ESP32 FTDI : RTS _ DTR _ Enable (reset) _ IO0 |
Alimentation du ESP32 : un point critique
L'alimentation de l'ESP32 est particulièrement sensible, avec des valeurs recommandées par Espressif de 3,3V ± 0,3V. Bien que l'ESP32 puisse fonctionner à une tension de 2,9V, il devient instable, surtout par temps froid. Il est donc essentiel de respecter ces spécifications pour assurer une performance fiable. Il faudra découpler avec soin en utilisant des condensateurs rapides en sortie de régulation, car les très forts pics de courant peuvent planter le circuit, même si la batterie est bien chargée. |
Mesures sur le MCP1700 330e
Tests sous Vin = 3.6 V
Première mesure à vide Iout = 0 : Vin = 4.2 V -> Iin = 5.5 µA // Vin = 3.6 V -> Iin = 4.5 µA : C’est très décevant, la moitié de la consommation de l'ESP32 en sommeil, alors que le datasheet annonçait 1.6 µA
Deuxième mesure : Iout = 6 µA, Iin = 10µA, rendement 60% , c'est le cas de l'ESP32 nu (sans périphérique) en sommeil, ce" qui représente la quasi totalité du temps....
Troisième mesure: Iout = 959 µA, Iin = 992 µA, rendement 97%
Quatrième mesure : Iout = 82.6 mA, Iin = 82.7mA, rendement presque 100%
Donc, pour résumer :
Le dropout de 250 mV est bien plus important que prévu, le datasheet annonçait 128 mV à 250 mA.
Le rendement est bon à fort courant, mais la perte à très faible courant est trop importante, la moitié de la consommation de l’ESP32 en sommeil.
Pourquoi ce composant est-il aussi loin des spécifications ?
Faut-il estimer que les composants chinois à bas prix sont de mauvais clones ou des rebuts ?... Il faudrait en tester un vrai.
RT9080-33GJ5
Les tests de ce MCP1700 330 ayant été très décevants, il faut trouver mieux. D’après les données constructeur, le RT9080-33GJ5 semble beaucoup moins gourmand.
Ce composant a toutefois un défaut, il est en SOT23, boitier minuscule, très difficile à souder avec des gros doigts. Il faut un circuit imprimé et de la pâte à souder sous air chaud.
Les résultats des mesures à suivre…
Autour du microcontrôleur, divers périphériques sont nécessaires pour mesurer l’environnement, les valeurs principales seront :
Le temps : Une horloge temps réel donnera le top précis d’émission de la trame de données (sans qu’il soit utile de connaitre l’heure complète). Il est possible de se recaler périodiquement en contactant un serveur de temps, mais l’opération est très gourmande en énergie.
La tension batterie : Par un convertisseur Analogique –Digital externe ou interne, indispensable pour savoir quand recharger,le convertisseur interne de l’ESP32 est trop médiocre.
Il est très surprenant que le défaut majeur de ce composant pourtant très évolué n’ait jamais été corrigé par Expressif malgré les plaintes incessantes des utilisateurs, alors que par exemple sur le STM32 les CAN sont très bons.
La température : AHT21, BMP ou BME280...
La pression : AHT21, BMP ou BME280...
L’humidité éventuellement : AHT21, BME280, et tout autre facteur : GPS, accéléromètre, luxmètre, courant, vent, hauteur de liquide, comptage, bruit, intrusions, etc.
La partie émission est soit interne (WiFi ou ESPNow) soit externe avec un module radio supplémentaire.
Le problème des capteurs
L’énergie consommée par une balise se répartit en trois blocs :
1 -> Au début du cycle, l’énergie de latence au réveil.
3 -> En fin de cycle, l’énergie d’émission de la trame.
Nous ne pouvons absolument pas agir sur ces valeurs très gourmandes en énergie !
2 -> Entre les deux, considérons que le temps de calcul pour préparer la trame est quasi nul donc à énergie quasi nulle.
Il n’en est pas de même pour la délicate exploitation de capteurs entre ces deux phases.
Chaque balise gère aussi divers capteurs, il faut bien réfléchir au cas par cas, le bilan énergétique étant très variable d’un capteur à l’autre.
Critère majeur : Combien de temps faut-il entre la demande de lecture et le résultat stable ?
La consommation propre du capteur dans cette phase n’est pas importante, car l’ESP32 consomme 50 mA pour rien pendant ce temps.
Les composants à temps d’attente long comme la DS18b20 en OneWire (presqu’une seconde) sont inexploitables, il faut être rapide.
Autre critère : Quelle est la consommation en sommeil profond ?
Pour ne pas plomber le bilan énergétique, il peut être tentant de couper l’alimentation du capteur pendant les deux minutes, mais le temps de démarrage à froid cité au dessus peut être contre productif.
Le choix de capteurs va s’avérer restreint. Nous considérerons pour commencer comment lire au mieux la température.
Les divers capteurs convertissant la température en tension, PT100, thermistances, etc. sont exploitables sur le CAN externe multiplexé utilisé pour lire la tension batterie.
Les choix des périfériques se porteront sur des capteurs I2C. Ici encore, on ne peut espérer gagner en montant la vitesse à 400 kb/s, le temps d’échange des données étant négligeable, c’est bien le temps de réponse pur qui et le seul critère.
Quelques exemples sont détaillés pour montrer les temps machine et les bilans énergétiques.
Mesure de la consommation des périphériques I2C
Le problème est surtout sensible pendant le mode sommeil. Une lecture du courant Vcc au picoampèremètre peut sembler très faible, mais c’est un leurre ! En effet si vous débranchez Vcc, le périphérique continue à fonctionner.
Il fonctionne donc à énergie nulle, c’est une trouvaille révolutionnaire !
Et bien non, car il se réalimente par pics sur SDA et SCL et la mesure en est difficile.
La seule mesure valable consiste à mesurer le courant au picoampèremètre dans le moins, ce qui est la somme des trois courants de Vcc, SDA, SDL et la vraie consommation.
La valeur typique pour une balise est d’émettre brièvement sa trame à un moment précis toutes les deux minutes et passer en sommeil le reste du temps pour ne pas interférer avec les autres.
Elle n’écoutera pas, car cela consomme trop de temps machine et ruine l’autonomie.
Premier exemple du bilan énergétique qui sera affinée par la suite, pour fixer les ordres de grandeurs :
1) Phase de réveil, lecture des capteurs, puis émission trame, pendant 1 seconde en tout, consommation moyenne 75 mA.
2) En sommeil presque 2 minutes, prenons une base de 50 µA.
Les chapitres suivants détailleront chacune des phases avec leur bilan énergétique.
Si l’on utilise un minuscule ESP32-C6 |
Moyen trivial pour économiser l'énergie
Evidement, si l'on augmente la période, la consommation moyenne diminuera d'autant, mais ce n'est pas vraiment jouable car trop peu de données dégradent les courbes.
La période de 2 minutes, qui donne 720 points de mesure par jour s'avère bien adaptée pour les courbes de domotique.
Le nombre de cycles annuel sera de 365 * 24 * 60/2 = 262800, chiffre que nous retrouverons par la suite.
Un lien très intéressant pour approfondir les timings et les consommations : community.platformio.org
Détails des consommations : forum.seeedstudio.com
Calcul du bilan énergétique sur l'année:
Pour calculer la dépense énergétique d'un cycle sur une année il suffit de multiplier : Courant en mA * Temps d'activation en mS par cycle * 10-3 *262800 /3600 = mA * mS * 73 * 10-3 en mAh |
Si nous reprenons les premiers chiffres de l'hypothèse grossière de début :
((75 * 1000) + (0.050 * 119000)) * 73 * 10-3 = (75 + 6 ) * 73 = 5913 mAh soit trois fois la capacité d'une 18650.
Cela n'est pas acceptable, il faudra donc drastiquement réduire le facteur majeur de consommation hors sommeil.
Lecture du courant |
INA101 |
Autre solution, l' INA250A4, capteur de courant sort en tension, 2 volts par ampère. avec shunt intégré 0.002 Ohm. Il sera câblé sur un petit Arduino indépendant qui enverra ces mesures sur une carte SD, qu’il sera ensuite facile d’exploiter sur un PC dans une feuille Excel. Inconvénient majeur de ces méthodes : A cause du trou entre les mesures, les pics très brefs et intenses seront ignorés, il faut mettre en entrée du circuit à mesurer une très grande capacité pour lire un courant moyen, ce qui est beaucoup moins informatif que la lecture sur oscilloscope très rapide.. |
|
Commençons par le plus facile, chercher à réduire le plus possible à consommation en sommeil bien que nous ayons vu qu'elle était faible par rapport au réveil, mais c’est un exercice de style.
Pour les modes de sommeil, il y a de très bonnes pages sur le Net, cherchez dans votre moteur «esp32 sommeil», je ne le reprendrai pas ici.
A titre indicatif, l'ESP32 avec un programme vide consomme 75 mA.
ESP32 nu
Les tests seront faits sur un ESP32 nu, monté sur la carte carrée blanche. Il faut simplement câbler les deux résistances et le condensateur indispensables à repérer sur le schéma.
Pour le programmer, il faut 4 fils fournis par la carte FTDI, l’alimentation et RX/TX (à croiser !), plus DTR/RTS avec le démarrage automatique, comme le montre le schéma Eagle.
Pour se faire une première idée, commençons par lancer le petit programme dans les exemples ESP32 "TimerWakeUp.ino" ou "Beacon_sleep.ino" dans mes fichiers joints, directorie "LowPower".
Il utilise le mode UART wakeup (light sleep only) avec la commande esp_sleep_enable_timer_wakeup().
Pour les premiers tests, et établir une base, regardons uniquement le mode sommeil.
La carte FTDI reste branchée, mais débranchée coté USB. L’alimentation est en 3.3 V. Un milliampèremètre en série montre un courant de 12 mA, c’est énorme.
Maintenant débranchons la carte FTDI et passons en mode microampère. Il ne faut donc pas monter les éléments de démarrage directement sur le circuit de la balise, mais ajouter les deux transistors+résistances (R1 ,R2,T1,T2) sur une petite carte intermédiaire amovible et de rentrer directement avec EN/IO0 à la place de DTR/RTS Cette page montre le comportement d'une 18650 à faibles courants : Décharge lente d'une LiPo 18650 |
ESP32 + circuit de charge de la batterie
On rajoute la carte du circuit de charge de la batterie, basée sur le TC4056A, qui permet de charger proprement la batterie LiPo sur une prise USB 5V.
En branchant cette petite carte (non alimentée) sur la batterie, la fuite est d'environ 0.6 µA.
Bien qu'elle ne devrait être alimentée qu'une fois par an, il serait possible de la laisser branchée, cette consommation du dixième de l'ESP32 nu est faible, mais l'alimentation externe par prises 3 pins l'isole de la batterie hors charge et il n'y a plus aucune perte.
Pour chaque capteur il faudra réduire la consommation au maximum en testant deux stratégies opposées.
Méthode classique :
Laisser le capteur alimenté en permanence, mesurer son courant de repos en sommeil, au réveil le lire en mesurant le temps d’occupation du CPU et faire le bilan énergétique du cycle.
Méthode avec coupure d'alimentation :
Si la consommation en sommeil est trop importante, on coupera l’alimentation, donc énergie nulle pendant les deux minutes.
Le problème sera au réveil, il faut attendre que la tension se stabilise, initialiser le composant à froid et attendre une lecture valide.
Mais ici les millisecondes coutent très cher en énergie avec le CPU qui consomme 50 mA !
Au regard du bilan énergétique, il est probable que cette solution sera mauvaise, il faudra tester pour chaque capteur pour faire le bon choix.
Note liminaire sur les cartes I2C : charge des bus
Rappel : Dans les nombreuses cartes implantant un périphérique I2C, les résistances de tirages de 4.7 ou 10 kOhms sont systématiquement ajoutées sur SDA et SCL.
Le problème avec plusieurs périphériques est qu’il ne faut pas surcharger le bus. Nous éliminerons systématiquement toutes ces résistances pour n’en garder qu’un seul jeu.
Ce n’est pas toujours facile car les composants sont minuscules.
On rajoute l'horloge DS3231 en I2C
La balise doit connaitre l'heure pour émettre à un moment précis du cycle afin d'éviter les collisions avec les autres balises. Sans cette RTC externe, l'heure glisse trop avec l'horloge incorporée et pourrait varier de quelques secondes par jour ce qui provoquerait un conflit aves les autres balises.
L'horloge DS3231 en I2C est extrêmement stable et il ne sera utile de la remettre à l'heure que tous les mois en prenant le temps en WiFi sur un serveur, opération couteuse en énergie.
Premier test avec la carte de base, DS3231 non initialisée, led rouge en place, la consommation en sommeil augmente de plus de 2 mA, c'est énorme.
Enlevons la led rouge inutile, la consommation passe à 957 µA, il n'y a aucun courant sur la diode de la pile CR2032, c'est encore bien trop.
D'après le datasheet des EEProms, le standby current est de à 0.1 µA, et en enlevant la AT24C02 de base, qui ne sera pas utilisée dans l'application balise, le gain est imperceptible.
Dessoudons les deux réseaux de résistances, et câblons en volant deux 10 kOhms de tirage SDA /SCL. La consommation en sommeil passe alors à 98 µA, c’est mieux, mais encore beaucoup trop.
Cela correspond bien au datasheet qui indique un standby current est de à 110 µA
Comme vous le voyez sur le montage, il faut alimenter les 3 Vcc par une sortie GPIO pendant le réveil pour désactiver la RTC en sommeil au lieu de tout tirer directement à Vcc.
Attention, il ne suffirait pas de commuter le Vcc, car les circuits I2C se réalimentent par SDA/SCL !
Remarque :
Pour couper une alimentation (par le + ou le -), il faut passer par un MosFet car les pics de courants peuvent être destructeurs sur la simple sortie GPIO.
Les MosFet NMOS (coupure par le -) ont une conductivité dix fois meilleure que les PMOS.
Le fait de travailler avec une tension très basse de 3 V complique l’implantation car le VGS est proche du blocage comme le montrent les courbes, ce que l’on évite par une pompe élévatrice mais au détriment de la simplicité et du temps de réponse.
Première mauvaise méthode, isoler par le positif Il faut prendre la précaution de laisser un temps entre la commande haute du GPIO et la lecture, car à très faible courants, les capacités parasites sont importantes et le signal met longtemps pour se stabiliser. C'est encore pire si l'on passe par un Mosfet (N ou P, coupure par le + ou le -), inutilisable pour des courants aussi faibles, sauf à le charger par une résistance supplémentaire pour consommer plus de quelques milliAmpères. Ecran du haut, temporisation de 500 µS entre la commande GPIO et la lecture de l'horloge, écran du bas temporisation 1500 µS. Les courbes montrent qu'avec 500 µS, c'est très limite, l'I2C se déclenche à 1.3 V, gros risque d'instabilité en batterie basse, avec 1500 µS ce n'est que 1.8 V. |
Violet: commande GPIO |
Deuxième bonne méthode, isoler par le négatif qui sera seul commandé par un GPIO (voir mesure tension batterie) . SDA/SCLA sont déjà au Vcc, ce qui est moins critique. Il faudra toutefois ajouter une temporisation d'au moins 1000 µS après l'état bas du GPIO pour stabiliser. Sur le firmware balise, cette temporisation sera utilisée pour traiter les autres périphériques avant de passer à l'envoi de la trame. Résultats des tests : L'opération dure moins de 1.5 mS, plus la temporisation. En ne comptant pas la temporisation qui derait être utilisée pour les autres fonctions, le bilan énergétique de la lecture RTC serait : Une fois la tension stabilisée, la consommation de la RTC en lecture est quasi nulle. |
coupure par négatif |
Première initialisation de la RTC
Pour initialiser l'horloge sur le serveur de temps, sans se préoccuper des consommations pour le moment, lancez une seule fois, "Beacon_RTC_init.ino". Il faudra auparavant rentrer le SSID et le mot de passe de votre box.
Si vous avez le message "Brownout detector was triggered", cela signifie que l'alimentation s'écroule lors du violent appel de courant du WiFi, revoir l'impédance des fils, de l'alimentation, supprimer le milliampèremètre, vérifier es condensateurs (10µF + 100 nF sur l'alimentation), la qualité des soudures...
Plus grave, cela peut être dû à un mauvais clone à bas prix de l’ESP32, il faut re-tester avec un authentique. Vous devez obtenir sur le terminal :! _ Connecting to myBox _
..... CONNECTED _ Monday, April 04 2022 13:50:12 _ ...
L'horloge est initialisée, par la suite, les appels au serveur de temps se feront automatiquement par le programme.
Recalage de la RTC sur un serveur de temps Internet.
Les longs appels WiFi vers le serveur de temps consommeront beaucoup, il faudra les limiter à quelques uns dans l'année.
Le passage heure été/hiver n'intervient pas car la balise n'a à connaitre que les minutes et secondes pour se déclencher par interruption.
Très longue séquence de connexion en WiFi, de plus de 2 secondes, environ 150 mA (voir détails plus loin),
Energie pour un appel : 2 * 150 = 300 mAs. Avec 12 appels par an, 300 * 12 / 3600 = 1 mAh, ce qui est absolument négligeable.
Quelle est la bonne solution pour la RTC ?
En laissant la tension stable, la consommation rajoutée en sommeil sera de 100 µA soit sur l’année :
0.1mA * 120000mS * 73 * 10-3 = 12*73 = 876 mAh, c’est énorme, 45% de la capacité batterie
Maintenant coupons l’alimentation sauf pendant une seconde de temporisation au réveil (avec consommation 50 mA) :
Le bilan annuel devient :
50 mA * 1000mS * 73 * 10-3 = 50*73 = 3650 mAh, c’est pire 182% de la capacité batterie, impossible à accepter.
Nous gardons l’alimentation permanente, mais nous allons essayer de réduire la tension pour tenter de réduire le courant. La marge est étroite, le constructeur fixe la limite à 2.7V. Nous ne savons pas le faire, car la tension d’alimentation générale varie de 2.7 à 3.3V et il n’existe pas de régulateur capable de la passer à 2.7 V à 100 µA, avec un courant résiduel très faible =
Voie sans issue
Elimination des temporisations
Seule solution évoquée par ailleurs, couper l’alimentation en sommeil, au réveil, rétablir l’alimentation, lire les capteurs et avant de sortir lire l’horloge, la tension aura eu le temps de se stabiliser pendant la longue séquence d’émission de la trame et il n’y aura pas la pénalisation de la temporisation inutile.
C’est ce que montre le schéma.
Il suffit de stoker en mémoire sauvegardée « minute modulo 30 multipliée par 60 (= 0 ou 60)» plus les secondes qui seront utilisées au tour suivant.
Ce n’est pas un problème car la seule chose qui nous intéresse est le calage précis au top 2 minutes pour synchroniser la balise avec les autres, la trame n’envoie pas l’heure qui est connue par le Master. Dans ces conditions, nous avons vu que la consommation de la DS3231 était de 5.5 mAh, fortement réductible en le la lisant que de tempe en temps.
Remarque préalable Il existe deux versions de cette carte à schéma identique, l’une avec le chip dessus, l’autre dessous. Sans rien modifier, la comsommation permanente de cette carte AHT21 est du même ordre que la consommation de l’ESP32 en sommeil, 6.8 µA, alors que le datasheet donne 0.25µA !
Consommation réveil L’appel des lectures température + humidité dure 2 fois 80 mS ce qui est très long. Le courant du AHT21 est donc d'environ 1 mA pendant la demi-période soit 40 mS, comme l'indique le datasheet, mais il faut tenir compte de la consommation de l'ESP32 de 50 mA sur tout le cycle, soit une dépense énergétique annuelle pour une seule mesure de (temp ou hum) : Malgré la réduction drastique de consommation en enlevant le régulateur, l'AHT21 est donc peu adapté pour une balise à faible consommation. |
|
Remarque préalable Attention sur les sites chinois lors de la commande, à la confusion BMP/BME ! Si le composant n’est pas cher, c’est un BMP malgré qu’il ait été commandé comme BME280. Le montage est ici beaucoup plus simple que pour l'AHT21 : 4 résistances de 10 kOhms, 3 en tirage SDA, SCL une pour CSB (seulement pour mode SPI), l'autre à la masse pour SDO (Bit d'adresse). Le BMP280 lit la pression + la température Consommation du BME280 La consommation d'un bon BME280 en sommeil est quasi nulle, il n’est pas utile de chercher à le commander par un créneau de tension comme pour la RTC. Le bilan énergétique annuel de la lecture du BME280 est : (50 + 0.3 mA) * 25 mS * 73 * 10-3 = 98 mAh, soit 2 % de la capacité batterie, ce qui est très acceptable. |
Ce capteur de température très répandu n’est pas un composant I2C, il utilise le bus One Wire de Dallas. Son inconvénient est de nécessiter un long intervalle entre la commande et la lecture.
Le circuit utilise le mode d’alimentation parasite, avec une 4.7 kOhms entre Vcc et DQ.
Pour les tests de consommation à l’oscilloscope, une résistance de 1 kOhm est provisoirement insérée dans le négatif du DS18B20.
Le TSL2561 est un circuit I2C de conversion digitale de l’éclairement. Un étalonnage très délicat permettrait d’en faire un luxmètre, sinon les valeurs lues ne seront que relatives. |
|
Comme pour l’AHT21, en 3.3V, il faut enlever le régulateur inutile qui consomme beaucoup, mais la consommation permanente reste encore de 650 µA, il est donc indispensable de couper l’alimentation en sommeil, la fuite tombe alors à 0.7µA ce qui est quasi nul. La trace violette est la porte d’alimentation du négatif. Le bilan énergétique annuel (incluant l'attente) de la lecture du TSL2561 est : Le TSL2561 ne peut pas être envisagé pour une balise faible consommation sans éliminer l'attente. |
ESP32 + Option afficheur Oled SSD 1306
Cas particulier : Le Oled est branché, sans être initialisé, en mode sommeil, la consommation augmente de 7 µA.
S’il est initialisé, suivant le texte affiché, la consommation passe à 7 mA, et en effaçant l’écran retombe à 0.7 mA.
Pour revenir au 7µA non initialisé, il faut le débrancher puis le rebrancher.
Ce bilan énergétique montre qu’il sera impossible de le laisser branché en permanence sur la balise.
Solution : Isoler par le négatif (voir mesure tension batterie) pendant le réveil pour désactiver l'Oled hors debug.
La led La tension batterie variant très lentement sur l’année, il peut être utile que de ne la lire qu’une fois de temps en temps puis de couper l’alimentation du convertisseur extérieur, même si le rallumage sera coûteux en temps machine (donc énergie). |
|
Principe de la mesure de la tension batterie L'anode de la led rouge est directement reliée au positif de la batterie (jusqu'à 4.2v). En période de sommeil, IO2 en sortie est au niveau haut, la tension aux bornes est au maximum de 4.2-3.3V = 0.9, dans la zone de non-conduction de la led, quasi aucun courant ne passe, la led est éteinte, La tension aux bornes de IO32 est flottante, et pour éviter tout risque de tension statique ou induite (effet d'antenne), une résistance Rstat de 100 kOhms est tirée au positif, donc avec courant nul. Si le tirage était à la masse, il y aurait une fuite via la led d'au maximum : 0.9/(100 103) = 9 µA. Le filtre RC introduit un léger retard exponentiel de quelques dizaines de µS, c'est pour cela que nous allons d'abord faire une lecture du pont R/2R des configurateurs pendant les premières 50 µS, puis une fois la tension stabilisée sur IO32, la lecture de la tension batterie. |
Violet: entrée ADC sur IO32 |
Il faut toutefois ajouter que pendant ce temps le CPU travaille, avec une consommation moyenne de 50 mA, la consommation rajoutée par cette mesure est négligeable, car le courant à considérer n'est pas de 0.65 mA mais de 50 mA,
Dépense énergétique annuelle liée à la mesure de tension batterie : mA * mS * 73 * 10-3 = 50 * (104.4* 10-3) * (73 *10-3) = 0.4 mAh soit 0.2%, ce qui est absolument négligeable.
Etalonnage : 1) La relation lecture CAN / tension d'entrée est rigoureusement linéaire ! 2) La relation Vout -> Vin. C'est parfait entre 4.2 V et 3.5 V mais ensuite cela descend vite et à 3.1 V, la tension de sortie tombe à 2.86 V ce qui est limite pour la stabilité de l'ESP32. Cela n'est pas gênant car comme le montrent les courbes de décharges suivantes, la batterie peut être considérée comme totalement vide à 3.1V. 3) La perte de tension Vin -Volt = "dropout", qui est de 350 mV dans la zone utile, ce qui est beaucoup moins bon que nous le laissait penser la lecture du datasheet (composant deuxième choix...) ! |
Mais cela ne suffit pas ! Connaitre la tension est une indication, mais ce qui est plus utile est de connaitre l'autonomie restante. |
Consommation en latence pendant le réveil
C'est maintenant que les problèmes commencent, car tout consomme trop pendant trop longtemps.
Après avoir étudié le krill et les petits poissons, étudions maintenant les baleines.
Latence du réveil de l'ESP32
En début de courbe, à gauche, réveil sur le marqueur de synchronisation.
Palier 17 mA pendant 30 mS
Palier 40 mA pendant 80 mS
Palier 62 mA pendant 20 mS
Palier 37 mA, début d'exécution du code, allumage de la led pendant 10 mS. C'est la consommation pendant lequel le processeur ne fait rien (boucle d'attente), aucun périphérique n’est branché.
Puis repasse en sommeil à 3 mA...
Ce temps de latence est donc d'environ 132 mS pendant lequel on ne peut strictement rien faire. C’est beaucoup pour un processeur qui ne fait encore rien, 18% de l’énergie disponible sur une 18650, mais il n'y a pas moyen de réduire simplement… Il est intéressant de voir quand démarre le timer. Ce début de programme nous montre que le compteur a démarré 27 milli secondes avant de rendre la main. |
void setup() { long top = millis(); Serial.begin(115200); while (!Serial); Serial.println (top) ; // Affiche 27 mS |
Consommation en phase active réveil
Cette phase de latence incompressible de 132 mS est terminée, nous avons vu comment les périphériques s'activent pour fournir les données, pendant un temps et une consommation qui dépend des capteurs comme vu précédemment.
Maintenant tous les capteurs sont lus, la préparation de la charge utile prend un temps machine quasi nul. Pour chaque cycle, il y a très peu de données à envoyer pour relever toutes les balises, quelques octets dans la charge utile, mais cela prendra du temps d'activité à fort courant.
Les balises communiquent toujours avec un maitre central qui centralise et traite toutes les données. Divers choix sont possibles, mais aucun n'est parfait.
C'est le produit <temps d'émission * courant moyen> qui sera le facteur clef. Les différentes consommations dans cette phase critique dépendent des choix technologiques pour l'envoi de cette charge utile.
Nous travaillerons en unidirectionnel, il n’y a pas d’handshake, la balise envoie mais n’écoute pas car cela prendrait beaucoup trop de temps machine.
Envoi données : Choix des technologies à compléter
Infra rouge
C’est une technique simple et extrêmement performante sur le plan énergétique, comme le prouvent les télécommandes domestiques, mais elle n’est possible que pour des balises à vue du central, ce qui est très rarement le cas, aussi elle sera oubliée.
Bluetooth
Nous ne le détaillerons pas pour le moment, malgré l'avantage de sa faible consommation, car la portée est limitée et l'exploitation beaucoup plus compliquée qu'avec les autres moyens.
LoRa
à compléter
Radio 432 MHz
Le HC12 est utilisé, une page lui sera dédiée.
ESPNow
Le système actuel tourne en ESPNow, mais n'exploite pas son avantage de pouvoir communiquer sur des grandes distances car tous les capteurs sont proches dans la maison.
Des solutions moins gourmandes sont à tester.
Le premier écran montre la première séquence d’envoi de la trame en ESPNow, avec demande WiFi sur le serveur de temps. Sur la séquence de 2.4 secondes, le courant de base est de 100 mA avec superposition des Diracs de courant. |
|
Heureusement cette séquence ne se produit que lors de la demande de mise à l'heure une fois par mois, donc nous pouvons l'igorer en terme de consommation annuelle. Nous avons vu au dessus que le bilan ne sera que de 1 mA par an donc quasi nul. |
Zoom début |
En réalité le pic de courant de l'ESPNow, hors demande de mise à l'heure est celui ci, la consommation est plus réaliste, c'est ce que nous trouvons en fin de la séquence précédente. Cette séquence totale de 60 mS pour un courant moyen de 65 mA, comporte aussi la lecture des périphériques au début, la vraie partie ESPNow est dans les dernières 20 millisecondes. L’intégrale du courant pendant cette séquence ESPNow + traitement capteurs sur un an est : Ce n'est pas l'ESPNow qui réduira l'autonomie. |
Vrai courant ESPNow |
En aparté : Fonction delta = Dirac
Le génial mathématicien Dirac a défini une fonction extraordinaire que l’on a appelé fonction Delta
Sa valeur est infinie au point zéro et toujours nulle ailleurs.
Le plus surprenant est que l’intégrale de cette fonction 0 * infini est égale à <UN>…
Ne vous fiez pas à cette apparente simplicité, le développement mathématique n’est pas du niveau de cette modeste page…
A notre tout petit niveau nous appellerons « Dirac » un pic extrêmement court de valeur intense. Nous ne saurons pas mesurer directement son énergie, mais avec des alimentations très découplées nous obtiendrons une gaussienne (Gauss, encore un génie) suffisamment étalée pour en faire l’intégrale dont la valeur sera proche de notre Dirac.
WiFi
Très curieusement, la consommation varie peu en réduisant la puissance émise, ce qui change beaucoup de nos émetteurs radio traditionnels.
En champ proche, près d'une box, la puissance est surabondante.
Voir la page préparatoire qui montre le comportement d'une 18650 à faibles courants : Décharge lente d'une LiPo 18650
Cette page montre qu’il est difficile d’atteindre une grande autonomie avec des composants classiques, il faudra se tourner vers de nouveaux microcontrôleurs spécialement conçus pour cette problématique.
Annexe : Contenu du Pack_Lipo_18650