Requisitos
Introducción
Siempre es importante ahorrar energÃa por razones medioambientales pero, sobre todo, en ciertas aplicaciones cuyo consumo no puede superar unos umbrales determinados. Por estos motivos, en este post vamos a ver cómo implementar la librerÃa Arduino Low-Power con nuestros PLC's industriales para ahorrar una pequeña cantidad de energÃa que puede ser crucial en muchas ocasiones. En el caso de la familia M-Duino, el consumo que se ahorra al aplicar la función de la librerÃa es de unos 10mA respecto al total que consume el controlador del PLC, que es de 70mA aproximadamente sin utilizar E/S ni comunicaciones especiales.Â
Aplicación
Vamos a ver dos códigos de ejemplo. Ambos utilizan la función Low.Power.idle() que, dependiendo de un parámetro de tiempo, apagan durante ese periodo definido algunos periféricos del PLC Arduino. Estos periféricos dependen de la CPU de la placa que tenga el PLC (ver la tabla de abajo) y son principalmente caracterÃsticas como ADC, TIMER's, USART's, SPI y TWI (I2C), que pueden ser configurados en función de tus requerimientos, eligiendo encenderlos, apagarlos o directamente no actuar sobre ellos. Hay que tener en cuenta que los ejemplos que vamos a ver están basados en M-Duino, pero pueden ser adaptados a Ardbox o 10 I/O's también (tendrás que comentar/descomentar los bloques de código según tu controlador industrial PLC).Â
FamÃlia PLC | Placa Arduino | CPU |
M-Duino | Mega | ATmega2560 |
Ardbox | Leonardo | ATmega32U4 |
10 I/O's | Nano | ATmega328P |
PerÃodo de estado inactivo
En este código, no es necesario inicializar la librerÃa LowPower en la parte de configuración, sólo las funciones que se van a requerir, como por ejemplo la Serial. En la parte del loop se va a ejecutar la función comentada LowPower.idle(). El primer parámetro de ésta es el periodo de tiempo de actuación, en este caso 8 segundos, y los otros parámetros son los periféricos que se pueden encender o apagar con esta función, teniendo en cuenta que normalmente están encendidos por defecto y que se van a apagar. Todos estos parámetros de configuración pueden ser consultados en la lista que se muestra en el archivo keywords.txt, ubicado dentro de la librerÃa. Después de este periodo de bajo consumo para los periféricos definidos, puedes añadir las funciones que necesites, como la lectura de los datos de los sensores. Es muy importante cosiderar todos los parámetros que van a ser deshabilitados temporalmente y si los requieres o no ya que, por ejemplo, si desactivas la USART0 no podrás utilizar la Serial0 para aplicaciones como la impresión de mensajes durante el periodo definido.Â
#include "LowPower.h" void setup() { Serial.begin(9600); } void loop() { Serial.println("Starting Low-Power Mode in 3 seconds"); delay(3000); // Enter idle state for 8 s with the rest of peripherals turned off // Each microcontroller comes with different number of peripherals // Comment off line of code where necessary // ATmega2560 (Arduino Mega: M-Duino) LowPower.idle(SLEEP_8S, ADC_OFF, TIMER5_OFF, TIMER4_OFF, TIMER3_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART3_OFF, USART2_OFF, USART1_OFF, USART0_OFF, TWI_OFF); // ATmega328P, ATmega168 (Arduino Nano: 10I/Os Nano ) //LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, // SPI_OFF, USART0_OFF, TWI_OFF); // ATmega32U4 (Arduino Leonardo: Ardbox) //LowPower.idle(SLEEP_16S, ADC_OFF, TIMER4_OFF, TIMER3_OFF, TIMER1_OFF, // TIMER0_OFF, SPI_OFF, USART1_OFF, TWI_OFF, USB_OFF); // Do something here // Example: Read sensor, data logging, data transmission. Serial.println("Do something here"); }
Interrupción externa en reposo
#include "LowPower.h" void setup() { Serial.begin(9600); } void loop() { Serial.println("Starting Low-Power Mode in 3 seconds"); delay(3000); attachInterrupt(digitalPinToInterrupt(I0_5), wakeUp, RISING); // ATmega2560 (Arduino Mega: M-Duino) LowPower.idle(SLEEP_FOREVER, ADC_OFF, TIMER5_OFF, TIMER4_OFF, TIMER3_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART3_OFF, USART2_OFF, USART1_OFF, USART0_OFF, TWI_OFF); // ATmega328P, ATmega168 (Arduino Nano: 10I/Os Nano ) //LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, // SPI_OFF, USART0_OFF, TWI_OFF); // ATmega32U4 (Arduino Leonardo: Ardbox) //LowPower.idle(SLEEP_16S, ADC_OFF, TIMER4_OFF, TIMER3_OFF, TIMER1_OFF, // TIMER0_OFF, SPI_OFF, USART1_OFF, TWI_OFF, USB_OFF); detachInterrupt(digitalPinToInterrupt(I0_5)); Serial.println("After interruption!"); } void wakeUp() { //Put here the code that you want to execute when the interrpution is executed Serial.println("INTERRUPT I0_5"); }