Comment puis-je faire fonctionner mon atmega328 pendant un an avec des piles?

51

Scénario

J'ai créé une belle serrure électronique pour mon dortoir. Il s’agit actuellement d’un Arduino Diecimila avec un servo [déverrouillant] la porte. Il dispose d'un clavier numérique avec 3x4 boutons et 5 DEL (2 paires de série et une seule DEL). Il fonctionne également actuellement sur un chargeur de téléphone portable.

Je l'ai maintenant repensé pour fonctionner sur un Arduino autonome (ATmega328), mais j'aimerais vraiment qu'il soit alimenté par des piles AA ou même par une pile 9V.

Pour la partie logicielle, j’ai pensé que je pourrais insérer des sleepappels à certains moments dans la méthode de boucle pour maintenir la consommation d’énergie de ATmega aussi basse que possible. Et laissez les DEL "clignoter" avec le temps d'arrêt le plus long possible.

question 1

Quand on appuie sur un bouton pendant les quelques millisecondes pendant lesquelles la planche dort, restera-t-il "mémorisé" / "maintenu" jusqu'à ce qu'il sorte du sommeil, puis soit repris en appuyant sur un bouton?

Quelle serait la meilleure façon de gérer cette pression sur un bouton en veille? Puis-je le coder pour me réveiller à l’activité du bouton, ou dois-je le laisser dormir pendant 10 m, par exemple?. dans chaque boucle?

question 2

Comment ferais-je pour calculer combien de piles AA sont nécessaires pour faire fonctionner cet appareil pendant 10 mois?

De plus, je ne sais pas comment mesurer la consommation moyenne d’énergie par minute, car elle alterne rapidement, etc.

Le dispositif

Mon dispositif de verrouillage de porte

LouwHopley
la source

Réponses:

35

L'Atmega328 fournit six modes d'économie d'énergie, classés du minimum au excellent (consommation actuelle estimée à partir de cet article du forum ):

  • SLEEP_MODE_IDLE: 15 mA
  • SLEEP_MODE_ADC: 6,5 mA
  • SLEEP_MODE_PWR_SAVE: 1,62 mA
  • SLEEP_MODE_EXT_STANDBY: 1.62 mA
  • SLEEP_MODE_STANDBY: 0.84 mA
  • SLEEP_MODE_PWR_DOWN: 0.36 mA

En citant la question initiale:

J'ai pensé que je pourrais mettre des sleepappels à certains moments dans la méthode de la boucle "

Vous devez utiliser sleep_cpu()le mode veille souhaité dans la liste ci-dessus. Le Arduino Playground a un post utile à ce sujet .

L'application doit être pilotée par des interruptions, utiliser les modes de veille décrits ci-dessus de manière intensive et réveiller le processeur lors de l'activation des boutons, du débordement de la minuterie et des événements de la surveillance pour exécuter les tâches.

Des économies d’énergie supplémentaires peuvent être obtenues aux étapes suivantes:

  • Utilisez l'oscillateur interne du microcontrôleur et une fréquence d'horloge faible (8 MHz au lieu de 16) - mais assurez-vous que le code lié à l'heure et à la synchronisation fonctionne toujours comme prévu. Une version différente du chargeur de démarrage peut être nécessaire pour cela.
  • Évitez de garder les voyants allumés longtemps si l'application les utilise. L'utilisation d'un double ou triple flash rapide de courte durée (0,05 seconde allumée, 0,5 seconde éteinte), avec des intervalles de secondes entre les deux, garantit une indication visible avec une consommation d'énergie minimale
  • Utilisez un régulateur de commutation au lieu d’un régulateur linéaire, si un régulateur est requis.
  • Faites fonctionner le microcontrôleur à une tension inférieure si elle est prise en charge, 3,0 volts (par exemple, pile au lithium CR2032, aucun régulateur nécessaire) ou 3,3 volts au lieu de 5 volts.
  • Suivez les recommandations de la fiche technique concernant les réglages inutilisés des broches d’entrée et de sortie pour une perte de puissance minimale.

L'intégration de ces suggestions permet d'exécuter des applications de microcontrôleur pendant des semaines ou des mois sur une seule pile bouton CR2032, et des années sur une pile au lithium de type LR123. Bien entendu, votre kilométrage peut varier en fonction des capteurs, des sorties et du traitement réel requis par votre application.

