오늘은 아두이노에 스위치를 달아보기로하자.
스위치도 앞서 사용한 조도 센서처럼 아두이노에게는 입력 장치이다. 스위치에도 여러 종류가 있다. 누르고 있는 동안만 신호가 가는 스위치가 있고, 한번 누르면 손을 놓아도 신호가 가고 다시 누르면 튀어나오면서 신호가 끊기는 스위치도 있다. 슬라이드 스위치는 누르는게 아니라 좌우로 미는 식으로 사용하는데, 이건 여러단자들 간에 신호 전환이나 전원스위치로 주로 사용한다.
오늘 사용할 스위치는 아두이노에 리셋 스위치로도 달려 있는 푸쉬버튼 스위치로서, 눌렀을때만 접점이 붙고 놓으면 바로 떨어지는 방식의 스위치이다.
이 푸쉬버튼 스위치는 세탁기, 밥통을 비롯한 수많은 가전제품의 조작판에 들어가는 것으로써, 일단 눌러보면 그 느낌이 매우 친숙할 것이다. 세탁기나 밥통을 보면 약간 두꺼운 비닐로 되어 버튼 이름등이 인쇄되어 있는 조작패널이 있는데, 그 뒤에 이 버튼 스위치가 달린 기판이 버티고 있는 것이다. 그 비닐 패널이 탄력성이 있어서 그 뒤의 버튼이 눌러지도록 쑥 들어갔다가 손을 놓으면 다시 원상복구 되는 것이다. 또 부분 부분 인쇄를 안하고 투명하게 둬서 내부에 있는 LED불빛이 보이도록 하거나 LCD화면이 보이도록 하기도 한다.
아무튼 스위치를 사용함에 있어서 확실히 알아둬야 할것은 스위치에서 손을 뗬을때 접점이 원상복구가 되는지 아니면 눌렀을때 그대로 있는지이다. 그에 따라 프로그램이 달라져야 하기 때문이다.
두 개만 있어도 되는 단자를 네개나 달아놔서 헷갈리게 만든 푸쉬버튼 스위치(사진출처 ladyada.net)
택트 스위치라고도 불리는 푸쉬버튼 스위치는 위 사진에서 처럼 다리가 네개가 나와 있지만 두개씩 내부에서 연결되어 있다. 그러나 연결된 구조가 쉽게 드러나지 않는 모양을 하고 있어서 사용할때마다 매우 헷갈린다. 같은 편에 있는 것으로 보이는 다리들끼리 연결된게 아니라 마주보고 있는 다리들끼리 한통속이다.
스위치는 접점이 붙거나 떨어지거나 둘 중 하나이기 때문에 스위치를 껐다 켰다 하면서 만들어 지는 신호는 디지털 신호가 된다. 그러니 digitalRead 명령을 써서 스위치가 켜져 있는지 꺼져 있는지를 입력 받아야 한다.
그럼 이제 회로를 구성해보자. 스위치의 한쪽은 디지털포트중 한곳에 연결하면 될것 같긴 한데 반대쪽은 어디에 연결해야할까? 어디에나 연결해도 된다. 다만 어디에 연결하냐에 따라 프로그램이 달라지면 되는것이다.
스위치의 한쪽 단자를 아두이노의 입력에 연결하고 스위치의 반대편을 GND에 연결한다면 스위치를 누를때마다 입력이 0v가 될것이므로 프로그램에서 디지털입력이 LOW인가 아닌가를 판단하기만하면 될것이다...라고 생각하기 쉽지만 사실 그렇지가 않아서 문제다. 여기가 오늘의 강좌의 핵심이다.
왜 이런 간단한 추리가 먹혀들지 않는가? 스위치를 눌렀을때 0v가 되는건 맞지만 누르지 않았을때는 몇 v가 나올까? 스위치가 눌러지지 않은 상태, 그러니까 단자가 허공에 떠 있을때의 입력값을 serialPrint를 이용해서 눈으로 보면 깜짝 놀랄것이다. 입력도 하지 않은 값들이 마구 난무하고 있기 때문이다. 마지 랜덤 함수를 돌려 놓은 것 처럼 0과 1이 지맘대로 나타나고 있는걸 볼 수 있다.
int switchPin = 10;
int ledPin = 13;
int val = 0;
void setup()
{
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(switchPin, INPUT);
}
void loop()
{
val = digitalRead(switchPin);
Serial.println(val);
digitalWrite(ledPin, val);
}
위 프로그램을 아무것도 연결하지 않은채로 돌리면 시리얼모니터에 0과1이 무작위로 나타나며 13번에 연결된 LED는 재빨리 반짝이는것을 볼 수 있다. 아울러 digitalRead로 읽은 값은 0이나 1로 저장된다는 것도 알게되었다.
그러면 어떻게 회로를 만들어야 스위치를 놓았을때 발광을 하지 않고 안정을 취하도록 할 수 있을까? 몇 가지 방법이 있다. 슬라이드나 토글 스위치 처럼 전환기능을 가진 스위치를 써서 각각의 스위치 단자에 - 와 + 를 연결해주는 방법이 있겠지만 여기서는 간단하고 저렴한 푸쉬버튼 스위치이기 때문에 그 방법은 해당이 없다. 푸쉬버튼 스위치를 쓰는 것으로 제한을 한다면 해결책은 정해진다. 바로 풀다운(pull down)이나 풀업(pull up)회로를 구성하는 것이다.
난데없이 왠 강아지 '풀'뜯는 소리인가 하겠지만 뭐 그다지 어려운건 아니다. 푸쉬버튼 스위치를 누르지 않았을때 아두이노쪽에 연결된 접점에 아무것도 연결되지 않아서 생기는 문제이기 때문에 그쪽에 무언가를 연결해주는 것인데 저항의 차이에 따른 전기의 흐름이 바뀌는 현상을 이용한 것이다.
출처 ladyada.net
풀다운은 위 그림 처럼 아두이노에 연결된 P2를 저항 두개를 거쳐서 접지( 마이너스, GND)에 연결해두는 것이다. 그러면 평상시에는 10K오옴 즉 10,000오옴짜리 저항을 통해 아두이노에 미미한 0v가 전류가 흐르다가 스위치를 누르는 순간에는 저항이 훨씬 작은 스위치를 통해서 5v의 전기가 흐르게 되는 것이다. 100오옴 짜리 저항은 회로 보호 차원에서 만약의 과전류를 막기 위해 연결한 것이다.
출처 ladyada.net
풀업회로는 그 반대로 평상시에는 아두이노 입력단자인 P2에 5v가 흐르다가 스위치를 누르면 0v가 되도록 하는 경우의 회로이다. 회로도에서 점점 작아지는 가로줄 세개가 위아래로 나란히 있는 기호는 접지 그러니까 아두이노에는 GND라고 표시되어 있는 것으로 마이너스를 뜻한다. 회로도의 모든 접지 기호는 한곳에 모아 연결해서 배터리의 마이너스단자에 연결해주는 것이다. 이것만 알면 회로도 보기의 반을 아는 것이다 ^^
위 사진이 회로를 구현한 모습이다. 아 회로보호용 100오옴 저항이 빠진 상태라는 점 이해 바란다. 사실 그것 말고도 틀린 부분이 하나 더 있다. 만약 찾아내게 되면 댓글로 올려주기 바란다 ^^
내 보드가 오리지날이 아니라서 당황할 수도 있으나 위 사진에서 빨간 전선은 5v출력에 연결한 것이고 까만 전선은 GND, 하얀전선은 디지탈 포트 10번에 연결한 것이다. 그리고 이 RBBB라는 보드는 시리얼-USB 컨버터가 포함된 케이블이 필요하고, 아두이노는 시리얼-USB컨버터가 기판에 내장되어 있어서 일반 USB케이블만 있으면 쓸수 있다는 차이가 있다.
오늘의 회로와 프로그램은 버튼을 누르고 있는 동안에만 불이 들어오는 아주 간단한 것이었다. 다음시간엔 버튼을 누를 때마다 모드가 바뀌는 프로그램을 한번 짜보기로 하겠다. 회로는 같고 프로그래밍이 한 단계 깊어지는 것이다. 모드는 한 세가지 정도로 해서 모드 별로 깜빡이는 횟수가 달라지는 것이 어떨까? 이 강좌를 보시는 분들께서 댓글로 아이디어를 내주셔도 좋겠다.
'Electronics' 카테고리의 다른 글
Beagle Board 입문기 (1) | 2011.10.02 |
---|---|
급기야 PIC도 시작, PIC용 프로그래머 PIC-PG1제작하다. (4) | 2010.08.20 |
아두이노 기초강좌 4 (15) | 2010.05.11 |
아두이노 기초강좌 3 (13) | 2010.04.28 |
아두이노 기초강좌 2 (34) | 2010.04.14 |