Làm thế nào để điều khiển LED RGB - Led 3 màu

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

  1. Arduino UNO
  2. Breadboard
  3. Dây cắm breadboard
  4. 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 angry)
  5. 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

 
lên
44 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Bộ điều khiển PID - ứng dụng phần 2 - xe dò line dùng thuật toán PID

Tiép nối bài viết về xe dò line cảm ơn Đỗ Hữu Toàn đã viết hộ mình phần 4. hôm nay mình sẽ làm cho chiếc xe dò line đi mượt và có hồn hơn 

lên
34 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

Hướng dẫn sử dụng cảm biến nhiệt độ DS18B20 (-55°C đến +125°C) sai số ±0.5°C

Lại quay về vấn đề đo nhiệt độ, như ở bài trước, mình đã dùng cả LM35, cả TMP36. Nhưng rốt cuộc vẫn không hiệu quả, lần này mình đang sử dụng con DS18B20 này và cảm thấy khá ổn hơn so với lần trước. Nhiệt độ ít bị chênh lệch hơn và như quảng cáo là chỉ có sai số ±0.5°C thôi (nếu nhiệt độ trong phạm vi -10°C to +85°C, đáng để thử phải không nào?

lên
17 thành viên đã đánh giá bài viết này hữu ích.

Breadboard là gì? Vì sao khi dùng Arduino lại cần breadboard

Lúc mình mới học về Arduino thì ngoài khái niệm về Arduino, thì mình còn gặp thêm một khái niệm mới nữa là breadboard. Khái niệm này cũng không quá khó, nhưng để giúp các bạn mới học đỡ phải tìm kiếm google (yêu hàng Việt) nên mình xin mạn phép viết ngắn lại giúp các bạn mới tiếp cận với Arduino có thể rút ngắn thời gian tìm tòi?

lên
27 thành viên đã đánh giá bài viết này hữu ích.
Từ khóa: