Arduino Software Interrupt
아두이노에서 하드웨어 인터럽트 (연결된 하드웨어(센서)를 지켜보고 있다가 신호가 있으면 즉시 어떤 코드를 실행) 는 2개 (Uno, nano) 사용할 수 있는데, 가끔 인터럽트가 더 많았으면 좋겠다 싶을 때도 있고, 또 때로는 일정한 시간마다 주기적으로 어떤 처리를 해야하는 경우 도 있다. 이럴 때 유용하게 쓸 수 있는 소프트웨어 인터럽트 (타이머) 활용법 대 공개!
아두이노에는 기본 3개의 타이머가 내장되어있는데, timer0, timer1, timer2이다. timer0은 delay()등의 시간관련 함수에서 내부적으로 사용하고, timer1은 서보라이브러리가 사용, timer2는 tone()에서 사용한다. 이 타이머도 일종의 인터럽트라고 할 수 있겠다. TimerOne라이브러리는 Timer1 타이머를 사용해 인터럽트를 구현토록 해준다.
TimerOne 라이브러리 설치
아두이노 메뉴 > 스케치 > 라이브러리 포함하기 > 라이브러리 매니저 에서 TimerOne 라이브러리를 검색 해 설치한다. 혹은 이곳에서 다운.
예제
/*
* 언제라도 버튼(핀7)누르면 즉시 불(핀13) 켜지는 회로
*/
#include <TimerOne.h>
void setup()
{
pinMode(7,INPUT_PULLUP);
Timer1.initialize(100000); // 1초마다 실행. in microseconds
Timer1.attachInterrupt(intFunction);
}
void loop(){
digitalWrite(13, LOW);
delay(1000);
}
void intFunction(){
if (digitalRead(7) == LOW){
digitalWrite(13,HIGH);
}
}
주의점
아두이노 서보 라이브러리가 Timer1을 사용하고있어 충돌이 일어날 수 있다. 그럴 땐 servo 라이브러리 대신 timer2를 사용하는 servotimer2 라이브러리를 사용해 충돌을 피하자.
ServoTimer2 사용하기 ServoTimer2 다운로드
아두이노 메가 등은 타이머가 총 6개 내장되어있고, 충돌을 피하기 위해 Timer3을 사용할 수 있다. TimerThree 라이브러리 다운로드
참고
한글자료: http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=lecture_pract&wr_id=12
라이브러리 문서: http://playground.arduino.cc/Code/Timer1