LED Turn On/Off
LED를 출력으로 설정하고, 디지털 출력을 나타내는 digitalWrite 함수와 명령을 지연시키는 delay 함수의 시간 설정에 따라 LED가 켜지고 꺼지는 시행을 수행합니다.
LED(Light Emitting Diode)
LED는 발광 다이오드로 전류가 흐르면 빛을 내는 반도체 소자입니다. LED는 램프 유형으로 두개의 다리(lead)를 가지고 있습니다. 긴 핀이 (+) 극이며 아두이노의 13번 핀과 연결이 되고, 짧은 핀이 (-)극으로 아두이노의 GND(ground)와 연결 합니다.
다이오드(Diode)
다이오드란 한쪽 방향으로 전류가 흐르도록 제어하는 반도체 소자입니다.
anode : 양극(+), cathode : 음극(-)
아두이노 우노의 디지털 입출력 핀
아두이노의 입출력 신호는 크게 디지털과 아날로그 두가지로 구분이 됩니다. 디지털 신호는 전압의 높낮이를 HIGH/LOW, 1/0, True/False. On/Off 와 같이 두개의 신호로 불연속적인 값을 표현하는 것을 말합니다. 아두이노에는 0-13번까지 14개의 디지털 입출력 핀이 있습니다. 단, 0과 1번은 PC와 통신하는 부분이 연결되어 있어 가급적이면 2번부터 사용하는걸 추천하고 있습니다.
// 상수 지정 (핀 번호)
const int buttonPin = 8; // 버튼 핀 번호는 8번
const int ledPin = 13; // LED 핀 번호는 13번
int buttonState = 0; // 버튼 상태는 디지털 입력이 없는 상태(0)
// 버튼의 입력은 1, 입력이 없을 때는 0
void setup() {
pinMode(ledPin, OUTPUT); // LED는 출력모드
// pinMode(LED_BUILTIN,OUTPUT);
pinMode(buttonPin, INPUT); // Button은 입력모드
Serial.begin(9600);
}
void loop() {
buttonState = digitalRead(buttonPin); // Button의 입력 여부 상태를 읽어들입니다.
if (buttonState == HIGH) {
digitalWrite(ledPin, HIGH); // Button에 입력이 들어오면 LED를 킵니다.
// digitalWrite(LED_BUILTIN,HIGH);
Serial.println("Button Input!");
} else {
digitalWrite(ledPin, LOW); // Button의 입력이 없으면 LED를 끕니다.
// digitalWrite(LED_BUILTIN,LOW);
Serial.println("Button NO Input!");
}
}
// 위의 코드에서 ledPin번호를 13번이라 지정했습니다.
// 하지만 이를 지정하지 않고 LED_BUILTIN이라는 상수를 사용했을 때,
// 아두이노 보드는 대부분 13번 핀에 LED를 연결해 두었기에 핀번호 과정 없이 작업을 진행 할 수 있었습니다.
스위치
스위치는 on/off 2가지로 나누어진 하드웨어 장치로 활용도가 높은 모듈입니다. 일반적으로 아두이노 조작 시 많이 쓰이는 스위치는 푸쉬버튼 스위치 입니다. 푸쉬버튼 스위치는 다리가 총 4개 있습니다. 2개씩 연결되어 있는 구조이므로, 쇼트 상태가 되지 않도록 주의 해야합니다. 대각선 방향으로 연결을 하면 쇼트가 발생하는 실수를 줄일 수 있습니다.
플로팅현상(Floating)
Float의 뜻은 물이나 공중에서 떠다니는 것을 의미합니다. 칩에 전류를 흐르게 했을 때, 칩은 디지털신호로서 1과 0을 구분하는데 이를 구분하지 못하는 애매한 상태를 플로팅 현상이라 합니다. 이는 주변 전기장 상태에 따라 입력값이 불안정하게 변해 칩이 전압을 정확하게 인식하지 못해 발생합니다. 이를 해결하기 위한 것이 풀업/풀다운 저항입니다.
풀업/풀다운 (Pull-up / Pull-down)
풀업과 풀다운은 저항의 위치에 따라 나뉘어지는데, (+)극 쪽에 저항이 연결되는 것이 풀업 그리고 (-)극 쪽에 저항이 연결되는 것이 풀다운 입니다.
풀업의 경우 스위치를 누르지 않아도 전류가 흘러 1(HIGH) 신호를 보내고, 스위치를 누를 경우 0(LOW) 신호를 보냅니다.
풀다운의 경우 스위치를 누르지 않으면 전류가 흐르지 않아 0(LOW) 신호를, 스위치를 누르면 전류가 흘러 1(HIGH)신호를 보냅니다.
바운스 현상(Bounce Effect)
참고 :
- http://blog.daum.net/trts1004/12108904
- https://m.blog.naver.com/PostView.nhn?blogId=jamduino&logNo=221096134736&proxyReferer=https%3A%2F%2Fwww.google.com%2F
회로구상 시 버튼과 스위치 등 물리적인 입력장치를 사용하는 경우가 많습니다. 이들을 통한 입력과정에서 마이크로 프로세서가 한번의 입력을 기계의 진동에의해 여러번의 입력으로 처리하는 경우가 있습니다. 이를 바운스현상 또는 채터링현상(Chatter : 딱딱 부딪치다) 이라고 합니다.
바운스 현상을 없애는 것을 디바운싱이라고 하는데, 두가지 방법이 있습니다. 하드웨어적인 방법과 소프트웨어적인 방법입니다.
- 하드웨어적 방법은 캐패시터를 스위치와 병렬로 연결하는 것 입니다. 캐패시터가 바운싱에의해 발생하는 급격한 전압 변화를 흡수하여 디바운싱이 이루어 집니다.
캐패시터?
캐패시터(Capacitor), 축전기는 전기를 일시적으로 저장하는 역할을 합니다. 흘러보내야될 전류보다 많은 양이 흐르게 되면, 해당 양을 저장해두고 적은 양이 오면 저장해 놓은 전류를 흘려보냅니다.
여기선 ㅣㅁ ㅣ 모양을 캐패시터로 생각해주시기 바랍니다.
- 소프트웨어적 방법은 스위치의 입력을 확인 할 때까지 약간의 시간을 주는 것입니다.
구현은 아래와 같습니다.
const int ButtonPIN = 8; // 버튼 핀 번호는 8번
const int LedPIN = 13; // Led 핀 번호 13번
int ledState = HIGH; // led의 상태를 HIGH로 설정
int buttonState; // 버튼의 현재 상태를 받을 변수 설정
int lastButtonState = HIGH; // 버튼의 바로 전 상태를 초기에 HIGH로 설정
unsigned long lastDebounceTime = 0; // 직전의 debounce 시간을 0으로 설정
unsigned long debounceDelay = 50; // 기준 지연 시간을 50ms(0.05초)로 설정
void setup() {
pinMode(ButtonPIN,INPUT); // Button핀은 입력으로 설정
pinMode(LedPIN,OUTPUT); // Led 핀은 출력으로 설정
digitalWrite(LedPIN,ledState); // Led핀을 초기에 켜진상태로 출력
}
void loop() {
buttonState = digitalRead(ButtonPIN); // 현재 버튼의 상태를 읽어옴
if(buttonState != lastButtonState){ // 이전 상태와 다른 상태가 됐는지 확인
delay(debounceDelay); // 지연시간을 갖음
buttonState = digitalRead(ButtonPIN); // 지연시간 후의 상태를 읽어옴
}
if(buttonState == HIGH){ // 현재 버튼 상태가 HIGH(눌림)인지 확인
digitalWrite(LedPIN,ledState); // Led를 HIGH상태로 출력
} else{ // 현재 버튼 상태가 Low(안 눌림)인지 확인
digitalWrite(LedPIN,!ledState); // Led상태를 꺼짐으로 출력
}
lastButtonState = buttonState; // 현재의 버튼 상태를 이전 상태로 설정
}