아두이노 강좌 #46 RGB LED 컬러 인덱스를 사용하여 시리얼 통신으로 제어하기
Lucy Archive
Lucy / Facilitate4U
2020. 10. 18. 14:46

Arduino Uno : RGB LED Color IndexArduino Uno : RGB LED Color Index

Arduino Uno : RGB LED Control with ColorIndex

지난 포스트에서는 RGB LED의 기본적인 동작 방법에 대해 설명하였습니다. 이번 포스트는 RGB LED를 쉽게 사용 할 수 있는 방법 중의 하나로,

자주 사용하는 컬러를 배열로 지정하여 배열의 인덱스로 RGB LED 색상을 표현하는 방법을 소개

합니다.


하드웨어 연결

회로도 및 연결

아래 그림은 아두이노 우노로 RGB LED를 동작시키기 위한 회로도와 연결 예시입니다. 지난 포스트의 연결 방법과 동일합니다. 본 포스트에 사용한 RGB LED 모듈은 공통 캐소드 타입입니다. 

저항이 함께 들어있는 RGB LED Module이 아닌 RGB LED를 그대로 사용하시는 경우 각 LED핀과 아두이노 핀 사이에 300Ω 정도의 저항을 연결 하시길 권장 드립니다.


예제1 : 컬러 인덱스를 사용한 RGB LED 제어

코드

아래 코드는 9가지 RGB 데이터를 배열로 저장하여, loop() 문에서 배열의 인덱스를 사용하여 RGB LED 색상을 표시하는 코드입니다. 아래와 같은 코드를 작성하는 경우, loop() 문 내에서 특정 조건 마다 RGB LED색상을 변경하기 위해 setRGBLED() 함수만 호출하여 사용 할 수 있습니다. 

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
#define RED 11 // RGB LED Module의 RED 핀
#define GREEN 10 // RGB LED Module의 GREEN 핀
#define BLUE 9 // RGB LED Module의 BLUE 핀
 
byte bRgbColorIndex[9][3= {
    {000000000}, // index 0 - black(None)
    {255255255}, // index 1 - white
    {255000000}, // index 2 - red
    {000255000}, // index 3 - green
    {000000255}, // index 4 - blue
    {25580000}, // index 5 - yellow
    {255000255}, // index 6 - magenta
    {000255255}, // index 7 - cyan
    {25520000}, // index 8 - orange
};
 
void setup(){
    pinMode(RED, OUTPUT);
    pinMode(GREEN, OUTPUT);
    pinMode(BLUE, OUTPUT);
}
 
void loop(){
    for(int i = 0 ; i < 9 ; i++){
        setRGBLED(i);
        delay(2000);
    }
}
 
void setRGBLED(int colorIndex){
    analogWrite(RED, bRgbColorIndex[colorIndex][0]);
    analogWrite(GREEN, bRgbColorIndex[colorIndex][1]);
    analogWrite(BLUE, bRgbColorIndex[colorIndex][2]);
}
cs


실행 결과

위 코드를 실행하면 loop()문 내의 for()의 코드와 같이 bRgbColorIndex 배열의 0 ~ 8 Index를 순차적으로 표시하는 것을 확인 할 수 있습니다. 


예제2 : 시리얼 통신으로 수신된 인덱스 표시

코드

예제2 코드는 예제1 코드의 응용으로 시리얼 포트로 수신된 인덱스 번호에 따라 RGB LED의 색상을 변경합니다. 시리얼 수신 포트로 0 ~ 8 까지 데이터만 수신된 경우 동작하도록 코드를 작성하였습니다.

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
#define RED 11 // RGB LED Module의 RED 핀
#define GREEN 10 // RGB LED Module의 GREEN 핀
#define BLUE 9 // RGB LED Module의 BLUE 핀
 
byte bRgbColorIndex[9][3= {
    {000000000}, // index 0 - black(None)
    {255255255}, // index 1 - white
    {255000000}, // index 2 - red
    {000255000}, // index 3 - green
    {000000255}, // index 4 - blue
    {25580000}, // index 5 - yellow
    {255000255}, // index 6 - magenta
    {000255255}, // index 7 - cyan
    {25520000}, // index 8 - orange
};
 
boolean flag = false// 시리얼 포트로 0 ~ 8 값이 수신된 경우 true 로 활성화
int recIndex; // 시리얼 포트로 0 ~ 8 값이 수신된 경우 수신된 값을 저장
 
void setup(){
    pinMode(RED, OUTPUT);
    pinMode(GREEN, OUTPUT);
    pinMode(BLUE, OUTPUT);
 
    Serial.begin(9600);
    while(!Serial){;};
    Serial.println("Input Color Index : 0 ~ 8");
    Serial.println("Index 0 - black(OFF)");
    Serial.println("Index 1 - white");
    Serial.println("Index 2 - red");
    Serial.println("Index 3 - green");
    Serial.println("Index 4 - blue");
    Serial.println("Index 5 - yellow");
    Serial.println("Index 6 - magenta");
    Serial.println("Index 7 - cyan");
    Serial.println("Index 8 - orange");
}
 
void loop(){
    if(flag){
        flag = false;
        setRGBLED(recIndex);
    }
}
 
void setRGBLED(int colorIndex){ // gRgbColorIndex 배열의 인덱스 값으로 RGB LED 색 표시
    analogWrite(RED, bRgbColorIndex[colorIndex][0]);
    analogWrite(GREEN, bRgbColorIndex[colorIndex][1]);
    analogWrite(BLUE, bRgbColorIndex[colorIndex][2]);
}
 
void serialEvent(){ // Serial 통신 수신되면 호출 되는 시리얼 수신 인터럽트 핸들러
    char temp;
    temp = Serial.read();
    if((temp >= '0'&& (temp <= '8')){
        recIndex = (int)temp - 48;
        flag = true;
    }
}
cs

실행 결과

위 코드를 실행하면 아래 영상과 같이 시리얼 통신으로 색상 인덱스를 전송하여 LED의 색상을 변경 할 수 있습니다. 


마무리

이번 포스트에서는 자주 사용하는 컬러를 배열로 저장하여, 배열의 인덱스로 RGB LED를 제어하는 방법을 소개하였습니다. 끝까지 읽어 주셔서 감사합니다.😄
관련포스트

👉 아두이노 RGB LED 관련글 목록 보기

👉 아두이노 시리얼통신 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기