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

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Đánh giá hiệu năng giữa Python và C trên Raspberry Pi

Python được biết đến như là ngôn ngữ chính để lập trình IO cho RPi nhưng bạn cũng hoàn toàn có thể sử dụng các ngôn ngữ khác để thực hiện điều này. Tuy sẽ khó khăn hơn so với việc sử dụng Python nhưng cũng sẽ có những ưu điểm khác bù lại. Sau đây, ta sẽ đánh giá khả năng IO của RPi khi chạy chương trình bằng ngôn ngữ Python và C.

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

Tạo webserver với Intel Edison

Tạo webserver với Intel Edison như thế nào? Có khó không? Bài viết này sẽ hướng dẫn bạn tạo webserver với board mạch này. Mình thấy cực kì dễ luôn, bạn thử xem.

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