안녕하세요 오늘은 아두이노 외부인터럽트에 대해 알아보겠습니다
일단 아두이노에서 Loop()에서 코드가 무한히 반복되고있습니다
이러한 반복되는 도중에 인터럽트핀에 입력을 받으면 어떠한 함수가 실행되는 것을 외부인터럽트라고 합니다
예를들어
Loop() 반복중 -> 외부인터럽트걸림 -> 외부인터럽트함수실행(이때 Loop은 동작안합니다) -> Loop 반복
이러한 입력을 받을수 있는 외부인터럽트핀은 어떤것을 사용하라고 보드마다 정해져 있습니다
보드 | 인터럽트에 쓸 수 있는 디지털 핀 |
---|---|
우노, 나노, 미니 기타 328-기반 | 2, 3 |
메가, 메가2560, 메가ADK | 2, 3, 18, 19, 20, 21 |
Micro, Leonardo, other 32u4-based | 0, 1, 2, 3, 7 |
제로 | all digital pins, except 4 |
MKR Family boards | 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
두에 | all digital pins |
101 | all digital pins (Only pins 2, 5, 7, 8, 10, 11, 12, 13 work with CHANGE) |
문법
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);
mode
: 인터럽트가 언제 트리거 되야하는지 정의함. 4개 상수는 타당한 값으로 미리 정의 됨:
- LOW : 핀이 LOW일때
- CHANGE : LOW->HIGH or HIGH->LOW로 변할 때
- RISING : LOW ->HIGH일때
- FALLING : HIGH -> LOW일때
- HIGH : 핀이 HIGH일때
예제로는 mode가 LOW일때를 사용해 테스트 해보겠습니다
int Testnum;
void setup() {
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), Exint, LOW);
Serial.begin(9600);
Testnum = 0;
}
void loop() {
Testnum++;
Serial.print("Testnum:");
Serial.println(Testnum);
delay(100);
}
void Exint() {
Serial.println("Interruput ON");
}
위의 동영상을 보면 loop문을 돌다가 (TestNum이 증가하는 것을 보고 알수있음)
외부인터럽트가 걸리니(2번핀,GND에 버튼을 연결)
외부인터럽트함수가 실행되고 (Interruput ON출력)
버튼을 때니 다시 TestNum이 증가하는 것을 볼 수 있습니다.
여기서 버튼을 안눌렀을때는 2번핀이 1이여서 인터럽트가 안걸리고 버튼을 누르면 0으로 변해서 인터럽트가 걸린 모습입니다