57 votos

¿Cómo puedo conseguir que mi atmega328 funcione durante un año con pilas?

Escenario

He creado una bonita cerradura electrónica para mi dormitorio. Actualmente se trata de un Arduino Diecimila con un servo que [des]cierra la puerta. Tiene un teclado numérico con 3x4 botones y 5 LED's (2 pares de series y un solo LED). También funciona actualmente con un cargador de móvil.

Ahora lo he rediseñado para que funcione con un Arduino autónomo (ATmega328), pero realmente me gustaría que funcionara con pilas AA o incluso con una pila de 9V.

Para la parte del software, pensé que podría poner sleep llama a ciertos tiempos dentro del método de bucle para mantener el consumo de energía del ATmega lo más bajo posible. Y dejar que los LED's "parpadeen" con el mayor tiempo posible de apagado.

Pregunta 1

Cuando se pulsa un botón durante los pocos milisegundos que la placa duerme, ¿se "recordará"/"mantendrá" hasta que salga del sueño y entonces se recogerá como una pulsación de botón?

¿Cuál sería la mejor manera de manejar esta pulsación de botón en el sueño? ¿Puedo codificarla para que se despierte tras la actividad del botón, o debo dejarla dormir durante, por ejemplo, 10 m.s. en cada bucle?

Pregunta 2

¿Cómo puedo calcular cuántas pilas AA se necesitan para que este dispositivo funcione durante 10 meses?

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

El dispositivo

My door lock device

39voto

userid53 Puntos 116

El Atmega328 ofrece seis modos de ahorro de energía, ordenados de mínimo a excelente (consumos de corriente estimados de este post 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:

Me imaginé que podría poner sleep llamadas para ciertos momentos dentro del método de bucle "

Tendría que utilizar sleep_cpu() después de configurar el modo de reposo que necesita, de la lista anterior. El Arduino Playground tiene un útil post sobre esto .

La aplicación debe ser controlada por interrupciones, utilizar ampliamente los modos de reposo mencionados anteriormente y despertar el procesador al pulsar un botón, al desbordarse el temporizador y a los eventos del temporizador de vigilancia para ejecutar realmente las tareas.

Se puede obtener un ahorro de energía adicional mediante los siguientes pasos:

  • Utiliza el oscilador interno del microcontrolador y una velocidad de reloj baja (8MHz en lugar de 16) - pero asegúrate de que el código relacionado con el tiempo y la sincronización sigue funcionando como se espera. Para ello puede ser necesaria una versión diferente del bootloader.
  • Evite mantener los LEDs encendidos durante mucho tiempo si la aplicación los utiliza. Utilizar un doble o triple parpadeo rápido de corta duración (0,05 segundos de encendido, 0,5 segundos de apagado), con espacios de segundos entre ellos, asegura una indicación notable con un consumo mínimo de energía
  • Utilizar 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, pila de litio CR2032, sin necesidad de regulador) o 3,3 voltios en lugar de 5 voltios.
  • Siga las recomendaciones de la hoja de datos para la configuración de las clavijas de entrada y salida no utilizadas con el fin de minimizar el gasto de energía.

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

Algunas referencias útiles:

21voto

meds Puntos 271

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

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

1. Un regulador diferente

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

2. Sleeeeeeep

La proporción de tiempo que el dispositivo está activo será pequeña. El resto del tiempo el dispositivo debería estar dormido en SLEEP_MODE_POWER_DOWN. Puedes basar tus rutinas de reposo en el Biblioteca de bajo consumo Rocketscreem . De acuerdo con ese enlace deberías ser capaz de bajarlo a 1,7uA con el ADC, el BOD y el WDT apagados y en modo de apagado.

3. Interrupciones

La otra mitad del sueño se interrumpe para despertarlo. En el modo de sueño Power Down, sólo las interrupciones de nivel en INT1 e INT2, la coincidencia de TWI, y el WDT lo despertarán. Así que necesitas tener un botón conectado a INT1 o INT2 para que al pulsar el botón se despierte.

Otras cosas:

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

Editar:

Un método que puede funcionar es usar la librería de bajo consumo de arriba, y dormir por ejemplo 60ms en cada bucle gracias al temporizador de vigilancia. Al despertar comprobar si se pulsa el botón. La función a llamar sería

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);

15voto

matt_black Puntos 141

