이글은 2018.1.18에 있었던 오프라인 강의 노트입니다.
PULL_UP 저항에 대하여
스위치를 연결할 때 핀과 5V 사이에 10K 정도의 저항을 연결하는 경우가 많습니다.
이처럼 핀에 5V를 연결하여 풀업하면 스위치가 접속되지 않을 때(=open될 때) 핀에는 전압이 HIGH(5V)가 걸리게 됩니다. 반대로 스위치가 접속되면(=close될 때) LOW(0V)가 걸리게 됩니다.
풀업하지 않으면 스위치가 접속이 되지 않을 때 핀에 0V가 나타나는 것이 아니라 전압이 불안정하게 플로팅(floating)하기 때문입니다.
별도로 풀업 저항 회로를 구성하지 않고 핀과 GND(0V) 사이에 스위치를 연결하기만 하고 pinMode 선언시에 INPUT_PULLUP을 지정하기만 하면 풀업 저항 모드가 됩니다. 왜냐하면 아두이노의 프로세서에는 풀업저항이 내장되어 있으므로 선언만 하면 깨워서 사용할 수 있기 때문입니다.
1 |
pinMode(buttonPin,INPUT_PULLUP); |
다른 방식으로 핀과 5V 사이에 스위치를 연결하고 핀과 GND 사이에는 10K 정도의 풀다운(pull down) 저항을 달아 둘 수도 있습니다. 이때는 스위치 접속시 핀에 HIGH(5V)가 걸리게 됩니다. 실제로는 풀업저항 방식이 선호됩니다.
버튼 테스트용 스케치
버튼을 누를 때 상태를 알려주는 스케치입니다. Timer1의 ISR에서 주기적으로 버튼의 변화를 갱신해줍니다.
메쏘드 | 기능 |
getButton() | 버튼의 상태를 알려 줍니다. |
setRepeat(false/true) | 계속 누를 때 반복 상태를 알려줄지를 지정합니다. 초기값은 false. |
setLongPress(false/true) | 길게 누를 때 상태를 알려줄지를 지정합니다. 초기값은 false. |
버튼 상태 값은 다음과 같습니다.
1 2 3 4 5 6 7 |
#define BUTTON_NONE 0 #define ON_RELEASED 1 #define ON_PRESSED 2 #define RELEASED 4 #define PRESSED 8 #define REPEAT 16 #define LONG_PRESSED 32 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
#include <TimerOne.h> #include <SanguruButton.h> SanguruButton btn1(A1); byte prevButtonVal; byte buttonVal; void setup() { // put your setup code here, to run once: Timer1.initialize(1000); Timer1.attachInterrupt(ISRupdate); Serial.begin(9600); printHelp(); } void loop() { // put your main code here, to run repeatedly: buttonVal = btn1.getButton(); if (prevButtonVal != buttonVal) { switch(buttonVal) { case BUTTON_NONE : Serial.println("buttonNone");break; case ON_RELEASED : Serial.println("onReleased");break; case ON_PRESSED : Serial.println("onPressed");break; case RELEASED : Serial.println("released");break; case PRESSED : Serial.println("pressed");break; case REPEAT : Serial.println("repeat");break; case LONG_PRESSED: Serial.println("longPressed");break; defualt: Serial.println("button error");break; } prevButtonVal = buttonVal; } if (Serial.available()) { serialReadAndSetOption(); } } void ISRupdate() { btn1.update(); } void printHelp() { Serial.println("***commad list"); Serial.println("r 1/0 setRepeat(true/false)"); Serial.println("l 1/0 longPress(true/false)"); Serial.println(); Serial.println("*** button operations"); Serial.println("onReleased"); Serial.println("onPressed"); Serial.println("released"); Serial.println("pressed"); Serial.println("repeat"); Serial.println("longPressed"); Serial.println(); } void serialReadAndSetOption() { char c = Serial.read(); if (c == 'r') { int val = Serial.parseInt(); if (val == 1){ btn1.setRepeat(true); Serial.println("*** setRepeat(true)"); } else { btn1.setRepeat(false); Serial.println("*** setRepeat(false)"); } } else if (c == 'l') { int val = Serial.parseInt(); if (val == 1){ btn1.setLongPress(true); Serial.println("*** setLongPress(true)"); } else { btn1.setLongPress(false); Serial.println("*** setLongPress(false)"); } } else if (c == 'h') { printHelp(); } } |
댓글 남기기