Reducir el consumo de energia de Arduino

Publicado por Loli Diéguez en

Las placas Arduino han dado un vuelco a los proyectos tecnológicos DIY. Proyectos simples como hacer tu propia estación meteorológica son fáciles de hacer y perfectos para enseñar conceptos de electrónica básica y programación.

Las placas Arduinos son ideales para proyectos domésticos, y se pueden emplear en soluciones móviles conectándolas a baterías. Aunque esto presenta un problema, y es el tiempo que te durará dado que la placa no está muy optimizada para tener un consumo reducido permitiendo que las baterías duren más, se diseñó con la idea de acercar la electrónica y la programación al gran público y reducir su consumo no fue una de las prioridades, aunque esto se puede optimizar con el modo de programarla o haciendo algunos cambios en la placa.

1- Bibliotecas software de bajo consumo de Arduino.

Hay varias bibliotecas software disponibles que pueden cambiar el consumo de energía de tu Arduino. Al enviar el Arduino a un "sueño profundo" (deep sleep) durante un tiempo determinado, se puede ahorrar energía durante su funcionamiento. Esto es una practica muy habitual en microcontroladores que toman lecturas de sensores en áreas remotas, como estaciones meteorológicas.

La biblioteca de baja potencia del usuario de rocketscream en  Github  es un ejemplo de una biblioteca fácil de usar que es perfecta para ahorrar algo de energía. Aquí tienes un ejemplo de código sacado de dicha biblioteca:

#include "LowPower.h"

// setup() your sensors/LEDs here

