아두이노 레시피

아두이노 레시피 : 버튼(Switch) - 기초편

arduinochef 2025. 2. 27. 15:49

# Recipe 19. 버튼 정복하기 시리즈 : 풀업 저항

기초 중의 기초! 버튼(스위치), 제대로 알고 있나요?

photo by Alex @ AEQ-WEB

안녕하세요~ 아두이노 셰프입니다! 요즘 제가 개인적인 일들 때문에 일주일간 포스팅을 못했네요..ㅠㅠ 앞으로 더 열심히 하겠습니다! 한 동안 주방을 비웠었는데, 별일 없으셨죠? 각자의 코딩주방에서 요리하고 계실 거라 생각이 드는데, 이제 메인셰프가 돌아왔으니 새로 시작해 볼까요?ㅎㅎ 이번 주도 기초 편을 다루려고 합니다. 저번에는 OUTPUT의 기초인 LED를 다뤄봤다면, 이번에는 INPUT의 기초를 다뤄보려고 해요. 그 주인공은 바로 버튼! 버튼이 쉬운데도, 생각보다 어려워하는 친구들이 많더라고요. 버튼을 이용한 가벼운 프로젝트로 이 재료를 완전히 여러 분 걸로 만들어보죠.

오늘은 그 첫 번째 시간, ‘풀업 저항’; ‘Pull-up Resistor’입니다.

오늘의 재료 Ingredient


<메인 재료>

택트 스위치 (모델명 : DM626)

<그 외 재료>

아두이노 우노

브레드보드

4.7kΩ 저항(1개)

수-수 케이블(5개)


메이킹 방법 Steps

시작하기 전에, 만약 여러분에게 스위치가 주어지고 그냥 연결하라고 한다면 어떻게 연결하시겠어요?

아마 이렇게 연결하실 것 같아요.

그렇다면 스위치가 제대로 동작하는지 테스트해 볼까요?

a. 택트스위치를 브레드보드에 연결해 주세요.

b. 택트스위치의 한쪽 다리를 아두이노의 GND에 연결해 주세요.

c. 택트스위치의 반대쪽 다리를 아두이노의 D2번에 연결해 주세요.

 

void setup(){
  Serial.begin(9600);
  pinMode(2,INPUT);
}
void loop(){
  Serial.println(digitalRead(2));
  delay(100);
}

● 코드를 업로드해 주세요.

● 시리얼모니터를 열어서 디지털신호가 어떻게 들어오는지 확인해 주세요.

 


실제 동작시켜 보니 어떤가요?
신호가 멋대로 바뀌지는 않나요?

분명 누르지도 않았는데, 1이 들어왔다가
또 0이 들어왔다가... 아주 난리일 거예요.

이제, 제대로 스위치를 연결해 보죠.

Step 1. 선 연결하기 Wiring

a. 택트스위치를 브레드보드에 그림처럼 연결해 줍니다.

b. 택트스위치의 다리 한쪽은 아두이노의 GND에 연결해 주세요.

c. 택트스위치의 반대쪽 다리는 저항을 이용해서 아두이노의 5v와 연결해 주세요.

d. 저항이 있는 택트스위치 다리와 아두이노의 D2번 핀을 연결해 주세요.

(조금 헷갈리신가요? 그림을 참고해 주세요! )

- - - - - - - - - -

Step 2. 아두이노 코드 Code review

여러분의 요리가 훨씬 간편해질 수 있도록, 숙성이 필요한 코드는 언제나 제가 준비할게요ㅎㅎ

일단 제대로 동작하는지 알아야 하니, 신호를 확인해 보죠.

void setup(){
  Serial.begin(9600);
  pinMode(2,INPUT);
}
void loop(){
  Serial.println(digitalRead(2));
  delay(100);
}

간단히 if문을 이용해서 신호에 따라 빌트인 LED를 켜볼게요. 

void setup(){
  Serial.begin(9600);
  pinMode(2,INPUT);
  pinMode(13,OUTPUT);
}
void loop(){
  int pull_up = digitalRead(2);
  if(pull_up == 0){
    digitalWrite(13,HIGH);
  }
  
  digitalWrite(13,LOW);
}

Step 3. 동작시키기 Working

● 코드를 아두이노 우노에 업로드해 주세요.

● 디지털신호가 알맞게 들어오나요? 또 LED가 스위치를 누르는 대로만 켜지나요?


