samedi 10 février 2018

ARDUINO PRO MINI & basse consommation





ARDUINO PRO MINI & basse consommation


1. Présentation

L'ARDUINO PRO MINI est une carte équipée d'un processeur ATMEGA 328. On peut trouver des versions 16MHz et 8MHz. Nous nous intéressons ici à la version 8MHz que l'on peut alimenter sous 3.3V et même un peu en dessous, environ 2.7V.
La tension mini ne devra pas descendre en dessous de 2.7V, ce qui correspond à la tension minimale de décharge d'une batterie NI-MH ou LI-ION.

L'ARDUINO PRO MINI a la particularité de ne pas posséder de convertisseur USB / série. La consommation s'en trouve diminuée d'environ 10mA.

Il ne possède pas non plus de sortie 3.3V. Sur les autres cartes ARDUINO NANO, UNO, etc. cette sortie est fournie par le convertisseur USB / série.

Malgré le fait que l'on puisse obtenir des résultats plus intéressants avec des processeurs du type STM32 L0, l'ARDUINO PRO MINI n'en reste pas moins une carte très intéressante pour réaliser des capteurs connectés alimentés sur piles ou batterie :
  • température / hygrométrie
  • passage
  • luminosité
  • etc.

2. La basse consommation

Sur le schéma de l'ARDUINO MINI, on peut constater que l'on peut alimenter celui-ci par la broche VCC. La sortie du régulateur U2 se retrouve donc sous tension et consomme légèrement (70µA).
D'autre part la diode LED1 est alimentée également et consomme 180µA si elle est polarisée par une résistance de 10KΩ ou 380µA si elle est polarisée par une résistance de 4.7KΩ.
Il vous faudra donc effectuer deux petites opérations de chirurgie pour obtenir une consommation compatible avec une alimentation sur batteries :
  • supprimer la diode LED
  • supprimer le régulateur 5V
Sur l'image ci-dessous, les deux composants à dessouder sont marqués d'un point rouge.
On peut également se contenter de dessouder uniquement la patte de sortie du régulateur et de la lever.

Le sketch utilisé pour passer la carte en mode sommeil est celui-ci :

#include <LowPower.h>

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

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


Après cela, votre ARDUINO en mode veille ne consommera plus que 5µA !!!

Certaines cartes possèdent un strap permettant de désolidariser la partie régulateur + LED.
Dans ce cas, on peut se contenter de couper ce strap.



3. La batterie

Généralement les batteries NI-MH ont une tension nominale de 3.6V, plus généralement 4V à pleine charge. Les batteries LI-ION ont une tension légèrement supérieures : 3.7V et 4.2V à pleine charge.

Voici un modèle que j'utilise couramment :


https://www.tme.eu/fr/details/accu-600_3ni-mh_c/batteries/cellevia-batteries/


Si vous utilisez des composants 3.3V, par exemple un module NRF24L01, celui-ci ne supportera pas cette tension, surtout si la batterie est à pleine charge, à moins de l'alimenter séparément à l'aide d'un régulateur 3.3V.

4. IDE ARDUINO

Dans votre IDE (arduino-cc 1.6.9 par exemple), dans le menu "Outils/Type de Carte" choisir "Arduino Pro or Pro Mini". Dans le menu "Outils/Processeur" choisir "ATmega328 (3.3V, 8MHz)".

5. Chargement

Pour charger le code dans l'ARDUINO, vous devrez utiliser un convertisseur USB / série 3.3V connecté sur les broches de l'ARDUINO réservées à cet usage.
Toutes les explications sont ICI.

Pour ma part j'utilise un cable FTDI TTL-232R-3V3.
Le câblage à utiliser pour le TTL-232R-3V3 est celui-ci :
  • RTS (vert) sur la pin GRN ou DTR de l'ARDUINO
  • RXD (jaune) sur la pin TX de l'ARDUINO
  • TXD (orange) sur la pin RX de l'ARDUINO
  • GND (noir) sur la pin GND de l'ARDUINO
Le VCC - fil rouge - du convertisseur n'est pas connecté car inutile et dangereux. Le 3.3V du convertisseur se retrouverait en conflit avec le 3.7V de la batterie. Pendant le chargement l'ARDUINO doit être alimenté par la batterie ou toute autre source d'alimentation 3.3V à 3.7V.

Il est également possible de trouver des convertisseurs made in China, très bon marché, acceptant les deux tensions :
https://fr.aliexpress.com/item/FT232RL-FTDI-BASIC-USB-vers-s-rie-pour-pro-mini-t-l-charger-c-ble-USB/32831265899.html?spm=a2g0w.search0104.3.1.46cb37af6VFhmn&ws_ab_test=searchweb0_0%2Csearchweb201602_2_10152_10151_10065_10344_10068_10342_10343_10340_10341_10084_10083_10618_10305_10304_10307_10306_10302_5711211_5722315_10313_10059_10184_10534_100031_10629_10103_10626_10625_10624_10623_10622_10621_10620_10142%2Csearchweb201603_1%2CppcSwitch_5&algo_expid=9ddc916b-fb91-4a80-8bdc-2176cb1f6e02-0&algo_pvid=9ddc916b-fb91-4a80-8bdc-2176cb1f6e02&priceBeautifyAB=0

