산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

1개의 인터럽트를 사용하는 10개의 버튼

구성품 및 소모품

Arduino UNO
또는 기타 마이크로컨트롤러
× 1
브레드보드(일반)
× 1
점퍼 와이어(일반)
× 21
촉각 스위치, 상단 작동
크거나 작은 모든 버튼
× 10

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

소개

인터럽트는 편리합니다. 때때로 코드를 더 간단하게 만드는 것 외에도 정확한 타이밍을 위해 또는 Arduino를 절전 모드에서 깨우는 데 사용할 수 있습니다.

예를 들어 배터리로 작동하는 원격 컨트롤러와 같은 사용자 인터페이스가 있다고 가정해 보겠습니다. 전력을 절약하기 위해 Arduino(또는 독립 실행형 ATmega)를 절전 모드로 전환할 수 있습니다. Arduino가 전원 차단 모드에 들어가면 외부 인터럽트에 의해서만 깨어날 수 있습니다. Arduino Uno에 사용되는 ATmega328P 칩에는 외부 핀 인터럽트가 두 개뿐입니다. (INT0INT1 핀 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

    제조공정

    1. Arduino만 사용하는 DTMF 디코더
    2. Arduino를 사용하여 모니터 Ambilight 만들기
    3. ARDUINO를 사용하는 초음파 부상 기계
    4. Arduino와 스마트폰을 사용한 DIY 전압계
    5. IoT를 사용한 심박수 모니터
    6. Arduino Uno WiFi를 사용하는 WebServerBlink
    7. Arduino + Processing + PHP를 사용한 자동차 카운터
    8. arduino를 사용한 자동화된 Dino 게임
    9. Arduino 및 RDA8057M을 사용하는 FM 라디오
    10. BLUE_P:무선 Arduino 프로그래밍 실드