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 sleep
chamadas 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.
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
fonte
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.
fonte
Fiz um teste em um atmega328P-PU vazio em uma placa de ensaio usando a biblioteca RocketScream LowPower
Utilizou este esboço:
Com um uCurrent Gold , medi 7,25 uA no modo de desligamento.
fonte
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:
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.
fonte
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.
fonte
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.
fonte