|
|
# LED Turn On/Off
|
|
|
|
|
|
LED를 출력으로 설정하고, 디지털 출력을 나타내는 digitalWrite 함수와 명령을 지연시키는 delay 함수의 시간 설정에 따라 LED가 켜지고 꺼지는 시행을 수행합니다.
|
|
|
|
|
|
## LED(Light Emitting Diode)
|
|
|
|
|
|
LED는 발광 다이오드로 전류가 흐르면 빛을 내는 반도체 소자입니다.
|
|
|
LED는 램프 유형으로 두개의 다리(lead)를 가지고 있습니다.
|
|
|
긴 핀이 (+) 극이며 아두이노의 13번 핀과 연결이 되고, 짧은 핀이 (-)극으로 아두이노의 GND(ground)와 연결 합니다.
|
|
|
|
|
|
> 다이오드(Diode)
|
|
|
>
|
|
|
> 다이오드란 한쪽 방향으로 전류가 흐르도록 제어하는 반도체 소자입니다.
|
|
|
>
|
|
|
>![https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Diode_pinout_en_fr.svg/450px-Diode_pinout_en_fr.svg.png](https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Diode_pinout_en_fr.svg/450px-Diode_pinout_en_fr.svg.png)
|
|
|
>
|
|
|
>anode : 양극(+), cathode : 음극(-)
|
|
|
|
|
|
|
|
|
## 아두이노 우노의 디지털 입출력 핀
|
|
|
|
|
|
아두이노의 입출력 신호는 크게 디지털과 아날로그 두가지로 구분이 됩니다.
|
|
|
디지털 신호는 전압의 높낮이를 HIGH/LOW, 1/0, True/False. On/Off 와 같이 두개의 신호로 불연속적인 값을 표현하는 것을 말합니다.
|
|
|
아두이노에는 0-13번까지 14개의 디지털 입출력 핀이 있습니다.
|
|
|
단, 0과 1번은 PC와 통신하는 부분이 연결되어 있어 가급적이면 2번부터 사용하는걸 추천하고 있습니다.
|
|
|
|
|
|
```c++
|
|
|
// 상수 지정 (핀 번호)
|
|
|
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를 연결해 두었기에 핀번호 과정 없이 작업을 진행 할 수 있었습니다.
|
|
|
```
|
|
|
|
|
|
## 스위치
|
|
|
![스위치](https://t1.daumcdn.net/cfile/tistory/23088D4B586B359119)
|
|
|
|
|
|
스위치는 on/off 2가지로 나누어진 하드웨어 장치로 활용도가 높은 모듈입니다.
|
|
|
일반적으로 아두이노 조작 시 많이 쓰이는 스위치는 푸쉬버튼 스위치 입니다.
|
|
|
**푸쉬버튼 스위치**는 **다리가 총 4개** 있습니다.
|
|
|
2개씩 연결되어 있는 구조이므로, 쇼트 상태가 되지 않도록 주의 해야합니다.
|
|
|
**대각선 방향으로 연결**을 하면 쇼트가 발생하는 실수를 줄일 수 있습니다.
|
|
|
|
|
|
## 플로팅현상(Floating)
|
|
|
|
|
|
Float의 뜻은 물이나 공중에서 떠다니는 것을 의미합니다.
|
|
|
칩에 전류를 흐르게 했을 때, 칩은 디지털신호로서 1과 0을 구분하는데 이를 구분하지 못하는 애매한 상태를 플로팅 현상이라 합니다.
|
|
|
이는 주변 전기장 상태에 따라 입력값이 불안정하게 변해 칩이 전압을 정확하게 인식하지 못해 발생합니다.
|
|
|
이를 해결하기 위한 것이 풀업/풀다운 저항입니다.
|
|
|
|
|
|
## 풀업/풀다운 (Pull-up / Pull-down)
|
|
|
|
|
|
![풀업/풀다운회로도](https://storage.googleapis.com/cr-resource/forum/482c743ad6ddf00ee50331306178d311/401a5e5f9a0c338974cd39c474eb3680.jpg)
|
|
|
|
|
|
풀업과 풀다운은 저항의 위치에 따라 나뉘어지는데, (+)극 쪽에 저항이 연결되는 것이 풀업 그리고 (-)극 쪽에 저항이 연결되는 것이 풀다운 입니다.
|
|
|
|
|
|
풀업의 경우 스위치를 누르지 않아도 전류가 흘러 1(HIGH) 신호를 보내고, 스위치를 누를 경우 0(LOW) 신호를 보냅니다.
|
|
|
|
|
|
풀다운의 경우 스위치를 누르지 않으면 전류가 흐르지 않아 0(LOW) 신호를, 스위치를 누르면 전류가 흘러 1(HIGH)신호를 보냅니다.
|
|
|
|
|
|
## 바운스 현상(Bounce Effect)
|
|
|
|
|
|
참고 :
|
|
|
1. [http://blog.daum.net/trts1004/12108904](http://blog.daum.net/trts1004/12108904)
|
|
|
2. [https://m.blog.naver.com/PostView.nhn?blogId=jamduino&logNo=221096134736&proxyReferer=https%3A%2F%2Fwww.google.com%2F](https://m.blog.naver.com/PostView.nhn?blogId=jamduino&logNo=221096134736&proxyReferer=https%3A%2F%2Fwww.google.com%2F)
|
|
|
|
|
|
회로구상 시 버튼과 스위치 등 물리적인 입력장치를 사용하는 경우가 많습니다.
|
|
|
이들을 통한 입력과정에서 마이크로 프로세서가 한번의 입력을 기계의 진동에의해 여러번의 입력으로 처리하는 경우가 있습니다.
|
|
|
이를 바운스현상 또는 채터링현상(Chatter : 딱딱 부딪치다) 이라고 합니다.
|
|
|
|
|
|
![Bounce현상](https://mblogthumb-phinf.pstatic.net/MjAxNjExMjhfNTEg/MDAxNDgwMzM1Nzc3MDM1.2-K36RdGL-TAxrmMVydrriMnM4Jod789wXrxhNaEW7Qg.K9NwhJvhMjuh3Fc-UJP9xC1nSvVQzMpPNunLo8Yj-J0g.JPEG.roboholic84/%EC%B1%84%ED%84%B0%EB%A7%81%ED%98%84%EC%83%81.jpg?type=w800)
|
|
|
|
|
|
바운스 현상을 없애는 것을 디바운싱이라고 하는데, 두가지 방법이 있습니다.
|
|
|
하드웨어적인 방법과 소프트웨어적인 방법입니다.
|
|
|
|
|
|
1. 하드웨어적 방법은 캐패시터를 스위치와 병렬로 연결하는 것 입니다. 캐패시터가 바운싱에의해 발생하는 급격한 전압 변화를 흡수하여 디바운싱이 이루어 집니다.
|
|
|
|
|
|
>캐패시터?
|
|
|
>
|
|
|
>캐패시터(Capacitor), 축전기는 전기를 일시적으로 저장하는 역할을 합니다.
|
|
|
흘러보내야될 전류보다 많은 양이 흐르게 되면, 해당 양을 저장해두고 적은 양이 오면 저장해 놓은 전류를 흘려보냅니다.
|
|
|
|
|
|
![간단한 디바운싱 회로](https://mblogthumb-phinf.pstatic.net/MjAxNzA5MTNfMjUx/MDAxNTA1MjkzMTQzMzcx.63HgSh3lKnASGE1sASUmf4NBU_1dbfLKJ7NbG9FZ_L8g.xLM1mCgmB-NUBSJLvN5wc-HJs_gBhDhdYbU4s6Gsrccg.PNG.jamduino/image.png?type=w800)
|
|
|
|
|
|
여기선 ㅣㅁ ㅣ 모양을 캐패시터로 생각해주시기 바랍니다.
|
|
|
|
|
|
2. 소프트웨어적 방법은 스위치의 입력을 확인 할 때까지 약간의 시간을 주는 것입니다.
|
|
|
|
|
|
구현은 아래와 같습니다.
|
|
|
```c++
|
|
|
|
|
|
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; // 현재의 버튼 상태를 이전 상태로 설정
|
|
|
}
|
|
|
|
|
|
``` |
|
|
\ No newline at end of file |