You are on page 1of 7

Bài 11: RGB LED

1. Mục đích
Biết cách ứng dụng xung PWM trong việc phát xung điều khiển led RGB
Giới thiệu về led RGB:

Hình 1: LED RGB

Khác với LED bình thường, led RGB có 4 chân, trong đó có 1 chân dương chung và 3
chân âm riêng cho từng màu (R - red - đỏ, G - Green - Xanh lá, B - Blue - Xanh dương). LED
RGB thực chất là 3 con diode led bình thường dính chụm thành 1 khối mà thôi (vì độ sáng
của LED RGB khá sáng cộng với hiệu ứng lưu ảnh của mắt người mà mình thấy được các
màu sắc khác nhau). Để thay màu sắc của LED RGB, ta chỉ việc thay đổi độ sáng của từng
con diode (led) trong con led rgb. Để thay đổi độ sáng của một con LED ta chỉ việc điều
chỉnh điện áp xuất ra con LED, mà để điều chỉnh điện áp xuất ra con LED ta sẽ dùng xung
PWM.
2. Sơ đồ nguyên lí
Để cho các bạn dễ hiểu, trong phần sơ đồ nguyên lí mình sẽ sử dụng 3 LED thay cho
LED RGB, về bản chất thì chúng giống nhau.

Hình 2: Sơ đồ nguyên lí

3. Sơ đồ lắp ráp
Hình 3: LED RGB

4. Chương trình mẫu

const int RED_PIN = 9; // led đỏ


const int GREEN_PIN = 10; // led xanh lá const
int BLUE_PIN = 11; // led xanh dương

// Hằng số đợi giữa mỗi lần đổi trạng thái

int DELAY_TIME = 500;

// đơn vị là mili giây


void setup()

{
pinMode(RED_PIN, OUTPUT);

pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
}
void loop()
{
// Gọi hàm displayAllBasicColors để thể hiện toàn bộ các màu
cơ bản !
displayAllBasicColors();
// Gọi hàm showSpectrum để chạy hiệu ứng cầu vồng.
showSpectrum();
}

// Cài đặt hàm displayAllBasicColors


void displayAllBasicColors()
{
// Tắt toàn bộ các led
digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);

delay(DELAY_TIME);

// Chỉ bật led đỏ

digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);

delay(DELAY_TIME);

// Chỉ bật led xanh lá

digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, LOW);

delay(DELAY_TIME);

// Chỉ bật led xanh dương

digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, HIGH);

delay(DELAY_TIME);

// Bật màu vàng bắng cách bật led đỏ và xanh

digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, LOW);

delay(DELAY_TIME);
// Xanh lam (Cyan) bằng cách bật led xanh lá và xanh dương
digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, HIGH);

delay(DELAY_TIME);

// Tím (đỏ xanh dương)

digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);

digitalWrite(BLUE_PIN, HIGH);
delay(DELAY_TIME);
// Màu trắng (tất cả các led)
digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, HIGH);

delay(DELAY_TIME);
}

// Cài đặt hàm showSpectrum

void showSpectrum()
{

for (int i = 0; i < 768; i++)


{
showRGB(i); // Call RGBspectrum() with our new x
delay(10); // Delay 10ms
}
}

// mình chia nó thành 3 khu


// đỏ - xanh lục
// xanh lục - xanh lam
// xanh lam - đỏ

// gồm có 4 mốc
// 0 = đỏ chét (đỏ 100%)
// 255 = xanh lục 100%
// 511 = xanh dương (100%)
// 767 = lại là đỏ chét

// Những con số nằm giữa các màu sẽ được tính toán theo công thức
bên dưới (đọc dễ hiểu mà) để ra được các màu cần thiết
void showRGB(int color)
{
int redPWM;
int greenPWM;
int bluePWM;

if (color <= 255) // phân vùng 1


{
redPWM = 255 - color; // red đi từ sáng về tắt
greenPWM = color; // green đi từ tắt thành sáng
bluePWM = 0; // blue luôn tắt
}
else if (color <= 511) // phân vùng 2
{
redPWM = 0; // đỏ luôn tắt
greenPWM = 255 - (color - 256); // green đi từ sáng về tắt
bluePWM = (color - 256); // blue đi từ tắt thành sáng
}
else // color >= 512 // phân vùng 3
{
redPWM = (color - 512); // red tắt rồi lại sáng
greenPWM = 0; // green luôn tắt nhé
bluePWM = 255 - (color - 512); // blue sáng rồi lại tắt
}

analogWrite(RED_PIN, redPWM);
analogWrite(BLUE_PIN, bluePWM);
analogWrite(GREEN_PIN, greenPWM);
}

