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 문 안에 위와 같이 선언을 해주고, 다음과 같은 측정함수를 불러오게끔 했다.
'학원 수업 관련 > Arduino&RPi' 카테고리의 다른 글
ESP-8266 모듈을 쉽게 사용하기 위한 가이드 (0) | 2021.12.25 |
---|---|
라즈베리파이 셋팅 가이드(3&4) 공통 (0) | 2021.11.30 |