Bài 3. Điều Khiển LED RGB - OpenBuilds Vietnam

Trong bài học này, chúng ta sẽ học cách sử dụng LED RGB (Red Green Blue – Đỏ, Xanh Lá, Xanh Dương). Bạn có thể sử dụng hàm analogWrite của Arduino để điều khiển màu sắc của LED.

Thoạt nhìn, LED RGB (Đỏ, Xanh lá, Xanh dương) trông giống như đèn LED thông thường, tuy nhiên, cấu tạo bên trong của LED này thực sự gồm 3 đèn LED, một đỏ, một xanh lá và một xanh dương. Bằng cách điều khiển độ sáng của mỗi LED riêng biệt mà bạn có thể tạo ra màu sắc bất kì mà bạn muốn.

Việc trộn màu sắc cũng giống như trộn âm thanh với bảng hòa âm hay như việc pha màu trên bảng màu – bằng cách điều chỉnh độ sáng của mỗi LED. Việc điều chỉnh này, về mặt phần cứng có thể thực hiện bằng cách thay đổi giá trị của các điện trở (hoặc biến trở) như chúng ta đã thực hiện trong bài 2. Tuy nhiên, việc này cũng có thể thực hiện bằng Arduino nhờ hàm analogWrite để điều khiển giá trị dòng ra đến các chân của LED.

Linh kiện cần thiết

Để thực hành bài tập này, chúng ta cần sử dụng một số linh kiện như sau

STTTên linh kiệnSLHình ảnh
1Đèn LED RGB 10mm1

2Điện trở 270Ω3

3Breadboard mini1

4Arduino UNO R31

5Dây nối dạng cắm

Sơ đồ breadboard

LED RGB có bốn chân. Mỗi chân được nối vào mỗi cực dương của LED đơn bên trong và một chân nối vào cực âm chung của LED.

Chân âm chung của LED là chân thứ hai kể từ phía bản phẳng của LED. Đây cũng là chân dài nhất trong 4 chân. Chân này sẽ được nối vào GND.

Mỗi chân LED bên trong đều phải có điện trở 270 Ω để hạn chế dòng qua nó. Ba chân dương của LED (đỏ, xanh lá, xanh dương) được kết nối với chân ngõ ra Arduino qua ba điện trở.

Nếu bạn sử dụng LED cực dương chung thay vì cực âm chung, kết nối chân dài nhất với +5V thay cho GND.

Màu sắc

Lý do bạn có thể pha trộn bất kì màu nào bạn thích bằng việc thay đổi lượng ánh sáng đỏ, xanh lá và xanh dường là vì mắt của bạn có ba loại thụ thể ánh sáng (đỏ, xanh lá và xanh dương). Mắt và não bộ xử lý lượng ánh sáng của mỗi màu và chuyển nó thành màu sắc của quang phổ.

Như vậy, bằng cách sử dụng ba màu LED chúng ta có thể phát ra bất cứ màu sắc nào theo ý muốn. Ý tưởng này được sử dụng trong các TV, các tấm LCD có ba điểm màu đỏ, xanh lá, xanh dương cạnh nhau tạo nên mỗi điểm ảnh (pixel).

Nếu bạn đặt độ sáng của tất cả các màu giống nhau, màu tổng hợp sẽ là màu trắng. Nếu bạn tắt LED xanh dương, chỉ đèn đỏ và xanh cùng độ sáng, màu tổng hợp sẽ là màu vàng.

Chúng ta có thể điều chỉnh độ sáng của mỗi LED đỏ, xanh lá và xanh dương, do đó chúng ta có thể trộn được màu mong muốn.

Arduino Sketch

Đoạn chương trình sau đây sẽ điều khiển màu sắc của đèn thay đổi qua các màu đỏ, xanh lá, xanh dương, vàng, tím và xanh ngọc.

/* Bai 3. RGB LED */ int redPin = 11; int greenPin = 10; int bluePin = 9; //uncomment this line if using a Common Anode LED //#define COMMON_ANODE void setup() { pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } void loop() { setColor(255, 0, 0); // red delay(1000); setColor(0, 255, 0); // green delay(1000); setColor(0, 0, 255); // blue delay(1000); setColor(255, 255, 0); // yellow delay(1000); setColor(80, 0, 80); // purple delay(1000); setColor(0, 255, 255); // aqua delay(1000); } void setColor(int red, int green, int blue) { #ifdef COMMON_ANODE red = 255 - red; green = 255 - green; blue = 255 - blue; #endif analogWrite(redPin, red); analogWrite(greenPin, green); analogWrite(bluePin, blue); }

Hãy thử nạp sketch vào Arduino, sau đó ta sẽ phân tích chi tiết về nó…

Chương trình bắt đầu bằng việc chỉ định chân nào sẽ sử dụng cho các màu sắc nào:

int redPin = 11; int greenPin = 10; int bluePin = 9;