Giải thích chương trình:


Chúng ta bắt đầu bằng việc khai báo các chân cho LED RGB, mỗi chân sẽ điều khiển
một màu xác định:
const int RED_PIN = 9; // led đỏ
const int GREEN_PIN = 10; // led xanh lá const
int BLUE_PIN = 11; // led xanh dương
Ở đây tôi có sử dụng một số hàm để minh họa:
// Gọi hàm displayAllBasicColors để thể hiện toàn bộ các màu cơ bản !
displayAllBasicColors();
// Gọi hàm showSpectrum để chạy hiệu ứng cầu vồng.
showSpectrum();
Đầu tiên tôi sẽ nói về hàm displayAllBasicColors(); , đây là hàm hiển thị các màu cơ
bản bằng việc bật một trong ba led :
void displayAllBasicColors()
{
// Tắt toàn bộ các led

digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);

delay(DELAY_TIME);

// Chỉ bật led đỏ

digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);

delay(DELAY_TIME);

// Chỉ bật led xanh lá

digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, LOW);

delay(DELAY_TIME);
// Chỉ bật led xanh dương

digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, HIGH);

delay(DELAY_TIME);

// Bật màu vàng bắng cách bật led đỏ và xanh

digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, LOW);

delay(DELAY_TIME);
// Xanh lam (Cyan) bằng cách bật led xanh lá và xanh dương
digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, HIGH);

delay(DELAY_TIME);

// Tím (đỏ xanh dương)

digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);

digitalWrite(BLUE_PIN, HIGH);
delay(DELAY_TIME);
// Màu trắng (tất cả các led)
digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, HIGH);

delay(DELAY_TIME);
}

LED RGB có một ứng dụng được rất nhiều người yêu thích đó là sử dụng để tạo hiệu ứng
LED cầu vòng, ở đây tôi sẽ sử dụng hàm showSpectrum(); để tạo hiệu ứng LED cầu vòng cơ
bản bằng việc điều khiển xung PWM và hiệu ứng trộn màu để tạo ra được nhiều màu sắc
khác nhau:
void showSpectrum()
{

for (int i = 0; i < 768; i++)


{
showRGB(i); // Call RGBspectrum() with our new x
delay(10); // Delay 10ms
}
}

Chúng ta sẽ cài đặt hàm showRGB( int color) để mỗi khi nhận một giá trị từ 0-767 nó sẽ
chuyển dần dần các màu của led RGB thành dỏ - cam – vàng – lục – lam – chàm – tím, chúng
ta sẽ chia nó thành 3 phân vùng để tiện cho các bạn hiểu:
void showRGB(int color)
{
int redPWM;
int greenPWM;
int bluePWM;

if (color <= 255) // phân vùng 1


{
redPWM = 255 - color; // red đi từ sáng về tắt
greenPWM = color; // green đi từ tắt thành sáng
bluePWM = 0; // blue luôn tắt
}
else if (color <= 511) // phân vùng 2
{
redPWM = 0; // đỏ luôn tắt
greenPWM = 255 - (color - 256); // green đi từ sáng về tắt
bluePWM = (color - 256); // blue đi từ tắt thành sáng
}
else // color >= 512 // phân vùng 3
{
redPWM = (color - 512); // red tắt rồi lại sáng
greenPWM = 0; // green luôn tắt nhé
bluePWM = 255 - (color - 512); // blue sáng rồi lại tắt
}

analogWrite(RED_PIN, redPWM);
analogWrite(BLUE_PIN, bluePWM);
analogWrite(GREEN_PIN, greenPWM);
}

You might also like