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

Guión

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

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

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

Pregunta 1

Cuando se presiona un botón durante los pocos milisegundos que la placa está inactiva, ¿será "recordado"/"retenido" hasta que salga del modo inactivo y luego se recogerá como una pulsación de botón?

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

Pregunta 2

¿Cómo abordaría las matemáticas para 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 de energía promedio por minuto, ya que se alterna rápidamente, etc.

El dispositivo

Dispositivo de bloqueo de mi puerta

Respuestas (7)

El Atmega328 proporciona seis modos de ahorro de energía, ordenados de mínimo a excelente (consumo de corriente 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á 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 impulsada por interrupciones, usar los modos de suspensión anteriores ampliamente y activar el procesador al presionar un botón, desbordamiento del temporizador y eventos del temporizador de vigilancia para ejecutar 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 velocidad de reloj baja (8 MHz en lugar de 16), pero asegúrese de que el tiempo y el código relacionado con el tiempo sigan funcionando como se esperaba. Es posible que se necesite una versión diferente del cargador de arranque para esto.
  • Evite mantener los LED encendidos por mucho tiempo si la aplicación los usa. El uso de un parpadeo rápido doble o triple de corta duración (0,05 segundos encendido, 0,5 segundos apagado), con intervalos de segundos entre ellos, garantiza una indicación notable con un consumo mínimo de energía
  • Utilice un regulador de conmutación en lugar de uno lineal, si se requiere un regulador.
  • Ejecute el microcontrolador a un voltaje más bajo si es compatible, 3,0 voltios (por ejemplo, celda de litio CR2032, no se necesita regulador) o 3,3 voltios en lugar de 5 voltios.
  • Siga las recomendaciones en la hoja de datos para la configuración de pines de entrada y salida no utilizados para un mínimo desperdicio de energía.

La incorporación de estas sugerencias permite ejecutar aplicaciones de microcontrolador 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 según los sensores, las salidas y el procesamiento real que requiera su aplicación.

Algunas referencias útiles:

Con mi experiencia, en SLEEP_MODE_PWR_DOWN puede reducirlo a 0.1uA a 6.0uA si ha sido inteligente al apagar todo (como la detección de caída de tensión). Creé versiones que usan menos de 60 uA que duran de 3 a 5 años con un juego de baterías alcalinas AA.
@TimEckel Estoy loco por indicar el estado con LED, eso consume el presupuesto de energía como si estuviera pasando de moda.
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, el LED de estado parpadea durante 5 a 15 ms cada pocos segundos en lugar de estar encendido constantemente. Tenía un LED de estado tenue barato que usaba 30 mA, lo cambié a un 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!
@TimEckel Claramente no entiendes el alcance de mi pasión por las luces parpadeantes :-D No es como si quisiera reducir la intensidad, me gustan esas pequeñas cosas que brillan como las llamas del Hades, ¡al diablo con el presupuesto de energía! En una nota más seria: estoy al tanto de esos pequeños trucos y, de hecho, he creado algunos propios, que aumentan el impacto visual de la alarma mientras reducen la potencia a través de los LED. Ese comentario anterior fue ( solo en parte ) en broma, para acompañar las muchas preguntas divertidas sobre LED que respondo aquí.
Medí el consumo de energía de ATMega328P a diferentes voltajes y frecuencias e hice este gráfico docs.google.com/spreadsheets/d/…

En este momento tengo un Arduino Pro Mini en mi escritorio 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 han logrado esto.

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,2 mA). Algo como este tablero sparkfun https://www.sparkfun.com/products/8999 debería hacer un trabajo similar. Asegúrese de conectarlo al pin de 5V del Arduino, no al VIN, para que no se utilice el regulador Arduino.

2. Dormir

La proporción de tiempo que el dispositivo está activo será pequeña. El resto del tiempo, el dispositivo debe estar dormido en SLEEP_MODE_POWER_DOWN. Puede basar sus rutinas de sueño en la biblioteca de bajo consumo Rocketscreem . De acuerdo con ese enlace, debería poder reducirlo a 1.7uA con ADC, BOD y WDT apagados y en modo de apagado.

3. Interrupciones

La otra mitad del sueño son interrupciones para despertarlo. En el modo de suspensión de apagado, solo las interrupciones de nivel en INT1 e INT2, coinciden con TWI, y el WDT lo activará. Por lo tanto, debe tener un botón conectado a INT1 o INT2 para que al presionar el botón se 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 con regularidad, use el temporizador de vigilancia para activarla periódicamente.

Editar:

