아두이노 기초강좌 5

Electronics 2010.06.22 17:44
오늘은 아두이노에 스위치를 달아보기로하자. 
스위치도 앞서 사용한 조도 센서처럼 아두이노에게는 입력 장치이다. 스위치에도 여러 종류가 있다.  누르고 있는 동안만 신호가 가는 스위치가 있고, 한번 누르면 손을 놓아도 신호가 가고 다시 누르면 튀어나오면서 신호가 끊기는 스위치도 있다.  슬라이드 스위치는 누르는게 아니라 좌우로 미는 식으로 사용하는데, 이건 여러단자들 간에 신호 전환이나 전원스위치로 주로  사용한다. 

오늘 사용할 스위치는 아두이노에 리셋 스위치로도 달려 있는 푸쉬버튼 스위치로서, 눌렀을때만 접점이 붙고 놓으면 바로 떨어지는 방식의 스위치이다.

이 푸쉬버튼 스위치는 세탁기, 밥통을 비롯한 수많은 가전제품의 조작판에 들어가는 것으로써, 일단  눌러보면 그 느낌이 매우 친숙할 것이다. 세탁기나 밥통을 보면 약간 두꺼운 비닐로 되어 버튼 이름등이 인쇄되어 있는 조작패널이 있는데, 그 뒤에 이 버튼 스위치가 달린 기판이 버티고 있는 것이다. 그 비닐 패널이 탄력성이 있어서 그 뒤의 버튼이 눌러지도록 쑥 들어갔다가 손을 놓으면 다시 원상복구 되는 것이다. 또 부분 부분 인쇄를 안하고 투명하게 둬서 내부에 있는 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케이블만 있으면 쓸수 있다는 차이가 있다.

오늘의 회로와 프로그램은 버튼을 누르고 있는 동안에만 불이 들어오는 아주 간단한 것이었다. 다음시간엔 버튼을 누를 때마다 모드가 바뀌는 프로그램을 한번 짜보기로 하겠다. 회로는 같고 프로그래밍이 한 단계 깊어지는 것이다. 모드는 한 세가지 정도로 해서 모드 별로 깜빡이는 횟수가 달라지는 것이 어떨까? 이 강좌를 보시는 분들께서 댓글로 아이디어를 내주셔도 좋겠다. 


저작자 표시 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Electronics' 카테고리의 다른 글

