상세 컨텐츠

본문 제목

Arduino MKR 1310 저전력 사용해보기 (Using low power on Arduino MKR 1310 with ArduinoLowPower.h)

embedded/IoT

by ZelKun 2023. 2. 1. 00:04

본문

반응형

[embedded/IoT] - Arduino MKR 1310 배터리 연결하기 (Arduino MKR 1310 with Batteries)

 

Arduino MKR 1310 배터리 연결하기 (Arduino MKR 1310 with Batteries)

[embedded/IoT] - Arduino MKR 1310 사용해보기 (with TTN) Arduino MKR 1310 사용해보기 (with TTN) Device 추가할때 From The LoRaWAN Device Repository 를 이용했는데, Gateway 설정은 KR920_TTN 이라 Manually 로 KR920 주파수로 잡아

zelkun.tistory.com

일전에 MKR 1310보드를 배터리로 연결할 수 있도록

PMIC(Power Management IC)를 추가했는데

 

아무래도 배터리를 사용하려면 항시전원보다는

저전력을 유지하는게 사용기간을 늘릴수 있으니

사용하지 않을때는 Sleep 하게해서

전력을 아낄수 있게 해볼까합니다

 

ESP 모듈들은 자체적으로 DeepSleep을 지원하던데

얘는 없나봐요?

아니면 못찾은건가...

 

대신 대안으로 찾은 LowPower 라이브러리 를 많이 사용하는것 같아

이용해 보기로 했습니다

 

아쉽게도 Arduino Uno 등 일반적인 아두이노는 지원하진 않습니다

우선 관련라이브러리를 추가해 줍니다

https://zelkun.tistory.com/entry/012-Arduino-아두이노-library-라이브러리-추가하기

Arduino MKR 1310 저전력 사용해보기 (Using low power on Arduino MKR 1310 with ArduinoLowPower.h)

라이브러리를 설치하고 예제를 MKR 1310 보드에

업로드해서 테스트를 진행합니다

Arduino MKR 1310 저전력 사용해보기 (Using low power on Arduino MKR 1310 with ArduinoLowPower.h)

5개의 예제가 있는데요

저는 마지막 TimedWakeup 을 이용했습니다

/*
  TimedWakeup

  This sketch demonstrates the usage of Internal Interrupts to wakeup a chip in sleep mode.
  Sleep modes allow a significant drop in the power usage of a board while it does nothing waiting for an event to happen. Battery powered application can take advantage of these modes to enhance battery life significantly.

  In this sketch, the internal RTC will wake up the processor every 2 seconds.
  Please note that, if the processor is sleeping, a new sketch can't be uploaded. To overcome this, manually reset the board (usually with a single or double tap to the RESET button)

  This example code is in the public domain.
*/

#include "ArduinoLowPower.h"

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  // Uncomment this function if you wish to attach function dummy when RTC wakes up the chip
  // LowPower.attachInterruptWakeup(RTC_ALARM_WAKEUP, dummy, CHANGE);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
  // Triggers a 2000 ms sleep (the device will be woken up only by the registered wakeup sources and by internal RTC)
  // The power consumption of the chip will drop consistently
  LowPower.sleep(2000);
}

void dummy() {
  // This function will be called once on device wakeup
  // You can do some little operations here (like changing variables which will be used in the loop)
  // Remember to avoid calling delay() and long running functions since this functions executes in interrupt context
}

예제코드를 보면 LED_BUILTIN 핀을 출력모드로 Setup 하고

Loop에서 켜고 끄는걸 반복하는데요

Loop 마지막에

LowPower.sleep(2000); 이 눈에 띄네요

 

2초간 대기상태로 sleep 시키고 LED를 켜지게 돼있습니다

 

코드에서는 확인이 안되지만

ESP의 DeepSleep과는 다르게

Sleep하고 깨어날때는 Setup이 아니고

Loop를 순화하기 때문에

 

만약 Setup부터 다시 진행해야한다면

약간의 편법을 이용해야하는 불편함이 있습니다

 

035. Arduino 아두이노 리셋 시키기 - Arduino software reset

 

035. Arduino 아두이노 리셋 시키기 - Arduino software reset

사실 우노(UNO) 보드로 코딩할 때는 Setup은 한번만하고 단순히 Loop만을 반복하는 전제로 코딩을 하게되는데요 때에 따라서는 물리적으로 리셋을 시켜야 할때가 생기곤 합니다 Setup을 다시 할거면

zelkun.tistory.com

리셋버튼을 이용하는 방법으로

리셋핀 연결은 위의 아두이노 리셋시키기 포스트를 참고 바랍니다..

#include "ArduinoLowPower.h"

void resetFunc(void);

int resetPin = 7;
boolean init_chk = true;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  if(!init_chk) {
    resetFunc();
  } else {
    init_chk = false;
  }
  
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
  // Triggers a 2000 ms sleep (the device will be woken up only by the registered wakeup sources and by internal RTC)
  // The power consumption of the chip will drop consistently

  LowPower.sleep(2000);
}

void resetFunc(){
  pinMode(resetPin, OUTPUT);
  digitalWrite(resetPin, HIGH);
  delay(1000);
  digitalWrite(resetPin, LOW);
}

 

변경된 소스

 

최초 실행시에만 init_chk 변수가 true로

2번째 loop부터 resetFunc 함수를 호출해서

보드를 리셋시키도록 해봤습니다

 

다만, 실제 보드에 업로드를 해보진 않아서

제대로 동작하는지는 테스트를 못해봤습니다

 

mkr보드가 하나뿐인데, 이미 사용중이라서요...

 

// Uncomment this function if you wish to attach function dummy when RTC wakes up the chip
LowPower.attachInterruptWakeup(RTC_ALARM_WAKEUP, dummy, CHANGE);

void dummy() {
  // This function will be called once on device wakeup
  // You can do some little operations here (like changing variables which will be used in the loop)
  // Remember to avoid calling delay() and long running functions since this functions executes in interrupt context
}

참고로 dummy함수는

Setup함수 내부의 주석처리된 InterruptWakeup 에서 사용하는거라

주석을 풀고 dummy 함수에 내용을 추가해도 동작하지 않습니다

 

뭔가 주석을 풀면 깨어날때 dummy를 실행할 것 같은 느낌이지만

주석을 읽어보면 RTC라고 명시하고 있어

 

rtczero 라이브러리와 함께 이용해야 하는것 같아요

아쉽지만 본 포스트에서는 다루지 않습니다

 

참고

1. https://docs.arduino.cc/hardware/mkr-wan-1310

2. https://github.com/arduino-libraries/ArduinoLowPower

3. https://docs.arduino.cc/tutorials/mkr-wifi-1010/powering-with-batteries

4.https://www.arduino.cc/reference/en/libraries/rtczero/

5. https://docs.arduino.cc/tutorials/mkr-wifi-1010/rtc-clock

 

반응형

관련글 더보기

댓글 영역