1차 프로젝트를 하면서 유용하게 사용한 타이머인터럽트(MsTimer2) 라이브러리에 대한 이야기이다.

아두이노를 활용한 실습을 할때 함수가 많아지는 경우가 있다.

동작이 의도한 대로 안 되거나 정확도를 높히고 싶을 때(센서로부터 받는 값을 특정 주기로 계속 측정하고 싶을 때)

인터럽트를 통해 이러한 걸 구현 할 수 있다. 또는 어딘가로 보내는 통신을 loop문에서 계속 호출한다던가.

 

인터럽트 

쉽게 생각하면, 끼어들기라고 생각하면 좋다. void loop 문 내 기본 메인 동작을 수행하는 도중에 어떤 돌출된 상황이 발생하면(즉, 이벤트) 메인 동작에 영향을 안주는 선에서 끼어들어서 그 상황에 관련된 특정 동작을 수행하고 

다시 되돌아가는 것을 의미한다.

 

아두이노에선 핀에 대한 인터럽트를 다음과 같은 방식으로 사용할 수 있다. (우노 기준 2,3번핀)

attachInterrupt(digitalPinToInterrupt(interruptPin), exchange, FALLING);

attachInterrupt(인터럽트핀, 호출함수, 상태)로 해서 setup()함수에 선언하여 사용한다.

LOW     :   LOW 상태일 때
CHANGE  :  입력 값이 변할때
RISING  :  LOW -> HIGH로 변할때
FALLING :  HIGH -> LOW로 변할때

 

하지만 나의 경우는 측정함수를 설정한 주기 동안 반복하게끔 하고 싶었기 때문에, MsTimer2 라이브러리를 사용했다.

 

설치 방법

Arduino IDE의 라이브러리 매니저에서 MsTimer2를 검색하거나,

https://github.com/PaulStoffregen/MsTimer2 에서 아래와 같은 방법으로 다운로드 받을 수 있다.

 

하지만 프로젝트에서는 아두이노 메가보드(Mega 2560/ADK)를 주력으로 사용하기에

http://www.hellmaker.kr/post/302 이 글을 참고하여 MsTimer2.cpp 파일을 수정하여 사용했다.

 

 

사용 방법

파일의 최 상단에 #include <MsTimer2.h>를 추가해주고, setup 문 안에 다음과 같이 정의한다.

void setup() {
....
  MsTimer2::set(ms, func); 
  MsTimer2::start();
....
  }

 

MsTimer2::stop를 만나기 전 까지 MsTimer2::set에 설정된 ms (1000ms = 1sec)주기로, func를 계속 실행하게 된다.

func 파라미터의 경우 반환형식이 없는 void 형의 함수만 호출이 가능하다. (그게 안 돼서 어리둥절했다는..)

최대 49일까지 설정이 가능하다.

 

 

 

delay를 사용한 blink 예제 vs 타이머 인터럽트를 사용한 blink 예제

void setup(){
	
	pinMode(13,OUTPUT);
	
}
void loop(){
	//문장 1
	digitalWrite(13,!digitalRead(13));
	delay(500);
	//문장 2
}

loop 문 내에 작성하면 동작이 끝난 후에 다음 문장을 실행하기 때문에 여러가지 동작을 loop 문 내에 작성하려는 경우 

delay를 활용하면 안 된다. 

 

#include <MsTimer2.h>

void setup(){
	pinMode(13,OUTPUT);
	MsTimer2::set(500,ledBlink);
	MsTimer2::start();
}

void loop(){
	//문장 1
	//문장 2
}

void ledBlink{
	digitalWrite(13,!digitalRead(13);
	state = !state; 
}

 

타이머인터럽트의 경우 loop문 보다 우선순위가 높아 500ms 간격으로 LED를 제어 할 수 있다.

void Setup 문 안에 위와 같이 선언을 해주고, 다음과 같은 측정함수를 불러오게끔 했다.

+ Recent posts