|
|
# RGB LED
|
|
|
|
|
|
RGB LED는 빨간색, 녹색, 파란색 빛의 3원색들을 이용해서 다양한 색을 출력하는 LED입니다.
|
|
|
|
|
|
![https://storage.googleapis.com/cr-resource/forum/482c743ad6ddf00ee50331306178d311/6b72be6858454de056020019f0268731.jpg](https://storage.googleapis.com/cr-resource/forum/482c743ad6ddf00ee50331306178d311/6b72be6858454de056020019f0268731.jpg)
|
|
|
|
|
|
모듈에는 4가지 핀이 있습니다. 가장 긴 핀은 공통 핀이고, 나머지 3개는 각각 빨간색, 녹색, 파란색에 해당하는 핀입니다.
|
|
|
|
|
|
![https://i0.wp.com/microcontrollerslab.com/wp-content/uploads/2018/05/RGB-LED-pinout.png?ssl=1](https://i0.wp.com/microcontrollerslab.com/wp-content/uploads/2018/05/RGB-LED-pinout.png?ssl=1)
|
|
|
|
|
|
이런 RGB LED에는 두가지 유형이 있습니다.
|
|
|
가장 긴핀을 GND에 연결하는 공통 음극(Common Cathode)과 가장 긴핀을 전원에 연결하는 공통 양극(Common Anode) 입니다.
|
|
|
|
|
|
![https://storage.googleapis.com/cr-resource/forum/482c743ad6ddf00ee50331306178d311/57b80fc266798fc5f305e2d9b76562d7.jpg](https://storage.googleapis.com/cr-resource/forum/482c743ad6ddf00ee50331306178d311/57b80fc266798fc5f305e2d9b76562d7.jpg)
|
|
|
|
|
|
이 두가지 유형의 차이는 RGB LED를 동작시키는 방법에서 발생합니다.
|
|
|
|
|
|
공통 음극의 방식은 digitalWrite() 함수를 통해 HIGH를 해주면 LED의 색이 출력됩니다.
|
|
|
|
|
|
공통 양극의 방식은 digitalWrite() 함수를 통해 LOW를 해주면 LED의 색이 출력됩니다.
|
|
|
만약 아무 코드도 넣지 않았다면, 연결된 데이터 핀이 LOW로 되어 있어 RGB LED의 모든 빛이 항상 켜져 있습니다.
|
|
|
|
|
|
아래는 공통 음극 유형의 RGB LED를 조작하는 코드입니다.
|
|
|
|
|
|
```c++
|
|
|
const int redPin = 9; // RGB LED의 붉은색 핀을 9번핀으로 설정
|
|
|
const int greenPin = 10; // RGB LED의 녹색 핀을 10번핀으로 설정
|
|
|
const int bluePin = 11; // RGB LED의 파란색 핀을 11번핀으로 설정
|
|
|
|
|
|
void setup() {
|
|
|
pinMode(redPin,OUTPUT); // RGB LED의 붉은색 핀을 출력으로 설정
|
|
|
pinMode(greenPin,OUTPUT); // RGB LED의 녹색 핀을 출력으로 설정
|
|
|
pinMode(bluePin,OUTPUT); // RGB LED의 파란색 핀을 출력으로 설정
|
|
|
|
|
|
Serial.begin(9600); // 색의 변화를 시리얼 모니터로 확인하기 위해 9600속도로 통신 시작
|
|
|
}
|
|
|
|
|
|
void loop() {
|
|
|
// 빨간색 출력
|
|
|
Serial.println("RED on");
|
|
|
digitalWrite(redPin, HIGH);
|
|
|
digitalWrite(greenPin, LOW);
|
|
|
digitalWrite(bluePin, LOW);
|
|
|
delay(1500);
|
|
|
|
|
|
// 녹색 출력
|
|
|
Serial.println("Green on");
|
|
|
digitalWrite(redPin, LOW);
|
|
|
digitalWrite(greenPin, HIGH);
|
|
|
digitalWrite(bluePin, LOW);
|
|
|
delay(1500);
|
|
|
|
|
|
// 파란색 출력
|
|
|
Serial.println("Blue on");
|
|
|
digitalWrite(redPin, LOW);
|
|
|
digitalWrite(greenPin, LOW);
|
|
|
digitalWrite(bluePin, HIGH);
|
|
|
delay(1500);
|
|
|
|
|
|
// 노란색 출력
|
|
|
Serial.println("YELLOW on");
|
|
|
digitalWrite(redPin, HIGH);
|
|
|
digitalWrite(greenPin, HIGH);
|
|
|
digitalWrite(bluePin, LOW);
|
|
|
delay(1500);
|
|
|
|
|
|
// 자주색 출력
|
|
|
Serial.println("MAGNETA on");
|
|
|
digitalWrite(redPin, HIGH);
|
|
|
digitalWrite(greenPin, LOW);
|
|
|
digitalWrite(bluePin, HIGH);
|
|
|
delay(1500);
|
|
|
|
|
|
// 청록색 출력
|
|
|
Serial.println("CYAN on");
|
|
|
digitalWrite(redPin, LOW);
|
|
|
digitalWrite(greenPin, HIGH);
|
|
|
digitalWrite(bluePin, HIGH);
|
|
|
delay(1500);
|
|
|
|
|
|
// 하얀색 출력
|
|
|
Serial.println("WHITE on");
|
|
|
digitalWrite(redPin, HIGH);
|
|
|
digitalWrite(greenPin, HIGH);
|
|
|
digitalWrite(bluePin, HIGH);
|
|
|
delay(1500);
|
|
|
}
|
|
|
```
|
|
|
|
|
|
## 펄스 폭 변조 (PWM : Pulse Width Modulation)
|
|
|
|
|
|
LED를 키고 끄는 것, 스위치를 열고 닫는 것 등은 연속적이지 않은 디지털 신호입니다.
|
|
|
이와 달리 빛의 세기, 온도, 거리 감지, 소리 크기 조절, 빛의 세기 등 많은 것들은 연속적인 아날로그 신호들 입니다.
|
|
|
|
|
|
디지털 출력을 아날로그 신호로 바꿔주는 장치를 DAC(Digital-Analog Converter)라고 하는데, 음향기기를 떠올리시면 될 것 같습니다.
|
|
|
음원 파일은 디지털 소스인데, 이를 사람 귀에 들리게 하기 위해서는 아날로그 신호로 바꿔 주어 사람 귀에 음악이 들리게 하는 것 입니다.
|
|
|
|
|
|
아두이노는 이런 DAC를 포함하고 있지 않아 아날로그 신호를 출력할 수 없습니다.
|
|
|
대신 PWM를 이용하여 디지털 신호를 아날로그처럼 보이게 출력합니다.
|
|
|
PWM은 디지털신호 ON(5V)와 OFF(0V) 신호가 지속되는 시간 부분을 변경하고, 이 패턴을 사람의 눈이 인식 못할 정도의 속도로 반복하는 것입니다.
|
|
|
이를 통하면 5V와 0V 둘로 나뉘어 있던 신호를 5V~0V사이의 것 처럼 표현 할 수 있습니다.
|
|
|
마치 '월렛과 그로밋'과 같은 클레이무비를 보듯 수십 프레임의 장면을 촬영하여 1초의 영상으로 만들어내는 것과 같습니다.
|
|
|
|
|
|
![https://storage.googleapis.com/cr-resource/forum/482c743ad6ddf00ee50331306178d311/9079fc54f1d914c4ae2606460a977d73.jpg](https://storage.googleapis.com/cr-resource/forum/482c743ad6ddf00ee50331306178d311/9079fc54f1d914c4ae2606460a977d73.jpg)
|
|
|
|
|
|
아두이노에서 PWM을 적용하기 위해선 2가지가 필요합니다.
|
|
|
1. 먼저 핀을 ~이 표시된 핀에 연결 시켜 주어야 합니다.
|
|
|
~이 표시된 핀들은 PWM 출력이 가능한 단자들 입니다.
|
|
|
보통의 핀은 pinMode()함수를 통해서 핀 모드를 설정 해야하지만, PWM핀은 설정을 따로 하지 않아도 됩니다.
|
|
|
|
|
|
![https://wikidocs.net/images/page/30789/01_PWM%E1%84%8B%E1%85%B3%E1%86%AF_%E1%84%8C%E1%85%B5%E1%84%8B%E1%85%AF%E1%86%AB%E1%84%92%E1%85%A1%E1%84%82%E1%85%B3%E1%86%AB_%E1%84%83%E1%85%B5%E1%84%8C%E1%85%B5%E1%84%90%E1%85%A5%E1%86%AF_%E1%84%91%E1%85%B5%E1%86%AB.png](https://wikidocs.net/images/page/30789/01_PWM%E1%84%8B%E1%85%B3%E1%86%AF_%E1%84%8C%E1%85%B5%E1%84%8B%E1%85%AF%E1%86%AB%E1%84%92%E1%85%A1%E1%84%82%E1%85%B3%E1%86%AB_%E1%84%83%E1%85%B5%E1%84%8C%E1%85%B5%E1%84%90%E1%85%A5%E1%86%AF_%E1%84%91%E1%85%B5%E1%86%AB.png)
|
|
|
|
|
|
2. 두번 째로 digitalWrite()함수를 쓰는 것이 아닌 analogWrite() 함수를 사용합니다.
|
|
|
|
|
|
```c++
|
|
|
analogWrite(pin,value);
|
|
|
// pin은 PWM 파형이 출력될 핀의 번호입니다.
|
|
|
// value는 0~255의 duty value, 즉 출력할 파형의 세기 입니다.
|
|
|
```
|
|
|
|
|
|
아날로그 출력의 코드는 아래와 같습니다.
|
|
|
|
|
|
```c++
|
|
|
const int redPin = 9; // 붉은색 핀 9번 설정
|
|
|
const int greenPin = 10; // 녹색 핀 10번 설정
|
|
|
const int bluePin = 11; // 파란색 핀 11번 설정
|
|
|
|
|
|
int delayTime = 50; // 지연시간 50ms로 설정
|
|
|
int stateChangeTime = 1000; // 한 색의 최대 출력에서 최저로 변환시 대기 시간
|
|
|
int colorChangeTime = 500; // 다른 색으로 변환 시 대기 시간
|
|
|
|
|
|
int redV;
|
|
|
int greenV;
|
|
|
int blueV;
|
|
|
|
|
|
int increaseAmount;
|
|
|
|
|
|
void setup() {
|
|
|
|
|
|
}
|
|
|
|
|
|
void loop() {
|
|
|
|
|
|
// 붉은색 PWM적용
|
|
|
greenV = 0;
|
|
|
blueV = 0;
|
|
|
for(redV = 0; redV < 256; redV += 5){ // 붉은색 점차 켜짐
|
|
|
analogWrite(redPin,redV);
|
|
|
analogWrite(greenPin,greenV);
|
|
|
analogWrite(bluePin,blueV);
|
|
|
delay(delayTime);
|
|
|
}
|
|
|
delay(stateChangeTime); // 최대 출력 1초간 유지
|
|
|
for(redV = 255; redV >= 0; redV -= 5){ // 붉은색 점차 꺼짐
|
|
|
analogWrite(redPin,redV);
|
|
|
analogWrite(greenPin,greenV);
|
|
|
analogWrite(bluePin,blueV);
|
|
|
delay(delayTime);
|
|
|
}
|
|
|
delay(colorChangeTime);
|
|
|
|
|
|
// 녹색 PWM적용
|
|
|
redV = 0;
|
|
|
blueV = 0;
|
|
|
for(greenV = 0; greenV < 256; greenV += 5){ // 녹색 점차 켜짐
|
|
|
analogWrite(redPin,redV);
|
|
|
analogWrite(greenPin,greenV);
|
|
|
analogWrite(bluePin,blueV);
|
|
|
delay(delayTime);
|
|
|
}
|
|
|
delay(stateChangeTime); // 최대 출력 1초간 유지
|
|
|
for(greenV = 255; greenV >= 0; greenV -= 5){ // 녹색 점차 꺼짐
|
|
|
analogWrite(redPin,redV);
|
|
|
analogWrite(greenPin,greenV);
|
|
|
analogWrite(bluePin,blueV);
|
|
|
delay(delayTime);
|
|
|
}
|
|
|
delay(colorChangeTime);
|
|
|
|
|
|
// 파란색 PWM적용
|
|
|
redV = 0;
|
|
|
greenV = 0;
|
|
|
for(blueV = 0; blueV < 256; blueV += 5){ // 파란색 점차 켜짐
|
|
|
analogWrite(redPin,redV);
|
|
|
analogWrite(greenPin,greenV);
|
|
|
analogWrite(bluePin,blueV);
|
|
|
delay(delayTime);
|
|
|
}
|
|
|
delay(stateChangeTime); // 최대 출력 1초간 유지
|
|
|
for(blueV = 255; blueV >= 0; blueV -= 5){ // 파란색 점차 꺼짐
|
|
|
analogWrite(redPin,redV);
|
|
|
analogWrite(greenPin,greenV);
|
|
|
analogWrite(bluePin,blueV);
|
|
|
delay(delayTime);
|
|
|
}
|
|
|
delay(colorChangeTime);
|
|
|
|
|
|
// 청록색 PWM적용
|
|
|
redV = 0;
|
|
|
greenV = 0;
|
|
|
blueV = 0;
|
|
|
for(increaseAmount = 0; increaseAmount <256; increaseAmount += 5){ // 청록색 점차 켜짐
|
|
|
analogWrite(redPin,redV);
|
|
|
analogWrite(greenPin,greenV + increaseAmount);
|
|
|
analogWrite(bluePin, blueV + increaseAmount);
|
|
|
delay(delayTime);
|
|
|
}
|
|
|
delay(stateChangeTime);
|
|
|
greenV = 255;
|
|
|
blueV = 255;
|
|
|
for(increaseAmount = 0; increaseAmount <256; increaseAmount += 5){
|
|
|
analogWrite(redPin,redV);
|
|
|
analogWrite(greenPin,greenV - increaseAmount);
|
|
|
analogWrite(bluePin, blueV - increaseAmount);
|
|
|
delay(delayTime);
|
|
|
}
|
|
|
delay(colorChangeTime);
|
|
|
|
|
|
// 임의의 10가지 색 출력
|
|
|
for(int i = 0; i < 10; i++){
|
|
|
analogWrite(redPin,random(0,255));
|
|
|
analogWrite(greenPin,random(0,255));
|
|
|
analogWrite(bluePin,random(0,255));
|
|
|
delay(colorChangeTime);
|
|
|
}
|
|
|
delay(colorChangeTime);
|
|
|
}
|
|
|
``` |