สวัสดีครับ
วันนี้จะมานำเสนอผลการทดลองใช้งานบอร์ด Arduino เพื่อควบคุมแสงจาก Led แบบ RGB กันนะครับ ซึ่งโจทย์มีอยู่ว่า
1) จงเขียนโค้ดสำหรับ Arduino และวงจรที่ทำงานได้ตามข้อกำหนดต่อไปนี้
[RGB LED / PWM-based Dimming]
- วงจรทำงานโดยใช้ระดับแรงดันสำหรับ I/O ที่ 5V เท่านั้น
- มีปุ่มกด 3 ปุ่ม (ให้ชื่อว่า R, G, B) ทำงานแบบ Pull-up (active-low) ให้ต่อวงจรปุ่มกดเอง เพื่อใช้งานกับบอร์ด Arduino
- มีเอาต์พุต 3 ขา ต่อกับวงจร RGB LED (จะใช้แบบ Common-Anode หรือ Common-Cathode ก็ได้) พร้อมตัวต้านทานจำกัดกระแส 3 ตัว
- เขียนโค้ดด้วยภาษา C++ สำหรับ Arduino เพื่อสร้าง Class ที่มีชื่อว่า "RGB_LED"
- กำหนดให้ constructor สำหรับคลาส RGB_LED เป็นดังนี้ RGB_LED( int red_pin, int_green_pin, int blue_pin ); โดยรับค่ามาเป็นหมายเลขของ I/O pins สำหรับ 3 ขาของ Arduino ที่จะถูกใช้งานเป็นเอาต์พุตแบบ PWM
- มีเมธอดอย่างเช่นvoid setRed( int duty_cycle ), void setGreen( int duty_cycle ),void setBlue( int duty_cycle ) เพื่อใช้กำหนดค่า duty cycle ของขาเอาต์พุต PWM และใช้ในการกำหนดความสว่างของแต่ละสี ใช้คำสั่ง analogWrite() ในการกำหนดค่า
- กำหนดสมาชิก instance members ตามความจำเป็น เช่น ค่า duty cycles สำหรับแต่ละสี
- ใช้คลาสดังกล่าวในการเขียนโค้ด (สร้าง object จากคลาสดังกล่าวและเรียกใช้เมธอด) เพื่อสาธิตการทำงานร่วมกับฮาร์ดแวร์จริง
- เมื่อกดปุ่ม R, G หรือ B แล้วปล่อยแต่ละครั้ง จะทำให้ค่า duty cycle ของสีดังกล่าวเพิ่มขึ้นทีละ 8 ถ้าค่า duty cycle เกิน 255 ให้วนกลับมาเริ่มที่ 0 ใหม่ (ค่าเริ่มต้นสำหรับ duty cycles เป็น 0)
2) เหมือนข้อ 1 แต่เปลี่ยนพฤติกรรมการกดปุ่ม: ถ้ากดปุ่ม R, G หรือ B ค้างไว้อย่างน้อย 100 msec จะเพิ่มค่าขึ้นทีละ 8 (แล้วเริ่มนับเวลาใหม่) ถ้าค่า duty cycle เกิน 255 ให้วนกลับมาเริ่มที่ 0 ใหม่
สำหรับอุปกรณ์ที่ใช้มีดังนี้
- บอร์ด Arduino Uno (สามารถใช้รุ่นอื่นแทนได้)
- RGB Led (Common Anode)
- ปุ่มกด X3
- ตัวต้านทาน 330 Ω X3 (ใช้กับ RGB Led)
- ตัวต้านทาน 10 KΩ X3 (ใช้กับปุ่มกด)
- Breadboard
ซอฟต์แวร์ที่ใช้
- Arduino IDE
- Fritzing
- text editor หรือ IDE สำหรับเขียนภาษา C/C++
โดยวงจรนี้เป็นวงจรที่สามารถผสมแสงสีของ
RGB
Led ได้ด้วยการควบคุมความเข้มของแสงจากปุ่มกด ซึ่งจะเริ่มจากค่าความสว่างสูงสุดและค่อยๆ
ลดลงเมื่อกดปุ่ม ซึ่งสามารถกดแยกเป็นสีๆ ได้ โดยจะกดแล้วปล่อยหรือกดค้างไว้ก็ได้
(เปลี่ยนระดับทุก 100 msec)
พร้อมกันนั้นในส่วนของโค้ดโปรแกรมจะมีส่วนของการเรียกใช้งานคลาสของภาษา C++
อยู่ด้วย ซึ่งมีดังต่อไปนี้
RGB_LED.h
#ifndef RGB_LED_h #define RGB_LED_h #include "Arduino.h" class RGB_LED{ public: RGB_LED (int red_pin, int green_pin, int blue_pin); void setRed(int duty_cycle); void setGreen(int duty_cycle); void setBlue(int duty_cycle); private: int _red_pin; int _green_pin; int _blue_pin; }; #endif |
RGB_LED.cpp
#include "Arduino.h" #include "RGB_LED.h" RGB_LED::RGB_LED(int red_pin, int green_pin, int blue_pin) { pinMode(red_pin, OUTPUT); pinMode(green_pin, OUTPUT); pinMode(blue_pin, OUTPUT); _red_pin = red_pin; _green_pin = green_pin; _blue_pin = blue_pin; } void RGB_LED::setRed(int duty_cycle) { analogWrite(_red_pin, duty_cycle); } void RGB_LED::setGreen(int duty_cycle) { analogWrite(_green_pin, duty_cycle); } void RGB_LED::setBlue(int duty_cycle) { analogWrite(_blue_pin, duty_cycle); } |
ส่วนของโค้ด
Arduino
rgbButtonWcpp.ino
#include "rgb_led .h" const int R = 3; const int G = 5; const int B = 6; // instance of class RGB_LED RGB_LED rgbLed(11, 10, 9); // 0 = brightiest, 255 = dimmiest int dutyCycleR = 0; int dutyCycleG = 0; int dutyCycleB = 0; void setup(){ // Initialize button pin pinMode(R, INPUT); pinMode(G, INPUT); pinMode(B, INPUT); // Set Initiate duty cycle to 0 rgbLed.setRed(dutyCycleR); rgbLed.setGreen(dutyCycleG); rgbLed.setBlue(dutyCycleB); } void loop(){ // Red section if (isButtonPressed(R)){ dutyCycleR = addDutyCycle(dutyCycleR); rgbLed.setRed(dutyCycleR); delay(100); } // Green section if (isButtonPressed(G)){ dutyCycleG = addDutyCycle(dutyCycleG); rgbLed.setGreen(dutyCycleG); delay(100); } // Blue section if (isButtonPressed(B)){ dutyCycleB = addDutyCycle(dutyCycleB); rgbLed.setBlue(dutyCycleB); delay(100); } } boolean isButtonPressed(int buttonPin){ int buttonState = digitalRead(buttonPin); // check button press (active low) if (buttonState == LOW){ return true; } else { return false; } } int addDutyCycle(int dutyCycle){ // increase duty cycle for 8 int dc = dutyCycle + 8; if (dc > 255){ dc = 0; } return dc; } |
รูปวงจรจริง
ขณะที่บอร์ดเริ่มต้นทำงานไฟจาก Led
จะเป็นแสงสีขาวที่เกิดจากการผสมกันของแสงสามสี
เมื่อกดปุ่มลดระดับความเข้มของแสงสีแดงลงจะได้เป็นแสงสีเขียวอ่อน
แสงสีม่วงที่ได้จากแสงสีแดงผสมกับแสงสีน้ำเงิน
ตัวอย่างแสงสีฟ้าอ่อนสวยๆ