개발자/Arduino

arduino sleep mode 절전 모드 사용하기

지구빵집 2021. 3. 12. 10:24
반응형

 

 

ARDUINO를 Sleep mode 절전 모드로 전환하는 방법

 

때때로 우리는 전력망에 직접 연결하지 않고 배터리나 충전 전원에 Arduino를 연결해야 하는 상황에 처해 있습니다. 이것은 원격 사이트에 정보를 기록하려고 하거나 특정 간격마다 동작하거나 이벤트에 반응하도록 설정하여 특정 경우에만 동작하는 것으로 Arduino를 활성화해야 할 때 자주 발생합니다.

 

이 경우 Arduino를 sleep mode 상태로 두는 것이 완벽한 일입니다. 특정 간격으로 데이터를 기록하거나 미리 정해진 이벤트가 발생하면 경고를 보내는 등 짧은 시간 동안만 주의가 필요합니다. 이 튜토리얼에서는 Arduino를 절전 모드로 전환하고 Arduino를 다시 켜는 방법을 살펴볼 것입니다.

 

이 튜토리얼은 개념을 익히고 Arduino를 잠자기 상태로 만드는 데 필요한 코드를 살펴보고 실습을 통해 결과를 확인하는 간단한 연습을 제공합니다. 

 

어떤 보드를 사용할까요?

 

이 튜토리얼에서는 프로토 타입이 더 쉬운 보드이기 때문에 Arduino Uno를 사용할 것입니다. 실제 라이브 프로젝트에서는 Arduino Pro Mini를 사용합니다. Arduino Uno와 Arduino Pro Mini는 매우 유사한 특성을 가지고 있으며 Arduino pro mini는 전력을 공급할 하드웨어 (예 : USB 부분, 추가 LED 및 기타 항목)가 훨씬 적으므로 전력을 훨씬 적게 사용합니다. 이것이 Arduino Pro mini가 더 나은 선택인 이유입니다.

 

예를 들어 Uno는 깨어있을 때 30-40mA를 사용하고 sleep mode에서는 약 19mA를 사용합니다. Pro Mini는 깨어있을 때 25mA를 사용하고 sleep mode에서는 0.57mA를 사용합니다. 배터리에 연결할 때 모든 mA가 중요하므로 경쟁이 없으며 Arduino Pro Mini가 승자임을 알 수 있습니다.

 

참고 : 초보 제작자로서 Arduino Pro Mini는 약간 위협적 일 수 있지만 그럴 이유가 없습니다. 말하자면, 헤더를 pro 보드에 납땜해야 하며 스케치를 업로드하려면 FTDI 케이블이 필요하지만 그 외에는 큰 차이가 없습니다.

 

Sleep mode

 

Arduino Uno 및 Arduino Pro mini 모두에 사용되는 ATmega328 p (이 문서의 사본을 보려면이 링크를 클릭하십시오.) 프로세서 의 설명서를 살펴보면 다양한 절전 모드를 사용할 수 있습니다. 그러나 실제 시나리오에서는 유용한 모드가 실제로 하나뿐입니다. 전원 차단 모드 (SLEEP_MODE_PWR_DOWN).

 

Arduino를 절전 모드로 전환하면 불필요한 구성 요소가 모두 꺼져 MCU (마이크로 컨트롤러 장치)의 전력 소비가 줄어듭니다. sleep mode에서 깨어날 수 있는 유일한 방법은 외부에서 간섭하는 방법을 사용하는 것입니다 (예 : 깨어나기 위해 살짝 찔러보는 일). 이 튜토리얼의 뒷부분에서 이 작업을 수행하는 방법을 살펴보겠습니다. 사용 가능한 인터럽트 pin에 high 신호나 low 신호를 주어 반응하게 합니다.

 

Interrupts

 

Arduino를 절전 모드로 전환하는 코드로 들어가기 전에 인터럽트 개념을 이해해야 합니다. 이를 설명하는 가장 좋은 방법은 다음과 같습니다. 당신은 정말로 집중해야 할 일을 하고 있습니다. 당신은 당신의 음악을 크게 울리는 헤드폰을 착용하여 당신의 외상을 익사시킵니다. 당신은 이것에 너무 집중되어 외부 세계가 당신에게 잃어버립니다. 주의를 끌 수 있는 유일한 방법은 넛지(슬쩍 찌르다)를 주는 것입니다. 이 넛지를 받은 후에는 중단이 무엇인지에 주의를 기울이고 이를 처리한 후 음악을 다시 켜고 작업을 계속합니다.

 

