Como faço para que meu atmega328 funcione por um ano com baterias?


51

Cenário

Eu criei uma bela fechadura eletrônica para o meu dormitório. Atualmente, é um Arduino Diecimila com um servo [un] trancando a porta. Possui teclado numérico com botões 3x4 e 5 LEDs (2 pares de séries e um único LED). Atualmente, ele também roda em um carregador de celular.

Eu agora o reprojetei para rodar em um Arduino autônomo (ATmega328), mas gostaria muito de rodar com baterias AA ou mesmo com uma bateria de 9V.

Para a parte do software, imaginei que poderia fazer sleepchamadas por determinados momentos dentro do método de loop para manter o consumo de energia do ATmega o mais baixo possível. E deixe o LED "piscar" com o maior tempo possível.

Questão 1

Quando um botão é pressionado durante os poucos milissegundos que a placa dorme, ele será "lembrado" / "mantido" até que saia do modo de espera e depois será pressionado como um botão pressionado?

Qual seria a melhor maneira de lidar com esse botão pressionado no modo de suspensão? Posso codificá-lo para ativar a atividade do botão ou devo deixá-lo dormir por, por exemplo, 10m.s. em cada loop?

Questão 2

Como eu abordaria a matemática para calcular quantas pilhas AA são necessárias para operar este dispositivo por 10 meses?

Além disso, não sei como medir o consumo médio de energia por minuto, aproximadamente, pois alterna rapidamente etc.

O dispositivo

Meu dispositivo de trava de porta

Respostas:


35

O Atmega328 fornece seis modos de economia de energia, ordenados de mínimo a excelente (consumo atual estimado desta postagem do fórum ):

  • 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

Citando a pergunta original:

Imaginei que poderia fazer sleepchamadas por determinados momentos dentro do método de loop "

Você precisaria usar sleep_cpu()depois de configurar o modo de suspensão necessário, na lista acima. O Arduino Playground tem um post útil sobre isso .

O aplicativo precisa ser acionado por interrupção, usar os modos de suspensão acima extensivamente e ativar o processador com eventos de pressionamento de botão, excesso de temporizador e cronômetro de vigilância para realmente executar tarefas.

Economias de energia adicionais podem ser obtidas através das seguintes etapas:

  • Use o oscilador interno do microcontrolador e uma baixa taxa de clock (8 MHz em vez de 16) - mas verifique se o código relacionado a tempo e tempo ainda funciona conforme o esperado. Uma versão diferente do gerenciador de inicialização pode ser necessária para isso.
  • Evite manter os LEDs por muito tempo se o aplicativo os usar. O uso de um flash rápido duplo ou triplo de curta duração (0,05 segundo ligado e 0,5 segundo desligado), com intervalos de segundos no meio, garante uma indicação perceptível com o mínimo consumo de energia
  • Use um regulador de comutação em vez de um linear, se for necessário um regulador.
  • Execute o microcontrolador em tensão mais baixa, se suportado, 3,0 Volts (por exemplo, célula de lítio CR2032, sem necessidade de regulador) ou 3,3 Volts em vez de 5 Volts.
  • Siga as recomendações na folha de dados para configurações de pinos de entrada e saída não utilizados, para desperdício mínimo de energia.

A incorporação dessas sugestões permite a execução de aplicativos de microcontrolador por semanas ou meses em uma única célula tipo moeda CR2032 e anos em uma célula de lítio do tipo LR123. Obviamente, sua milhagem pode variar dependendo de quais sensores, saídas e processamento real sua aplicação requer.

Algumas referências úteis:


Com a minha experiência, no SLEEP_MODE_PWR_DOWN, você pode reduzi-lo para 0,1uA a 6,0uA, se você for esperto em desativar todas as pequenas coisas (como detecção de queda de energia). Criei compilações que usam menos de 60uA, que duram de 3 a 5 anos em um conjunto de pilhas alcalinas AA.
amigos estão dizendo sobre tim

@ TimEckel Sou louco por indicar status com LEDs - isso consome o orçamento de energia como se estivesse saindo de moda.
Anindo Ghosh

3
Não precisa. Use LEDs de alta potência com alta resistência. Usará uma fração de mA em vez de mais de 20 mA. Além disso, pisque o LED de status por 5 a 15 ms a cada poucos segundos, em vez de constantemente aceso. Eu tinha um LED de status fraco que usava 30 mA, mudei para LED de alta potência com um resistor de 3,3k Ohm, que pisquei por 15 ms uma vez a cada 8 segundos. Foram de 30 mA a 2,9 uA de corrente média, 1/1000 da potência!
Tim Eckel

4
@ TimEckel Você claramente não entende a extensão da minha paixão por luzes piscantes :-D Não é como se eu quisesse reduzir a intensidade, eu gosto daquelas coisinhas brilhando como as chamas de Hades, que o orçamento de energia seja muito alto! Em uma observação mais séria: conheço esses pequenos truques e, de fato, criei alguns dos meus, que aumentam o impacto do alarme visual e reduzem a energia através dos LEDs. O comentário anterior foi ( apenas parcialmente ) em tom de brincadeira, para acompanhar as muitas perguntas divertidas sobre LED que eu respondo por aqui.
Anindo Ghosh

