이번 글에서는 지난번 설명했던 인터럽트를
아두이노에서 어떻게 구현하는지 보여드리도록 할게요.
아두이노 레퍼런스에 나와있는 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 |