참고 : 인터럽트가 어떤 용도로 유용한 지 자세히 설명하지는 않겠지만 이 개념에 대해 자세히 알아보려면 이 주제에 대한 튜토리얼 (인터럽트를 사용하여 프로젝트의 기능 향상)을 확인하십시오. 대부분의 진정한 Arduino에는 이를 수행하는 몇 개의 핀이 있습니다. Uno와 Pro Mini에는 Arduino가 수행하는 작업을 중단할 수 있는 2 개의 핀 (d2 및 d3)이 있습니다. 이를 통해 Arduino를 깨어있는 상태로 되돌릴 수 있습니다.

 

Arduino를 절전 모드로 전환하기

 

튜토리얼의 전체 코드는 아래에 있습니다. 각 부분 코드를 살펴보겠습니다.

 

#include <avr/sleep.h>//this AVR library contains the methods that controls the sleep modes
#define interruptPin 2 //Pin we are going to use to wake up the Arduino

 

위 코드는 Arduino를 절전 모드로 전환하는 데 필요한 모든 것이 포함된 라이브러리를 로드하는 코드 스니펫(재사용 가능한 소스 코드, 기계어, 텍스트의 작은 부분을 일컫는 프로그래밍 용어)이 포함되어 있습니다. 또한 디지털 핀 2에 대해 변수 interruptPin을 선언합니다. 나중에 이를 핀 2를 입력 핀으로 만드는 데 사용할 것입니다. 다음으로 Setup () 함수를 살펴보겠습니다.

 

void setup() {
  Serial.begin(115200);//Start Serial Comunication
  pinMode(LED_BUILTIN,OUTPUT);//We use the led on pin 13 to indecate when Arduino is A sleep
  pinMode(interruptPin,INPUT_PULLUP);//Set pin d2 to input using the buildin pullup resistor
  digitalWrite(LED_BUILTIN,HIGH);//turning LED on
}

 

Setup( ) 함수에 대한 코드가 있습니다. 모든 것이 간단합니다. 디지털 핀 13을 출력 핀으로 선언합니다 (LED_BUILTIN은 온보드 LED가 연결된 디지털 핀 13 변수에 할당된 변수입니다). 우리는 Arduino가 절전 모드 일 때 (LED가 켜져 있을 때 Arduino가 깨어있을 때, Arduino가 꺼져있을 때 절전 모드일 때) LED를 indecator로 사용하고 있습니다.

 

18번 라인에서는 디지털 핀 2를 입력 핀으로 설정했습니다. INPUT 대신 INPUT_PULLUP을 사용합니다. 이렇게 하면 내장 풀업 저항을 사용하여 핀이 아무것도 부착되지 않았을 때 HIGH와 LOW 사이에서 핀이 흔들리는 것을 방지합니다(버튼을 누루고 있는 역할과 동일한 기능을 수행, 일정한 값이 되도록 할 필요가 있음).

 

void loop() {
 delay(5000);//wait 5 seconds before going to sleep
 Going_To_Sleep();
}

 

다음으로 우리는 main loop () 함수로 갑니다.

23 번째 줄에서는 24 번째 줄에서 Going_To_Sleep () 함수를 호출하기 전에 5초의 지연 시간을 두었습니다. 이는 Arduino가 깨어 있음을 표시하기 위해 온보드 LED가 켜져 있음을 알 수 있도록 하기 위한 것입니다.

 

Going_To_Sleep () 함수는 LED가 꺼져 Arduino가 sleep mode 상태임을 나타냅니다.

 

다음으로 Going_To_Sleep () 함수 자체를 살펴보겠습니다.

 