Todos estos comentarios dan en el clavo. Me gustaría añadir algunas sugerencias más:

1) Para los LEDs, utilice LEDs de alta potencia de 20 mA. Esta es la lógica. Digamos que quieres un LED de estado tenue que parpadee cada 8 segundos. No quieres que sea brillante, así que usas un LED cualquiera. El problema es que un LED tenue sigue utilizando 20 mA (o más) para emitir sólo 100 mcd. En lugar de eso, consigue un LED de alta potencia que aún esté clasificado para 20 mA pero que pueda emitir 4000 mcd (asegúrate de mirar el ángulo de salida, probablemente quieras que sea de 30 grados o más). Con este LED de 4000 mcd, lo conectas con algo como una resistencia de 3,3 k Ohm y obtienes alrededor de 100 mcd de salida de luz, pero estás usando menos de 1 mA. Así que, en lugar de usar 20 mA para el LED de estado, estás usando una fracción de un solo mA. También suelo ajustar el tiempo de parpadeo del LED de estado a sólo 5-15 ms, lo que también puede ahorrar mucha energía si previamente tenías el tiempo de parpadeo a 100 ms.

2) Mi regulador de voltaje elegido es el Microchip MCP1700. Utiliza sólo 1,6 µA de corriente de reposo y es súper barato (alrededor de 0,30 dólares en pequeñas cantidades). Su única limitación es que la tensión máxima de entrada es de sólo 6 voltios, por lo que no se puede utilizar una batería de 9 voltios. Sin embargo, es perfecto para 4 pilas AA, una LiPo de una sola célula o dos pilas de moneda de litio.

3) Para alimentar un circuito ATmega con 4 pilas AA, suelo utilizar un diodo 1N4001 en VCC para reducir los 6 voltios máximos de las 4 pilas a 5,5 voltios. Además, el diodo protege al ATmega de la tensión inversa, por lo que tiene dos propósitos útiles. Haciendo esto, puedo crear un circuito alimentado por baterías que puede utilizar tan sólo 0,1 µA mientras duerme, ya que no hay ningún regulador de voltaje consumiendo corriente todo el tiempo.

8voto

Schmitty Puntos 259

Hice una prueba en una atmega328P-PU en una protoboard utilizando 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 He medido 7,25 uA en modo de apagado.

6voto

abby hairboat Puntos 130

Hay dos preguntas aquí, pero sólo la segunda es realmente parte del título de la pregunta, así que probablemente sea mejor que abras otra para la pregunta de programación de Arduino. Voy a responder a la segunda pregunta aquí.

Una sola pila alcalina de 1,5V AA de gama alta tiene una capacidad de unos 2600mAh. Si optas por las pilas de litio, puedes conseguir unos 3400mAh si tienes suerte. Tomemos esa cifra como referencia para el mejor de los casos.

La forma de calcular el tiempo máximo teórico de funcionamiento de una carga es simplemente la capacidad dividida por la carga. Si tu carga es de 1mA, puedes hacerla funcionar durante 3400 / 1 = 3400 horas = 141 días = ~5 meses. Sin embargo, esto es sólo un máximo teórico ya que empezarás a tener una caída de voltaje significativa alrededor del 65% en ese tiempo. Si estás regulando la salida, obtendrás un efecto de fuga en el que cuanto menor sea el voltaje de la batería, mayor será la corriente necesaria para mantener el voltaje regulado, lo que agotará la batería más rápidamente. Me sorprendería que pudieras obtener más del 80% de la capacidad anunciada con un voltaje lo suficientemente alto como para hacer funcionar tu dispositivo.

Así que, digamos que obtienes el 80% de ese tiempo después de la caída de voltaje y las ineficiencias del regulador. Supondremos que estás funcionando a 3,3V con tres baterías en serie. Esto todavía te dará la misma capacidad, pero el voltaje será suficiente para un regulador. Si tu dispositivo funciona a 15mA (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

Así que necesitarías unas 144 baterías de litio (48 juegos de 3) para hacerlo funcionar durante un año. No es tan bueno.

Yo sugeriría utilizar una fuente de alimentación de CC regulada desde la red eléctrica. Se puede incluir una batería de reserva, que es fácil de configurar con un relé SPDT: basta con conectar la bobina a la CC de la red y tener el contacto de "apagado" conectado a la batería. Cuando la corriente continua falla, el contacto cae y se utiliza la batería en su lugar.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X