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 sleep
llamadas 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.
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?
¿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 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 ):
Citando la pregunta original:
Pensé que podría poner
sleep
llamadas 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:
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:
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.
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í:
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.
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.
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.
Tim Eckel
Anindo Ghosh
Tim Eckel
Anindo Ghosh
cano64