Thursday, August 28, 2014

การทดลองใช้งานบอร์ด Arduino เพื่อควบคุมแสงจาก RGB Led

สวัสดีครับ วันนี้จะมานำเสนอผลการทดลองใช้งานบอร์ด 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;
}



ภาพวงจรที่ออกแบบไว้โดยใช้โปรแกรม Fritzing


ภาพจากการทดลองจริง


รูปวงจรจริง



ขณะที่บอร์ดเริ่มต้นทำงานไฟจาก Led จะเป็นแสงสีขาวที่เกิดจากการผสมกันของแสงสามสี



เมื่อกดปุ่มลดระดับความเข้มของแสงสีแดงลงจะได้เป็นแสงสีเขียวอ่อน



แสงสีม่วงที่ได้จากแสงสีแดงผสมกับแสงสีน้ำเงิน



ตัวอย่างแสงสีฟ้าอ่อนสวยๆ


สำหรับ source code ทั้งหมดสามารถโหลดได้ ที่นี่ 

No comments:

Post a Comment