Quelques références utiles:

Anindo Ghosh
la source
Avec mon expérience, dans SLEEP_MODE_PWR_DOWN, vous pouvez le réduire à 0,1uA à 6,0A si vous avez été intelligent pour tout désactiver (comme la détection des baisses de tension). J'ai créé des versions qui utilisent moins de 60uA et durent de 3 à 5 ans avec un jeu de piles alcalines AA.
Tim Eckel le
@TimEckel Je suis folle d'indiquer le statut avec des voyants - cela consomme le budget de puissance comme si elle était à la mode.
Anindo Ghosh
3
Ce n'est pas obligé. Utilisez des LED haute puissance avec une résistance élevée. Utilisera une fraction de mA au lieu de plus de 20 mA. De plus, faites clignoter la DEL d'état pendant 5 à 15 ms toutes les quelques secondes au lieu de rester allumée en permanence. J'avais une DEL d'état de gradation bon marché qui utilisait 30 mA; je l'ai changée en DEL haute puissance avec une résistance de 3,3 kohms à laquelle j'ai clignoté pendant 15 ms toutes les 8 secondes. Passé de 30 mA à 2,9 µA de courant moyen, 1/1000 de la puissance!
Tim Eckel
4
@TimEckel Vous ne comprenez manifestement pas l'étendue de ma passion pour les lumières clignotantes :-D Ce n'est pas comme si je voulais réduire l'intensité, j'aime ces petites choses étincelantes comme les flammes d'Hadès, le budget de puissance doit être maudit! Sur une note plus sérieuse: je suis au courant de ces petits trucs et en ai même fabriqué quelques-uns, qui augmentent l'impact de l'alarme visuelle tout en réduisant la puissance fournie par les DEL. Ce commentaire précédent était ( seulement partiellement ) en plaisanterie, pour aller avec les nombreuses questions amusantes de la DEL auxquelles je réponds ici.
Anindo Ghosh
3
I mesuré la consommation d'énergie de ATmega328P à différentes tensions et fréquences et fait ce tableau docs.google.com/spreadsheets/d/...
Cano64
19

J'ai actuellement sur mon bureau un Arduino Pro Mini fonctionnant avec 2 piles AA et pouvant durer plus d'un an si nécessaire.

Trois aspects de la conception ont permis d'atteindre cet objectif.

1. Un régulateur différent

J'utilise un régulateur boost LTC3525. Il a un très faible courant de repos (7uA) et une haute efficacité (> 90% à 0.2mA). Quelque chose comme cette carte sparkfun https://www.sparkfun.com/products/8999 devrait faire un travail similaire. Assurez-vous de le connecter à la broche 5V de l’Arduino, pas à celle du VIN, afin que le régulateur Arduino ne soit pas utilisé.

2. Sleeeeeeep

La proportion de temps pendant laquelle l'appareil est actif sera petite. Le reste du temps, l'appareil doit rester en veille dans SLEEP_MODE_POWER_DOWN. Vous pouvez baser vos routines de sommeil sur la bibliothèque Rocketscreem Low Power . Selon ce lien, vous devriez pouvoir le réduire à 1,7uA avec ADC, BOD et WDT désactivé et en mode hors tension.

3. interruptions

L'autre moitié du sommeil est interrompue pour le réveiller. En mode veille Power Down, seules les interruptions de niveau sur INT1 et INT2, correspondance TWI, et le WDT le réveille. Vous devez donc connecter un bouton à INT1 ou INT2 pour pouvoir le réactiver.

D'autres choses:

Éteignez toutes les LED sauf en cas d'absolue nécessité. Si le verrou est à l'intérieur, il n'est pas nécessaire que les DEL soient lumineuses pour économiser davantage d'énergie. De même, si vous avez besoin que la MCU exécute une tâche régulièrement, utilisez le minuteur de surveillance pour la réactiver périodiquement.

Modifier:

Une méthode qui peut fonctionner consiste à utiliser la bibliothèque Low Power ci-dessus et à dormir environ 60 ms par boucle grâce au minuteur de surveillance. Au réveil, vérifiez si vous appuyez sur un bouton. La fonction à appeler serait

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);
geometrikal
la source
14

