43- Ahorro de energ铆a en Arduino


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 鈥渞ed鈥: 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 鈥渃onsume鈥 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 consumoSi 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:

Voltaje seguro de operaci贸n de arduino
Voltaje seguro de operaci贸n de arduino

De hecho, como de costumbre, todo est谩 un poco 鈥渟obrevalorado鈥, 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:

Consumo de energ铆a versus frecuencia en arduino
Consumo de energ铆a versus frecuencia en arduino.

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):

ModeWDTADCBODT2T1T0SPIUSART0TWICurrent

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)

IdleOnOnOnOnOnOnOnOnOn3648.0 碌A
IdleOffOnOnOnOnOnOnOnOn3643.0 碌A
IdleOffOffOnOnOnOnOnOnOn*
IdleOffOffOnOffOnOnOnOnOn*
IdleOffOffOnOffOffOnOnOnOn3618.0 碌A
IdleOffOffOnOffOffOffOnOnOn927.0 碌A
IdleOffOffOnOffOffOffOffOnOn832.0 碌A
IdleOffOffOnOffOffOffOffOffOn789.0 碌A
IdleOffOffOnOffOffOffOffOffOff687.0 碌A
ADC Noise ReductionOnOnOnOn651.0 碌A
ADC Noise ReductionOffOnOnOn646.0 碌A
ADC Noise ReductionOffOffOnOn*
ADC Noise ReductionOffOffOnOff584.0 碌A
Power DownOffOffOff1.7 碌A
Power DownOffOffOn18.6 碌A
Power DownOffOnOn110.0 碌A
Power DownOnOnOn113.9 碌A
Power SaveOffOffOffOff1.7 碌A
Power SaveOffOffOffOn416.0 碌A
Power SaveOffOffOnOn435.0 碌A
Power SaveOffOnOnOn527.0 碌A
Power SaveOnOnOnOn531.0 碌A
StandbyOffOffOff201.7 碌A
StandbyOffOffOn218.5 碌A
StandbyOffOnOn309.9 碌A
StandbyOnOnOn313.9 碌A
Extended StandbyOffOffOffOff202.2 碌A
Extended StandbyOffOffOffOn416.0 碌A
Extended StandbyOffOffOnOn436.0 碌A
Extended StandbyOffOnOnOn527.0 碌A
Extended StandbyOnOnOnOn531.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 鈥渂loquear鈥 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.

Alimentaci贸n con autobloqueo para arduino
Alimentaci贸n con autobloqueo para arduino

Deja un comentario