Arduino Bajo Consumo

Hasta ahora, normalmente en tus proyectos conectabas tu Arduino al USB de tu ordenador y no pensabas mucho sobre cuanto podrías estar consumiendo o si la batería (si es un portátil) puede estar gastando más de la cuenta.

Muchas veces cuando pasamos a realizar un proyecto donde se usan baterías o pilas, nos gustaría que las baterías duren lo máximo posible. Es por esto que es necesario aprender a utilizar Arduino en modo de Bajo Consumo.

Gracias al microcontrolador AtmelMega328p(el microcontrolador que llevan los Arduino UNO), podemos utilizar una serie de funciones o modos para poder ahorrar energía. En este artículo mostraremos dichos modos y como utilizarlos.

En primer lugar, hay que saber como es por dentro el microcontrolador que usa nuestro Arduino ya que en función de este, pueden cambiar algunas cosas que contemos en este tutorial. El tutorial esta preparado para un Arduino UNO y también esta probado para un Arduino MEGA. Os dejamos los datastheet de estos 2 microcontroladores:

Una vez vistos estos microcontroladores, vamos a mostrar los distintos modos de bajo consumo que tiene. Seguidamente os mostramos una tabla comparativa donde especifica que dispositivos o partes del microcontrolador están activos en cada modo.

Captura de pantalla 2015-05-15 a las 12.41.17

Una vez que vemos cuales son los modos y que partes están activas en cada uno, vamos a dar una serie de funciones que podemos usar en nuestros proyectos Arduino. Aunque estas librerías no son del entorno Arduino como tal, pertenecen a las herramientas de desarrollo para la arquitectura de procesadores que usan Arduino(AVR). Las funciones que vamos a utilizar son las siguientes:

  • set_sleep_mode(modo): esta funciona establece el modo de bajo consumo, el parámetro modo, puede tomar el valor de los nombres de los modos que hemos establecido anteriormente(ver tabla anterior).
  • sleep_enable(): inicializa el sistema para ponerse en modo bajo consumo pero aun no esta activo.
  • sleep_mode(): activa el modo bajo consumo.
  • sleep_disable(): primera instrucción que debe aparecer cuando se vuelve del modo bajo consumo. desactiva el modo bajo consumo.

Seguidamente se muestra un ejemplo de uso:

Esquema del montaje:

ejemplolowpower

 

#include <avr/sleep.h>//Incluimos la libreria para AVR sleep.
 
int led = 13;
 
void setup() {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);//EStablecemos el modo de bajo consumo.
  attachInterrupt(0,interrupthandler,RISING);//establecemos la interrupcion para poder reactivarlo.
  pinMode(led,OUTPUT);
}
 
void loop() {
  sleep_enable();//inicializamos el modo bajo consumo
 
  sleep_mode();//ponemos el modo bajo consumo.
  digitalWrite(led,!digitalRead(led));//SI se desactiva el modo bajo consumo se enciende/apaga el led
 
}
 
void interrupthandler(){//funcion que maneja la interrupcion
  sleep_disable();//desactivamos el modo bajo consumo
}

Como podemos ver en este caso, el arduino se “despierta” a través de una interrupción que en este caso, es un botón que al ser pulsado, activa dicha señal. En posteriores artículos hablaremos sobre el uso de interrupciones y como podemos utilizarlas en nuestros proyectos.



Por otro lado, podemos realizar otro medio para poder reactivar nuestro arduino. y es usando el temporizador del WatchDog. Este temporizador, nos permitirá mandar una señal al procesador, cuando haya acabado un tiempo que puede ser de hasta 8 Segundos. Este temporizador podemos usarlo para poder dormir nuestro Arduino por un corto periodo de tiempo. Existen distintas librerías que nos ayudan a utilizar este temporizador para usarlo para más de 8 segundos. Una de ellas es la librería SnoozeLib. Esta librería, nos permite poner nuestro Arduino en bajo consumo(en este caso solo POWER_DOWN) durante un periodo de tiempo. Os dejamos un ejemplo de esta librería:

 

#include <SnoozeLib.h>//Include the library
 
int state = HIGH;//Led State 
void setup(){
  pinMode(6,OUTPUT);
  attachInterrupt(0,wakeup,RISING);//Attaching the 0 Interrupt(on Arduino UNO pin 2) for RISING.
  Serial.begin(9600);
}
 
void loop(){
 
  Serial.println("Snoozing...");
  snoozeLib.snooze(10000);//Snooze the CPU
  Serial.println("Wake UP!!");
  digitalWrite(6,state);
}
 
void wakeup(){ //Interrupt Handle Function
snoozeLib.wakeup(); //WakeUp The CPU
 state=!state;//Change the State
}

Una vez terminado, ya hemos visto como utilizar el modo bajo consumo de nuestro Arduino y de como usar el WatchDog para poder dormirlo durante un periodo de tiempo.

9 Comments on "Arduino Bajo Consumo"

  1. Se podría despertar cuando un sensor analógico pase de un valor?

    Gracias.

    • Hola:

      Cuando el arduino se encuentra en modo sleep(dependiendo del tipo) solo se puede despertar por una interrupción que en el caso del arduino UNO se encuentra en los pines 2 y 3 digitales. Por lo que no podrías usar un valor analógico. Quizas puedas mandar una señal cuando el sensor mande algo y despertar el arduino.

  2. Saludos.

    Si no definiéramos correctamente la interrupción por hardware ¿quedaría en modo sleep de forma indefinida? He leido que si ocurriera, solo hay que reprogramarlo ¿Es correcto?

    Gracias.

    • Hola Jesus:

      En principio no habría problema ya que cuando pase el tiempo el propio arduino vuelve del estado de Dormir. Por lo que no pasaría eso que dices.

  3. Carlos Bergillos Roldán | Marzo 30, 2016 en 7:08 pm | Responder

    Buenas me gustaría saber la diferencia en consumo que hay más o menos al estar conectado normal y al estar en modo bajo consumo. Un saludo

    • En la cabecera del ejemplo de la librería Narcoleptic.h tienes este texto

      ** Whilst in a Narcoleptic delay, the CPU current consumption drops from
      ** around 15mA down to about 7µA..

  4. buenas, quisiera saber donde se especifica el maximo tiempo que podemos ingresarle a la función snooze.
    Saludos

    • Hola Gonzalo:

      En principio la variable de entrada es un Long por lo tanto se puede poner hasta ese máximo de tiempo que sería 2,147,483,647 milisegundos.

      Esperemos que te sea de ayuda.

Deja un comentario.

Tu dirección de correo no será publicada.


*


*