Sei sulla pagina 1di 8

Modo de ahorro de energía en Módulos Arduino

1. Introducción

Arduino, ante todo, es una empresa de hardware y software de código abierto. Se


refiere al proyecto y la comunidad de usuarios que diseña y utiliza tableros de
desarrollo basados en microcontroladores. Estas placas de desarrollo se conocen
como módulos Arduino, que son plataformas de prototipado de código abierto.
La placa de microcontrolador simplificada viene en una variedad de paquetes de
placas de desarrollo. El enfoque de programación más común es utilizar el IDE de
Arduino, que utiliza el lenguaje de programación C. Esto le da acceso a una enorme
biblioteca de Arduino que está en constante crecimiento gracias a la comunidad
de código abierto[1].

2. Resumen

En la mayoría de proyectos de movilidad donde no es posible tener alimentación


eléctrica, es necesario alimentar el microcontrolador mediante batería, para
conseguir alimentar un microcontrolador durante mucho tiempo con batería, es
factible usar el modo sleep, donde el consumo energético se verá reducido
drásticamente. Dentro del modo sleep, existen distintos modos para ahorrar
energía, de entre los cuales uno de ellos “power-down mode” será el descrito en
este documento.

3. Marco Teórico

3.1 Sleep Mode

Los modos sleep habilitan la aplicación para apagar módulos innecesarios en el


microcontrolador, por ende, permiten ahorrar energía. El microcontrolador usado
por Arduino es el ATmega 328 el cual provee varios modos de ahorro permitiendo
al usuario adaptar el consumo de energía al requerimiento de las aplicaciones [2].

ATmega328p cuenta con 6 modos de ahorro:

 Idle
 ADC Noise Reduction
 Power-save
 Power-down
 Standby
 Extended Standby
La figura 1, muestra los diferentes modos de ahorro, sus fuentes de reinicio y los
diferentes modos que deshabilita.

Fig. 1 Modos de ahorro[2].

De entre los seis modos de ahorro, es notable que el modo “Power-down” es la


mejor opción en cuanto a ahorrar energía, debido a que desactiva los dominios de
reloj activos, los osciladores y el monitor de voltaje BOD. Además, cuenta con 3
formas para poder despertarlo, siendo estas por interrupciones, por interfaz serial
a 2 hilos (I2C) o por WDT.

3.2 Librería modo sleep Arduino.

Para hacer uso del modo de ahorro de energía en Arduino, se hace uso de la
librería “Avr/sleep.h” DESSDE AQUÍ AVERIGUA COSA S COMO : cómo funciona
que hace y cosas asi

<avr / sleep.h>: Administración de energía y modos de suspensión.


El uso de esta instrucción puede permitir que una aplicación reduzca
considerablemente su consumo de energía. Se debe configurar el modo de
suspensión deseado opcionalmente usando set_sleep_mode(), y luego llamar
sleep_mode().[3]
Las funciones para usar esta librería se detallan a continuación:

 sleep_bod_disable ().- Desactiva la BOD (Brown Out Detector) antes de irse


a dormir. Genera un código de ensamblaje en línea que implementará
correctamente la secuencia programada para deshabilitar el BOD para que
el dispositivo pueda ponerse en modo de suspensión, de lo contrario el
BOD no se deshabilitará realmente.
 sleep_cpu ().- Para poner el dispositivo en modo suspendido. El bit SE debe
configurarse de antemano, y se recomienda borrarlo después.
 sleep_disable (). - Borra el bit SE(bit de habilitación de suspensión).
 sleep_enable (). - Manda al dispositivo en modo de reposo. La forma en
que el dispositivo sale del modo de suspensión depende del modo
especifico seleccionado con la función set_sleep_mode().
 sleep_mode (). - Para poner el dispositivo en modo reposo, cuidando de
configurar el bit SE antes y borrándolo después. Tener en cuenta que las
interrupciones deben habilitarse antes de irse a dormir, caso contrario la
CPU se bloqueara completamente.
 sei ().- Configura las interrupciones.

Otras librerías relacionadas que funcionan conjuntamente con esta son:


<avr / power.h>: Sirve para la gestión de reducción de energía, y
< avr / interrupt.h >: que es un archivo de interrupción. [3]

Formas de despertar al MCU:

 Interrupciones por hardware. - Estas son asíncronas a la ejecución del


