제조공정
| × | 1 | ||||
| × | 1 | ||||
| × | 21 | ||||
| × | 10 |
|
소개
인터럽트는 편리합니다. 때때로 코드를 더 간단하게 만드는 것 외에도 정확한 타이밍을 위해 또는 Arduino를 절전 모드에서 깨우는 데 사용할 수 있습니다.
예를 들어 배터리로 작동하는 원격 컨트롤러와 같은 사용자 인터페이스가 있다고 가정해 보겠습니다. 전력을 절약하기 위해 Arduino(또는 독립 실행형 ATmega)를 절전 모드로 전환할 수 있습니다. Arduino가 전원 차단 모드에 들어가면 외부 인터럽트에 의해서만 깨어날 수 있습니다. Arduino Uno에 사용되는 ATmega328P 칩에는 외부 핀 인터럽트가 두 개뿐입니다. (INT0
및 INT1
핀 2와 3) 사용자 인터페이스에는 2개 이상의 버튼이 있을 가능성이 높기 때문에 문제입니다.
표준 해결 방법
이것은 모든 버튼을 정상적으로 연결하는 것이지만 다이오드가 있는 인터럽트 핀에도 연결하는 것입니다. 그러나 이것은 회로를 상당히 복잡하게 만듭니다.
표준 외부 인터럽트 외에도 ATmega328P에는 핀 변경 인터럽트도 있습니다. 이를 처리할 라이브러리가 있으며 이 문제에 대한 좋은 솔루션입니다.
그러나 프로그래밍 대회에서 추가 전기 부품 없이 표준 외부 인터럽트를 사용하여 이 작업을 수행하는 방법을 알아냈습니다.
회로
버튼이 몇 개 있습니다. 나는 내 브레드 보드에 잘 맞는 10 개를 사용했습니다. (나도 더 이상 가지고 있지 않습니다.) 핀당 하나의 버튼을 가질 수 있습니다. 즉, Uno에는 최대 20개, Mega에는 최대 70개를 의미합니다! (실제로 70개의 버튼이 필요한 경우 멀티플렉싱을 사용하는 것이 좋습니다. 전체 메가는 필요하지 않습니다.)
각 버튼에는 임의의 핀에 연결된 한 쪽이 있습니다. (내 경우에는 4-13) 모든 버튼의 다른 쪽은 단일 인터럽트 가능 핀에 함께 연결되어 있습니다. (내 경우에는 2개)
코드
코드는 아래에 첨부되어 있습니다. 이 예제를 작동시키려면 보드에 업로드하십시오. 직렬 모니터를 엽니다. 버튼을 누르면 해당 번호가 나타납니다. 보시다시피 루프 기능은 전혀 사용하지 않습니다.
어떻게 작동합니까?
분명히 인터럽트가 있습니다. 제 경우에는 핀 2에 연결되어 있습니다. FALLING
으로 구성되어 있습니다. .
다이오드 사용을 피하기 위해 Arduino는 즉시 회로를 다시 배선합니다. 두 가지 가능한 구성이 있습니다. 공통 모드 및 고유 모드 .
공통 모드
대부분의 경우 회로는 공통 모드에 있습니다. 인터럽트 핀은 INPUT_PULLUP
로 구성됩니다. 나머지는 OUTPUT
입니다. 및 낮음
.
configureCommon() { pinMode(commonPin, INPUT_PULLUP); for (int i =0; i
공통 모드에서 아무 버튼이나 누르면 인터럽트 핀이 아래로 당겨지고 인터럽트가 발생합니다. 그런 일이 발생하면 인터럽트 서비스 루틴이 핀을 고유 모드로 재구성합니다.
고유 모드
인터럽트가 트리거되면 빠르게 고유 모드로 전환합니다.
고유 모드는 공통 모드의 반대입니다. 인터럽트 핀은 OUTPUT
입니다. 및 낮음
나머지는 INPUT_PULLUP
입니다. .
configureDistinct() { pinMode(commonPin, OUTPUT); digitalWrite(공통핀, 낮음); for (int i =0; i
고유 모드에서는 실제로 눌러진 버튼에 해당하는 핀만 풀다운됩니다. 모든 핀을 쉽게 살펴보고 어떤 핀이 인터럽트를 발생시켰는지 알 수 있습니다.
완료되면 Arduino는 공통 모드로 다시 전환하고 다른 인터럽트를 기다릴 수 있습니다. 또는 애플리케이션에 따라 고유 모드를 유지하고 평소와 같이 사용자 입력을 처리하여 Arduino가 절전 모드로 전환되기 전에 공통 모드로 다시 전환할 수 있습니다.
더 복잡한 예
좀 더 복잡한 것을 시도해 보겠습니다. 서보를 연결하고 각 버튼을 다른 각도로 매핑합니다. (1=0°, 2=20°... 10=120°) 또한 몇 개의 배터리로 Arduino에 전원을 공급할 것입니다.
이 예에서는 전력을 절약하기 위해 5초 동안 활동이 없으면 Arduino를 전원 끄기 모드로 전환합니다. 절전 모드에 대한 자습서는 온라인에서 찾을 수 있습니다. 그 외에도 트랜지스터를 통해 서보에 전원을 공급하여 사용하지 않을 때는 셧다운합니다.
이 예제의 코드도 아래에 첨부되어 있습니다.
<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드"> 코드
<울> 시리얼 로거
절전 모드가 있는 서보
직렬 로거Arduino
<사전> const int commonPin =2;const int buttonPins[] ={4,5,6,7,8,9,10,11,12,13}; unsigned long lastFire =0;void setup() { configureCommon( ); // 인터럽트를 위한 핀 설정 attachInterrupt(digitalPinToInterrupt(commonPin), pressInterrupt, FALLING); Serial.begin(9600);}void loop() { // 비어 있음!}void pressInterrupt() { // ISR if (millis() - lastFire <200) { // 디바운스 return; } 마지막 발사 =밀리(); 구성 구별(); // 개별 버튼을 테스트하기 위한 설정 핀 for (int i =0; i 절전 모드가 있는 서보Arduino
#include #include #include const int commonPin =2;const int buttonPins[] ={4,5,6,7,8 ,9,10,11,12,13};const int servoEnablePin =A1;const int servoPin =A0;Servo servo;unsigned long lastFire =0;int status =0;void setup() { pinMode(commonPin, INPUT_PULLUP); 구성 공통(); attachInterrupt(digitalPinToInterrupt(commonPin), pressInterrupt, FALLING); 서보.부착(서보핀); pinMode(servoEnablePin, OUTPUT);} 무효 루프() { if (millis()-lastFire> 5000) { digitalWrite(servoEnablePin, LOW); set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); 절전 모드(); } 지연(10);} 무효 pressInterrupt() { sleep_disable(); power_all_enable(); if (millis()-lastFire <200) { 반환; } 마지막 발사 =밀리(); 구성 구별(); for (int i=0;i 회로도
multiinterrupt_hoF76Oc4T5.fzz 서보_with_sleep_u9ZqxF0jhY.fzz
제조공정
-
Arduino Yun을 사용한 초음파 지도 작성기
구성품 및 소모품 Arduino 윤 × 1 초음파 센서 × 1 서보(타워 프로 MG996R) × 1 점퍼 와이어(일반) × 10 앱 및 온라인 서비스 Arduino IDE MATLAB 이 프로젝트 정보 1단계:이론 이 프로젝트에서는 초음파 거리 센서를 사용하고 있습니다. 사람이 들을 수 없는 범위의 음파를 생성하고 이 음파가 장애물에 부딪치고 되돌아오는 데 필요한 시간을 계산하여 거
-
Arduino 튜토리얼 02:버튼과 PWM
Arduino 자습서 시리즈의 두 번째 Arduino 자습서에 오신 것을 환영합니다. 이 튜토리얼에서는 디지털 입력 및 출력 핀이 작동하는 방식을 배우고 버튼과 LED를 사용하여 몇 가지 예를 만들 것입니다. 또한 PWM(Pulse Width Modulation)이 무엇인지 배우고 PWM을 사용하여 LED 밝기를 제어하는 예를 만듭니다. 이것은 따라하기 쉬운 단계별 비디오 자습서입니다. 또한 동영상 아래에서 이 튜토리얼에 필요한 부품과 동영상의 예제 소스 코드를 찾을 수 있습니다. 이 가이드에 필요한 구성요소 Ardui