3
Medi o consumo de energia do ATMega328P em diferentes tensões e frequências e fiz este gráfico docs.google.com/spreadsheets/d/…
Cano64

19

No momento, tenho um Arduino Pro Mini em minha mesa que está usando duas pilhas AA e pode funcionar por mais de um ano, se necessário.

Existem três aspectos do design que alcançaram isso.

1. Um regulador diferente

Estou usando um regulador de impulso LTC3525. Possui corrente quieta muito baixa (7uA) e alta eficiência (> 90% a 0,2mA). Algo como esta placa sparkfun https://www.sparkfun.com/products/8999 deve fazer um trabalho semelhante. Certifique-se de conectá-lo ao pino de 5V no Arduino, não no VIN, para que o regulador do Arduino não seja usado.

2. Sleeeeeeep

A proporção de tempo que o dispositivo está ativo será pequena. Durante o resto do tempo, o dispositivo deve estar adormecido em SLEEP_MODE_POWER_DOWN. Você pode basear suas rotinas de sono na Biblioteca de Baixa Potência do Rocketscreem . De acordo com esse link, você poderá baixá-lo para 1,7uA com ADC, BOD e WDT desligado e no modo de desligamento.

3. Interrompe

A outra metade do sono é interrompida para acordá-lo. No modo de suspensão de desligamento, apenas interrupções de nível nas combinações INT1 e INT2, TWI e o WDT o ativará. Portanto, você precisa ter um botão conectado ao INT1 ou INT2 para que pressionar o botão o ative.

Outras coisas:

Desligue todos os LEDs, a menos que seja absolutamente necessário. Se a trava estiver em um local fechado, os LEDs não precisarão ser brilhantes, economizando mais energia. Além disso, se você precisar que o MCU execute alguma tarefa regularmente, use o timer do watchdog para ativá-lo periodicamente.

Editar:

Um método que pode funcionar é usar a biblioteca Low Power acima e dormir por, aproximadamente, 60ms a cada loop, graças ao timer do watchdog. Ao ativar, verifique se o botão é pressionado. A função a ser chamada seria

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);

14

Todos esses comentários estão no local. Gostaria de adicionar mais algumas sugestões:

1) Para LEDs, use LEDs de 20 mA de alta saída. Aqui está a lógica. Digamos que você queira um LED de status fraco que pisque a cada 8 segundos. Você não quer que seja brilhante, então use um LED aleatório. O problema é que um LED escuro ainda usa 20 mA (ou mais) para produzir apenas 100 mcd. Em vez disso, obtenha um LED de alta saída que ainda é classificado para 20 mA, mas que pode gerar 4000 mcd (verifique o ângulo de saída, você provavelmente ainda quer que ele seja 30 graus ou mais). Com esse LED de 4000 mcd, você o conecta a um resistor de 3,3 k Ohm e obtém cerca de 100 mcd de saída de luz, mas está usando menos de 1 mA. Portanto, em vez de usar 20 mA para o LED de status, você está usando uma fração de um único mA. Normalmente, também ajusto o flash do LED de status no tempo por apenas 5-15 ms, o que também pode economizar bastante energia se você tiver o flash no tempo em 100 ms.

2) Meu regulador de tensão preferido é o Microchip MCP1700. Ele usa apenas 1,6 µA de corrente quieta e é super barato (cerca de US $ 0,30 em pequenas quantidades). Sua única limitação é que a tensão máxima de entrada é de apenas 6 volts, portanto você não pode usar uma bateria de 9 volts. Mas, é perfeito para 4 pilhas AA, uma única célula LiPo ou duas células de moeda de lítio.

3) Para alimentar um circuito ATmega com 4 pilhas AA, normalmente uso um diodo 1N4001 no VCC para reduzir o máximo de 6 volts das 4 baterias para 5,5 volts. Além disso, o diodo protege o ATmega da tensão reversa, por isso serve a dois propósitos úteis. Fazendo isso, posso criar um circuito alimentado por bateria que pode usar apenas 0,1 µA enquanto dorme, pois não há regulador de tensão que consome corrente o tempo todo.


8

Fiz um teste em um atmega328P-PU vazio em uma placa de ensaio usando a biblioteca RocketScream LowPower

Utilizou este esboço:

#include "LowPower.h"

void setup(){}

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

Com um uCurrent Gold , medi 7,25 uA no modo de desligamento.


11
Agradável! Vou tentar isso o mais rápido possível. Isso permite executar um atmega238 por anos com uma bateria CR2032?
Basj

6

Há duas perguntas aqui, mas apenas a segunda é realmente parte do título da pergunta, por isso é provavelmente melhor se você abrir outra para a questão de programação do Arduino. Eu vou responder a segunda pergunta aqui.