Si vous utilisez un convertisseur possédant une pin DTR - C'est le cas de la majeure partie des modèles chinois que l'on peut trouver sur AMAZON ou ALIEXPRESS - on peut l'utiliser en lieu et place du RTS :

  • DTR sur la pin GRN ou DTR de l'ARDUINO
  • RX  sur la pin TX de l'ARDUINO
  • TX sur la pin RX de l'ARDUINO
  • GND sur la pin GND de l'ARDUINO

Pour résumer, le convertisseur doit posséder une pin DTR ou RTS à connecter sur la pin GRN ou DTR de la MINI. Cette pin provoque un reset de la MINI au début du téléchargement.
Si vous utilisez seulement RX TX et masse, il vous faudra presser le bouton RESET de la MINI après la compilation, juste avant le téléchargement. Pas très pratique, mais ça marche.

SPARKFUN propose également un convertisseur directement enfichable sur l'ARDUINO MINI :
https://learn.sparkfun.com/tutorials/using-the-arduino-pro-mini-33v

Comme vu plus haut, pendant le chargement, l'ARDUINO MINI peut être alimenté par la batterie ou toute autre source d'alimentation 3.3V à 3.7V.
Mais en cours de développement il peut s'avérer assez pratique d'alimenter l'ARDUINO MINI par le convertisseur USB / série, car vous n'avez peut-être pas de batterie ou d'alimentation sous la main.
Dans ce cas, vous pouvez connecter le VCC du convertisseur USB / série sur la pin VCC de l'ARDUINO MINI. La batterie devra cependant être déconnectée.

Si vous n'avez rien d'autre sous la main vous pouvez utiliser un convertisseur USB / série 5V. L'ARDUINO MINI acceptera cette tension sans dommage.
Par contre si vous avez dans votre montage des composants 3.3V, par exemple un module NRF24L01, ceux-ci ne supporteront pas cette tension. Vous devrez intercaler entre le 5V et la broche d'alimentation de ces composants un régulateur 3.3V.

Pour résumer, soit vous alimentez la MINI par le VCC du convertisseur, soit vous alimentez par la batterie, mais pas les deux.

6. ARDUINO NANO

Comparativement à une PRO MINI, une carte ARDUINO NANO possède un convertisseur USB / série ou FT232RL ou GH340G et un régulateur 5V AMS1117.
On peut identifier sur cette carte trois sources de consommation de courant :
  • la LED PWR : 5mA
  • le CH340G : 80 µA non actif
  • le régulateur 5V : 5mA typiques
Essayons de mesurer le courant consommé après avoir chargé le sketch du paragraphe 2.
Une fois le sketch chargé, la carte est alimentée en 5V via la pin 5V bien entendu.
  • carte d'origine : 8.8mA
  • sans la LED : 3.8mA
  • sans la LED et sans le régulateur : 90µA
Il est possible d'obtenir avec une NANO modifiée une consommation en veille 100 fois inférieure à celle de la carte d'origine, sans toutefois atteindre celle d'une PRO MINI. 

7. Autonomie

Parlons autonomie. Quelle batterie choisir en fonction de la consommation totale d'un montage ?
Partons d'un exemple concret : ce thermomètre sur batterie.
Sa consommation est de 20µA en veille. Il utilise un NRF24L01 pour transmettre la température à un serveur DOMOTICZ. Pendant l'émission, qui a lieu toutes les 15 minutes, la consommation est de 8mA pendant 30ms, avec des pointes à 30mA.
Prenons une moyenne de 10mA.

Fixons-nous un objectif d'autonomie : 365 jours.

Consommation en mode veille : 20µAH x 24 x 365 = 175mAH

L'émission a lieu 4 fois par heure pendant 30ms, donc 120ms au total, ce qui représente 1/500è d'heure.
La consommation en mode éveillé est donc de 10mAH / 500 = 20µAH, égale à la consommation en mode veille.

Consommation en mode éveillé : 20µAH x 24 x 365 = 175mAH

Nous avons donc une consommation de 350mAH au total, donc il nous faudra une batterie de 350mAH pour que le montage aie une autonomie d'un an.

Ce thermomètre est en service depuis le 10 décembre 2017.
La capacité de la batterie est remontée périodiquement au serveur DOMOTICZ.
Celui-ci indique : 81%.
La batterie utilisée est une LITHIUM-ION au format 16340 (16mm * 340), dont j'ai mesuré la capacité avec un courant de décharge de 330mA : 225mAH.
Il y a fort à parier que sa capacité avec un courant de décharge beaucoup plus faible soit bien supérieure, car sinon elle serait déjà déchargée.

