¿Cómo puedo hacer que mi atmega328 funcione durante un año con baterías?

51

Guión

He creado una bonita cerradura electrónica para mi dormitorio. Actualmente es un Arduino Diecimila con un servo [des] cerrando la puerta. Tiene un teclado numérico con botones 3x4 y 5 LED (2 pares de series y un solo LED). Actualmente también funciona con un cargador de teléfono celular.

Ahora lo he rediseñado para funcionar con un Arduino independiente (ATmega328), pero realmente me gustaría que funcione con baterías AA o incluso con una batería de 9V.

Para la parte del software, pensé que podría poner sleepllamadas para ciertos momentos dentro del método de bucle para mantener el consumo de energía ATmega lo más bajo posible. Y deje que el LED "parpadee" con el mayor tiempo posible.

Pregunta 1

Cuando se presiona un botón durante los pocos milisegundos que duerme el tablero, ¿se "recordará" / "retendrá" hasta que salga del modo de suspensión y luego se lo levante al presionar un botón?

¿Cuál sería la mejor manera de manejar este botón al presionar el botón de reposo? ¿Puedo codificarlo para que se active con la actividad del botón, o debo dejarlo reposar, por ejemplo, 10m.s. en cada vuelta?

Pregunta 2

¿Cómo abordaría la matemática de calcular cuántas baterías AA se necesitan para hacer funcionar este dispositivo durante 10 meses?

Además, no sé cómo medir el uso promedio de energía por minuto, ya que se alterna rápidamente, etc.

El dispositivo

Mi cerradura de puerta

LouwHopley
fuente

Respuestas:

35

El Atmega328 proporciona seis modos de ahorro de energía, ordenados de mínimo a excelente (consumo actual estimado de esta publicación del foro ):

  • 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 la pregunta original:

Pensé que podría poner sleepllamadas para ciertos momentos dentro del método de bucle "

Debería usarlo sleep_cpu()después de configurar el modo de suspensión que necesita, de la lista anterior. El Arduino Playground tiene una publicación útil sobre esto .

La aplicación debe ser controlada por interrupciones, usar ampliamente los modos de suspensión anteriores y activar el procesador al presionar el botón, el desbordamiento del temporizador y los eventos del temporizador de vigilancia para ejecutar realmente las tareas.

Se pueden obtener ahorros de energía adicionales a través de los siguientes pasos:

  • Utilice el oscilador interno del microcontrolador y una frecuencia de reloj baja (8MHz en lugar de 16), pero asegúrese de que el código relacionado con el tiempo y la temporización siga funcionando como se esperaba. Es posible que se necesite una versión diferente del gestor de arranque para esto.
  • Evite mantener los LED encendidos por mucho tiempo si la aplicación los usa. El uso de un flash rápido doble o triple de corta duración (0.05 segundos encendido, 0.5 segundos apagado), con intervalos de segundos intermedios, garantiza una indicación notable con un consumo mínimo de energía
  • Use un regulador de conmutación en lugar de uno lineal, si se requiere un regulador.
  • Haga funcionar el microcontrolador a un voltaje más bajo si es compatible, 3.0 voltios (por ejemplo, celda de litio CR2032, no necesita regulador) o 3.3 voltios en lugar de 5 voltios.
  • Siga las recomendaciones en la hoja de datos para la configuración de los pines de entrada y salida no utilizados para un desperdicio de energía mínimo

La incorporación de estas sugerencias permite ejecutar aplicaciones de microcontroladores durante semanas o meses en una sola celda de moneda CR2032, y años en una celda de litio tipo LR123. Por supuesto, su kilometraje puede variar dependiendo de qué sensores, salidas y procesamiento real requiera su aplicación.

Algunas referencias útiles:

Anindo Ghosh
fuente
Con mi experiencia, en SLEEP_MODE_PWR_DOWN puede reducirlo a 0.1uA a 6.0uA si ha sido inteligente al desactivar cada pequeña cosa (como la detección de oscurecimiento). He creado versiones que usan menos de 60uA que duran 3-5 años en un conjunto de baterías alcalinas AA.
Tim Eckel
@TimEckel Estoy loco por indicar el estado con LED, que consume el presupuesto de energía como si estuviera pasando de moda.
Anindo Ghosh
3
No tiene que hacerlo Utilice LED de alta potencia con alta resistencia. Utilizará una fracción de mA en lugar de más de 20 mA. Además, parpadee el LED de estado durante 5-15 ms cada pocos segundos en lugar de estar constantemente encendido. Tenía un LED de estado tenue barato que usaba 30 mA, lo cambié a LED de alta potencia con una resistencia de 3.3k Ohm que parpadeé durante 15 ms una vez cada 8 segundos. ¡Pasó de 30 mA a 2.9 uA de corriente promedio, 1/1000 de la potencia!
Tim Eckel
44
@TimEckel Claramente no entiendes el alcance de mi pasión por las luces parpadeantes :-D No es que quiera reducir la intensidad, me gustan esas pequeñas cosas que brillan como las llamas de Hades, ¡maldito sea el presupuesto de energía! En una nota más seria: soy consciente de esos pequeños trucos, y de hecho he creado algunos propios, que aumentan el impacto de la alarma visual al tiempo que reducen la potencia a través de los LED. Ese comentario anterior fue ( solo en parte ) en broma, para ir con las muchas preguntas divertidas de LED que respondo por aquí.
Anindo Ghosh
3
Medí el consumo de energía de ATMega328P a diferentes voltajes y frecuencias e hice este cuadro docs.google.com/spreadsheets/d/…
Cano64
19

