아두이노 기본실습 5 - 푸시버튼 스위치 실험

푸시버튼 스위치는 회로구성에 있어서 기본이 되는 전자부품으로 모터와 같은 장치들을 온/오프하는 용도로 많이 사용됩니다. 이 번 실험에서는 푸시버튼 스위치로 회로구성을 한 후 아두이노 프로그램으로 입력을 받아 LED를 온/오프하는 방법에 대해서 알아봅니다.

여러가지 종류의 푸시버튼 스위치가 있으나 가장 많이 사용되는 6MM 또는 12MM TACT SWITCH를 가지고 실험합니다.

아래는 6MM 푸시버튼 스위치 도면과 내부 결선도입니다.

외부회로를 구성할 때는 아래의 그림에서와 같이 첫번째 또는 두번째와 같은 방법으로 하여야 하며 세번째 방법으로는 동작하지 않으므로 주의하여야 합니다.

 

아날로그 스위치입력 실험

아래는 첫번째 실험을 위한 결선도입니다. 첫번째 실험에서는 아날로그 입력(A5)을 이용하여 스위치 입력을 받습니다. 여기서는 풀다운(PULL-DOWN) 저항(1K~10K옴 저항 사용)이 사용되며 풀다운은 스위치 입력이 없는 경우 입력이 0V(LOW LEVEL)이 유지되도록 하는 기능을 합니다.

스위치 입력을 받아 스위치를 누르는 동안만 LED가 ON되는 실험입니다. LED는 아두이노 우노보드위에 장착된 LED를 통해서 하며 이 LED는 디지털IO 13번과 연결되어 있습니다.

스위치를 누르지 않는 경우 아날로그 입력(A5)에는 0V가 입력되며 스위치를 누르면 5V가 입력으로 들어갑니다. 프로그램에서는 약 4.88V이상이면 스위치가 눌러진 것으로 판단하고 LED를 점등합니다.

 

소스코드1

아래는 소스코드1입니다. 아두이노 IDE에 붙여넣기 하여 컴파일하고 업로드해봅니다.

// 아두이노 푸시버튼 스위치 실험1
int led=13; //LED 디지털 IO핀 설정(우노보드에 장착된 LED)
void setup()
{
  pinMode(led,OUTPUT);//디지털IO를 출력으로 설정
}
void loop()
{
  int i;//변수 선언
  while(1)
  {
    i=analogRead(5);//A5 아날로그 입력으로부터 전압을 읽어옴
    if(i>1000)//전압값이 1000보다 크면(약 4.88V)
      digitalWrite(led,HIGH);//디지털IO 13번을 HIGH로 하여 LED 점등
    else
      digitalWrite(led,LOW);//디지털IO 13번을 LOW로 하여 LED 소등 
  }
}

위 프로그램에서는 analogRead()함수를 이용하여 아날로그 입력값을 읽어오며 0-5V의 전압값을 0-1023(8비트)의 값으로 읽어옵니다. 따라서 프로그램에서는 1000이상의 값을 스위치가 눌러진 것으로 판단하고 이는 전압으로 환산하면 약 4.88V가 됩니다.

입력전압의 범위를 다른 전압으로 바꾸고자 하는 경우에는 analogReference()를 함수를 사용하면 됩니다.

 

디지털 스위치입력 실험

아래는 디지털방식으로 스위치의 입력을 받은 실험입니다. 이 번에는 스위치 입력을 받아 다른 방법으로 LED를 점등해봅니다. 앞서 실험에서의 스위치 입력핀을 디지털IO 3번으로 변경합니다.

스위치를 한번 누르면 LED가 점등하고 다시 스위치를 누르면 LED가 소등합니다. 

 

소스코드2

아래는 소스코드2입니다. 아두이노 IDE에 붙여넣기 하여 컴파일하고 업로드해봅니다.

// 아두이노 푸시버튼 스위치 실험2
int Button=3; //디지털 IO 3번핀에 스위치 연결
int LED=13; //LED 디지털 IO핀 설정(우노보드에 장착된 LED)
boolean onoff=LOW; //LED 점등상태 저장
void setup()
{
  pinMode(Button,INPUT); //버튼은 입력으로 설정
  pinMode(LED,OUTPUT); //LED는 출력으로 설정
}
void loop(){
  if(digitalRead(Button)==LOW)  //상승 엣지 검출(먼저 초기에 LOW레벨 여부 확인, 버튼 누르기 전)
  {
    delay(10); //10ms 딜레이
    if(digitalRead(Button)==HIGH) //HIGH레벨 여부 확인 (버튼이 눌러진 상태)
    {
      digitalWrite(LED,onoff);  //LED에 LED점등상태값 출력
      onoff=(!onoff); //LED점등상태를 바꿈(LOW->HIGH or HIGH->LOW0
      delay(10);  //10ms 딜레이
      while(digitalRead(Button)==HIGH) //버튼이 떨어질 때까지 대기
      {
        delay(1);
      }
    }
  }
}