RGB LED
RGB LED는 빨간색, 녹색, 파란색 빛의 3원색들을 이용해서 다양한 색을 출력하는 LED입니다.
모듈에는 4가지 핀이 있습니다. 가장 긴 핀은 공통 핀이고, 나머지 3개는 각각 빨간색, 녹색, 파란색에 해당하는 핀입니다.
이런 RGB LED에는 두가지 유형이 있습니다. 가장 긴핀을 GND에 연결하는 공통 음극(Common Cathode)과 가장 긴핀을 전원에 연결하는 공통 양극(Common Anode) 입니다.
이 두가지 유형의 차이는 RGB LED를 동작시키는 방법에서 발생합니다.
공통 음극의 방식은 digitalWrite() 함수를 통해 HIGH를 해주면 LED의 색이 출력됩니다.
공통 양극의 방식은 digitalWrite() 함수를 통해 LOW를 해주면 LED의 색이 출력됩니다. 만약 아무 코드도 넣지 않았다면, 연결된 데이터 핀이 LOW로 되어 있어 RGB LED의 모든 빛이 항상 켜져 있습니다.
아래는 공통 음극 유형의 RGB LED를 조작하는 코드입니다.
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초의 영상으로 만들어내는 것과 같습니다.
아두이노에서 PWM을 적용하기 위해선 2가지가 필요합니다.
- 먼저 핀을 ~이 표시된 핀에 연결 시켜 주어야 합니다. ~이 표시된 핀들은 PWM 출력이 가능한 단자들 입니다. 보통의 핀은 pinMode()함수를 통해서 핀 모드를 설정 해야하지만, PWM핀은 설정을 따로 하지 않아도 됩니다.
- 두번 째로 digitalWrite()함수를 쓰는 것이 아닌 analogWrite() 함수를 사용합니다.
analogWrite(pin,value);
// pin은 PWM 파형이 출력될 핀의 번호입니다.
// value는 0~255의 duty value, 즉 출력할 파형의 세기 입니다.
아날로그 출력의 코드는 아래와 같습니다.
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);
}