플밍

아두이노 기초강좌 - 4. 버튼 입력받기 본문

프로그래밍/아두이노

아두이노 기초강좌 - 4. 버튼 입력받기

너구리안주 2015. 7. 18. 00:26


본 강좌는 지인의 사이트에서 허락받고 퍼온 강좌입니다.

다른곳으로 불펌하시면 곤란합니다.

그리고 제가 아두이노를 그리 잘 알지는 못합니다.

저한테 물어보시는것도 곤란.... ^^

#ads_1

버튼을 누르면 아두이노 2번핀으로 신호를 받아들이는 회로를 만들어 봅시다

 

버튼을 눌렀을때 5V (Volt)

버튼을 뗏을때 0V

 

이렇게 생각할 수 있겠죠?

 

그럼 5V의 전기를 어디서 끌어와 써야 하는데 SMPS나 어댑터가 없다면 곤란하겠죠?

아날로그 핀 위에 보시면 5V 출력핀이 있습니다.  이걸 쓰도록 하죠.

 

자 그럼 핀들을 어떻게 연결해야 할까요?

 

 





[그림 1]

 

 

회로는 이렇게 연결하시고

 

아두이노 프로그래밍을 아래와 같이 코딩해보죠

 

 

 #define BTN_PIN 2

 

 void setup() {

   Serial.begin(9600);

   pinMode(BTN_PIN, INPUT);

 }

 

 

 void loop() {

   int btn = digitalRead(BTN_PIN);

   Serial.println(btn);

   delay(100);

 }

 

 

일단 코드를 봅시다

 

Serial.begin(9600);

 

첨 보는게 나왔네요.

이건 시리얼통신을 위한 준비작업입니다.

아두이노 IDE 에서 상단 오른쪽에

 

  요 버튼을 클릭해보세요.

그럼 시리얼모니터라는 창이 뜹니다.

아두이노에서 PC로 보낸 데이타를 볼 수 있는 창입니다.

 

통신을 하기 위해서는 서로 통신속도를 정해줘야 합니다.

이걸 Baud rate (보율) 라고 부릅니다.

 

일단 우리는 기본값인 9600을 사용할 것이기 때문에

Serial.begin(9600) 이라고 코딩했습니다.

 

 

 

pinMode(BTN_PIN, INPUT);

 

앞장에선 LED에 출력을 하기 위해서 OUTPUT을 했었죠?

이번에는 입력을 받기 위해서 핀을 INPUT모드로 설정합니다.

BTN_PIN 은 버튼이 연결된 핀번호입니다

제일 상단에서 define 을 사용하여 2번으로 지정해 줬네요

 

int btn = digitalRead(BTN_PIN);

실제로 버튼으로 부터 입력을 받아서 btn이라는 변수에 저장합니다.

 

 

Serial.println(btn);

 

btn에 저장된 값을 시리얼을 통해 PC로 송신합니다.

println() 은 [값]에다가 [줄바꿈문자]를 추가하여 보냅니다

줄바꿈 문자를 추가하지 않으려면 print() 를 사용하면 됩니다.

 

그리고 delay() 함수로 0.1초 대기하고 다시 무한루프...

 

자 모든 준비가 다 되었네요

다시 회로를 봅시다.

 

5v ---> 스위치 --> 2번핀

 

이렇게 연결되었습니다.

중간에 스위치가 기본적으로 열려있을테고 누르면 도통해서 전기가 2번핀으로 들어가겠죠?

 

그럼 시리얼 모니터를 켜시고...

버튼을 눌러볼까요?

 

1 이라는 값이 계속 출력됩니다.

이젠 버튼을 떼봅시다.  0이 나오나요?

 

어랏?  0이 나오다가 1이 나오다가 지맘대로 동작하네요.

이게 무슨 일일까요?

 

생각대로라면 버튼을 뗏을때 도통이 안되어 0v의 전압이 들어오겠죠?

근데 사실 외부환경이나 기타 자연계의 여러이유로(그렇다고 합니다 ㅠㅠ) 깨끗한 0V가 아닌 미세한 전압이 영향을 주기 때문입니다.  이걸 전문용어로 플로팅되었다고 한다네요.  떳다는 말인거 같죠??  맞나??

 

자 여기서 우린 풀업저항, 풀다운저항이라는 두 용어를 만나게 됩니다.

플로팅을 막아주고 전압을 원하는대로 깨끗하게 해주는 회로입니다.

#ads_2

 

먼저 풀업저항을 보죠.

 

 

 


[그림 2]


먼저 검은색선(GND)를 빼고 봅시다.  저항을 통과하여 무조건 전압이 신호선으로 가해지겠죠?  (보통때 항상 전압이 가해지고 있다고 해서 풀업인가 봅니다.  저도 무식해서... ㅜㅜ)

 

이때 스위치를 닫게 되면 2번핀으로 가해지던 전압이 GND 쪽으로 가게 됩니다.  2번핀의 미세하게 입력되던 전압도 GND로 흐르게 되어 결국 2번핀은 깨끗한 0V가 됩니다.

 

그래서 스위치를 뗐을때는 전압이 가해져서 코드상으로 1이 나오게 되고 눌렀을때는 0V니까 코드상으로 0이 나오게 됩니다.

이게 풀업저항 회로입니다.  값이 반대라는거 꼭 기억하세요

 

 

풀다운 저항은 반대입니다.  보통때는 전압이 신호선으로 가해지지 않다가 눌렀을때 가해지는거죠.

 

[그림 3]



스위치가 열렸을때는 신호선으로는 0V이고 미세한 전압은 GND쪽으로 갑니다.

 

그리고 버튼이 눌러졌을때는 신호선으로 전압이 가해지게 됩니다.

풀업과는 다르게 보통때는 0 눌렀을때는 1입니다.

 

직관적으로 생각하면 풀다운을 많이 쓸거 같지만 실제로는 풀업저항을 더 많이 씁니다.

둘다 이해하기 힘드시면 풀업저항 하나만이라도 이해하셔야 합니다.

 

자 이제 시리얼 모니터를 켜고 버튼을 눌렀다 뗐다 반복해 보세요.

플로팅 없이 깨끗하게 신호가 출력되는걸 볼 수 있을겁니다.

 

근데 버튼 하나 연결 할때마다 이렇게 회로를 구성해야 하면 귀찮겠죠?

아두이노에는 놀라운 마법이 있습니다.

내부회로에 풀업저항이 이미 구성되어 있다는거죠.

 

다시 [그림 1]처럼 저항없이 바로 연결해 봅시다.

 

그리고 작성된 코드의 setup() 부분을 아래와 같이 바꿔주세요

 

 

 void setup() {

   Serial.begin(9600);

   pinMode(BTN_PIN, INPUT_PULLUP);

 }

 

 

INPUT 을 INPUT_PULLUP 으로만 변경했습니다.

 

다시 버튼을 눌렀다 뗐다 해보세요.

잘 작동하죠?   아두이노는 정말 대단합니다.

그래도 풀업의 원리는 꼭 기억하고 계시길 바랍니다. 

#ads_3

Comments