procesador, es decir, se pueden producir en cualquier momento
independientemente de lo que esté haciendo el CPU en ese momento. Las
causas que las producen son externas al procesador y a menudo suelen
estar ligadas con los distintos dispositivos de entrada o salida. [4]
 Timers y WDT. - El Watchdog Timer en el microprocesador del Arduino solo
tiene una fuente de reloj que es su propio oscilador interno de 128kHz (a
diferencia de los temporizadores internos de 8/16bit, que pueden usar el
reloj del sistema de 16Mhz o un reloj externo). Es este oscilador separado
permite que el WDT funcione en el modo de potencia más baja:
SLEEP_MODE_PWR_DOWN. [5]
 UART o puerto serie. – En el puerto serie tenemos dos líneas, Tx y Rx. Estas
líneas se deben cruzar para comunicar dos dispositivos, es decir, el Tx del
dispositivo 1 debe conectarse al Rx del dispositivo 2. El Tx del dispositivo 2
debe conectarse al Rx del dispositivo 1. Además, ambos dispositivos deben
compartir una masa común. En ocasiones podemos encontrar dispositivos
en los que solo existe el Tx. Esto puede ser debido a que ese dispositivo
sólo envía datos, no necesita recibir. Un ejemplo puede ser un sensor o un
receptor GPS. Para enviar los datos a las líneas debemos usar un hardware
que esté diseñado para llevar a cabo esa tarea y en este caso lo
llamamos UART. Esta se encargará de leer datos cuando llegan, generar y
gestionar interrupciones, enviar datos y gestionar los tiempos de bit. En
general la UART se encarga de hacer todo el trabajo por nosotros. SI
usamos un microcontrolador, es muy posible que no necesitemos hacer
nada especial ya que la UART estará integrada en el propio
microcontrolador. Si usamos una FPGA o similar es posible que tengamos
que diseñar el hardware de la UART o usar un diseño ya existente. El
funcionamiento de la UART es el mismo en todos los dispositivos ya que si
no fuera así, no se podrían comunicar entre sí. [6]

En este trabajo se usará interrupciones por hardware para poder


despertar al Arduino.

3.3 Código en Arduino.

El modo “power-down” con la librería “avr/sleep.h”, es habilitado de la


siguiente manera, donde el código base a usar será el siguiente:

#include <avr/sleep.h> // incluimos la librería para controlar el modo sleep


int wakePin = x; // pin usado para despertar, sea INT0 o INT1
void wakeUpNow() // la interrupción es manejada después de despertar
{
// código a realizar cuando despierte.
}
void setup() // detalles del programa
{
}
void loop()
{
sleepNow(); // se llama función de modo sleep
}
void sleepNow() // función que pone a dormir el Arduino.
{
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // modo sleep
sleep_enable(); // se habilita el bit de sleep en el registro del mcucr
attachInterrupt(0,wakeUpNow, LOW); // usamos la interrupción 0 (pin D2)
en BAJO y corre la función (0 para el pin D2, 1 para el pin D3)
sleep_mode(); // dispositivo puesto a dormir
sleep_disable(); // después de despertar
detachInterrupt(0); // deshabilita la interrupción
}

3.4 Código final.

Como objetivo final, se desea obtener el estado de batería cada vez que el
dispositivo esté despierto. Para esto se acopla al código base el código que
hará que 3 Leds muestren el estado en el que se encuentre la batería.
#include <avr/sleep.h>
#define LEDAMARILLO 12
#define LEDROJO 10
#define LEDNARANJA 11
#define ANALOGPILA 0

// Variables
int analogValor = 0;
float voltaje = 0;
int ledDelay = 800;

// Umbrales
float maximo = 1.6;
float medio = 1.4;
float minimo = 0.3;

int wakePin = 2;

