Bài 7. Hiệu ứng LED RGB
Trong bài học này, bạn sẽ học cách kết nối một số linh kiện của những bài học trước nhằm sử dụng ba nút nhấn (trong bài 6) để điều khiển màu sắc của LED RGB mà bạn đã dùng trong bài 3 để tạo thành một hiệu ứng đẹp mắt.
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
STT | Tên linh kiện | SL | Hình ảnh |
1 | LED RGB | 1 | |
2 | Điện trở 270 Ω | 3 | |
3 | Nút nhấn | 3 | |
4 | Breadboard | 1 | ![]() |
5 | Arduino UNO | 1 | ![]() |
6 | Dây nối dạng cắm | ![]() |
Sơ đồ breadboard
Sơ đồ cắm chân cho breadboard được cho bên dưới. Chân dài nhất của LED RGB được cắm trên hàng 2 của breadboard. Hàng này được nối vào GND. Sơ đồ đi dây này được giả định trong trường hợp LED âm chung –nếu bạn sử dụng LED dương chung, hãy kết nối chân dài nhất này với GND. Lưu ý rằng với LED dương chung, chiều đổi màu LED sẽ bị đảo (giá trị màu giảm dần thay vì tăng dần nếu dùng LED âm chung).
Code Arduino
Nạp đoạn sketch sau vào board Arduino. Khi bắt đầu, đèn LED sẽ tắt. Nếu bạn nhấn và giữ một nút nhấn nào đó, đèn LED sẽ sáng dần lên. Màu thành phần đỏ ứng với nút nhấn trên cùng, xanh lá với nút nhấn giữa và màu xanh dương với nút nhấn dưới.
Khi đã có đủ một màu sắc, hãy thử nhấn nút nhấn khác và để ý sự pha trộn màu của LED.
Nếu muốn bắt đầu lại từ đầu, hãy nhấn nút Reset trên Arduino. Đây là nút nhấn nằm cạnh cổng kết nối USB của Arduino.
/* Bài 7. RGB Fader */ int redLEDPin = 11; int greenLEDPin = 10; int blueLEDPin = 9; int redSwitchPin = 7; int greenSwitchPin = 6; int blueSwitchPin = 5; int red = 0; int blue = 0; int green = 0; void setup() { pinMode(redLEDPin, OUTPUT); pinMode(greenLEDPin, OUTPUT); pinMode(blueLEDPin, OUTPUT); pinMode(redSwitchPin, INPUT_PULLUP); pinMode(greenSwitchPin, INPUT_PULLUP); pinMode(blueSwitchPin, INPUT_PULLUP); } void loop() { if (digitalRead(redSwitchPin) == LOW) { red ++; if (red > 255) red = 0; } if (digitalRead(greenSwitchPin) == LOW) { green ++; if (green > 255) green = 0; } if (digitalRead(blueSwitchPin) == LOW) { blue ++; if (blue > 255) blue = 0; } analogWrite(redLEDPin, red); analogWrite(greenLEDPin, green); analogWrite(blueLEDPin, blue); delay(10); }
Sketch tương tự như bài 3. Chúng ta cũng sẽ sử dụng 3 ngõ ra để điều khiển LED. Chúng đều là những chân PWM (nếu chưa rõ PWM là gì, hãy xem lại bài 3) để điều khiển công suất của mỗi màu LED.
Chúng ta cũng cần sử dụng thêm ba chân khác cho ba nút nhấn và chúng được cấu hình trong hàm ‘setup’ là ngõ vào và được kéo lên mức HIGH, chỉ đến khi nút nhấn được tác động, chúng mới được kéo xuống mức LOW.
Sau khi xác định các chân vào/ra, có một nhóm nhỏ các biến, được lưu giá trị hiện tại của các màu sắc gọi là ‘red’, ‘green’ và ‘blue’.
int red = 0; int blue = 0; int green = 0;
Nếu ‘red’ có giá trị 0 nghĩa là thành phần màu đỏ của LED sẽ tắt, và nếu giá trị là 255 nó sẽ có độ sáng cực đại. Hàm ‘loop’ có hai thành phần. Thành phần thức nhất sẽ kiểm tra trạng thái của nút nhấn và tạo ra các thay đổi cần thiết của các biến ‘red’, ‘green’ và ‘blue’. Mỗi nút nhấn sẽ gây ảnh hưởng đến một màu sắc nhất định. Đoạn kiểm tra nút nhấn thay đổi màu đỏ như sau:
if (digitalRead(redSwitchPin) == LOW) { red ++; if (red > 255) red = 0; }
Nếu khi thực hiện lệnh ‘digitalRead’ đối với nút nhấn màu đỏ, ta nhận được giá trị LOW, nghĩa là nút nhấn đang bị tác động, ta sẽ cộng thêm 1 vào giá trị của biến ‘red’. Lệnh ++ sẽ cộng thêm 1 vào giá trị biến.
Tuy nhiên, chúng ta cần cẩn trọng ở đây, bởi giá trị lớn nhất dùng cho chân PWM là 255. Cho nên ở dòng tiếp theo, ta sẽ kiểm tra xem giá trị này đã vượt quá giới hạn hay chưa, nếu có ta sẽ đặt nó trở về mức 0 và bắt đầu lại.
Thành phần thứ hai trong hàm ‘loop’ thực hiện lệnh ‘analogWrite’ đối với mỗi màu LED.
analogWrite(redLEDPin, red); analogWrite(greenLEDPin, green); analogWrite(blueLEDPin, blue); delay(10);
Cuối cùng, có một lệnh delay để đặt thời gian trễ, làm chậm quá trình đổi màu để chúng ta dễ dàng nhận ra.
Chúng ta có thể làm gì thêm?
Hãy thử bỏ dòng delay cuối lệnh ‘loop’. Bạn có thể làm việc này đơn giản là đặt dòng lệnh đó thành một chú thích, bằng cách thêm vào kí hiệu // ở đầu của dòng lệnh, như sau:
analogWrite(blueLEDPin, blue); //delay(10);
Đó là một kĩ thuật hữu ích, bởi đôi khi bạn muốn sử dụng lại dòng lệnh đó thì cách đơn giản là xóa bỏ kí hiệu // đi.
Nếu không có độ trễ, bạn sẽ nhận ra rằng, bất cứ khi nào bạn nhả nút nhấn, bạn sẽ bắt gặp giá trị ngẫu nhiên độ sáng của LED. Điều đó xảy ra bởi vì tốc độ thay đổi độ sáng quá nhanh, đến nỗi bạn không thể kiểm soát được nó.
Một thử nghiệm khác bạn có thể làm là đổi chức năng của ba nút nhấn để điều khiển LED như một đèn tín hiệu giao thông. Hãy thử làm sao để khi nhấn nút trên cùng đèn chuyển màu xanh lá, nút giữa là màu vàng và nút cuối là màu đỏ.
Trả lời