Librería Arduino de bajo consumo Aplicación PLC
Controlador Arduino PLC
30 septiembre, 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");
}

 Latest Posts

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

¬ŅBuscas 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.


Comparación PLC industrial>>>

¬ŅQuieres m√°s informaci√≥n?

¬°Rellena el formulario!

¬°Cu√©ntame m√°s!