Arduino의 올바른 버튼 연결. Arduino에 버튼 연결하기

그리고 아두이노여기서도 예외는 아닙니다. LED가 깜박인 후 버튼을 연결하고 이를 사용하여 바로 이 LED의 깜박임을 제어하려고 합니다. 여기에는 특별히 복잡한 것은 없지만 "접촉 바운스"라는 뉘앙스가 하나 있습니다. 버튼을 올바르게 연결하는 방법 아두이노"접촉 바운스"가 무엇인지, 이 효과가 어떻게 나타나는지, 그리고 이를 방지하는 방법이 오늘 논의될 것입니다.

버튼을 마이크로 컨트롤러에 연결하는 가장 간단한 다이어그램은 다음과 같습니다.

열쇠라면 에스 1열려 있는 경우(버튼이 해제된 경우) 디지털 입력에서 디에마이크로 컨트롤러의 전압은 논리 전압에 해당하는 5V입니다. 버튼을 누르면 입력됩니다. 디에논리적 0 레벨에 해당하는 접지에 연결되며 모든 전압은 저항기를 통해 떨어집니다. R 1, 버튼을 눌렀을 때 너무 많은 양이 흐르지 않는다는 사실을 기반으로 값이 선택됩니다. 고전류(보통 약 10~100kOhm).

디지털 입력과 접지 사이에 버튼만 연결하면(저항 없이) R 1, +5V에 연결됨) 또는 입력과 +5V 사이에 있는 경우 버튼을 누르지 않은 위치에서 정의되지 않은 전압이 마이크로 컨트롤러의 디지털 입력에 표시됩니다(레벨 0 또는 1에 해당할 수 있음). 우리는 무작위 상태를 읽을 것입니다. 그러므로 저항을 사용한다. R 1, 이는 버튼을 놓으면 입력을 +5V로 "풀업"한다고 합니다.

상태 읽기 디지털 입력마이크로 컨트롤러를 사용하면 버튼이 눌렸는지(논리 상태 0) 여부(입력에서 논리적 상태를 받게 됨)를 확인할 수 있습니다.

버튼을 연결하기 아두이노

마이크로컨트롤러 아트멜 AVR ATmega (그것을 토대로 만들어졌습니다. 아두이노) 소프트웨어로 연결된 부하 저항이 내장되어 있습니다. Rn 20kOhm이며 연결 다이어그램을 단순화하여 사용할 수 있습니다.


내부 부하 저항은 포트의 필수 비트에 논리 저항을 기록하여 연결됩니다.

스케치 예 아두이노, 내부 부하 저항을 사용하여 두 번째 핀에 연결된 버튼을 누르거나 떼는지 여부에 따라 핀 13의 내장 LED를 켜고 끕니다.