Tous ces commentaires sont sur place. J'aimerais ajouter quelques suggestions supplémentaires:

1) Pour les LED, utilisez des LED 20 mA à haut rendement. Voici la logique. Supposons que vous souhaitiez un voyant d'état d'atténuation qui clignote toutes les 8 secondes. Vous ne voulez pas que ce soit lumineux, vous utilisez donc des LED aléatoires. Le problème, c’est qu’une DEL de faible intensité utilise toujours 20 mA (ou plus) pour ne produire que 100 mcd. Au lieu de cela, obtenez une LED haute puissance qui est toujours nominale pour 20 mA mais peut produire 4000 mcd (assurez-vous de regarder l'angle de sortie, vous voulez toujours qu'il soit de 30 degrés ou plus). Avec cette LED de 4000 mcd, vous la connectez avec quelque chose comme une résistance de 3,3 k Ohm et vous obtenez environ 100 mcd de sortie de lumière, mais utilisez moins de 1 mA. Ainsi, au lieu d'utiliser 20 mA pour le voyant d'état, vous utilisez une fraction d'un seul mA. De plus, je règle généralement le temps de clignotement de la LED d'état pendant seulement 5 à 15 ms, ce qui peut également vous faire économiser beaucoup d'énergie si vous aviez déjà le temps de clignotement à 100 ms.

2) Mon régulateur de tension de choix est le Microchip MCP1700. Il utilise seulement 1,6 µA de courant de repos et est très bon marché (environ 0,30 USD en petites quantités). La seule limite est que la tension d'entrée maximale n'est que de 6 volts, vous ne pouvez donc pas utiliser une pile de 9 volts. Mais, il est parfait pour 4 piles AA, une pile LiPo ou deux piles bouton au lithium.

3) Pour alimenter un circuit ATmega avec 4 piles AA, j’utilise généralement une diode 1N4001 sur VCC pour réduire le maximum de 6 volts des 4 piles à 5,5 volts. De plus, la diode protège l’ATmega de la tension inverse, ce qui lui confère deux fonctions utiles. En faisant cela, je peux créer un circuit alimenté par batterie qui ne consomme que 0,1 µA en veille car aucun régulateur de tension ne consomme du courant tout le temps.

Tim Eckel
la source
8

J'ai fait un test sur un nu atmega328P-PU sur une carte de visite à l' aide de la bibliothèque RocketScream LowPower

Utilisé ce croquis:

#include "LowPower.h"

void setup(){}

void loop()
{
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);         
    delay(5000);
}

Avec un uCurrent Gold, je mesurais 7,25 uA en mode hors tension.

Guus
la source
1
Agréable! Je vais essayer cela dès que possible. Est-ce que cela permet de faire fonctionner un atmega238 pendant des années avec une pile CR2032?
Basj
6

Il y a deux questions ici, mais seule la seconde fait vraiment partie du titre de la question, il est donc probablement préférable d’en ouvrir une autre pour la question de programmation Arduino. Je vais répondre à la deuxième question ici.

Une seule pile alcaline AA de 1,5 V haut de gamme a une capacité d’environ 2600mAh. Si vous optez pour des piles au lithium, vous pouvez obtenir environ 3 400 mAh si vous avez de la chance. Partons de ce chiffre comme base pour le meilleur des cas absolus.

La manière dont vous calculez la durée de fonctionnement maximale théorique d'une charge est tout simplement la capacité divisée par la charge. Si votre charge est 1mA, vous pouvez l'exécuter pendant 3400/1 = 3400 heures = 141 jours = ~ 5 mois. Cependant, il ne s'agit que d'un maximum théorique , car vous allez commencer à avoir une tension significative tombant autour de 65% au cours de cette période. Si vous réglez la sortie, vous obtiendrez un effet d'emballement: plus la tension de la batterie est basse, plus le courant nécessaire pour maintenir la tension régulée est élevé, ce qui draine la batterie plus rapidement. Je serais surpris si vous pouvez utiliser plus de 80% de la capacité annoncée avec une tension suffisamment élevée pour faire fonctionner votre appareil.