Bước tiếp theo là viết hàm ‘setup’. Như đã giới thiệu trong bài học trước hàm setup thực hiện một lần khi Arduino reset. Trong trường hợp này, hàm setup sẽ thực hiện việc đặt các chân điều khiển đều là ngõ ra (output).

void setup() { pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); }

Trước khi phân tích hàm ‘loop’, hãy xem qua hàm cuối cùng trong sketch

void setColor(int red, int green, int blue) { analogWrite(redPin, red); analogWrite(greenPin, green); analogWrite(bluePin, blue); }

Hàm này sẽ nhận ba tham số, một cho độ sáng của LED đỏ, một cho xanh lá và còn lại là xanh dương. Giá trị các tham số này sẽ nằm trong khoảng từ 0 đến 255, với 0 nghĩa là tắt và 255 nghĩa là mức sáng lớn nhất. Hàm này sẽ gọi lệnh ‘analogWrite’ để đặt độ sáng cho mỗi đèn LED.

Quan sát hàm ‘loop’ bạn sẽ thấy rằng chúng ta sẽ cài đặt lượng màu đỏ, xanh lá và xanh dương mà chúng ta muốn hiển thị, sau đó delay một giây trước khi chuyển sang màu khác.

void loop() { setColor(255, 0, 0); // red delay(1000); setColor(0, 255, 0); // green delay(1000); setColor(0, 0, 255); // blue delay(1000); setColor(255, 255, 0); // yellow delay(1000); setColor(80, 0, 80); // purple delay(1000); setColor(0, 255, 255); // aqua delay(1000); }

Thử thêm một vài màu khác vào sketch, nạp lại chương trình và xem hiệu ứng trên đèn LED.

Nếu bạn sử dụng LED RGB với cực dương (Anode) chung, bạn phải thay đổi giá trị ghi analog để độ sáng được trừ đi bởi giá trị 255. Việc này có thể được thực hiện bằng cách bỏ ghi chú cho dòng ‘#define COMMON_ANODE trong sketch.

Sử dụng màu sắc Internet

Màu sắc được ứng dụng trên các trang web là dạng số ‘hex’. Ví dụ màu đỏ là #FF0000. Bạn có thể tìm thấy các mã màu tương ứng với màu sắc trên bảng màu tại http://htmlcolorcodes.com.

Sáu số của hệ hex này thực ra là 3 cặp số; cặp thứ nhất là thành phần màu đỏ, hai số tiếp theo là thành phần xanh lá và cặp số cuối cùng là thành phần xanh dương. Màu đỏ là #FF0000, vì thành phần đỏ cực đại (FF là 255 trong hệ hex) và không có thành phần màu xanh lá hoặc xanh dương.

Điều này cũng hữu ích trong việc lựa chọn màu sắc mong muốn để hiển thị trên LED RGB. Hãy thử tạo ra màu indigo (#4F0082).

Thành phần màu đỏ, xanh lá và xanh dương trong màu indigo (hệ hex) là 4B, 00 và 82. Chúng ta có thể sử dụng hàm setColor để tạo ra màu đó như sau:

setColor(0x4F, 0x0, 0x82);

Chúng ta sẽ dùng hệ hex cho các số của mỗi thành phần màu bằng cách đặt ‘0x’ trước mã hex đó.

Hãy thử đặt thêm một số màu sắc khác vào hàm ‘loop’ và đừng quên sử dụng thêm hàm delay sau đó.

Nguyên lý (PWM)

Điều xung (PWM – Pulse-width modulation) là kỹ thuật điều khiển công suất. Chúng ta sử dụng nó để điều khiển độ sáng của mỗi bóng LED.

Đồ thị bên dưới thể hiện tín hiệu từ một ngõ ra PWM của Arduino.

Với khoảng 1/500 giây, mỗi chân PWM sẽ tạo ra một xung. Độ rộng của xung sẽ được điều khiển bởi hàm ‘analogWrite’. Do vậy ‘analogWrite(0)’ sẽ không tạo ra bất kì xung nào và ‘analogWrite(255)’ sẽ tạo ra một xung dài đến khi xung tiếp theo được tạo ra, hay nói cách khác, ngõ ra luôn có điện áp cao.

Nếu bằng cách nào đó, ngõ ra chỉ đạt điện áp 5V trong 90% thời gian thì tải (LED) cũng chỉ nhận được 90% công suất. Chúng ta không thể quan sát được LED bật/tắt trong khoảng thời gian ngắn như vậy, mà chỉ quan sát được việc thay đổi độ sáng của LED.

Bạn có thể làm được gì nữa

Hãy thử:

  • Đặt bóng LED vào một quả bóng nhựa, điều khiển thay đổi màu LED và quan sát hiệu ứng
  • Thay đổi giá trị hàm delay để giảm hoặc tăng tốc độ thay đổi màu sắc

Có rất nhiều thứ bạn có thể làm với LED RGB. Hãy thử tìm một số project trên internet sử dụng RGB LED và tìm hiểu cách họ sử dụng nó.

Từ khóa » Sơ đồ Led Rgb