빠르게 움직이는 자동차를 생각해보십시오. 갑자기 반대 방향으로 다른 자동차에 부딪히면 가장 먼저 일어나는 일은 자동차에있는 가속도계 센서가 갑작스러운 감속을 감지하고 내부에있는 마이크로 컨트롤러에 외부 인터럽트를 트리거한다는 것입니다. 자동차. 그런 다음 그 인터럽트를 기반으로 마이크로 컨트롤러는 전기 신호를 생성하여 에어백을 즉시 배포합니다. 자동차에있는 마이크로 컨트롤러는 자동차 속도 감지, 다른 센서 확인, 에어컨 온도 제어 등과 같은 많은 것을 동시에 모니터링합니다. 그렇다면 몇 초 만에 에어백이 갑자기 열리는 이유는 무엇일까요? 대답은 인터럽트입니다. 여기에서는 우선 순위가 가장 높은 인터럽트 신호 가 사용됩니다.
인터럽트의 또 다른 간단한 예 는 "터치"감각에 가장 높은 우선 순위를 갖는 터치 스크린 휴대폰입니다. 거의 모든 전자 장치에는 일반 프로세스를 '중단'하고 특정 이벤트에 대해 더 높은 우선 순위를 수행하는 일종의 인터럽트가 있습니다. 인터럽트를 제공 한 후 정규 프로세스가 재개됩니다.
따라서 기술적으로 Interrupts는 I / O 또는 명령어가 프로세서의 정상적인 실행을 일시 중단하고 우선 순위가 더 높은 것처럼 자체적으로 서비스되는 메커니즘 입니다. 예를 들어, 정상 실행을 수행하는 프로세서는 ISR (Interrupt Service Routine)에있는 특정 프로세스를 실행하기 위해 일부 센서에 의해 중단 될 수 있습니다. ISR 프로세서를 실행 한 후 다시 정상 실행을 재개 할 수 있습니다.
인터럽트 유형
두 가지 유형의 인터럽트가 있습니다.
하드웨어 인터럽트: 외부 인터럽트 핀이 LOW에서 HIGH 또는 HIGH에서 LOW로 상태를 변경하는 것과 같은 외부 이벤트가 발생할 때 발생합니다.
소프트웨어 인터럽트: 소프트웨어 의 지시에 따라 발생합니다. 예를 들어 타이머 인터럽트는 소프트웨어 인터럽트 입니다.
Arduino의 인터럽트
이제 Arduino Board 에서 인터럽트 를 사용하는 방법을 살펴 보겠습니다. 두 가지 유형의 인터럽트가 있습니다.
- 외부 인터럽트
- 핀 변경 인터럽트
외부 인터럽트:
이러한 인터럽트는 하드웨어에 의해 해석되며 매우 빠릅니다. 이러한 인터럽트는 RISING 또는 FALLING 또는 LOW 레벨의 이벤트에서 트리거되도록 설정할 수 있습니다.
Arduino 보드 |
외부 인터럽트 핀: |
UNO, 나노 |
2,3 |
메가 |
2,3,18,19,20,21 |
핀 변경 인터럽트:
Arduino는 핀 변경 인터럽트 를 사용하여 더 많은 인터럽트 핀을 활성화 할 수 있습니다. ATmega168 / 328 기반 Arduino 보드에서는 모든 핀 또는 20 개의 신호 핀 모두를 인터럽트 핀으로 사용할 수 있습니다. RISING 또는 FALLING 에지를 사용하여 트리거 할 수도 있습니다.
Arduino에서 인터럽트 사용
Arduino에서 인터럽트를 사용하려면 다음 개념을 이해해야합니다.
ISR (인터럽트 서비스 루틴)
인터럽트 서비스 루틴 또는 인터럽트 핸들러는 작은 명령 세트가 포함 된 이벤트입니다. 외부 인터럽트가 발생하면 프로세서는 먼저 ISR에있는 이러한 코드를 실행하고 정상 실행을 종료 한 상태로 돌아갑니다.
ISR은 Arduino에서 다음 구문을 사용합니다.
attachInterrupt (digitalPinToInterrupt (핀), ISR, 모드);
digitalPinToInterrupt (pin): Arduino Uno, NANO에서 인터럽트에 사용되는 핀은 2,3 및 메가 2,3,18,19,20,21입니다. 여기에서 외부 인터럽트에 사용되는 입력 핀을 지정합니다.
ISR: 외부 인터럽트가 발생했을 때 호출되는 함수입니다.
모드: 트리거 할 전환 유형 (예: 하강, 상승 등)
- RISING: 핀이 LOW에서 HIGH로 이동할 때 인터럽트를 트리거합니다.
- FALLING: 핀이 HIGH에서 LOW로 이동할 때 인터럽트를 트리거합니다.
- CHANGE: 핀이 LOW에서 HIGH로 또는 HIGH에서 LOW로 전환 될 때 (즉, 핀 상태가 변경 될 때) 인터럽트를 트리거합니다.
인터럽트 사용 중 일부 조건
- 인터럽트 서비스 루틴 기능 (ISR)은 가능한 짧아야합니다.
- 지연 () 함수는 ISR 내에서 작동하지 않으므로 피해야합니다.
이 Arduino Interrupt 자습서 에서는 숫자가 0에서 증가하고 두 개의 푸시 버튼이 인터럽트를 트리거하는 데 사용되며 각각 D2 및 D3에 연결됩니다. LED는 인터럽트를 표시하는 데 사용됩니다. 누름 버튼 하나를 누르면 LED가 켜지고 디스플레이에 interrupt2가 표시되고 꺼지고 다른 누름 버튼을 누르면 LED가 꺼지고 디스플레이에 interrupt1이 표시되고 꺼집니다.
필요한 구성 요소
- Arduino Board (이 튜토리얼에서는 Arduino NANO가 사용됨)
- 푸시 버튼-2
- LED-1
- 저항기 (10K)-2
- LCD (16x2)-1
- 브레드 보드
- 전선 연결
회로도
Arduino Nano와 16x2 LCD 디스플레이 간의 회로 연결:
LCD |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
전위차계 센터 PIN으로 LCD 명암 조절용 |
RS |
D7 |
RW |
GND |
이자형 |
D8 |
D4 |
D9 |
D5 |
D10 |
D6 |
D11 |
D7 |
D12 |
ㅏ |
+ 5V |
케이 |
GND |
두 개의 푸시 버튼은 핀 D2 및 D3에서 Arduino Nano 에 연결됩니다. 두 개의 외부 인터럽트를 사용하는 데 사용됩니다. 하나는 LED를 켜고 다른 하나는 LED를 끄는 데 사용됩니다. 각 푸시 버튼에는 접지에 연결된 10k 의 풀다운 저항 이 있습니다. 따라서 누름 버튼을 누르면 로직 HIGH (1)가되고, 누르지 않으면 로직 LOW (0)가됩니다. 풀다운 저항은 필수입니다. 그렇지 않으면 입력 핀 D2 및 D3에 부동 값이 있습니다.
LED는 또한 인터럽트가 트리거 된 것을 나타 내기 위해서 (때문에) 사용 또는 버튼을 누르면되고있다.
Arduino 인터럽트 프로그래밍
이 자습서에서는 Arduino Nano에 연결된 (16x2) LCD에 연속적으로 표시되는 0부터 숫자가 증가합니다. 왼쪽 누름 버튼 (인터럽트 핀 D3)을 누를 때마다 LED가 켜지고 디스플레이에 Interrupt2가 표시되고 오른쪽 누름 버튼이 (인터럽트 핀 D2)를 누르면 LED가 꺼지고 디스플레이에 Interrupt1이 표시됩니다.
작동하는 비디오가 포함 된 완전한 코드는이 튜토리얼의 끝에 제공됩니다.
1. 먼저 LCD 디스플레이 용 헤더 파일 이 포함 된 다음 Arduino Nano와 연결하는 데 사용되는 LCD 핀이 정의됩니다.
#포함
2. void 설정 () 기능 내에서 먼저 LCD 디스플레이에 일부 인트로 메시지를 표시합니다. 여기에서 Arduino와 LCD 인터페이스에 대해 자세히 알아보십시오.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("ArduinoInterrupt"); 지연 (3000); lcd.clear ();
3. 그런 다음 동일한 void 설정 () 기능에서 입력 및 출력 핀을 지정해야합니다. 핀 D13은 LED의 Anode에 연결되므로이 핀은 출력으로 정의되어야합니다.
pinMode (13, OUTPUT);
4. 이제 프로그래밍에서 가장 중요한 부분은 attachInterrupt () function 이며 void setup () 안에 포함되어 있습니다.
attachInterrupt (digitalPinToInterrupt (2), buttonPressed1, RISING); attachInterrupt (digitalPinToInterrupt (3), buttonPressed2, RISING);
여기서 핀 2는 외부 인터럽트 용으로 지정되어 있으며 D2 핀에 RISING (LOW에서 HIGH)이있을 때 buttonPressed1 함수가 호출됩니다. 그리고 3 번 핀은 외부 인터럽트 용이고 D3 핀에 RISING이있을 때 buttonPressed2 함수가 호출됩니다.
5. void loop () 안에서 숫자 (i)가 0부터 증가하여 LCD (16x2)에 인쇄됩니다.
lcd.clear (); lcd.print ("카운터:"); lcd.print (i); ++ i; 지연 (1000);
동일한 void loop ()에서 digitalWrite () 는 LED의 양극이 연결된 핀 D13에 사용됩니다. 가변 출력 의 값에 따라 LED가 켜지거나 꺼집니다.
digitalWrite (13, 출력);
6. 가장 중요한 부분은 attachInterrupt () 함수 에서 사용하는 이름에 따라 인터럽트 핸들러 함수를 만드는 것입니다.
두 개의 인터럽트 핀이 2와 3을 사용하므로 두 개의 ISR이 필요합니다. 이 프로그래밍에서는 ISR에 따른
buttonPressed1 ():
void buttonPressed1 () { output = LOW; lcd.setCursor (0,1); lcd.print ("인터럽트 1"); }
이 기능은 핀 D2의 푸시 버튼을 누르면 실행됩니다 (RISING EDGE). 이 기능은 출력 상태를 LOW로 변경하여 LED를 끄고 LCD 디스플레이에 "interrupt1"을 인쇄합니다.
buttonPressed2 ():
void buttonPressed2 () {출력 = HIGH; lcd.setCursor (0,1); lcd.print ("인터럽트 2"); }
이 기능은 핀 D3의 누름 버튼을 누르면 실행됩니다. 이 기능은 출력 상태를 HIGH로 변경하여 LED를 켜고 LCD 디스플레이에 "interrupt2"를 인쇄합니다.
Arduino 인터럽트 데모
1. 왼쪽의 PUSH BUTTON을 누르면 LED가 켜지고 LCD에 Interrupt2가 표시됩니다.
2. 오른쪽의 PUSH BUTTON을 누르면 LED가 꺼지고 LCD에 Interrupt1이 표시됩니다.
이것은 인터럽트가 정상적인 실행 사이에 중요한 작업을 트리거하는 데 유용 할 수있는 방법입니다.