본문 바로가기

컴퓨터

ARDUINO [강의 2강] 택트 스위치

1. 개요

택트 스위치(Tactile Switch)는 우리가 주변에서 흔히 보는 '눌렀다 떼는' 버튼입니다.

아두이노에게 "지금 눌렀어(1)" 또는 "안 눌렀어(0)"라는 디지털 신호를 보내는 가장 기본적인 디지털 입력 센서입니다.

 

원리는 스위치 내부에는 떨어져 있는 두 금속판이 있습니다. 버튼을 누르면 두 금속판이 붙으면서 전기가 통하는 단순한 구조입니다.

2. 하드웨어 구조

학생들이 가장 먼저 헷갈려 하는 것이 "선생님, 다리가 4개인데 어디에 연결해요?"입니다.

내부 구조:

4개의 다리가 모두 따로따로가 아닙니다. "스위치의 다리는 4개지만 실제로는 2개씩 한 쌍입니다."

버튼을 뒤집어 보면 몸통을 관통해서 마주 보고 있는 다리끼리는 서로 연결되어 있으니 주의해야 합니다.

가장 안전한 방법은 대각선 방향의 다리 두 개를 사용하는 것입니다.

3. 핵심 이론: 플로팅(Floating) , 풀다운(Pull-down), 풀업(Pull-up)

문제 상황 (플로팅 현상)

 

스위치를 그냥 선으로만 연결하고 코드를 짜 후에 업로드하면 버튼을 안 눌렀는데도 0과 1이(불이 켜졌다, 꺼졌다) 미친 듯이 왔다 갔다 합니다.

 

 

핀이 연결되지 않은 상태(버튼을 안 누른 상태)에서는 공기 중의 정전기나 잡음 때문에 전압이 둥둥 떠다니기 때문입니다. 이것을 '유령 신호(Floating)'라고 합니다.

const int buttonPin = 7;  // 버튼은 7번 핀
const int ledPin = 13;    // 내장 LED는 13번 핀

int buttonState = 0;      // 버튼 상태를 저장할 변수 (그릇)

void setup() {
  pinMode(ledPin, OUTPUT);  // LED는 출력 (보여주는 것)
  pinMode(buttonPin, INPUT); // 버튼은 입력 (읽는 것)
  Serial.begin(9600);       // 상태 확인용 시리얼 통신
}

void loop() {
  // 1. 버튼 상태 읽기
  buttonState = digitalRead(buttonPin);

  // 2. 상태 확인 (디버깅)
  // 버튼을 누르면 1, 안 누르면 0이 나오는지 시리얼 모니터로 보세요.
  Serial.println(buttonState); 

  // 3. 조건문 (만약 ~라면)
  if (buttonState == HIGH) { 
    // 버튼이 눌렸다면 (HIGH = 1)
    digitalWrite(ledPin, HIGH); // LED 켜기
  } 
  else {
    // 버튼이 안 눌렸다면 (LOW = 0)
    digitalWrite(ledPin, LOW);  // LED 끄기
  }
}
 

4. 해결책: 풀다운(Pull-down) 연결하기

 
  1. 버튼 꽂기: 브레드보드 가운데 홈을 가로질러 버튼을 꽂습니다.
  2. 전원 연결 (5V): 버튼의 한쪽 다리에 아두이노 5V를 연결합니다.
  3. 신호선 연결 (입력): 버튼의 반대쪽 다리에서 선을 뽑아 아두이노 7번 핀에 연결합니다.
  4. 저항 연결 (GND): 3번에서 연결한 다리(7번 핀과 연결된 다리)**와 같은 줄에 10kΩ 저항을 꽂고, 저항의 반대쪽을 GND에 연결합니다.

 

[전기의 흐름]

안 눌렀을 때: 7번 핀은 저항을 통해 GND와 연결됨 ➡ LOW (0)

눌렀을 때: 5V 전기가 강하게 흘러 들어와 7번 핀으로 감 ➡ HIGH (1) (저항 쪽으로도 일부 흐르지만 7번 핀으로 가는 신호가 우선됨)

5. 또 다른 해결책 풀업(Pull-up)

이 유령 신호를 없애려면 저항을 달아서 전압을 꽉 잡아줘야 합니다. 하지만 저항 다는 것이 복잡해서 풀업 저항을 사용해 보겠습니다.

여러분, 저항을 직접 달지 마세요.

아두이노 칩 안에는 이미 숨겨진 저항이 들어있답니다.

우리는 코드로 이 기능을 켜기만 하면 돼요.

이걸 '내부 풀업(Input Pull-up)'이라고 합니다."

가장 간단하고, 배선 실수가 적으며, 부품도 절약되는 '배선법'입니다.

한쪽 다리: 아두이노 GND에 연결

반대쪽 다리: 아두이노 **디지털 핀(예: 7번)**에 연결

끝! (5V 전원선은 연결하지 않습니다. GND와 신호선만 있으면 됩니다.)

 

 

내부 풀업을 사용하면 논리가 반대가 됩니다.

스위치 안 누름 (평소): 내부 저항 덕분에 5V와 연결됨 HIGH (1)

스위치 누름 (작동): GND와 연결되어 0V가 됨 LOW (0)

const int BUTTON_PIN = 7; // 버튼 연결 핀
const int LED_PIN = 13;   // 내장 LED

void setup() {
  Serial.begin(9600); // 시리얼 모니터로 확인하기 위해
  
  // [핵심] INPUT이 아니라 INPUT_PULLUP으로 설정!
  pinMode(BUTTON_PIN, INPUT_PULLUP); 
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  // 버튼 상태 읽기
  int buttonState = digitalRead(BUTTON_PIN);

  // [중요] 풀업 모드에서는 눌렀을 때가 LOW(0)입니다!
  if (buttonState == LOW) { 
    Serial.println("버튼 눌림!");
    digitalWrite(LED_PIN, HIGH); // LED 켜기
  } 
  else {
    Serial.println("버튼 안 눌림");
    digitalWrite(LED_PIN, LOW);  // LED 끄기
  }
  
  delay(10); // 약간의 대기 (안정성을 위해)
}
 

#아두이노 #택트스위치 #택트 

반응형