Donc, disons que vous obtenez 80% de ce temps après une chute de tension et une inefficacité du régulateur. Nous supposerons que vous utilisez 3,3 V à partir de trois batteries en série. Cela vous donnera toujours la même capacité, mais la tension sera suffisante pour un régulateur. Si votre appareil fonctionne à 15mA (c'est une estimation plutôt conservatrice), les chiffres ressemblent à ceci:

  • Capacité après 80% d'efficacité = 3400 * 0,8 = 2720mAh
  • Temps = 2720/15 = 181 heures = 7.54 jours

Il vous faut donc environ 144 piles au lithium (48 jeux de 3) pour le faire fonctionner pendant un an. Pas si bon!

Je suggérerais plutôt d'utiliser une alimentation CC régulée du secteur. Une batterie de secours peut être incluse, ce qui est facile à configurer avec un relais SPDT - il suffit de brancher la bobine au CC du secteur et de relier le contact "off" à la batterie. Lorsque le CC tombe en panne, le contact chute et la batterie est utilisée à la place.

Polynôme
la source
Mes rêves sans fil sont brisés;) Merci pour la réponse détaillée. Cela me semblait aussi la meilleure option.
LouwHopley
Par coïncidence, c’était la même question que je me posais lors de la conception d’une serrure électronique. Même avec une grosse batterie rechargeable de 10 000 mAh, cela ne valait pas la peine. Nous avons fini par utiliser un adaptateur CC 250 mA et une vieille batterie de téléphone portable en guise de secours.
Polynôme du
4
La moyenne de 15 mA ne me semble pas très conservatrice! Le 328 peut fonctionner avec des microampères à un chiffre en mode veille, et vous pourriez sûrement vous en sortir en dormant au moins semi-profond la plupart du temps. De plus, à basses fréquences (par exemple 0,5 MHz), vous pouvez vous en tirer avec <1 mA en mode actif. Bien entendu, d'autres composants (régulateurs de tension, etc.) doivent être choisis pour s'adapter à la nature à faible consommation.
exscape
4
@ Polynomial Je n'ai pas examiné le schéma de près, mais le projet pourrait sûrement être construit sans "voyant d'alimentation". Vous pouvez également le faire clignoter, par exemple à mi-luminosité (via PWM), par exemple pendant 25 ms toutes les 2 secondes, de sorte que l'utilisation actuelle chute à une moyenne d'environ 0,09 mA au lieu de 15.
exscape
1
Arduino est avide de pouvoir. Construire votre propre tableau résoudrait ce problème. Atmega328 consomme 0,2 mA lorsque 32 kh et 0,75 µA en mode économie d'énergie.
Vorac
4

Quelque chose que personne n’a encore mentionné: Vous devez avoir un moyen de désactiver l’alimentation + 5V qui alimente le servo lorsque vous ne l’utilisez pas. Même lorsqu'il ne bouge pas, un servo consomme toujours de l'énergie.

Un FET dont la porte est contrôlée par une broche d’entrée / sortie de l’arduino est un bon moyen de le faire.

jwygralak67
la source
J'utilise généralement un 2N3904 pour chaque capteur ou quoi que ce soit pour l'activer / le désactiver. Ou, si le capteur est de faible puissance et à la même tension que celle sur laquelle je suis sous ATmega, j'utilise simplement une broche directement pour contrôler l'état de l'alimentation.
Tim Eckel
1
Utilisez un 2n7000 pour utiliser nettement moins d'énergie qu'un 2n3904 et vous n'avez pas besoin d'une résistance de base.
John Meacham
3

Vous pourriez envisager d’utiliser un micro-contrôleur spécialement optimisé pour une consommation d’énergie faible lors de votre prochain projet. Pour une faible consommation d'énergie, il est nécessaire de prendre une très faible consommation d'énergie pendant le sommeil. Ce qui est souvent négligé, c'est qu'il est également important de savoir à quelle vitesse il peut se réveiller de ce sommeil.

Ce qui compte, c'est la charge que prend le sommeil le plus profond pour traiter une interruption le plus rapidement possible (car la puissance sera alors très courte) et pour se rendormir à nouveau.

Un exemple de ce type de micro-contrôleur est le MSP430 de Texas Instruments. Vous trouverez sur leur site Web des notes d'application sur la conservation de l'énergie et des applications de récupération d'énergie.

Peer Stritzinger
la source