Tengo un Arduino Pro Mini en mi escritorio ahora que funciona con 2 baterías AA y podría funcionar durante más de un año si es necesario.

Hay tres aspectos del diseño que lo han logrado.

1. Un regulador diferente

Estoy usando un regulador de impulso LTC3525. Tiene una corriente de reposo muy baja (7uA) y una alta eficiencia (> 90% a 0.2mA). Algo así como esta placa sparkfun https://www.sparkfun.com/products/8999 debería hacer un trabajo similar. Asegúrese de conectarlo al pin de 5 V del Arduino, no al VIN, para que no se use el regulador Arduino.

2. Sleeeeeeep

La proporción de tiempo que el dispositivo está activo será pequeño. Por el resto del tiempo, el dispositivo debe estar dormido en SLEEP_MODE_POWER_DOWN. Puede basar sus rutinas de sueño en la Biblioteca Rocketscreem Low Power . Según ese enlace, debería poder bajarlo a 1.7uA con ADC, BOD y WDT apagados y en modo de apagado.

3. Interrupciones

La otra mitad del sueño es interrupciones para despertarlo. En el modo de apagado automático, solo el nivel interrumpe en INT1 e INT2, TWI coincide, y el WDT lo activará. Por lo tanto, debe tener un botón conectado a INT1 o INT2 para que presionar el botón lo active.

Otras cosas:

Apague todos los LED a menos que sea absolutamente necesario. Si la cerradura está en el interior, los LED no tienen que ser brillantes, ahorrando más energía. Además, si necesita que la MCU realice alguna tarea regularmente, use el temporizador de vigilancia para activarla periódicamente.

Editar:

Un método que puede funcionar es usar la biblioteca de bajo consumo de energía anterior, y dormir durante unos 60 ms cada ciclo gracias al temporizador de vigilancia. Al despertarse, verifique la presión del botón. La función a llamar sería

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);
Geometrikal
fuente
14

Todos estos comentarios son acertados. Me gustaría agregar algunas sugerencias más:

1) Para los LED, use LED de 20 mA de alto rendimiento. Aquí está la lógica. Digamos que desea un LED de estado tenue que parpadea cada 8 segundos. No desea que sea brillante, por lo que utiliza un LED aleatorio. El problema es que un LED tenue todavía usa 20 mA (o más) para emitir solo 100 mcd. En su lugar, obtenga un LED de alto rendimiento que todavía tenga una capacidad nominal de 20 mA pero que pueda generar 4000 mcd (asegúrese de mirar el ángulo de salida, probablemente aún desee que sea de 30 grados o más). Con este LED de 4000 mcd, lo conecta con algo así como una resistencia de 3.3 k Ohm y obtiene alrededor de 100 mcd de salida de luz, pero usa menos de 1 mA. Entonces, en lugar de usar 20 mA para el LED de estado, está usando una fracción de un solo mA. Por lo general, también configuro el tiempo de encendido del LED de estado durante solo 5-15 ms, lo que también puede ahorrar mucha energía si anteriormente tenía el tiempo de encendido del flash a 100 ms.

2) Mi regulador de voltaje de elección es el Microchip MCP1700. Utiliza solo 1.6 µA de corriente de reposo y es súper barato (alrededor de $ 0.30 en pequeñas cantidades). Su única limitación es que el voltaje de entrada máximo es de solo 6 voltios, por lo que no puede usar una batería de 9 voltios. Pero es perfecto para 4 baterías AA, un LiPo de una sola celda o dos celdas de monedas de litio.

3) Para alimentar un circuito ATmega con 4 baterías AA, generalmente uso un diodo 1N4001 en VCC para bajar el máximo de 6 voltios de las 4 baterías a 5.5 voltios. Además, el diodo protege el ATmega del voltaje inverso, por lo que sirve para dos propósitos útiles. Al hacer esto, puedo crear un circuito alimentado por batería que puede usar tan solo 0.1 µA mientras duerme, ya que no hay un regulador de voltaje que consuma corriente todo el tiempo.

Tim Eckel
fuente
8

Hice una prueba en un atmega328P-PU desnudo en una placa de prueba usando la biblioteca RocketScream LowPower

Usó este boceto:

#include "LowPower.h"

void setup(){}

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

Con un uCurrent Gold medí 7.25 uA cuando estaba en modo de apagado.

Guus
fuente
1
¡Agradable! Lo intentaré lo antes posible. ¿Esto permite ejecutar un atmega238 durante años con una batería CR2032?
Basj
6

Aquí hay dos preguntas, pero solo la segunda es realmente parte del título de la pregunta, por lo que probablemente sea mejor si abre otra para la pregunta de programación de Arduino. Contestaré la segunda pregunta aquí.

