3D프린터와 아두이노/아두이노

풀업, 풀다운과 플로팅 (택트 스위치 연결 실습)

메카럽 2020. 9. 15. 09:12

안녕하세요. 메카럽입니다.

이번 포스팅에서는 아두이노에서 스위치를 활용한 풀업, 풀다운과 플로팅에 대해서 알아보려 합니다.

앞서 digitalWrite( ) 함수로 LED를 켜고 끄는 예제를 해보았습니다. 이번에는 외부의 스위치 입력에 따라 LED를 켜고 끄는 예제를 다뤄보고자 합니다. digitalWrite( ) 함수와 반대의 개념인 digitalRead( ) 함수는 LOW 또는 HIGH(0또는 1) 입력을 읽어 들이는 역할을 하며, 스위치에 연결하여 스위치의 켜짐과 꺼짐을 판단합니다.

택트 스위치 내부 구조

택트 스위치는 이러한 예제에 최적화된 스위치 중 하나입니다. 택트 스위치는 상부의 스위치 버튼과 함께 하부에 네 개의 핀을 갖고 있으며 네 개의 핀 중 한 면에 할당된 두 개의 핀(a-a)이 서로 연결되어 있고, 반대 면의 두 개의 핀(b-b)이 서로 연결되어 있습니다. 스위치가 눌러지면 각 면의 핀(a-b)들이 연결되는 방식입니다.

준비물 : 아두이노 우노, 점퍼선, 전원 USB, 택트 스위치

이 스위치를 아두이노로 가져와 보겠습니다. 다음은 스위치의 열림과 닫힘을 알기 위한 회로도입니다. D3 핀에 택트 스위치가 연결되어 있고, 반대편에 5V 전원이 연결되어 있습니다. 스위치가 닫히면 회로가 연결되어 D3 핀에는 5V가 인가됩니다. 즉 HIGH 신호로 판단하게 됩니다.

간략 회로
아두이노 우노- 스위치 연결회로

다음 코드는 택트 스위치로 인가되는 신호가 HIGH이면 시리얼 모니터에 "HIGH" 문자를 출력하고, LOW이면 시리얼 모니터에 "LOW" 문자를 출력하는 스케치입니다.

const int Switch = 3;
int buttonState = 0;


void setup( )
{
 Serial.begin(9600);
 pinMode(Switch, INPUT);
}

void loop( )
{
 buttonState=digitalRead(Switch);

if (buttonState==HIGH)
 {
  Serial.println("HIGH");
 }
else
 {
  Serial.println("LOW");
 }
]

택트 스위치를 누른 후(스위치 닫힘) 실행결과를 확인해보면, HIGH 문자가 출력되는 것을 확인할 수 있습니다.

실행결과 스위치 닫힘(좌) - 스위치 열림(우)

스위치를 다시 눌러 열림 상태로 만들면 어떨까? 회로를 살펴보면 스위치가 열린 상태에서 D3 핀은 그 어디에도 연결되어 있지 않습니다. 이는 회로에 아무것도 연결되지 않은 상태, 즉 0V나 LOW 상태가 아닌 개방(Open)된 상태임을 의미합니다. 이 상태에서는 주변회로의 전기적 흐름이나 정전기 등에 의해서 입력값이 HIGH나 LOW 그 어떤 임의의 값으로 바뀔 수 있는데, 이러한 상황을 플로팅상태라고 이야기합니다. 시리얼 모니터에서도 위 그림의 오른쪽과 같이 LOW와 HIGH, HIGH와 LOW를 복잡하게 오가며 일정하지 않은 값이 출력됩니다. 플로팅 상태에 있기 때문에 발생하는 현상으로, 불안정한 결과값이 보입니다.

플로팅에 대해서 조금 더 살표보겠습니다. 아래 그림은 전등을 켜기 위한 스위치의 상태를 나타내고 있는데, 여기에는 켜짐(ON)과 꺼짐(OFF) 두 가지밖에 존재하지 않습니다. 만약 스위치가 중간에 멈춰서면 어떻게 될까요? 이런 경우는 켜짐도 꺼짐도 아닌 상태가 될 수 있습니다. 이대는 전등이 켜질지 꺼질지 알기 어려운 상태입니다.

다시 말해서 1도 아니고 0도 아닌 애매모호한 상태를 말하는데, 이때 불안정한 값이 입력됩니다. 전기적으로 이런 상태와 유사한 것이 플로팅입니다. 사전적으로 "떠 있는 상태"의 의미가 있습니다. 이도 저도 아니므로 부르는 이름이며, 불확실성을 뜻하기도 합니다. 이는 회로의 작동 신뢰성과 연관되므로 불확실성을 최소화하기 위해 달아주는 것이 풀업, 풀다운입니다. 이들은 스위치가 중간에 멈추지 않도록 ON 상태와 OFF상태를 확실히 유지해주는 역할이라 보면 되겠습니다.

스위치 모델

 

728x90