void wakeUpNow()
{
analogValor = analogRead(ANALOGPILA);
voltaje = 0.0048 * analogValor;
// Dependiendo del voltaje mostramos un LED u otro
if (voltaje >= maximo)
{
digitalWrite(LEDAMARILLO, HIGH);
delay(ledDelay);
digitalWrite(LEDAMARILLO, LOW);
}
else if (voltaje < maximo && voltaje > medio)
{
digitalWrite(LEDNARANJA, HIGH);
delay(ledDelay);
digitalWrite(LEDNARANJA, LOW);
}
else if (voltaje < medio && voltaje > minimo)
{
digitalWrite(LEDROJO, HIGH);
delay(ledDelay);
digitalWrite(LEDROJO, LOW);
}
}
void setup()
{
Serial.begin(9600);
pinMode(wakePin, INPUT);
pinMode(LEDAMARILLO, OUTPUT);
pinMode(LEDROJO, OUTPUT);
pinMode(LEDNARANJA, OUTPUT);
Serial.begin(9600);
attachInterrupt(0, wakeUpNow, LOW); // uso de interrupcion 0 (pin 2) e
ir a funcion
digitalWrite(LEDROJO, HIGH);
delay(100);
digitalWrite(LEDAMARILLO, LOW);
digitalWrite(LEDROJO, LOW);
digitalWrite(LEDNARANJA, LOW);
}
void loop()
{
sleepNow(); // sleep function called here
}
void sleepNow() // función que pone a dormir el Arduino
{
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();attachInterrupt(0,wakeUpNow, LOW);
sleep_mode();
sleep_disable();
detachInterrupt(0);
}

4. Experimentación

Para la activación de la interrupción se hizo uso del sensor de vibración SW-


420 conjuntamente con un timer 555 en modo monoestable redisparable.

Sensor SW-420.- es un sensor que detecta las vibraciones a partir de un umbral


que puedes fijar con el potenciómetro que incluye. El módulo está basado en
el sensor SW-420 y un comparador LM393 produciendo una señal TTL cuando
se activa. [7]
Características:
 Alimentación: 3.3 - 5V
 Consumo: 4.2 mA
 Tamaño: 40 x 12 x 6mm
Timer 555.- Este circuito integrado se utiliza para activar o desactivar circuitos
durante intervalos de tiempo determinados, es decir se usa
como temporizador. Utilizamos el timer 555 CMOS para obtener un consumo
de energía mucho menor. Para nuestra aplicación lo necesitamos en modo
monoestable, en este modo como se puede observar en la gráfica, el disparo
envía una señal de entrada y activa la salida durante un tiempo o sea
desactivamos el disparo o la entrada y se activa la salida. Para activar la salida
nuevamente se redispara otra vez desactivando la entrada. El tiempo que se
mantiene en alto la salida depende de los resistores y condensadores del
circuito. [8]
Características:
 Alimentación: 5V
 Consumo: 144 uA (0.7 mW)

Fig. 2 Curva de funcionamiento modo monoestable 555 [8]

5. Resultados AUN FALTA ACTUALIZAR ya lo hago yo

De las pruebas realizadas con el uso de un Arduino nano, se observa el consumo


energético de alrededor de 5.14 mA en modo ahorro y de 7.3 mA en modo despierto.
Es importante tener en cuenta que el consumo en modo despierto representa solo el
consumo del led L en Arduino, sin tomar en cuenta el consumo que se podría producir
al realizar cualquier proyecto, lo que significaría un incremento en el consumo
energético del mismo. En la Fig. 2 se observa el consumo energético tanto en modo
ahorro como en modo despierto.
Fig. 2 Consumo energético entre modo despierto
y modo ahorro en Arduino nano.

5.1 Gráficas

6. Recomendaciones
PROBABLEMENTE ENCUENTRES QUE PARA DISMINUI MAS EL CONSUMO DE
BATERIA SE DEBE QUITAR EL REGULADOR esas cosas van aquí

7. Bibliografía

[1] Arduino and Documentation, “What is arduino?,” Atmel, 2015. [Online]. Available:
http://web.csulb.edu/~hill/ee400d/Technical Training Series/02 Intro to
Arduino.pdf.
[2] Atmel, “ATmega 328P Datasheet,” 2015. [Online]. Available:
http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-
Microcontrollers-ATmega328P_Datasheet.pdf.
[3] https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html
[4] https://aprendiendoarduino.wordpress.com/2016/11/13/interrupciones/
[5] https://aprendiendoarduino.wordpress.com/tag/watchdog/
[6] https://www.rinconingenieril.es/funciona-puerto-serie-la-uart/
[7] https://www.e-ika.com/sensor-de-vibracion-sw-420
[8] https://www.areatecnologia.com/electronica/circuito-integrado-555.html

Potrebbero piacerti anche