void Going_To_Sleep(){
    sleep_enable();//Enabling sleep mode
    attachInterrupt(0, wakeUp, LOW);//attaching a interrupt to pin d2
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);//Setting the sleep mode, in our case full sleep
    digitalWrite(LED_BUILTIN,LOW);//turning LED off
    delay(1000); //wait a second to allow the led to be turned off before going to sleep
    sleep_cpu();//activating sleep mode
    Serial.println("just woke up!");//next line of code executed after the interrupt 
    digitalWrite(LED_BUILTIN,HIGH);//turning LED on
  }

 

28 행에서 avr/sleep.h 라이브러리의 일부인 sleep_enable () 함수를 호출합니다. 그것은 우리가 Arduino를 sleep mode 상태로 만들 수 있게 29번 줄에서 인터럽트 섹션에서 핀 2에 인터럽트를 연결합니다.

 

attachInterrupt 함수 설명

 

attachInterrupt (interrupt, ISR, mode);

 

  • interrupt: 우선 '핀'에는 어떤 핀에 인터럽트를 사용할지 해당하는 인터럽트 번호(0, 1 등)를 넣어주면 됩니다. 여기서 주의할 점은 그 핀의 핀번호를 넣으면 안 된다는 점입니다. 아두이노 우노의 경우 2번과 3번 핀에 인터럽트를 사용할 수 있는데, 2번 핀에 인터럽트를 사용하려면 0을 넣으면 되고, 3번 핀에 사용하려면 1을 넣으면 됩니다. 다른 보드들은 다른 번호를 사용하는데, 각각 다른 보드마다 할당된 인터럽트 번호는 아래 이미지를 참고하세요. 그림을 참고하세요. 예를 들어 아두이노 메가의 경우 18번 핀에 인터럽트를 사용하고 싶다면 5를 넣으면 됩니다.
  • 'ISR(interrupt Service Routine'은 함수에는 인터럽트가 발생할 경우 사용자가 작성하여 실행할 함수 이름을 넣으면 됩니다. 사용자는 같은 이름으로 함수를 만들어야 합니다. 함수를 다른 말로 ISR(Interrupt Service Routine)이라고도 합니다.
  • Mode: '모드'에는 주로 'RISING', 'FALLING', 'CHANGE' 세 가지 중 하나를 넣습니다. RISING의 경우 인터럽트 핀의 전압이 LOW에서 HIGH(5V)로 바뀔 때 인터럽트가 발동됩니다. FALLING의 경우 이와 반대로 HIGH에서 LOW로 바뀔 때 발동되며, CHANGE는 핀의 전압이 HIGH에서 LOW든 LOW에서 HIGH든 바뀌기만 하면 무조건 발동됩니다. 

 

 

아시다시피 0을 사용하여 핀 2를 사용하고 있음을 나타냅니다. 이는 Arduino Uno / Pro Mini에 2 개의 인터럽트가 있기 때문입니다. 인터럽트 0은 디지털 핀 2에 연결되고 인터럽트 1은 디지털 핀 2에 연결됩니다. ISR은 인터럽트가 때 호출되는 함수 이름입니다. 우리의 경우에는 합니다. 모드는 인터럽트를 호출하기 위해 디지털 핀에 것입니다. 우리의 경우 핀을 LOW (GND로)로 당겨야 합니다.

 

30 행에서 원하는 절전 모드를 설정했습니다. 우리의 경우에는 가능한 모든 것을 종료합니다. 31번 라인에서 LED를 끄고 32번 라인에서 LED를 끌 시간을 주기 위해 잠시 기다립니다. 다음으로 실제로 sleep_cpu () 함수를 사용하여 Arduino를 절전 모드로 전환합니다.

 

코드는 인터럽트가 호출될 때까지 여기에서 중지됩니다. 깨어난 후 Arduino는 먼저 wakeUp () 함수에서 코드를 실행 한 다음 34 행을 계속해서 직렬 모니터에 웨이크 업 메시지를 인쇄하고 35 행에서 LED를 다시 켭니다.

 

void wakeUp(){
  Serial.println("Interrrupt Fired");//Print message to serial monitor
   sleep_disable();//Disable sleep mode
  detachInterrupt(0); //Removes the interrupt from pin 2;
}

 