void setup() ( pinMode(13, OUTPUT); //핀 13의 LED pinMode(2, INPUT); //핀 2개가 입력 모드입니다. 버튼이 접지에 연결되어 있습니다. digitalWrite(2, HIGH); // 풀업 저항 연결 ) void loop() ( digitalWrite(13, !digitalRead(2)); // 버튼 상태를 읽고 LED 전환 )

여기서는 부울을 사용하여 입력 포트에서 읽은 값을 반전시킵니다. 아니다, 표시 느낌표기능 전에 디지털읽기, 버튼을 누르면 0이 읽혀지고, 포트의 LED를 켜려면 1을 보내야 합니다.

연락처 반송

버튼이 완벽한 이상적인 세상에 산다면 모든 것이 괜찮을 것입니다. 버튼에 있는 실제 기계적 접점은 즉시 닫히거나 열리지 않습니다. 짧은 시간 동안 키(버튼)의 접점이 반복적으로 닫히고 열리므로 단일 전압 강하가 아니라 전체 펄스 패킷이 마이크로 컨트롤러의 입력에서 수신됩니다. 이 현상을 '접촉 바운스'라고 합니다.

위의 예에서는 단순히 버튼을 사용하여 LED를 켜고 끌 때 이를 눈치채지 못했습니다. "바운싱"되는 순간 LED 켜기/끄기가 매우 빠르게 발생했고 단순히 버튼으로 이를 볼 수 없었기 때문입니다. 눈.

이 라이브러리에는 다음 메서드가 포함되어 있습니다.

  • 되튐()— 바운스 객체의 초기화
  • 무효 간격(부호 없는 긴 간격)— 반송 방지 시간을 밀리초 단위로 설정합니다.
  • 무효 부착(int 핀)— 버튼이 연결된 핀을 설정하고 내장 풀업 저항을 이 핀에 연결합니다.
  • 정수 업데이트()- 때문에 되튐을 사용하지 않으면 객체의 상태를 읽기 전에 객체를 "업데이트"하고 있으며 이 작업은 지속적으로 수행되어야 합니다(예: 내부 고리). 방법 업데이트 객체를 업데이트하고 반환합니다. 진실(1) 핀의 상태가 변경된 경우(버튼을 눌렀거나 반대로 놓음) 거짓(0) 그렇지 않은 경우. 메소드 호출 업데이트 내부에 고리한 번만 수행하면 됩니다.
  • 정수 읽기()— 핀의 업데이트된 상태를 반환합니다.

기본적으로 Bounce 라이브러리는 안정화 간격( 안정된 간격) 바운스 방지를 구현합니다. 이는 이해하기 쉽고 채팅 기간을 알 필요가 없습니다.


매개변수 안정된 간격바운스 라이브러리

결정한

#BOUNCE_LOCK-OUT 정의

#BOUNCE_LOCK-OUT 정의

파일에 바운스.h켜질 수 있다 대체 방법잡담에 맞서 싸우다. 이 방법을 사용하면 버튼 상태 변화에 더 빠르게 반응할 수 있지만 바운스 기간을 설정해야 하며 위에서 언급한 것처럼 이 값은 시간이 지남에 따라 증가하므로 버튼을 변경해야 합니다. 코드를 작성하거나 의도적으로 더 큰 값을 설정하십시오.


다음은 이 라이브러리를 사용하는 예입니다.

#포함하다 바운스 경비원 = 바운스(); //바운스 클래스의 인스턴스 생성 void setup() ( pinMode(2 ,INPUT); // 핀 2의 버튼 digitalWrite(2 ,HIGH); // 내장 풀업 저항기 바운서 연결 .attach(2 ); // 바운서 버튼을 설치합니다. Interval(5); // stable 간격 = 5ms로 설정합니다. Serial.begin(9600); // 직렬 포트를 9600bps로 설정합니다. void loop() ( if (bouncer. update()) ( // 이벤트가 발생하는 경우 if (bouncer.read()==0) ( //버튼을 누른 경우 Serial.println("pressed"); //누른 경우 메시지 표시 ) else Serial. println("released"); //해제에 대한 메시지를 표시합니다.)

#포함하다

바운스 경비원 = 바운스 () ; //Bounce 클래스의 인스턴스 생성

무효 설정()

핀모드(2, INPUT); // 핀 2의 버튼

디지털쓰기(2, HIGH); // 내장 풀업 저항 연결

경비원. 첨부(2); // 버튼 설정

경비원. 간격(5); // 매개변수 안정 간격을 5ms로 설정합니다.

연속물. 시작(9600); //직렬 포트를 9600bps로 설정

무효 루프()

if (바운서 . 업데이트 () )

{ //이벤트가 발생한 경우

if (bouncer .read () == 0 )

필요할 것이예요

  • 아두이노;
  • 재치 버튼;
  • 저항 10kΩ;
  • 빵판;
  • 연결 전선.

1 종류버튼

버튼은 다르지만 모두 동일한 기능을 수행합니다. 즉, 전기 접촉을 보장하기 위해 도체를 물리적으로 연결(또는 반대로 끊기)합니다. 가장 간단한 경우에는 두 개의 도체를 연결하는 것입니다. 연결하는 버튼이 있습니다. 많은 분량지휘자.

일부 버튼은 (를 누른 후에도 전선이 연결된 상태로 유지됩니다. 잠금 버튼), 다른 사람들은 해제 후 즉시 회로를 엽니다( 잠기지 않는 버튼).

버튼은 다음과 같이 나뉩니다.

  • 평상시 열려 있음,
  • 평상시 닫혀 있음.
첫 번째는 누르면 회로가 닫히고 두 번째는 회로가 열립니다.

요즘에는 버튼 유형이 "택트 버튼". 시계 - "촉각"이라는 단어가 아니라 "촉각"이라는 단어에서 나온 것입니다. 손가락에 압력이 잘 느껴집니다. 하지만 이 잘못된 용어는 정립되었고 이제 이 버튼은 어디에서나 그렇게 불립니다. 누르면 닫히는 버튼입니다. 전기 회로, 그리고 놓으면 열립니다. 즉, 이 버튼은 걸쇠가 없는 일반적으로 열려 있는 버튼입니다.

2 울리는콘택트 렌즈

버튼은 인간과 기술 사이의 더 나은 상호 작용을 제공하는 매우 간단하고 유용한 발명품입니다. 그러나 자연의 모든 것과 마찬가지로 이상적인 것은 아닙니다. 이것은 버튼을 누를 때와 놓을 때 소위라는 사실에서 나타납니다. "바운스"를 영어로. 이는 안정된 상태를 가정하기 전에 짧은 시간(몇 밀리초 정도) 동안 버튼 상태를 여러 번 전환하는 것입니다. 이러한 바람직하지 않은 현상은 버튼 재질의 탄력성 또는 재질의 변형으로 인해 버튼을 전환할 때 발생합니다. 전기적 접촉마이크로스파크



다음 기사에서는 연락처를 닫고 열 때 "바운싱"을 방지하는 방법을 자세히 살펴보겠습니다. 그동안 버튼을 Arduino에 연결하는 옵션을 살펴보겠습니다.

3 잘못된 연결버튼

일반적으로 열린 시계 버튼을 Arduino에 연결하려면 다음을 수행하십시오. 간단한 방법으로: 버튼의 자유 도체 중 하나를 전원 또는 접지에 연결하고 다른 하나는 디지털에 연결합니다. 아두이노 핀. 그러나 일반적으로 말하면 이것은 잘못된 것입니다. 사실 버튼이 닫히지 않은 순간 Arduino 디지털 출력에 전자기 간섭이 나타나며 이로 인해 오탐이 발생할 수 있습니다.



간섭을 피하기 위해 디지털 핀은 일반적으로 상당히 큰 저항기(10kΩ)를 통해 접지 또는 전원에 연결됩니다. 첫 번째 경우에는 다음과 같이 호출됩니다. "풀업 저항이 있는 회로", 두 번째 - "풀다운 저항이 있는 회로". 각각을 살펴보겠습니다.

4 버튼 연결풀업 저항이 있는 회로에 따르면

먼저 접속해보자 아두이노 버튼풀업 저항을 사용하는 회로에 따라. 이렇게 하려면 버튼의 한 접점을 접지에 연결하고 두 번째 접점을 디지털 출력 "2"에 연결합니다. 디지털 출력 "2"도 10kOhm 저항을 통해 +5V 공급 장치에 연결됩니다.



버튼 클릭을 처리하고 Arduino에 업로드하기 위해 이와 같은 스케치를 작성해 보겠습니다.

// 핀 번호를 설정합니다: const int ButtonPin = 2; const int ledPin = 13; 무효 설정() ( pinMode(led핀, OUTPUT); pinMode(buttonPin, INPUT); } 무효 루프() ( int ButtonState = digitalRead(buttonPin); // 버튼 상태를 읽습니다. if (buttonState == HIGH) ( digitalWrite(ledPin, HIGH); // 버튼을 누르면 LED가 켜집니다.) else ( digitalWrite(ledPin, LOW); // LED가 꺼집니다. 버튼을 놓았을 때) }

핀 "13"에 내장된 LED는 버튼을 누를 때까지 계속 켜져 있습니다. 저것들. Arduino의 포트 "2"에는 항상 높은 논리 레벨 HIGH가 있습니다. 버튼을 누르면 포트 "2"의 전압이 LOW가 되고 LED가 꺼집니다.

5 버튼 연결풀다운 저항을 사용하는 방식에 따라

이제 풀다운 저항을 사용하여 회로를 조립해 보겠습니다. 버튼의 한 접점을 +5V 전원 공급 장치에 연결하고 두 번째 접점을 디지털 출력 "2"에 연결합니다. 10kOhm 저항을 통해 디지털 출력 "2"를 접지에 연결합니다. 우리는 스케치를 변경하지 않을 것입니다.



Arduino의 디지털 포트 "2"에서 회로를 켤 때 낮은 수준 LOW이고 LED가 켜지지 않습니다. 버튼을 누르면 포트 "2"가 수신합니다. 높은 레벨 HIGH이고 LED가 켜집니다.

이 예에서는 버튼을 Arduino 컨트롤러에 연결하는 방법을 살펴보겠습니다. 버튼을 누르면 내장된 LED가 켜집니다. 다수 아두이노 보드출력 13(핀 13)에 연결된 내장형 SMT LED가 있습니다.

필수 구성 요소

  • 아두이노 컨트롤러
  • 재치 버튼
  • 10kΩ 저항
  • 핀 브레드보드
  • 연결 전선

연결

전원 출력(5V)과 접지(Gnd)를 각각 빨간색과 검은색 와이어로 브레드보드에 연결합니다. 일반적으로 브레드보드는 그림과 같이 전원 및 접지용으로 가장 바깥쪽 핀 행을 사용합니다. 세 번째 파란색 와이어를 사용하여 Arduino 컨트롤러의 디지털 핀 2를 시계 버튼 핀에 연결합니다. 동일한 접점 또는 4핀 설계로 영구적으로 연결된 접점에 10kOhm 풀업 저항을 연결하고 이 저항을 접지에 연결합니다. 버튼의 다른 출력을 5V 전원 공급 장치에 연결합니다.

시계 버튼을 누르지 않으면 출력 2는 풀업 저항을 통해 접지에만 연결되고 이 입력은 LOW로 표시됩니다. 그리고 버튼을 누르면 입력 2와 5V 전원 사이에 접점이 나타나 판독됩니다.

참고: 대부분의 경우 택트 버튼에는 연결 그림에 표시된 것처럼 각 측면에 두 개의 접점이 있습니다. 동시에 버튼의 모양은 거의 정사각형입니다. 연결할 때 어떤 접점이 연결되어 있고 어떤 접점을 눌렀을 때 닫히는지 혼동하지 않는 것이 중요합니다. 확실하지 않으면 버튼을 누르는 것이 가장 좋습니다.

첫 번째 프로그램은 버튼을 사용하여 LED를 제어해야 합니다.

  • 버튼을 누르면 LED가 켜집니다.
  • 버튼을 눌러도 LED가 켜지지 않습니다.

Arduino 보드에 버튼과 LED를 연결합니다.

연락하려면 외부 요소 V 아두이노 컨트롤러 UNO에는 14개의 디지털 핀이 있습니다. 각 핀은 프로그램에 의해 입력 또는 출력으로 정의될 수 있습니다.

디지털 출력에는 높음과 낮음의 두 가지 상태만 있습니다. 높은 상태는 약 5V의 출력 전압에 해당하고, 낮은 상태는 0V에 해당합니다. 출력을 통해 최대 40mA의 전류로 부하를 연결할 수 있습니다.

핀이 입력으로 정의되면 해당 상태를 읽어 입력의 전압 레벨을 확인할 수 있습니다. 5V에 가까운 전압(실제로는 3V 이상)에서는 HIGH 상수에 해당하는 높은 상태가 판독됩니다. 전압이 0에 가까우면(1.5V 미만) 낮은 상태 또는 LOW 상수가 읽혀집니다.

LED를 핀에 연결하여 출력으로 정의해야 하며, 버튼은 입력 모드로 핀에 연결됩니다.

LED는 전류 제한 저항을 통해 연결됩니다. 다음은 일반적인 다이어그램입니다.

저항은 LED / R의 I = Uoutput – Udrop 공식을 사용하여 계산됩니다.

Uoutput = 5V, LED의 Udrop은 1.5V와 동일하게 간주될 수 있습니다(참조 도서에 더 정확하게 표시됨). 우리 회로에서 LED를 통과하는 전류는 10mA로 설정되어 있습니다.

아무 핀이나 선택할 수 있지만 연결의 용이성을 위해 보드에 장착된 LED를 사용하는 것이 좋습니다. 첫 번째 테스트 예에서 깜박인 것과 동일합니다. 디지털 핀 13에 연결됩니다. 이 경우 보드에 추가 LED를 연결할 필요가 없습니다.

버튼을 다른 핀(예: 12)에 연결합니다. 버튼 연결 회로의 하드웨어는 버튼을 눌렀을 때 0V, 버튼을 눌렀을 때 5V의 전압 레벨을 제공해야 합니다. 이는 간단한 다이어그램으로 수행할 수 있습니다.



버튼을 누르면 저항이 출력에서 ​​5V를 생성하고, 누르면 입력이 접지로 단락됩니다. 버튼에 대한 마지막 강의에서 저항 선택에 대한 권장 사항을 작성하겠습니다. 이제 다른 옵션을 제안하겠습니다. 보드의 모든 핀에는 컨트롤러 내부에 5V에 연결된 저항기가 있습니다. 핀에서 소프트웨어를 활성화하거나 비활성화할 수 있습니다. 이 저항기의 저항은 약 20-50kOhm입니다. 너무 많아서 실제 회로, 그러나 우리 프로그램과 컨트롤러 근처에 설치된 버튼의 경우 상당히 허용됩니다.

결과적으로 연결 다이어그램은 다음과 같습니다.



버튼은 커넥터의 전선에 납땜될 수 있습니다. 납땜하지 않고 브레드보드에 설치했습니다. 수업 시연용으로 특별히 구매했습니다.


I/O 제어 기능.

디지털 출력으로 작업하기 위해 Arduino 시스템에는 3가지 내장 기능이 있습니다. 출력 모드를 설정하거나, 출력을 읽거나, 특정 상태로 설정할 수 있습니다. 핀의 상태를 결정하기 위해 이러한 함수는 높은 신호 레벨과 낮은 신호 레벨에 해당하는 상수 HIGH 및 LOW를 사용합니다.

pinMode(핀, 모드)

출력 모드(입력 또는 출력)를 설정합니다.

인수: pin 및 모드.

  • 핀 – 핀 번호;
  • 모드 – 출력 모드.

이 함수는 아무것도 반환하지 않습니다.

digitalWrite(핀, 값)

출력 상태(높음 또는 낮음)를 설정합니다.

인수 핀 및 값:

  • 핀 – 핀 번호;
  • 값 – 출력 상태.

이 함수는 아무것도 반환하지 않습니다.

디지털읽기(핀)

입력 상태를 읽습니다.

인수: pin - 핀 번호.

로그인 상태를 반환합니다.

디지털읽기(핀) = 낮음 낮은 입력 레벨
디지털읽기(핀) = 높음 높은 입력 레벨

LED 제어 프로그램.

이전 수업을 고려하여 이제 우리는 모든 것을 가지고 있습니다. 필요한 정보프로그램을 작성합니다. Arduino 프로그램은 setup()과 loop라는 두 가지 함수로 구성됩니다. setup()에서 핀 모드를 설정하고, loop()에서 버튼 상태를 ButtonState 변수로 읽어 LED에 전달합니다. 우리는 길을 따라 반전하기 때문에 버튼을 누르면 신호 상태가 낮고 높을 때 LED가 켜집니다.

/* 프로그램 scetch_5_1 레슨 5
*/

부울 버튼상태; // 전역 변수 버튼 상태 생성

무효 설정() (
핀모드(13, 출력); //

}

// 끝없는 순환
무효 루프() (



}

보관용 중간값버튼의 상태에 대해 부울 유형의 버튼 상태 변수를 만듭니다. 이것 부울 유형데이터. 변수는 true 또는 false 두 가지 값 중 하나를 취할 수 있습니다. 우리의 경우에는 LED가 켜지고 켜지지 않습니다.

프로그램 코드를 창에 복사하거나 다시 작성하십시오. 아두이노 IDE. 컨트롤러에 다운로드하여 확인하세요.

Arduino 프로젝트를 저장하기 위해 d:\Arduino Projects\Lessons\Lesson5 폴더를 만들었습니다. 제가 scetch_5_1, scetch_5_2라고 부르는 프로그램의 각 레슨에서 동일한 작업을 수행하거나 자신만의 파일 저장 시스템을 입력할 수 있습니다.

프로그램 블록:

버튼상태 = digitalRead(12); // 입력 12(버튼)의 상태를 읽고 ButtonState에 씁니다.
버튼상태 = ! 버튼상태; // ButtonState 변수의 반전
digitalWrite(13, 버튼상태); // ButtonState의 상태를 출력 13(LED)에 씁니다.

중간 ButtonState 변수를 사용하지 않고 작성할 수 있습니다.

digitalWrite(13, !digitalRead(12));

digitalWrite() 함수에 대한 인수는 digitalRead() 함수입니다. 멋진 스타일이것이 바로 옵션입니다. 추가 변수가 필요하지 않으며 텍스트도 적습니다.

저것들. 함수는 다른 함수의 인수로 사용될 수 있습니다. 함수는 함수에서 호출될 수 있습니다.

동일한 프로그램의 다른 버전을 사용하여 조건부 연산자만약에.

/* 프로그램 scetch_5_2 레슨 5
버튼(핀 12)을 누르면 LED(핀 13)가 켜집니다. */

무효 설정() (
핀모드(13, 출력); // 핀 13(LED)을 출력으로 정의
핀모드(12, INPUT_PULLUP); // 핀 12(버튼)을 입력으로 정의
}

// 끝없는 순환
무효 루프() (
if (digitalRead(12) == LOW) digitalWrite(13, HIGH);
그렇지 않으면 digitalWrite(13, LOW);
}

안에 끝없는 루프 12번 핀(버튼)의 상태를 확인하여 로우(LOW)이면 13번 핀(LED)에 하이 상태(HIGH)가 형성됩니다. 그렇지 않으면 LED 상태가 LOW입니다.

#define 지시어입니다.

I/O 함수에 대한 모든 예에서 핀 번호를 결정하는 핀 인수를 다음 형식으로 지정했습니다. 특정 번호- 상수. 상수 12는 버튼의 핀 번호이고 13은 LED의 핀 번호라는 것을 기억했습니다. 상징적인 이름으로 작업하는 것이 훨씬 더 편리합니다. 이를 위해 C 언어에는 식별자를 상수 및 표현식과 연결하는 지시문이 있습니다.

#define 지시문은 프로그램 텍스트에 나타날 때마다 식별자와 식별자를 대체하는 문자 시퀀스를 정의합니다.

안에 일반적인 견해그것은 다음과 같습니다

#이름 정의 문자_시퀀스

우리 프로그램에서 다음과 같이 작성하면:

#LED_PIN 13 정의 //

그러면 프로그램에서 LED_PIN이라는 이름이 나타날 때마다 변환 중에 기호 13이 해당 이름으로 대체됩니다. LED를 켜는 기능은 다음과 같습니다.

디지털쓰기(LED_PIN, HIGH);

#define을 사용한 최종 프로그램입니다.

/* 5과 프로그램
버튼(핀 12)을 누르면 LED(핀 13)가 켜집니다. */

#LED_PIN 13 정의 // LED 핀 번호는 13입니다.
#define BUTTON_PIN 12 // 버튼 핀 번호는 12 입니다

무효 설정() (
핀모드(LED_PIN, OUTPUT); // 핀 13(LED)을 출력으로 정의
pinMode(BUTTON_PIN, INPUT_PULLUP); // 핀 12(버튼)을 입력으로 정의
}

// 끝없는 순환
무효 루프() (
digitalWrite(LED_PIN, !digitalRead(BUTTON_PIN));
}

#define 지시문 뒤에는 의사 연산자이므로 세미콜론이 없습니다. 그는 아무런 조치도 취하지 않습니다. 지시문은 상수를 지정하므로 구분 기호(밑줄)를 사용하여 대문자로 이름을 작성하는 것이 일반적입니다.

다음 강의에서는 버튼 채터를 다루고, 프로그램을 블록으로 나누고, 블록 간의 통신 인터페이스를 만들어 보겠습니다.



질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: