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.

Modificacion de pista de circuito impreso en Arduino

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.

LEDs de TX y RX de Arduino

 

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.

Y no olvides visitar nuestra tienda para comprar lo que necesites para realizar tus proyectos. 

sigue leyendo


Compartir esta publicación



‚Üź Publicaci√≥n m√°s antigua Publicaci√≥n m√°s reciente ‚Üí