wakeup( ) 함수에서 인터럽트가 호출된 즉시 깨어나는 상태를 시리얼 모니터에 줄을 인쇄 할 수 있습니다. 다음 두 줄은 스케치가 고착되어 프로젝트가 실패할 수 있는 의도하지 않은 루프가 발생하지 않도록 하는 데 매우 중요합니다. 40번 라인에서는 슬립 기능을 비활성화하고 41번 라인에서는 2번 핀에서 인터럽트를 분리합니다. 제가 말했듯이 무한 루프 상황을 방지하기 위해 이렇게 합니다. 

 

전체 소스 코드는 아래에 있습니다. 코드의 출처는 코드 상단에 있습니다. 참고하세요.

 

/**
 * Author:Ab Kurk
 * version: 1.0
 * date: 24/01/2018
 * Description: 
 * This sketch is part of the beginners guide to putting your Arduino to sleep
 * tutorial. It is to demonstrate how to put your arduino into deep sleep and
 * how to wake it up.
 * Link To Tutorial http://www.thearduinomakerman.info/blog/2018/1/24/guide-to-arduino-sleep-mode
 */

#include <avr/sleep.h>//this AVR library contains the methods that controls the sleep modes
#define interruptPin 2 //Pin we are going to use to wake up the Arduino


void setup() {
  Serial.begin(115200);//Start Serial Comunication
  pinMode(LED_BUILTIN,OUTPUT);//We use the led on pin 13 to indecate when Arduino is A sleep
  pinMode(interruptPin,INPUT_PULLUP);//Set pin d2 to input using the buildin pullup resistor
  digitalWrite(LED_BUILTIN,HIGH);//turning LED on
}

void loop() {
 delay(5000);//wait 5 seconds before going to sleep
 Going_To_Sleep();
}

void Going_To_Sleep(){
    sleep_enable();//Enabling sleep mode
    attachInterrupt(0, wakeUp, LOW);//attaching a interrupt to pin d2
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);//Setting the sleep mode, in our case full sleep
    digitalWrite(LED_BUILTIN,LOW);//turning LED off
    delay(1000); //wait a second to allow the led to be turned off before going to sleep
    sleep_cpu();//activating sleep mode
    Serial.println("just woke up!");//next line of code executed after the interrupt 
    digitalWrite(LED_BUILTIN,HIGH);//turning LED on
  }

void wakeUp(){
  Serial.println("Interrrupt Fired");//Print message to serial monitor
   sleep_disable();//Disable sleep mode
  detachInterrupt(0); //Removes the interrupt from pin 2;
}

 

여기서의 실습은 간단합니다.

아두이노 2번 핀에 점퍼 양쪽이 다 핀으로 나와 있는 케이블을 꼽습니다. 프로그램이 업로딩 되면 5초 기다리다가 2번 핀에서 나온 케이블 반대쪽을 GND에 연결합니다. 그럼 인터럽트가 실행되고 아두이노가 Sleep Mode 에서 깨어난 것을 볼 수 있습니다. 결과 화면은 아래와 같습니다. 즐겁게 개발하시기 바랍니다. 우리 삶이 너무나 짧아서 즐겁지 않으면 의미가 없습니다. 즐거움은 고통이 지난 후에 얻는 것이라는 사실은 잊지 마십시요. ^^

 

*중요: 간혹 sleep_cpu( ) 실행하고 인터럽트에서 깨어나야 하는데 깨어나지 않는 문제가 생긴다. 즉 앞의 문장 바로 뒤의 코드 "just wake up" 코드가 실행되지 않는다는 점이다. 아마도 하드웨어 설정을 건드리는 것 같은데 해결은 남겨두기로 한다. 급하다 급해!@ 

 

인터럽트를 사용한 슬립 모드 테스트 결과 화면

 

 

참고 문서

A GUIDE TO PUTTING YOUR ARDUINO TO SLEEP  

 

Part 1 Overview Of Arduino Sleep Mode

Part 2 Wake Up Via An External Interrupt

Part 3 Wake Up Via the UART

Part 4 Wake Up Via Internal Timer

Part 5 Wake Up Via The Watchdog Timer

 

 

 

고양이 졸림. 무료이미지 pixabay.com

 

 

 

반응형