Uma única bateria alcalina de 1,5V AA de ponta tem uma capacidade de cerca de 2600mAh. Se você optar por baterias de lítio, poderá obter cerca de 3400mAh se tiver sorte. Vamos acompanhar esse número como uma linha de base para o melhor caso absoluto.

A maneira como você calcula o tempo máximo de execução teórico para uma carga é simplesmente a capacidade dividida pela carga. Se sua carga for de 1 mA, você poderá executá-la por 3400/1 = 3400 horas = 141 dias = ~ 5 meses. No entanto, esse é apenas o máximo teórico , pois você começará a ter uma tensão significativa caindo cerca de 65% nesse período. Se você estiver regulando a saída, obterá um efeito descontrolado em que quanto menor a tensão da bateria, maior a corrente necessária para manter a tensão regulada, o que drena a bateria mais rapidamente. Ficaria surpreso se você conseguir obter mais de 80% da capacidade anunciada com uma voltagem alta o suficiente para executar o dispositivo.

Então, digamos que você tenha 80% desse tempo após queda de tensão e ineficiências do regulador. Vamos supor que você esteja funcionando a 3,3V a partir de três baterias em série. Isso ainda lhe dará a mesma capacidade, mas a tensão será suficiente para um regulador. Se o seu dispositivo funcionar a 15mA (essa é uma estimativa bastante conservadora), os números ficarão assim:

  • Capacidade após 80% de eficiência = 3400 * 0.8 = 2720mAh
  • Tempo = 2720/15 = 181 horas = 7,54 dias

Então você precisaria de cerca de 144 baterias de lítio (48 conjuntos de 3) para executá-lo por um ano. Não tão bom!

Eu sugiro usar uma fonte DC regulada da rede elétrica. Pode ser incluído um backup da bateria, que é fácil de configurar com um relé SPDT - basta conectar a bobina à corrente elétrica da rede elétrica e ter o contato "desligado" conectado à bateria. Quando o DC falha, o contato cai e a bateria é usada.


Meus sonhos sem fio são esmagados;) Obrigado pela resposta detalhada. Esta parecia a melhor opção para mim também.
LouwHopley

Coincidentemente, essa foi a mesma pergunta que fiz ao projetar uma fechadura eletrônica. Mesmo com uma bateria recarregável de 10.000 mAh, não valia a pena. Acabou usando um adaptador de 250mA DC e uma bateria antiga de celular como backup.
Polinomial

4
A média de 15 mA não me parece muito conservadora! O 328 pode ser executado em microamperes de um dígito no modo de suspensão, e com certeza você pode se dar bem durante pelo menos meia hora de sono profundo. Além disso, em baixas frequências (por exemplo, 0,5 MHz), você pode conviver com <1 mA no modo ativo. Obviamente, outros componentes (reguladores de tensão etc.) precisam ser escolhidos para se adequarem à natureza de baixa potência.
Exscape 19/11/12

4
@ Polinomial Não olhei atentamente para o esquema, mas certamente o projeto poderia ser construído sem um "LED de energia". Ou você pode piscar, para que fique ligado, por exemplo, com meio brilho (via PWM), apenas por 25 ms a cada 2 segundos, de modo que o uso atual caia para uma média de ~ 0,09 mA em vez de 15.
exscape

11
Arduino está com fome de poder. Construir seu próprio conselho resolveria isso. O Atmega328 consome 0,2 mA quando 32kH e 0,75 uA no modo de economia de energia.
Vorac

4

Algo que ninguém mencionou ainda: Você precisa ter uma maneira de desligar a fonte de + 5V que alimenta o servo, quando não estiver em uso. Mesmo quando não está em movimento, um servo ainda consome energia.

Um FET com o gate controlado por um pino de E / S do arduino é uma boa maneira de fazer isso.


Normalmente, uso um 2N3904 para cada sensor ou o que quer que seja para ligar / desligar. Ou, se o sensor estiver com baixa potência e a mesma tensão que estou executando o ATmega, apenas uso um pino diretamente para controlar o status da energia.
amigos estão dizendo sobre tim

11
Use um 2n7000 para usar significativamente menos energia que um 2n3904 e você não precisa de um resistor de base.
John Meacham

3

Você pode considerar usar um microcontrolador especialmente otimizado para baixo consumo de energia para o seu próximo projeto. Para baixo consumo de energia, é necessário consumir muito pouca energia durante o sono. O que geralmente é esquecido é que também é importante a rapidez com que pode acordar desse sono.

O que conta é a quantidade de carga necessária para dormir profundamente para lidar com uma interrupção o mais rápido possível (porque a explosão de energia será muito curta) e voltar a dormir novamente.

Um exemplo desse microcontrolador é o MSP430 da Texas Instruments. Em seu site, você encontrará notas de aplicação sobre como conservar aplicações de energia e de captação de energia.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.