Un método que puede funcionar es usar la biblioteca Low Power anterior y dormir durante, digamos, 60 ms en cada bucle gracias al temporizador de vigilancia. Al despertar, verifique si se presiona el botón. La función a llamar sería

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);

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

1) Para los LED, use LED de alto rendimiento de 20 mA. Aquí está la lógica. Digamos que desea un LED de estado tenue que parpadee 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 generar solo 100 mcd. En su lugar, obtenga un LED de alto rendimiento que aún 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 una resistencia de 3,3 k ohmios 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 flash LED de estado a tiempo durante solo 5-15 ms, lo que también puede ahorrar mucha energía si anteriormente tenía el flash a tiempo a 100 ms.

2) Mi regulador de voltaje preferido es el Microchip MCP1700. Utiliza solo 1,6 µA de corriente de reposo y es muy 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 pilas AA, una LiPo de una sola celda o dos pilas de botón de litio.

3) Para alimentar un circuito ATmega con 4 baterías AA, normalmente uso un diodo 1N4001 en VCC para reducir el máximo de 6 voltios de las 4 baterías a 5,5 voltios. Además, el diodo protege al ATmega del voltaje inverso, por lo que tiene 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.

Hice una prueba en un atmega328P-PU desnudo en una placa 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.

¡Bonito! Intentaré esto lo antes posible. ¿Esto permite hacer funcionar un atmega238 durante años con una batería CR2032?

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. Voy a responder a la segunda pregunta aquí.

Una sola batería alcalina de gama alta de 1,5 V AA tiene una capacidad de aproximadamente 2600 mAh. Si opta por baterías de litio, puede obtener alrededor de 3400 mAh si tiene suerte. Vayamos con esa cifra como línea de base para el mejor de los casos.

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 tener una caída significativa de voltaje de alrededor del 65% en ese momento. Si está regulando la salida, obtendrá un efecto desbocado en el que 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 hacer funcionar su dispositivo.

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

  • Capacidad después del 80 % de eficiencia = 3400 * 0,8 = 2720 mAh
  • 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 que funcione durante un año. ¡No tan bien!

En su lugar, sugeriría usar un suministro de CC regulado de la red eléctrica. 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 eléctrica de CC y tenga el contacto de "apagado" conectado a la batería. Cuando falla la CC, el contacto cae y se usa la batería en su lugar.

Mis sueños inalámbricos están aplastados;) Gracias por la respuesta detallada. A mí también me pareció la mejor opción.
Coincidentemente, esta fue la misma pregunta que me hice a mí mismo cuando diseñé una cerradura de puerta electrónica. Incluso con una batería recargable gruesa de 10,000 mAh, no valió la pena. Terminé usando solo un adaptador de CC de 250 mA y una batería de teléfono móvil vieja como respaldo.
¡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 suspensión semiprofunda la mayor parte del tiempo. Además, a bajas frecuencias (p. ej., 0,5 MHz) puede funcionar con <1 mA en modo activo. Por supuesto, es necesario elegir otros componentes (reguladores de voltaje, etc.) para adaptarse a la naturaleza de baja potencia.
Solo @exscape LED4 extraerá 15 mA. La activación de S1, S2 o S3 generará otros ~0,5 mA cada uno debido a los arranques.
@Polynomial No miré de cerca el esquema, pero seguramente el proyecto podría construirse sin un "LED de alimentación". O puede parpadear, de modo que esté encendido, por ejemplo, a la mitad del brillo (a través de PWM), solo durante, digamos, 25 ms cada 2 segundos, de modo que el uso actual caería a un promedio de ~ 0.09 mA en lugar de 15.
@exscape Eso es cierto. Tal vez sea posible hacerlo funcionar durante casi un año con unas pocas baterías AA de litio después de todo, si realiza un trabajo adicional para reducir el consumo. Sin embargo, me imagino que la batería alcalina promedio no funcionaría mejor que 4-6 meses.
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.

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á usando. 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.

Normalmente uso un 2N3904 para cada sensor o lo que sea para encenderlo/apagarlo. O, si el sensor es de baja potencia y tiene el mismo voltaje que el ATmega, solo uso un pin directamente para controlar el estado de la energía.
Use un 2n7000 para usar significativamente menos energía que un 2n3904 y no necesita una resistencia base.

Podría considerar usar un microcontrolador que esté 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 se 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 desde el 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 un microcontrolador de este tipo es el MSP430 de Texas Instruments. En su sitio web encontrará notas de aplicación sobre cómo conservar energía y aplicaciones de recolección de energía.