코드의 동작 알고리즘

알고리즘은 쉬운 말로 ‘진행절차’라고 할 수 있습니다.

코드가 어떻게 동작되는지 알아볼까요?

오늘의 알고리즘은 너무 단순하죠?

첫 번째 코드는

단순히 D2번 핀에서 읽은 디지털 신호를 시리얼모니터로 출력했을 뿐이고,

두 번째 코드는

첫 번째 코드에 if문을 추가해서 신호가 0일 때, LED를 켜고 아니면 껐을 뿐이에요.

(이 부분이 이해가 되지 않는다면, LED기초 편을 참고해 주세요!)


과학으로 양념하기” Seasoning

스위치 및 회로 원리

오랜만에 돌아온 과학양념 시간입니다ㅋ

일단 먼저, 스위치의 구조부터 살펴볼게요.

다리가 4개여서 "어떻게 연결해야지?"

당황하셨을 분들을 위해서요ㅎㅎ

photo by 에듀이노

우리가 사용한 스위치는 저런 구조를 가졌어요.

그래서 저희가 a와 b에 각각 연결한 거랍니다~!

자 이제 본론으로 다시 넘어가죠.

사실 여러분이 궁금한 것은 코드원리가 아니라

"스위치를 왜 저렇게 연결해야 해?"일 거예요.

이걸 이해하려면 '임피던스'라는 개념을 알아야 하는데요.

아주 쉽게 설명하면, 저항도와 같은 개념이에요.

단, 그냥 저항이라는 뜻은 아니고

저항도는 저 항도인데

주파수에 따라 저항도가 달라지는 것을 임피던스라고 부릅니다.

아두이노의 모든 I/0핀들은 모두 저항도가 있는, 임피던스 상태인데

이게 주파수의 영향을 받다 보니까, 주변의 작은 정전기, 자기장 등에 영향을 받아요.

그러니까 주변환경의 영향으로 그냥 놔두면, 미세하지만 저항도가 계속 바뀐다는 뜻입니다.

즉, 들어오는 신호가 항상 0인 상태가 아니라는 뜻이죠.

디지털신호는 정도의 상관없이 조금이라도 전기가 흐르면 1이잖아요.

그래서 이 임피던스 때문에 그냥 놔둬도 1이 된답니다.....

저희가 처음에 잘못 연결한 예제를 해봤잖아요.

난 분명 스위치와 5V만 연결했고,

누르기 전에는 분명 전기가 통하지 않아야 하는데

시리얼모니터는 불규칙적으로 1일 표시됐었죠?

이게 바로 임피던스 때문에 그래요.

그런데 이런 현상은 '신호'라는 측면에서 정말 최악이거든요.

그렇잖아요. 내가 누르지도 않았는데, 누른 것으로 인식하는 거니까.

그래서 이를 해결하기 위해서

'풀업저항'이라는 회로가 필요합니다!

풀 업 저항(Pull-up Resistor) 회로

풀-업, pull-up

뜻만 보면 뭔가를 끌어올린다는 표현인데요.

전기를 끌어올린다는 얘기입니다.ㅋㅋ

단순하게 얘기하면,

"스위치를 누르기 전까지는

신호핀을 5v와 연결해서 항상 신호 1을 출력하겠다"는 의미예요.

그럼 임피던스 때문에 값이 계속 변할 수가 없겠죠?

전기신호가 계속 일정하게 들어오니까요.

그리고 스위치를 누르면,

자연스럽게 GND와 연결되면서 신호는 0이 출력됩니다.

(전류는 저항도가 낮은 쪽으로 흐르니까요!)

이렇게 연결하면

평상시 연결이 안 되어 있을 때는

연결한 5v 때문에 '1'이 계속 출력되고

스위치를 누를 때에만, '0'을 출력하겠죠?

이게 바로 풀업 저항 회로입니다!

신호를 올바르게 받을 수 있도록 해주죠.

뭔가 버튼하나에도 여러 과학원리가 숨어있죠?ㅋㅋㅋㅋ

에구.. 어렵네요.

이런 자세한 원리를 알면 좋겠지만

몰라도 괜찮아요

'버튼을 연결할 때는 풀업저항으로 연결해야 해'만 기억하면 돼요.

풀업저항 말고도, 풀 다운 저항도 있는데요.

다음 시간에 다뤄볼게요~~!