Tôi yêu Arduino gửi vào
- 196052 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