Beagle Board 입문기  (1) 2011.10.02
급기야 PIC도 시작, PIC용 프로그래머 PIC-PG1제작하다.  (4) 2010.08.20
아두이노 기초강좌 5  (36) 2010.06.22
아두이노 기초강좌 4  (15) 2010.05.11
아두이노 기초강좌 3  (13) 2010.04.28
아두이노 기초강좌 2  (34) 2010.04.14
Trackback 0 : Comments 36
    이전 댓글 더보기
  1. rararabra 2010.06.24 21:56 신고 Modify/Delete Reply

    버튼을 누를 때마다 모드가 바뀌는 참신한 아이디어를 내고 싶지만, 아는게 없어서 아이디어 내는 것에도 한계가 생기네요. 버튼을 누를 때마다 모터를 조절하는 것이 어떤까요? 오늘 프린터 주웠거든요. 한 번 뜯어볼려고하는데... 지금 수준에 너무 무리가 된다면, LED 깜빡이는 횟수 바뀌는 것도 좋습니다. 헤헤

    • Favicon of http://blog.whattomake.co.kr BlogIcon MrKiss 2010.06.25 00:38 신고 Modify/Delete

      모터 제어는 아무래도 약간 복잡한 회로가 필요하기 때문에 뒤로 미루고요. LED반짝이는 횟수 그걸로 해보죠 ^^ 제가 바라던 아주 좋은 아이디어였습니다 ~

  2. Favicon of http://pepsiman.tistory.com BlogIcon 펩시맨 2010.06.28 10:20 신고 Modify/Delete Reply

    안녕하세요 MrKiss님 ^^
    강좌 잘보고있어요~
    테스트는 해보지 않아서 정확하진 않은데 택트 스위치가 대각선이 연결되어 있는거 아닌가요?
    볼때마다 느끼지만 아두이노 참 귀엽게 생겼네요 ^^

    • Favicon of http://blog.whattomake.co.kr BlogIcon MrKiss 2010.06.28 14:56 신고 Modify/Delete

      안녕하세요 펩시맨님^^
      택트스위치 내부 연결은 조오기~ 위에 ladyada가 그린 그림대로 되어 있어요. 지금도 이상한데 대각선이면 더 헷갈리겠는데요 ㅜㅜ

  3. Favicon of http://www.epanbeads.com/pandora-silver-beads.html BlogIcon pandora style beads 2010.06.29 10:17 신고 Modify/Delete Reply

    지금 수준에 너무 무리가 된다면, LED 깜빡이는 횟수 바뀌는 것도 좋습니다. 헤헤

    • Favicon of http://blog.whattomake.co.kr BlogIcon MrKiss 2010.06.29 11:45 신고 Modify/Delete

      이건 rararabra님이 올리신것 같진 않고 말로만 듣던 지능형 스팸댓글인가보군. 잔머리대마왕이다~

  4. letsme 2010.07.15 11:57 신고 Modify/Delete Reply

    늘 열정이 넘치시는 듯 ^^
    그런데 풀다운 저항이 10K옴이 아니라 10옴으로 보이는데요? ㅋ

    • Favicon of http://blog.whattomake.co.kr BlogIcon MrKiss 2010.07.15 14:57 신고 Modify/Delete

      오 잘맞히셨습니다. 사진찍을 때 엉뚱한걸 꽂은채로 찍는 바람에 내친김에 그냥 퀴즈로 냈었는데 잘 보이지도 않는걸 잘히시는군요.
      두환님은 역시 초천재다우십니다^^

  5. 이오 2010.07.17 21:16 신고 Modify/Delete Reply

    강좌가 유용했습니다. 이제는 7인치 칼라TFT 터친 스크린에서 온습도 표시와 키패트를 불려 설정치 화면에서 설정치 입력하여 여러개의 릴레이 출력을 보내고 싶습니다.
    관련한 대락적인 강좌정보 좀 올려 주세요

    • Favicon of http://blog.whattomake.co.kr BlogIcon MrKiss 2010.07.18 00:57 신고 Modify/Delete

      터치lcd를 쓰는건 저도 아직 안해봤지만 아래 사이트에서 판매하면서 튜토리얼도 올려놨으니 참고해보시기 바랍니다.
      http://www.liquidware.com/shop/show/TSL/TouchShield+Slide

  6. 이오 2010.07.21 10:20 신고 Modify/Delete Reply

    외국에는 아이폰 앱으로 아두이노 터치하던데 앱은 만들기 어려운가요?

    • Favicon of http://blog.whattomake.co.kr BlogIcon MrKiss 2010.07.21 11:37 신고 Modify/Delete

      아이폰과 아두이노 연결은 탈옥을 해야하구요. 난이도로 본다면 아두이노에서는 중급이상은 되겠습니다.
      아두이노와는 시리얼로 통신을 하게 되는데 그런앱은 이미만들어져 있는걸 쓰면 될겁니다. 앱프로그래밍은 안하던 사람에겐 매우 어렵구요. 하던 사람에겐 그리 어려운 프로그램은 아니라고봅니다 (뻔한 이야긴가 --...)
      저도 요즘 앱프로그래밍을 공부중인데 절대 쉽다고는 말 못하겠습니다 ㅎㅎ

  7. 2010.07.25 17:13 Modify/Delete Reply

    비밀댓글입니다

  8. 2010.10.18 21:21 Modify/Delete Reply

    비밀댓글입니다

    • Favicon of http://blog.whattomake.co.kr BlogIcon MrKiss 2010.10.19 15:07 신고 Modify/Delete

      이글에서 led는 안썼는데.. 혹시 저항을 말씀하시는건가요?
      저항이 뜨거워 진다는 것은 저항이 너무 낮아서 전류가 과하게 흐르고 있다고 볼 수 있는데요. 저항이 10K가 확실한지 테스터로 검사해보시구요
      잘못 연결한 것인지 아닌지는 회로도와 자알~ 비교해보면 알수 있습니다.

  9. 2010.10.19 17:20 Modify/Delete Reply

    비밀댓글입니다

  10. 한장 2010.11.05 00:22 신고 Modify/Delete Reply

    요즘 갑자기 전자쪽 -특히 아두이노에 꽂혀서 열공중입니다.
    ISP랑 USB연결이라 많은것들이 ㅠ.ㅠ 답답한게 많았는데 주~욱 읽어보니 많은 도움이 되었습니다.
    앞으로도 계속 빨랑빨랑 올려주세요

    전자 전공도 아니고 처음으로 시작하고 있어서 저항, 콘덴서, 다이오드 등등 기본 부품부터 공부하고 있는데 제대로 하는건지 모르겠네요 ^^;
    하튼 아자! 아자! 입니다.

    PS. 펩시맨님 혹시 연구소의그분?? 연구소도 자주 기웃거리고 있네요. ㅎㅎ
    PS2. 위의 비밀댓글 넘궁금해요. 몹쓸놈의 호기심 -.-; ㅋㅋ

    • Favicon of http://blog.whattomake.co.kr BlogIcon MrKiss 2010.11.05 03:55 신고 Modify/Delete

      저는 10k를 썼는데 led가 뜨거워 지면서 타는 냄새가 나서 터질까봐 일단은 뺐는데 제가 저항을 잘못연결 한 것인가요 ??!! ㅠ.ㅠ [비밀댓글]

      아 .. 그러니까 저는 10k를 쓰고 버튼을 누르면 led에 불빛이 나오도록 회로를 꽃고 run을 했었어요ㅠㅠ 요 말을 안썼네요... led가 너무 뜨거워서 놀랐어요 아무래도 제가 저항을 잘못 해서 그랬겠죠?ㅎㅎ 아무튼 감사합니다. 다따라해 보고 더 따라해 보고싶어요 ㅎㅎ 너무 친절한 강의? 이신것 같아요[비밀댓글]

      조~ 위에 있는 두 개의 비밀 댓글의 내용입니다. 비밀일 이유가 별로 없어 보이죠? 그냥 공개로 하셔야 다른분들에게도 참고가 될텐데 왜들 비밀로 하시는지 ... 아 그리고 그 팹시맨님 맞습니다 ㅎㅎ

  11. 한장 2010.11.06 00:47 신고 Modify/Delete Reply

    ㅋㅋ 그냥 공개하는게 더 좋을듯 한데요.
    실수와 시행착오는 저같은 초보에게는 큰 도움이 될수도 있을텐데..ㅋㅋ
    그나저나 저는 언제쯤 다른사람에게 도움을 줄수있을까요..

    오늘 Arduino Duemilanove를 구입하고 USBtinyISP는 만능기판에 직접만들어 볼까하는데요
    IC2 인 74AHC125가 검색에서 안나오네요
    디바이스마트에서 74HC125(DIP) 이게 비슷해보이는데 맞나요?

    근데 링크삽입은 어떻게 하나요? ㅠ.ㅠ

    • Favicon of http://blog.whattomake.co.kr BlogIcon MrKiss 2010.11.06 03:02 신고 Modify/Delete

      저도 거기서 사서 만든 듯하네요. 아마 맞을듯 합니다. 아마 ^^
      그냥 링크 주소 통채로 쓰면 될듯한데요.
      http://mrkiss.tistory.com/177#comment6624676

  12. 정지철 2010.12.25 22:37 신고 Modify/Delete Reply

    초딩때 배이직을 만저본경험이잇어서...
    전강좌까지는 대략 이해하면서 보앗는대..^^
    드디어 한계인가봅니다...회로도보는 방법좀 공부하러가야겟습니다..^^
    정말 좋은 강좌 잘보앗습니다.

    • Favicon of http://blog.whattomake.co.kr BlogIcon MrKiss 2010.12.27 02:25 신고 Modify/Delete

      간만에 들르니 정지철님께서 댓글을 많이 남겨 주셨네요^^ 메마른 사박에 단비를 뿌려주셨습니다 감사합니다.

  13. 정지철 2010.12.25 22:38 신고 Modify/Delete Reply

    전강좌까지는 이해하면서 보앗는대..^^
    드디어 한계인가봅니다...회로도보는 방법좀 공부하러가야겟습니다..^^
    정말 좋은 강좌 잘보앗습니다.

  14. 쪼이랜드 2011.07.29 23:28 신고 Modify/Delete Reply

    멋진 강의 감사드립니다. 궁금한 점이 있어서요
    보통 AVR에는 내부풀업저항이 있쟎아요.
    만일 내부풀다운이 있고 그것이 default라면
    예전에 꼬마전구랑 밧데리랑 실험할 때처럼 5v에 연결되면 하이, 연결이 안되면 로우... 이렇게 일반인도 쉽게 받아들이게 될 것 같은데... 왜 내부풀다운저항은 없을까요?
    혹시 있나요?

    • Favicon of http://blog.whattomake.co.kr BlogIcon MrKiss 2011.07.30 15:06 신고 Modify/Delete

      저는 내부 풀업조차 거의 안쓰고 있었기때문에 별로 생각해 보지 았지만 지금 찾아보니 별 이유는 없는것 같은데요 ^^ 그냥 내부 풀다운은 없다네요 --;;

  15. 2012.10.12 10:27 Modify/Delete Reply

    비밀댓글입니다

    • Favicon of http://blog.whattomake.co.kr BlogIcon MrKiss 2012.10.15 17:28 신고 Modify/Delete

      질문은 댓글로 해주시는게 다른 분들에게도 참고가 되고 좋습니다 ^^ 가능한 구체적으로 질문을 해주셔야 저도 감을 잡고 답변을 드릴 수 있겠죠?

  16. 서덕기 2013.02.19 10:37 신고 Modify/Delete Reply

    다른부분은 어느정도 이해를 했는데, 회로도에서 막히는군요.

  17. 궁금 2013.07.06 08:44 신고 Modify/Delete Reply

    전 강좌에 있는 조도센서와 스위치를 합칠려고하는데 스위치를 눌렀을때 어두울때만 led 가 켜지게 하는건 어떻게 코딩해야하나요?

    • Favicon of http://blog.whattomake.co.kr BlogIcon MrKiss 2013.07.06 13:13 신고 Modify/Delete

      묻기 전에 치열하게 생각해보는 습관을 기르지 않으면 제대로 몸에 익힐 수 없습니다.

  18. 2015.02.28 00:29 Modify/Delete Reply

    비밀댓글입니다

  19. 질문 2015.02.28 00:38 신고 Modify/Delete Reply

    좋은 글 잘 읽었습니다. 그런데 궁굼한 것이있어서 댓글을 썼습니다.
    본문에서 접지를 않시키고 그냥 디지털 포트의 V값을 읽어보면 숫자가 랜덤처럼 나온다고 하셨는데요. 그건 왜 그러는 건가요? 분명 아무런 회로도 구성되지 않았기 때문에 0V이여야지 않나요? 아두이노만 그런 현상이나타나는 건가요? 아니면 그냥 건저지에 아무것도 연결시키지 않고 측정을 해봐도 같은 현상이 나타나는 건가요? 특히 왜 하필 1V와 0V만 무작위로 나오는 건가요? 그리고 0V전류라는 것이 존제하나요? 아니면 설명을 위한 이론적인 개념인가요? 도저히 모르겠네요.
    그냥 아두이노가 전류가 흐른다 / 안 흐른다 를 구분 할 수 없나요? 그럼 다 편할 것 같은데

  20. kim 2015.10.19 13:19 신고 Modify/Delete Reply

    그저 좋은강좌에 감사할 따름입니다.

Write a comment

◀ PREV : [1] : ... [27] : [28] : [29] : [30] : [31] : [32] : [33] : [34] : [35] : ... [198] : NEXT ▶