Ahorrar energía durmiendo Arduino.
Probablemente tenga un reloj despertador de escritorio con un sensor de temperatura y humedad, que ha estado funcionando con dos baterías AA durante más de un año y ni siquiera planea quedarse sin energía. Al mismo tiempo, si conecta la placa Arduino a un «banco de energía» de 10 amperios/hora, se agotará en dos semanas. Como paso ?!
Es mucho más difícil desarrollar un dispositivo autónomo energéticamente eficiente basado en Arduino o un microcontrolador simple que uno alimentado por la “red”: el consumo del circuito se compone de una gran cantidad de factores: tanto hardware como software. En este tutorial intentaremos cubrirlos todos. Aspectos más destacados del ahorro de energía:
- Elija la fuente de voltaje correcta.
- Minimizar y optimizar el consumo de componentes pasivos (estabilizadores de tensión, LED de indicación, divisores de tensión, etc…)
- Configure el modo de funcionamiento óptimo del dispositivo y sus partes individuales: máximo ahorro de energía durante la mayor parte del tiempo de funcionamiento, activación por eventos externos o un temporizador, funcionamiento de varios componentes en un horario fijado, etc. Por ejemplo: sondear el sensor y enviar datos por radio una vez por minuto, el resto del tiempo – reposo máximo de Arduino y desconectar el sensor y la radio (Wifi- Bluetooth) de la fuente de alimentación.
- En cuanto al sueño de Arduino en sí, puede mandarlo a dormir utilizando comandos integrados (por ejemplo, en ensamblador asm ( «sleep» ) o sleep_mode () de avr / sleep.h ), o puede usar bibliotecas. Por ejemplo, hay una avr / sleep.h estándar que viene con el entorno de desarrollo. De las no estándar, están las muy populares Narcoleptic y Low-Power, que tienen muchas más posibilidades de ajustar el modo sueño. Aquí utilizaremos la biblioteca para administrar el ahorro de energía de Arduino: GyverPower 1.0, que incluye un control preciso sobre el sueño y el consumo de energía de arduino en todos los niveles (suspensión, frecuencia y control periférico), así como un calibrador de temporizador de vigilancia integrado y varios chips únicos que no se encuentran en ninguna otra biblioteca. En esta lección, me referiré a ella.
- Además, el consumo de Arduino depende en gran medida de la frecuencia. Puede reducir la frecuencia entre períodos de trabajo activo (cálculos, trabajo con sensores), lea sobre esto a continuación.
Voltios, amperios, capacidad.
Comencemos con los conceptos básicos del mundo de la electricidad: voltios y amperios (lea más en la lección sobre electrónica para arduino ). Voltios – voltaje, es la diferencia de potencial. El voltaje lo establece la fuente de alimentación, como una batería o una fuente de alimentación. Amperios – la corriente en el circuito, muestra con qué fuerza se “consume” la energía eléctrica. El consumidor establece la corriente en el circuito . Nota: lo anterior es cierto para una fuente de voltaje, que es cualquier batería / acumulador o una fuente de alimentación convencional. La fuente de corriente puede ser un cargador especial o un controlador LED.
No puede alimentar un circuito destinado a una fuente de corriente con una fuente de voltaje; se quemará inmediatamente.
La energía consumida y almacenada generalmente se considera en Amperios * hora, funciona de la siguiente manera: digamos que la capacidad de la batería es de 1 A * h (Amperios * hora). Esto significa que dicha batería puede suministrar una corriente de 1 amperio durante una hora, mientras se descarga por completo. Si la corriente en el circuito es de 0,5 A, la batería durará 1 A * h / 0,5 A == 2 horas. La placa Arduino consume alrededor de 24 mA, es decir, la misma batería convencional puede alimentarla durante 1000 mA * h / 24 mA ~ 42 horas. Cuando los consumidores están conectados en paralelo, como suele ser el caso en un circuito, se suma la corriente de consumo. Si agregamos una pantalla retroiluminada al «circuito» del cálculo anterior, que consumirá convencionalmente 30 mA, entonces dicho circuito funcionará con la misma batería 1000 mA * h / (24 + 30 mA) ~ 18,5 horas.
Consumo de otros componentes del circuito.
Si además del microcontrolador hay algunos otros módulos / sensores / pantallas / microcircuitos en el dispositivo, entonces harán una mayor contribución al consumo de energía, porque el MC puede estar sumergido en el sueño, y no siempre es así. Es lógico que para maximizar el ahorro de energía, debe mantener todos los componentes en un estado completamente desconectado y encender solo durante el período de trabajo activo: sensores, durante el tiempo de sondeo, pantallas y retroiluminación, durante la interacción con una persona, y similares.
- Algunas piezas hardware tienen un pin EN – Chip_enable muy conveniente, que permite que el nivel lógico del microcontrolador encienda y apague completamente el componente, lo que hace que sea muy fácil controlar su estado.
- Algunos microcircuitos tienen un modo de ahorro de energía incorporado que se puede activar desde el programa (por ejemplo, enviando el comando requerido a través de la interfaz de comunicación). Debe buscar información en una hoja de datos o biblioteca para cada pieza específica de hardware.
- Si la pieza de hardware no tiene tales pines, siempre puede simplemente cortar su fuente de alimentación con un transistor u optoacoplador. No se recomienda utilizar un relé electromecánico, porque él mismo consume una corriente considerable.
- Los componentes de baja potencia (hasta 20 mA) se pueden alimentar directamente desde los pines de Arduino, lo que simplifica aún más las tareas de administración de energía. Nota: Los AVR de Arduino tienen un margen de corriente muy decente: alrededor de 40 mA por pin, pero a esta corriente el voltaje desciende y el trabajo del hardware puede volverse inestable, por lo que no se recomienda conectar una carga superior a 20 mA al pin. Por cierto, otros procesadores (STM32, esp8266) tienen una corriente máxima de los pines un orden de magnitud menor (2-5 mA) y es básicamente imposible suministrar nada de ellos.
- La mayoría de los circuitos integrados de «interfaz» deberán reiniciarse al reiniciar la alimentación. Para la misma pantalla lcd, después de apagar y encender la alimentación, debe llamar a, init () para que la pantalla responda a otros comandos.
Si el sistema mide una tensión de alimentación superior a 5 V (tensión de la batería), entonces el divisor de tensión debe calcularse de forma óptima para no desperdiciar corriente sin carga. Hablamos de esto en la lección sobre entradas analógicas.
Consumo de la placa Arduino.
Honestamente, el microcontrolador en sí puede funcionar de manera absolutamente independiente, simplemente con la presencia de energía, y cambiar el modo de suspensión o la frecuencia afectará el consumo exactamente como está escrito en la hoja de datos. Si el proyecto se basa en una placa arduino, comenzamos a cruzar los dedos: indicadores LED, un estabilizador de energía y un convertidor Usb-TTL; todos consumen corriente en modo inactivo, simplemente porque están conectados en una fuente de alimentación común. La placa Nano en modo activo consume alrededor de 24 mA, y si pone el microcontrolador en suspensión máxima, alrededor de 5 mA. Al mismo tiempo, de acuerdo con la hoja de datos, el microcontrolador en este modo debería consumir en la región de 1 μA, es decir, 5000 (cinco mil) veces más. Estos mismos 5 mA son consumidos por los componentes enumerados anteriormente en la placa arduino, por lo tanto, para crear un proyecto verdaderamente eficiente en energía, necesita hacer su propia placa y soldar el microcontrolador en ella.
Consumo de microcontrolador Arduino.
Frecuencia de reloj
El núcleo de computación siempre consume energía cuando está en modo activo: si el programa calcula el coseno inverso, si está esperando el final del retardo delay(), ya sea colgando en el vacío infinito para ( ;; )– no importa. El consumo será el mismo en todos los casos siempre que el núcleo esté sincronizado. Además, el voltaje al que está garantizado el funcionamiento estable del microcontrolador depende de la frecuencia del reloj. Aquí hay imágenes de la hoja de datos de ATmega328:
De hecho, como de costumbre, todo está un poco “sobrevalorado”, porque a 16 MHz de reloj, Arduino funciona bien a partir de 3.3V, y a 8 MHz (interno) – desde 1.8V ( con BOD desactivado ). Hay cuatro niveles de control de reloj:
- Conectando un cristal externo con la frecuencia requerida (la placa Arduino tiene 16 MHz, el propio microcontrolador soporta hasta 20 MHz sin overclocking).
- Selección de una fuente de reloj mediante fusibles: externo (la frecuencia corresponde al generador instalado) e interno (8 MHz).
- Cambiar la frecuencia del sistema directamente desde el programa: la mayoría de los microcontroladores AVR le permiten reducir la frecuencia proveniente de la fuente de reloj, es decir, dividir la frecuencia (implementado en librería GyverPower). Por lo tanto, es posible ralentizar el funcionamiento de todo el MC para reducir el consumo de energía o aumentar la estabilidad de funcionamiento por subtensión. Puede realizar las acciones necesarias a alta frecuencia y luego bajarla al mínimo hasta que ocurran eventos externos por interrupciones o por temporizador. En algunas MCU hay un PLL, un multiplicador de frecuencia (por ejemplo, en el Attiny85), que permite sincronizar a una frecuencia de 36 MHz desde una fuente interna. Para tal overclocking, tendrá que aumentar el voltaje y proporcionar disipación de calor, pero no se trata de esto en esta lección =).
- Fusible CKDIV8: el divisor del sistema del párrafo anterior se establece automáticamente en 8 antes de iniciar el microcontrolador. Esto es necesario para un arranque más confiable a baja tensión. Usualmente usado así: Arduino comienza con CKDIV8 a una frecuencia reducida, mide la tensión de alimentación, si es lo suficientemente alta (la batería no está descargada), la frecuencia se ajusta a la requerida y el trabajo continúa. De lo contrario, por ejemplo, puede cortar todo e irse a dormir.
También adjunto una imagen con gráficos del consumo de corriente del microcontrolador Arduino en modo activo (no en reposo) en función de la frecuencia y la tensión de alimentación:
Modos de ahorro de energía
El microcontrolador tiene varios modos de ahorro de energía, en cada uno de los cuales solo algunos de los bloques de hardware (temporizadores, interfaces, ADC, etc.) permanecen en modo activo. Además, el microcontrolador tiene una unidad BOD, que se encarga de monitorear constantemente el voltaje y reiniciar si cae por debajo del umbral configurado. En todos los modos de suspensión, el ADC permanece activo, debe apagarse por separado (todo está implementado en GyverPower).
Modos de ahorro de energía del microcontrolador (AVR):
- IDLE– Sueño ligero, solo se apaga un reloj de CPU y Flash, se despierta instantáneamente de cualquier interrupción.
- POWERDOWN – El sueño más profundo, todo está deshabilitado excepto WDT e interrupciones externas, se despierta desde el hardware (normal + PCINT) o WDT, se despierta en 16 + 6 ciclos de reloj (~ 1.375 μs a 16 MHz). ¡La interrupción debe ser más larga que este tiempo para un despertar exitoso!
- STANDBY – Sueño profundo, idéntico POWERDOWN + reloj del sistema activo, se despierta en 6 ciclos de reloj (0,4 μs)
- POWERSAVE – Sueño profundo, idéntico POWERDOWN + el temporizador 2 está activo (+ puede despertarse con sus interrupciones), se puede usar para contar el tiempo.
- EXTSTANDBY – Sueño profundo, idéntico POWERSAVE + reloj del sistema activo, se despierta en 6 ciclos de reloj (0,4 μs)
El modo más utilizado en la práctica es el POWERDOWN, el sueño más profundo. Deshabilita todo excepto el perro guardián y las interrupciones de hardware (externo regular y PCINT). En este modo, el Arduino consume una corriente mínima (ATmega328 – un poco menos de 1 μA), y puede despertarse solo mediante el temporizador de Watchdog o mediante una interrupción de hardware (mediante un botón). Obviamente, los temporizadores y las interrupciones no funcionan en el sueño profundo, por lo que el tiempo se convierte en una tarea separada (en GyverPower, esta tarea se resuelve de la manera más conveniente posible).
Periféricos de Arduino
Además del «núcleo» principal, el microcontrolador tiene un montón de unidades periféricas (ADC, comparador, temporizadores, interfaces de comunicación), que de hecho funcionan por separado y pueden comunicarse con el microcontrolador a nivel de hardware. Cada bloque consume algo de corriente y, si se desea, algunos bloques se pueden apagar. En el modo de sueño profundo, se apagan automáticamente, pero en el trabajo activo, debe apagarlos manualmente. En la página oficial de la biblioteca Low Power se puede ver una gran tabla con consumos del microcontrolador en diferentes modos y con un conjunto diferente de periféricos activos, por si acaso la adjunto a continuación. El control de periféricos también se implementa en GyverPower.
Las mediciones se realizaron en una placa Arduino Pro Mini de 8 MHz alimentada por una batería de Li-Ion (3.7V):
Mode | WDT | ADC | BOD | T2 | T1 | T0 | SPI | USART0 | TWI | Current |
---|---|---|---|---|---|---|---|---|---|---|
Timer 1 & Timer 2 not in use Timer 2 not clock asynchronously from an external 32.768 kHz crystal (lower consumption can be further achieved) | ||||||||||
Idle | On | On | On | On | On | On | On | On | On | 3648.0 µA |
Idle | Off | On | On | On | On | On | On | On | On | 3643.0 µA |
Idle | Off | Off | On | On | On | On | On | On | On | * |
Idle | Off | Off | On | Off | On | On | On | On | On | * |
Idle | Off | Off | On | Off | Off | On | On | On | On | 3618.0 µA |
Idle | Off | Off | On | Off | Off | Off | On | On | On | 927.0 µA |
Idle | Off | Off | On | Off | Off | Off | Off | On | On | 832.0 µA |
Idle | Off | Off | On | Off | Off | Off | Off | Off | On | 789.0 µA |
Idle | Off | Off | On | Off | Off | Off | Off | Off | Off | 687.0 µA |
ADC Noise Reduction | On | On | On | On | – | – | – | – | – | 651.0 µA |
ADC Noise Reduction | Off | On | On | On | – | – | – | – | – | 646.0 µA |
ADC Noise Reduction | Off | Off | On | On | – | – | – | – | – | * |
ADC Noise Reduction | Off | Off | On | Off | – | – | – | – | – | 584.0 µA |
Power Down | Off | Off | Off | – | – | – | – | – | – | 1.7 µA |
Power Down | Off | Off | On | – | – | – | – | – | – | 18.6 µA |
Power Down | Off | On | On | – | – | – | – | – | – | 110.0 µA |
Power Down | On | On | On | – | – | – | – | – | – | 113.9 µA |
Power Save | Off | Off | Off | Off | – | – | – | – | – | 1.7 µA |
Power Save | Off | Off | Off | On | – | – | – | – | – | 416.0 µA |
Power Save | Off | Off | On | On | – | – | – | – | – | 435.0 µA |
Power Save | Off | On | On | On | – | – | – | – | – | 527.0 µA |
Power Save | On | On | On | On | – | – | – | – | – | 531.0 µA |
Standby | Off | Off | Off | – | – | – | – | – | – | 201.7 µA |
Standby | Off | Off | On | – | – | – | – | – | – | 218.5 µA |
Standby | Off | On | On | – | – | – | – | – | – | 309.9 µA |
Standby | On | On | On | – | – | – | – | – | – | 313.9 µA |
Extended Standby | Off | Off | Off | Off | – | – | – | – | – | 202.2 µA |
Extended Standby | Off | Off | Off | On | – | – | – | – | – | 416.0 µA |
Extended Standby | Off | Off | On | On | – | – | – | – | – | 436.0 µA |
Extended Standby | Off | On | On | On | – | – | – | – | – | 527.0 µA |
Extended Standby | On | On | On | On | – | – | – | – | – | 531.0 µA |
Alimentación.
Fuente de alimentación
La elección de una fuente de energía es muy importante para un ahorro de energía efectivo: es más conveniente alimentar el microcontrolador directamente desde una batería / acumulador:
- Tres o cuatro baterías AA / AAA o baterías recargables son suficientes para operar a una frecuencia estándar de 16 MHz (con 4 baterías, debe tener cuidado con el voltaje total, y 4 baterías de níquel son ideales).
- Una batería de litio (3.7-4.2V) puede funcionar a 16 MHz, pero con una descarga por debajo de 3.5V, es posible que el trabajo a esa frecuencia ya no sea muy estable (la frecuencia se puede reducir ligeramente, más sobre eso a continuación).
- Desde una pila de litio de 3V (CR2025, CR2032 y otras), el microcontrolador funcionará perfectamente con el reloj interno de 8 MHz.
- Las situaciones en las que tiene que usar convertidores y estabilizadores Buck pueden considerarse una mala opción: todos gastarán varios miliamperios «en calor», e incluso en el modo de suspensión del microcontrolador, lo que puede resultar absolutamente un sin sentido. Pero en cualquier situación, debe contar el consumo y estimar el tiempo de funcionamiento para algunas tareas. Alimentar a través de un estabilizador será aceptable en nombre de la simplificación del circuito y la estabilidad de 5 voltios (un probador de transistores chino, por ejemplo, se enciende durante unos segundos, por lo que no tiene problemas de alimentación).
- Si el dispositivo utiliza una batería recargable, puede hacer trampa: un consumidor de alto voltaje (un motor, por ejemplo) puede alimentarse con el voltaje total de la batería a través del controlador, y el microcontrolador puede funcionar desde uno de sus «bancos o celdas», conectando el cable común con un signo menos al negativo. El microcontrolador, especialmente en modo de suspensión, consume una cantidad insignificante en comparación con el mismo motor, por lo que no tiene que preocuparse por desequilibrar las celdas. Así, el microcontrolador también puede monitorear el voltaje de la batería y desconectarlo durante la descarga, actuando como BMS. Hablamos sobre la medición de voltaje en la lección sobre entradas analógicas.
- Permíteme también recordarte que es posible alimentar todo tipo de sensores directamente desde el microcontrolador solo dentro de ciertos límites, hablamos con más detalle sobre ellos y la alimentación del proyecto en general en la lección sobre alimentación de Arduino.
Fuente de alimentación con autobloqueo
La forma más sencilla y fiable de ahorrar energía es mediante el bloqueo automático de la fuente de alimentación. Es adecuado para dispositivos que se encienden con un botón táctil (sin pestillo) y después de un tiempo deben apagarse antes del siguiente clic en el botón. El autobloqueo funciona de la siguiente manera: al presionar el botón se suministra corriente al microcontrolador, se enciende, envía una señal a la «llave», que es paralela a la línea eléctrica. Soltamos el botón y el microcontrolador sigue funcionando, porque él mismo tiene la tecla a través de la cual se suministra la energía. De ahí el nombre: fuente de alimentación con autobloqueo. Debido a un tiempo de espera u otro algoritmo de operación, el microcontrolador puede soltar la tecla y apagarse. Mediante la misma llave también se puede alimentar el resto de piezas de hierro, y de la misma forma desconectarse de la corriente durante el autoapagado.
El problema es que la MCU del AVR se puede alimentar desde cualquier pin GPIO (si hay un GND común), por lo que casi todos los circuitos antiguos de Internet no funcionan.
Pero hay una opción inteligente, simple y funcional: usar un regulador de voltaje con el pin Enable, para lo cual el microcontrolador puede “bloquear” su fuente de alimentación. Aquí hay un ejemplo con un estabilizador de 3.3V me6212c33m5g. En el diagrama, PWR_EN conduce al botón físico conectado con la segunda pata a la fuente de alimentación (batería), BUT_MK va al pin del microcontrolador, que dará una señal alta al inicio. 3V3, respectivamente, línea 3.3 (el microcontrolador en sí y, opcionalmente, algún sensor más se alimentan de él), y BAT es una batería.