Una sola batería alcalina AA de 1.5V de alta gama tiene una capacidad de aproximadamente 2600mAh. Si opta por baterías de litio, puede obtener aproximadamente 3400 mAh si tiene suerte. Vayamos con esa cifra como referencia para el mejor caso absoluto.

La forma de calcular el tiempo de funcionamiento máximo teórico para una carga es simplemente la capacidad dividida por la carga. Si su carga es de 1 mA, puede ejecutarla durante 3400/1 = 3400 horas = 141 días = ~ 5 meses. Sin embargo, esto es solo un máximo teórico , ya que comenzará a caer un voltaje significativo alrededor del 65% en ese momento. Si está regulando la salida, obtendrá un efecto desbocado donde cuanto menor sea el voltaje de la batería, mayor será la corriente necesaria para mantener el voltaje regulado, lo que agota la batería más rápido. Me sorprendería si puede obtener más del 80% de la capacidad anunciada con un voltaje lo suficientemente alto como para ejecutar su dispositivo.

Entonces, supongamos que obtiene el 80% de ese tiempo después de la caída de voltaje y las ineficiencias del regulador. Asumiremos que está funcionando a 3.3V con tres baterías en serie. Esto todavía le dará la misma capacidad, pero el voltaje será suficiente para un regulador. Si su dispositivo funciona a 15 mA (es una estimación bastante conservadora) los números se verán así:

  • Capacidad después del 80% de eficiencia = 3400 * 0.8 = 2720mAh
  • Tiempo = 2720/15 = 181 horas = 7.54 días

Por lo tanto, necesitaría alrededor de 144 baterías de litio (48 juegos de 3) para funcionar durante un año. ¡No tan bien!

Sugeriría usar un suministro de CC regulado de la red eléctrica en su lugar. Se puede incluir una batería de respaldo, que es fácil de configurar con un relé SPDT: simplemente conecte la bobina a la red de CC y tenga el contacto "apagado" conectado a la batería. Cuando la CC falla, el contacto cae y la batería se usa en su lugar.

Polinomio
fuente
Mis sueños inalámbricos están aplastados;) Gracias por la respuesta detallada. Esto también me pareció la mejor opción.
LouwHopley
Casualmente, esta fue la misma pregunta que me planteé al diseñar una cerradura electrónica. Incluso con una batería recargable de 10.000 mAh no valió la pena. Terminé simplemente usando un adaptador de CC de 250 mA y una batería de teléfono móvil vieja como respaldo.
Polinómico
44
¡El promedio de 15 mA no me parece muy conservador! El 328 puede funcionar con microamperios de un solo dígito en modo de suspensión, y seguramente podría salirse con la suya al menos en un sueño semi-profundo la mayor parte del tiempo. Además, a bajas frecuencias (por ejemplo, 0,5 MHz) puede pasar con <1 mA en modo activo. Por supuesto, otros componentes (reguladores de voltaje, etc.) deben seleccionarse para adaptarse a la naturaleza de baja potencia.
exscape
44
@Polynomial No examiné de cerca el esquema, pero seguramente el proyecto podría construirse sin un "LED de encendido". O podría parpadear, de modo que esté encendido, por ejemplo, a la mitad del brillo (a través de PWM), solo por unos 25 ms cada 2 segundos, de modo que el uso actual caiga a un promedio de ~ 0.09 mA en lugar de 15.
exscape
1
Arduino tiene hambre de poder. Construir tu propio tablero resolvería esto. Atmega328 consume 0.2 mA cuando 32kH y 0.75 uA en modo de ahorro de energía.
Vorac
4

Algo que nadie ha mencionado todavía: debe tener alguna forma de apagar el suministro de + 5V que alimenta el servo, cuando no lo está utilizando. Incluso cuando no se está moviendo, un servo seguirá consumiendo energía.

Un FET con la puerta controlada por un pin de E / S del arduino es una buena manera de hacerlo.

jwygralak67
fuente
Normalmente uso un 2N3904 para cada sensor o lo que sea para encenderlo / apagarlo. O, si el sensor es de baja potencia y el mismo voltaje que el que estoy usando ATmega, solo uso un pin directamente para controlar el estado de la alimentación.
Tim Eckel
1
Use un 2n7000 para usar una potencia significativamente menor que un 2n3904 y no necesita una resistencia base.
John Meacham
3

Puede considerar usar un microcontrolador especialmente optimizado para un bajo consumo de energía para su próximo diseño. Para un bajo consumo de energía, es necesario tomar muy poca energía mientras duerme. Lo que a menudo se pasa por alto es que también es importante qué tan rápido puede despertarse de este sueño.

Lo que cuenta es cuánta carga se necesita del sueño más profundo para manejar una interrupción lo más rápido posible (porque la explosión de energía será muy corta entonces) y volver a dormir nuevamente.

Un ejemplo de tal microcontrolador es MSP430 de Texas Instruments. En su sitio web encontrará notas de aplicación sobre cómo conservar la energía y las aplicaciones de recolección de energía.

Peer Stritzinger
fuente