본문 바로가기

아두이노

아두이노 : External Interrupt

이번 글에서는 지난번 설명했던 인터럽트를

아두이노에서 어떻게 구현하는지 보여드리도록 할게요.

 

아두이노 레퍼런스에 나와있는 External Interrupt를 바탕으로 구현해보겠습니다.

 

우선 인터럽트를 어떻게 구현할 것이냐면요.

 

1) LED_GREEN(초록색 LED은 1초 간격으로 깜빡인다.

2) 스위치 버튼을 누르는 동안 LED_RED(빨간색 LED)가 켜진다.

 

이렇게 2 가지 LED가 깜빡이도록 프로그램을 짜는데

초록색 LED는 loop() 함수 안에서 구현을 하고

빨간색 LED는 External Interrupt로 구현할 거예요.

 

이렇게 구현하기 위해서 우선 어떤 아두이노의 핀을 사용할지 정해야 해요.

 

정리해보자면 우리가 사용해야 할 핀은 총 3가지가 됩니다.

 

1. LED_GREEN과 연결할 핀 - Digital Out

2. LED_RED와 연결할 핀 - Digital Out

3. 스위치 버튼과 연결할 핀 - Digital In + External Interrrupt

 

그럼 이제 LED와 스위치를 어디에 연결할지 결정하기 위해 핀 맵을 살펴볼게요.

 

 

 

 

위에 그림은 아두이노 핀 맵이에요.

 

위에 빨간 박스로 표시한 부분이 External Interrupt로 사용 가능한 핀입니다.

Pin 번호 2번과 3번 핀 2개가 가능하네요.

 

저는 External Interrupt로 2번 핀을 사용할 거예요.

그리고 LED_RED는 8번 LED_GREEN은 9번을 사용하겠습니다.

 

자 이제 필요한 재료 설명하겠습니다.

 

1. LED : 초록색 1개, 빨간색 2개

2. 저항 : 2개(LED와 함께 배선할 저항입니다)

3. 스위치 : 버튼식 스위치 1개

4. 브레드보드 : 작은 브레드보드도 충분할 거 같아요.

5. 배선용 전선 : 적당한 길이로 6가닥 정도 필요하겠습니다.

 

그럼 이제 배선도를 보면서 설명할게요!

 

 

자! 우선 배선부터 설명을 하자면,

 

1. 아두이노의 GND와 브레드보드 (-)를 연결합니다.

2. 스위치의 한쪽은 아두이노 2번 핀에 그리고 반대편은 GND에 연결합니다.

3. LED_RED의 (+)는 아두이노 8번 핀에 LED_GREEN의 (+)는 아두이노 9번 핀에 연결합니다.

4. 두 LED의 (-)는 각각 저항을 통해 GND와 연결되도록 해주세요.

 

이렇게 연결했다면 이제 코드를 작성합니다.

 

 

const byte LED_RED = 8;
const byte LED_GREEN = 9;
const byte SWITCH = 2;
int blinktime = 1000;

void setup() {
  // put your setup code here, to run once:
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_RED, OUTPUT);
  
  // External Interrupt로 사용할 핀 모드를 설정합니다.
  pinMode(SWITCH, INPUT_PULLUP);
  
  // External Interrupt를 설정합니다.
  // ISR 이름은 LED_RED_ISR로 하였습니다.
  attachInterrupt(digitalPinToInterrupt(SWITCH), LED_RED_ISR, CHANGE);
}

void loop() {
  // put your main code here, to run repeatedly:
  
  // LED_RED는 인터럽트로 제어하기 때문에 여기에는
  // LED_RED에 관한 코드가 없습니다.
  
  // LED_GREEN이 1초 간격으로 깜빡입니다.
  digitalWrite(LED_GREEN, HIGH);
  delay(blinktime);
  digitalWrite(LED_GREEN, LOW);
  delay(blinktime);
}

void LED_RED_ISR() {
  // ISR에서 사용되는 변수에 volatile을 붙이는 경우는
  // 전역변수로 사용되어 loop()내에서 사용됨과 동시에 
  // ISR에서 사용될 때 volatile을 붙여줍니다.
  
  // 이 변수는 ISR함수 내에서만 사용되기 때문에
  // volatile을 붙이지 않아도 됩니다.
  byte state=LOW;
  
  state=!digitalRead(SWITCH);
  digitalWrite(LED_RED, state);
}

 

ISR함수 LED_RED_ISR()에서

 

state=!digitalRead(SWITCH);

 

위와 같이 코드를 짠 이유는 SWITCH 핀을 PullUp으로 설정했기 때문이에요.

PullUp 상태이기 때문에 SWITCH 핀의 전압은 오픈된 상태에서 V(+)로 HIGH이고,

스위치가 눌려지면 전압이 GND(-)로 떨어지면서 LOW가 되기 때문입니다.

 

그럼 여기까지 External Interrupt 구현이었습니다.

끝으로 테스트 영상 올리면서 마무리할게요.

 

감사합니다!!

 

 

 

'아두이노' 카테고리의 다른 글

아두이노 : 자료형 앞에 volatile을 붙이는 이유  (0) 2020.02.08
아두이노 : 인터럽트란?  (0) 2020.02.02