Mechanic 공방

13. 아두이노 LED 실습 (5) with Button module & Interrupt Pin 본문

아두이노 (Arduino)

13. 아두이노 LED 실습 (5) with Button module & Interrupt Pin

H-Mechanic 2020. 7. 29. 20:23
728x90
반응형

이번 포스팅에서는 저번 '아두이노 LED 실습 (4)'와 동일한 실습 과정을 'Interrupt' 기능을 사용하여 구현해보고자 한다.

 

'Interrupt'란 단어의 뜻 그대로 방해를 하는 것을 말한다.

 

어떠한 제어 로직이 진행 중일 때, 특정 신호를 인식하게 되면 해당 진행을 멈추고 특정 신호를 먼저 처리한 뒤 다시 진행을 재개하는 방식을 의미한다.

 

'Interrupt' 기능에 대한 보다 자세한 설명은 다음 포스팅에서 진행할 예정이며, 본 포스팅에서는 해당 기능을 사용하여 어떻게 동일한 동작을 구현시킬 수 있는지 설명해보고자 한다.

 

[회로 구성]

회로는 실습 (4)와 동일하다.

 

다만, 아두이노 우노 보드에서 제공하는 인터럽트 기능은 2개의 핀에서만 제공하기 때문에, 아래 회로도에서 제일 왼쪽의 초록색 LED는 아무런 역할을 하지 않는다.

[코드 설명]

#define Button1 2
#define Button2 3

#define LED1 9
#define LED2 10
#define LED3 11

bool status1 = false;
bool status2 = false;

void setup() {
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);

    pinMode(Button1, INPUT_PULLUP);
    pinMode(Button2, INPUT_PULLUP);

    attachInterrupt(0,LED1Interrupt,CHANGE);
    attachInterrupt(1,LED2Interrupt,CHANGE);
}

void loop() {
}

void LED1Interrupt() {
    delayMicroseconds(1000);
    if (status1 == false) {
        digitalWrite(LED1,HIGH);
        status1 = true;
    } else {
        digitalWrite(LED1,LOW);
        status1 = false;
    }
}

void LED2Interrupt() {
    delayMicroseconds(1000);
    if (status2 == false) {
        digitalWrite(LED2,HIGH);
        status2 = true;
    } else {
        digitalWrite(LED2,LOW);
        status2 = false;
    }
}

본 실습에서는 이전 실습과 동일한 회로도를 가지고 코드만 다른 방식으로 작성하여 동일한 동작을 구현하는 것을 목표로 하였다.

 

실습 (4)의 코드는 반복문을 사용하여 모든 경우에 대한 경우의 수를 나누어 놓고 각 경우가 맞을 경우 LED의 작동 방식을 작성하였다면, 이번 실습에서는 아두이노에서 제공하는 Interrupt 기능을 사용하여 보다 간결한 코드를 작성해보았다.

 

아두이노 우노에는 Interrupt 기능을 수행할 수 있는 핀이 2개로 고정되어 있다.

 

D2번과 D3번 핀만 그 기능을 수행할 수 있기 때문에, 해당 기능을 이용하고자 하면 반드시 2,3번 핀만을 사용해야 한다.

 

Interrupt 기능을 사용하기 위해서는attachInterrupt()라는 함수를 사용해야 한다.

 

이 함수는 3가지 요소를 포함하고 있으며, 첫번째 요소는 사용하고자 하는 Interrupt의 번호를 지정하는 변수이다.

 

아두이노 우노에서는 2개의 핀만 Interrupt 기능을 수행할 수 있도록 고정되어 있기 때문에 2번 핀의 경우 Interrupt 0, 3번 핀의 경우 Interrupt 1번으로 지정해주면 된다.

 

두 번째 요소는 해당 인터럽트 핀에 신호가 인식되면 수행할 인터럽트 함수 이름이다.

 

마지막 요소는 해당 인터럽트 핀의 신호 인식 방식을 결정하는 변수이다.

 

본 코드에서는 신호가 변화할 때마다 구현하기 위하여 ‘CHANGE’라는 구문을 사용하였다.

 

인터럽트 기능을 사용할 때에는 코드의 loop() 부분에는 아무런 내용이 없어도 된다.

 

스위치가 눌릴 때마다 연결된 인터럽트 함수가 자동으로 호출되기 때문에, 해당 함수 내부에 LEDon/off 동작 수행 코드를 넣어주면 된다.

 

위 코드 중 LED1Interrupt()와 LED2Interrupt() 함수를 보게 되면, 먼저 LEDon/off 상태를 판단한 뒤 LED가 켜져 있었던 상태에서는 LED를 꺼버리고 반대로 꺼져있던 상태에서는 켜도록 되어있다.

 

특이한 점은 코드의 시작 부분에 delayMicroseconds(1000)의 구문이 들어가 있는데, 이는 인터럽트의 특성상 불특정한 신호를 받아들여 오작동을 일으킬 수 있기 때문이다.

 

따라서 delay 구문을 사용하여 매 인터럽트 함수 실행 시 일정 시간 지연 후 특정 구문을 실행시킬 수 있다.

 

위 코드를 정상적으로 업로드하였다면 아래와 같은 동작을 보일 것이다.

 

[동작 영상]

 

이번 포스팅에서는 Interrupt 핀을 사용하여 LED + Button module 실습을 진행해보았다.

 

다음 포스팅에서는 Interrupt 기능에 대하여 좀 더 자세히 설명해보고자 한다.

728x90
반응형