아두이노에서 인터럽트를 사용하는 방법과 그 예제에 대해서 알아본다. '스케치로 시작하는 아두이노 프로그래밍' 이라는 서적에서 발췌한 내용이다.
인터럽트
큰 프로그램을 작성하던 프로그래머들은 아두이노가 한 번에 하나의 작업만 수행 할 수 있다는 점 때문에 실망하기도 한다. 프로그램에서 여러 개의 쓰레드를 동시에 실행하고 싶은 프로그래머라면 아쉬움이 클 것이다. 몇몇 개발자가 여러 쓰레드를 동시에 실행할 수 있는 프로젝트를 개발하기는 했지만 아두이노를 사용하는 일반적인 상황에서는 이 기능이 필요하지 않은 경우가 대부분이다.
아두이노에서는 이 기능과 가장 유사한 대안으로 인터럽트를 사용할 수 있다.
아두이노 보드의 핀 중에서 D2 핀과 D3 핀에는 인터럽트 기능을 설정할 수 있다. 다시 말해서, 이 핀들을 입력 핀으로 설정한 후 이 핀들을 통해 지정된 인터럽트 신호가 수신되면, 아두이노 프로세서가 수행 중이던 작업을 멈추고 해당 인터럽트에 연결된 함수를 실행하게 된다.
그대로 따라하기
아래 예제는 LED 를 점멸시키다가 인터럽트가 수신되면 점멸 간격을 변경한다. D2 핀과 GND 를 점퍼선으로 연결한 후 내장 풀업 저항을 통해 대부분의 시간 동안 인터럽트를 HIGH 상태로 유지하여 인터럽트를 시뮬레이션할 수 있다.
int interruptPin = 2; int ledPin = 13; int period = 500; void setup() { pinMode(ledPin, OUTPUT); pinMode(interruptPin, INPUT); digitalWrite(interruptPin, HIGH); // 풀업 attachInterrupt(0, goFast, FALLING); } void loop() { digitalWrite(ledPin, HIGH); delay(period); digitalWrite(ledPin, LOW); delay(period); } void goFast() { period = 100; }
다음은 위 소스코드에서 setup 함수에서 가장 핵심이 되는 구문이다.
'attachInterrupt(0, goFast, FALLING);'
첫번째 인수는 두 개의 인터럽트 중 사용할 인터럽트를 지정한다. 조금 혼란스럽겠지만, 여기서 0은 핀 2를 사용 중이라는 의미이고, 1은 핀 3을 사용 중이라는 의미이다.
두번째 인수는 인터럽트가 발생했을 때 호출할 함수의 이름이며, 마지막 인수는 'CHANGE, RISING 및 FALLING' 이라는 세 가지 상수 중 하나이다. 아래 그림에서 이 옵션들에 해당하는 인터럽트 모드를 그래프로 볼 수 있다.
인터럽트 모드가 CHANGE 이면, 0 에서 1 로 변경되는 RISING 이나 1 에서 0 으로 변경되는 FALLING 을 사용하여 인터럽트를 발생시킬 수 있다.
인터럽트를 사용하지 않으려면 noInterrupts 함수를 사용한다. 이 함수는 두 인터럽트 채널의 모든 인터럽트를 중지시킨다. 나중에 interrupts 함수를 호출하면 인터럽트를 다시 사용할 수 있다.