Librería Arduino de bajo consumo Aplicación PLC

Controlador Arduino PLC
30 de septiembre de 2021 por
Librería Arduino de bajo consumo Aplicación PLC
Boot & Work Corp. S.L., Quesada Dani Salvans

Requisitos

PLC basado en Arduino 

PLC

 

Cómo utilizar las entradas de interrupción con las placas Arduino industriales

 

Librería de bajo consumo de Arduino


Repositorio GitHub de bajo consumo

 

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 PLCPlaca Arduino CPU
M-Duino MegaATmega2560
ArdboxLeonardoATmega32U4
10 I/O'sNanoATmega328P

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

En este código, no es necesario inicializar la librería LowPower en la parte de configuración, solo las funciones que vas a requerir, como por ejemplo la Serial. En la parte del loop, se inicializa la interrupción, aquí debes tener en cuenta los atributos de la función; el pin utilizado como interrupción con la función correspondiente digitalPinToInterrupt() en este caso digitalPinToInterrupt(I0_5), la función handler donde debes poner todo lo que quieres que se ejecute cuando se active la interrupción, en este caso, wakeUp, y el modo de activación de la interrupción, en este caso RISING edge. Después se activa la función LowPower.idle() teniendo en cuenta los mismos puntos comentados anteriormente pero, en este caso, con un periodo diferente: SLEEP_FOREVER que apagará los periféricos referidos hasta que se active la interrupción. Después, está la función detachInterrupt(), y se puede añadir código en la parte del loop posterior, pero sólo se va a ejecutar justo después del código del manejador de la interrupción. 

#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");
}
Your Dynamic Snippet will be displayed here... This message is displayed because you did not provided both a filter and a template to use.

Buscar en nuestro blog

Librería Arduino de bajo consumo Aplicación PLC
Boot & Work Corp. S.L., Quesada Dani Salvans 30 de septiembre de 2021
Compartir

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.


Industrial PLC comparison >>>