void loop()
{
  //con este codigo Arduino entra en sleep por 8 segundos
  //ADC se refiere al conversor analogico-digital
//BOD es brown out detection
//tanto ADC como BOD se apagan durante el periodo sleep para reducir consumo LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); //Despues de cada sleep aqui es donde se continuara ejecutando el codigo }

Lo primero que haremos será incluir las librerías necesarios, como siempre, y en este caso son las de LowPower.h, si necesitas definir alguna constante, justo después de importar librerías seria el momento.

Después en el loop, dormimos la placa con la sentencia LowPower.powerDown, en este caso 8 segundos (SLEEP_8S), después de los cuales podemos definir el código que queremos que se ejecute tras el periodo sleep que provocamos en la placa.

Este código, además de importar las librerías adecuadas y poner la placa a dormir, también desactiva el conversor analogico-digital (ADC_OFF) y el circuito Brown Out Detection (BOD_OFF), los cuales son componentes que tienen un consumo de energía incluso si no son empleados en el código, por ello, si no los usas, es bueno desactivarlos.

Una vez que la placa entra en modo sleep, hay varias maneras de hacerla despertar:

  • Con el Watch Dog Timer o (WDT) 
  • Por interrupciones hardware
  • O por la UART

En el caso de arriba el método para volver a despertar la placa es por WDT, el proceso que en este caso se produce es que hay un contador, el cual cuando llega a 0 dispara una interrupción que "despierta" la placa, el valor de la cuenta  atrás no es ni más ni menos que SLEEP_8S que hemos pasado por la función LowPower.powerDown, aquí os pongo otros valores que puedes usar para dormir la placa:

  • SLEEP_15MS
  • SLEEP_30MS
  • SLEEP_60MS
  • SLEEP_120MS
  • SLEEP_250MS
  • SLEEP_500MS
  • SLEEP_1S
  • SLEEP_2S
  • SLEEP_4S
  • SLEEP_8S
  • SLEEP_FOREVER

Os hago dos aclaraciones, ten cuidado como usar estos valores y sobre todo el FOREVER, podrías hacer que tu placa se duerma para siempre y para recuperar la tendrías que borrar todo el código cargado en ella y reiniciarla. Otro valor que tenéis que manejar con cuidado es BOD, apagar este circuito supone que si la potencia que entra en la placa baja de unos niveles adecuados, no lo podréis detectar, y un nivel inferior a lo necesario podría dañar la placa, así que usar estos conceptos con cuidado.

Este método es una forma simple pero efectiva para comenzar a reducir la cantidad de energía que tu Arduino consume.

2- Arduino Built-In Power Saving

El lenguaje de programación de Arduino tiene su propia funcionalidad para poner la placa a "dormir" (sleep) incorporada, diseñada para ayudar a ahorrar energía. La función de sleep, utilizada en tándem con interrupción , permite que Arduino se despierte nuevamente.

Arduino tiene pines específicos diseñados para interrumpir el ciclo de "sueño", y puedes acceder a ellos usando la función setup.

El siguiente sketch muestra como:

Primero hay que agregar las librerías adecuadas que contienen todo lo necesario para poner a dormir a Arduino. También declaramos la variable interruptPin como pin digital 2.

 

#include <avr/sleep.h>//libreria para controlar el modo sleep
#define interruptPin 2 //Definimos el Pin que usaremos para realizar una interrupcion

Después de las declaraciones de variables y librerías toca configurar setup, vamos a declarar el pin digital 13 como un pin de salida, el led será quien nos indique, según su estado, cuando Arduino está en modo sleep o no.

También configuramos el pin digital 2 como una entrada. Usamos INPUT_PULLUP en lugar de INPUT, de este modo utilizamos la resistencia de pull-up incorporada para evitar que el pin se mueva entre HIGH y LOW cuando no hay nada conectado.

void setup()
{
  Serial.begin(115200);//Inicio de comunicaciones seria
pinMode(LED_BUILTIN,OUTPUT);//Uso el pin 13 para indicar cuando Arduino esta despierto
pinMode(interruptPin,INPUT_PULLUP);//definmos el pin 2 como entrada usando la resistencia pullup interna
digitalWrite(LED_BUILTIN,HIGH);//led 13 encencido }

Ahora que tenemos los pines configurados, podemos enviar Arduino a dormir, aunque antes debemos definir las funciones que lo pondrán a dormir y la que lo despertará.

En el loop mandaremos la placa Arduino a dormir como te muestro aquí:

void loop() {
delay(5000);
SendToSleep();

}

Y los métodos que pondrá Arduino en sleep y lo despertaran son estos: 

void SendToSleep(){
sleep_enable();//Habilitar modo sleep
attachInterrupt(interruptPin, wakeUp, LOW);//asociando interrupciones y metodo de "despertar" al pin 2
set_sleep_mode(SLEEP_MODE_PWR_DOWN);//Estableciendo el modo sleep
digitalWrite(LED_BUILTIN,LOW);//Apagado del led de placa
sleep_cpu();//activando modo sleep
//en este momento Arduino estara en modo sleep consumiendo muy poco
//cuando lo despertemos poniendo el pin 2 a 0, el sketch continuara ejecutandose desde aqui
Serial.println("Despierto!");
digitalWrite(LED_BUILTIN,HIGH);//Led de placa encendido
}
void wakeUp(){
Serial.println("Interrupcion lanzada");
sleep_disable();//Se deshabilita el modo sleep
detachInterrupt(0); //se desenlaza la interrupcion del pin 2

El código anterior es una forma simplificada de poner tu Arduino en modo de suspensión, y puedes reactivarlo nuevamente conectando el pin 2 al pin GND . 

Pin Arduino puesto a GND

Mientras que el Arduino Uno está en modo de reposo, reducirás el consumo aproximadamente 11 mA.

Si queréis aprender más sobre interrupciones aquí tenéis un blog donde se explican muy bien.

3- Reducir la frecuencia del reloj de Arduino

La velocidad del reloj de tu Arduino determina cuántas operaciones puede realizar por segundo. La mayoría de las placas Arduino se ejecutan en un procesador de 8 o 16 MHz.

Oscilador Arduino

Así que el tiempo que tu código tarda en ejecutarse esta directamente relacionado con la frecuencia del reloj de la placa, lo que también implica una relación directa con el consumo de energía que se requiere para ejecutar toda la rutina cargada, pero en muchos casos de uso, emplear la velocidad de reloj completa es excesivo y se podría reducir, lo que redundaría en una reducción de la energía necesaria. Aquí es donde la regulación de la velocidad del reloj a través del software puede marcar la diferencia.

Aquí hay que hacer una advertencia, cambiar la velocidad del reloj puede causar problemas en el arranque si esta modificación se realiza incorrectamente y puede dejar tu Arduino inutilizado para cargar otros sketch .

Si aun así quieres intentar cambiar la velocidad del reloj, no dejes de leer la guía detallada de Pieter P donde te explica lo necesario para realizar estas modificaciones de forma segura.

4- Quitar componentes de la placa Arduino

Arduino Uno es la placa más popular para los principiantes, y la mayoría de los kits Arduino ofrecen un modelo oficial. Su factor de forma más grande y la posibilidad de cambiar algunos de sus componentes lo hacen perfecto para la experimentación, y su amplia capacidad para voltajes de entrada junto con la conversión de voltaje que tiene presente en placa de 3.3v lo hacen apto para casi cualquier propósito.

Sin embargo, toda esta funcionalidad tiene un precio, y es que su diseño no está pensado para bajos consumos gracias a que ofrece mucha versatilidad. Con esto en mente, hay varias cosas que puedes hacer para alterar físicamente un Arduino Uno para ahorrar energía, aunque ten en cuenta que tienes que tener altos conocimientos de electrónica si quieres realizarlos ya que supone modificar físicamente la placa retirando algunos de sus componentes.

Para reducir significativamente el consumo de energía de la placa Arduino UNO, estos son los puntos que puedes tocar en la placa para conseguirlo:

  • Reemplazar el regulador lineal por un convertidor DC-DC,
  • Ajustar el circuito USB a serie para que solo se alimente desde el puerto USB,
  • Cortar (o desoldar) los LED TX y RX
  • LED de encendido

Reemplazar el regulador de la placa Arduino

El regulador de voltaje en el Arduino Uno causa el mayor consumo de energía en la placa. Esto no es particularmente sorprendente, ya que tiene que bajar hasta 7v de forma segura desde la fuente de alimentación de entrada a la placa. 

regulador potencia Arduino

Algunos han intentado evitar esto reemplazando el regulador por otros más eficientes, aunque esto puede que no resuelva el problema.

 

Mejoras en el circuito USB

La placa Arduino usa el ATmega16U2 como conversor USB que permite programar la placa cuando ésta se conecta al PC por USB, pero cuando pasas a modo ejecución este componente sigue consumiendo energía, aunque ya no se use, así que es un aspecto a tener en cuenta para reducir el consumo de tu proyecto.

Este componente se alimenta desde el USB o desde el regulador CC según como se esté alimentando la placa, así que una buena idea puede ser modificar la placa reajustando algunas conexiones para que este conversor solo se alimente cuando se conecta al PC para programar, pero que no se alimente cuando se conecta la placa a través del regulador CC.

Aunque estas modificaciones implica de nuevo, hacer cambios que solo recomiendo si tienes el equipo apropiado y tienes altos conocimientos de electrónica.

Cortar o desoldar los LED TX y RX

Otros componentes que siempre están funcionando son los LED TX y RX, los cuales tiene como función indicarte el estado de comunicación de la placa a través del puerto serie, estos LED están siempre conectados a 5 V así que la única opción será cortar las pistas de los LED o desoldarlos, para que no puedan usarse.

 

LED de encendido

Otro de los LED que siempre están en uso es el de encendido de la placa, su función principal no es ni más ni menos que indicar que la placa está en funcionamiento, así que quitarlo o o cortar las pista de este componente también reducirá el consumo de tu placa.

LED encendido Arduino

 

Si te interesa saber mas detalles de como realizar estas modificaciones en la placa mira el blog de Patrick Fenner, de DefProc Engineering, donde explica con todo detalle como realizar estas modificaciones.

 


Compartir esta publicación



← Publicación más antigua Publicación más reciente →