Tôi yêu Arduino gửi vào
- 252734 lượt xem
I. Giới thiệu
Cũng đã khá lâu kể từ lần cuối mình viết bài chia sẻ với Cộng đồng Arduino Việt Nam. Mấy hôm nay, mình có một dự án liên quan đến LED RGB (Led 3 màu - led có thể biểu diễn tất cả các màu), mà tìm tài liệu trên Cộng đồng Arduino lại không có, vì vậy, mình sẽ viết một bài viết để chia sẻ cho các bạn đi sau.
II. Những gì cần nắm
Mục tiêu mà mình hướng đến và muốn chia sẻ trong bài viết này đó là giới thiệu về LED RGB và chỉ các bạn điều khiển 1 con LED RGB. Còn muốn điều khiển nhiều con LED RGB thì cần nhiều đồ hơn và phức tạp hơn nên mình xin nhường lại vấn đề này cho các bạn tìm hiểu thêm và chia sẻ cho cộng đồng.
III. Phần cứng
- Arduino UNO
- Breadboard
- Dây cắm breadboard
- Led 3 màu - LED RGB (các bạn mua loại chung cực âm cho nó dễ, vì sao nó dễ thì các bạn đọc tiếp thì sẽ tự nhận thấy thôi
) - 3 con điện trở (220ohm - 560ohm)
IV. Sơ lược về 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 (một loại xung mà hầu hết các mạch Arduino đều có - xêm thêm về xung PWM).
Ânodo comum (chung cực dương) - Cátodo comum (chung cực âm - mình demo con này)
V. Nối mạch
| LED RGB | Arduino UNO |
| 1 (RED) | 9 |
| 2 | GND |
| 3 (GREEN) | 10 |
| 4 (BLUE) | 11 |
VI. Mã lập trình
/*
User: Tôi yêu Arduino
http://arduino.vn/users/toi-yeu-arduino
RGB LED
Tạo led cầu vồng
*/
// Ta sẽ đặt tên cho cho các chân (vì các chân không thay đổi nên mình lưu ở dạng hằng số với từ khóa const)
// http://arduino.vn/reference/const-bien-hang
// Theo quy tắc đặt tên trong giới lập trình thì các hằng số các bạn phải viết hoa toàn bộ các ký tự
// và các dấu cách giữa các từ được thay bằng dấu gạch nối dưới (dân gian gọi là shift gạch :3)
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 nhá - thử thay đổi số này xem sao :3
// Hàm setup
// Xem thêm về vòng đời các hàm trong Arduino
// http://arduino.vn/reference/setup-va-loop
void setup()
{
// Khởi tạo các chân là OUTPUT (tất nhiên òi :D)
// http://arduino.vn/reference/pinmode
// http://arduino.vn/reference/thiet-dat-digital-pins-nhu-la-input-inputpullup-va-output
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
}
// Hàm loop
// Xem thêm về vòng đời các hàm trong Arduino
// http://arduino.vn/reference/setup-va-loop
void loop()
{
// Gọi hàm displayAllBasicColors để thể hiện toàn bộ các màu cơ bản !
displayAllBasicColors();
// Đã chơi led rgb mà không biết đến hiệu ứng cầu vồng thì không thể chấp nhận được :3, vì vậy, mình chia sẻ cho các bạn hiệu ứng cầu vồng luôn
// 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 - cái này dễ mà ha
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)
// Mình không hiểu nổi vụ con công tô màu cho con quạ :3, đáng lẻ phải ra màu trắng chứ, mà thế quái nào lại ra màu đen :3, chắc do con công pha màu kém quá :D
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
}
}
// Cài đặt hàm showRGB(int color)
// Chúng ta sẽ cài đặt hàm showRGB để mỗi khi nhận một giá trị từ 0 - 767
// nó sẽ chuyển dần dầm các màu của con đèn led rgb thành các màu đỏ - cam - vàng - lục - lam - chàm - tím
// 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
}
// rồi xuất xung ra và chơi thôi :3
analogWrite(RED_PIN, redPWM);
analogWrite(BLUE_PIN, bluePWM);
analogWrite(GREEN_PIN, greenPWM);
}
VII. Kết luận
Thật dễ phải không nào :3, mình thấy cực dễ luôn á. Các bạn làm thử như thế nào rồi báo cho mình hay nha hehe

)