Quelle batterie faudrait-il pour alimenter le même montage avec une ARDUINO NANO modifiée ?
On peut considérer que le courant en mode éveillé sera le même qu'avec la PRO MINI.

Consommation en mode veille : 80µAH x 24 x 365 = 700mAH
Consommation en mode éveillé : 20µAH x 24 x 365 = 175mAH

Il nous faudra une batterie de 875mAH pour que le montage aie une autonomie d'un an. Une LITHIUM-ION au format 18650 de 1000mAH devrait suffire.

8. Sommeil de longue durée

Le processeur de la PRO MINI ne sait pas dormir plus de 8s. Il vous suffit de relancer la mise en sommeil en boucle :


#include <LowPower.h>

void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(115200);
}

void lowPowerSleep(int minutes)
{
  int seconds = minutes * 60;
  int sleeps = seconds / 8;
  for (int i = 0 ; i < sleeps ; i++) {
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  }
}

void loop() {
  lowPowerSleep(15);
  Serial.println("HELLO");
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
}


9. Références

DOMOTICZ : https://domoticz.com/
MYSENSORS : https://www.mysensors.org/
ARDUINO PRO MINI : https://www.arduino.cc/en/uploads/Main/Arduino-Pro-Mini-schematic.pdf
ARDUINO PRO MINI : https://learn.sparkfun.com/tutorials/using-the-arduino-pro-mini-33v
Régulateurs LDO : https://riton-duino.blogspot.com/2018/11/les-regulateurs-ldo.html  

10. Mises à jour

27/10/2018 : ajout du paragraphe 6. ARDUINO NANO
28/10/2018 : ajout du paragraphe 7. Autonomie
25/10/2018 :  ajout du paragraphe 8. Sommeil de longue durée

6 commentaires:

  1. Bonjour
    Très interessant votre article.
    J'ai eu une question : vous dites que votre module (arduino+ nrf24L01) émet pdt 30ms toutes les 15mins mais je crois que le temps d'attente pour la conversion en température d'un DS18B20 est de 175ms avec la résolution la plus basse. Est ce que vous mettez votre arduino en "veille" pdt cette conversion ?
    Merci

    RépondreSupprimer
  2. oui, absolument.
    Le code est inspiré de ceci :
    https://www.mysensors.org/build/temp

    RépondreSupprimer
  3. petite précision, la pin RAW permet de l'alimenter avec du 6 à 12V et dans ce cas il ressort 3.3V sur sa PIN VCC, ça permet par exemple une alim via 6V alternatif prise téléinfo Linky (une fois redressé) et ressortir du 3.3V pour alim nRF24L01 par exemple mais pas beaucoup plus car alim Linky = 130mW max

    RépondreSupprimer
  4. 6V alternatifs donneront environ 7.3V continus, si l'on soustrait la perte dans le redresseur.
    Si l'on considère qu'une PRO MINI consomme 5.7mA et qu'un NRF24L01 consomme 12mA maximum :

    P = 7.3 * (5.7 + 12) = 129mW.
    C'est un peu juste pour un montage constamment en mode éveillé, mais pourrait se concevoir en mode veille avec réveil périodique.

    Mais le but de cet article est surtout de parler de l'ARDUINO PRO MINI en mode veille et alimenté par batterie.

    RépondreSupprimer
  5. Ah ok, mais bon en tout cas mon montage marche bien 24/24 7/7n, par contre j'envisage une version wifi mais là il faut que j'ajoute une batterie qui serait rechargée par l'alim du Linky pour permettre un réveil/lecture trame complète Linky/envoi vers serveur local ou dans le cloud tout en prenant en compte les lenteurs éventuelles comme par exemple le serveur qui est injoignable temporairement, il faudra donc définir combien de temps "raisonnable" on accorde au TimeOut avant d'échouer et retourner en veille car malheureusement le WiFi ça consomme pas mal donc le choix d'un module wwifi "économe" est important, j'avais prévu un ESP8266 "tout intégré" mais peut-être qu'un Arduino (ou STM32) + module wifi Ralink moins consommateur serait mieux.

    RépondreSupprimer
  6. Un ESP8266, à partir du moment où il est capable d'établir une connexion WIFI de manière fiable et répétitive au démarrage, est une bonne solution. Le problème est qu'il va consommer plus de 400mA pendant environ 50ms, à chaque réveil. Il ne faut pas le réveiller trop souvent ...

    Pour la recharge un TP4056 pourrait aider.
    https://riton-duino.blogspot.com/2019/02/alimenter-un-arduino-sur-pile-ou.html
    Voir 8.3.1. Le TP4056 en test

    Personnellement pour avoir essayé le NRF24L01 et l'ESP8266 en domotique, le NRF24L01 reste mon préféré : basse consommation et excellente réactivité.

    RépondreSupprimer