สำหรับในตอนนี้นั้น เราจะมาเขียนโค้ดภาษา C++ เพื่อใช้งานบอร์ด Arduino ในการควบคุม RGB LED โดยโปรแกรมและวงจรที่เราจะสร้างขึ้นมานั้นมีคุณสมบัติดังนี้
- วงจรทำงานโดยใช้ระดับแรงดันสำหรับ I/O ที่ 5V
- มีปุ่มกด 3 ปุ่มที่ทำงานแบบ Active Low โดยแต่ละปุ่มนั้นจะใช้ควบคุมความสว่างของแต่ละสี
- มีเอาต์พุตจากบอร์ด Arduino 3 ขา ต่อกับวงจร RGB LED (ในที่นี้จะใช้แบบ common anode) พร้อมตัวต้านทานจำกัดกระแส 3 ตัว
- เมื่อกดปุ่มแล้วปล่อยแต่ละครั้ง จะทำให้ค่า Duty Cycle ของสีนั้นเพิ่มขึ้น 8 ค่า เช่น เมื่อกดปุ่ม R ทำให้ค่า Duty Cycle ของสีแดงเพิ่มขึ้น 8 ค่า และถ้าค่า Duty Cycle มีค่ามากกว่า 255 ให้กลับมาเริ่มที่ 0 ใหม่
ในส่วนแรกนั้นเราจะสร้างไฟล์ชื่อ RGB_LED.h เพื่อเป็นการประกาศคลาสชื่อ RGB_LED โดยมีสองส่วนคือ private และ public ในส่วน private นั้นเราจะทำการประกาศตัวแปรต่างๆ ที่จะใช้งานภายในคลาส และในส่วน public นั้นเราจะประกาศ method ต่างๆ ที่ object ของคลาสนี้จะสามารถเรียกใช้งานได้
โค้ดที่ได้เป็นดังนี้
จากโค้ดด้านบน// class declaration #ifndef RGB_LED_H #define RGB_LED_H #include <inttypes .h> #if ARDUINO >= 100 #include "Arduino.h" #else #include "WProgram.h" #endif class RGB_LED { private: int red_pin, green_pin, blue_pin; int red_duty, green_duty, blue_duty; 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); void update_red(int width); void update_green(int width); void update_blue(int width); }; #endif;
ในส่วน private เราได้ประกาศตัวแปรทั้งหมด 6 ตัวดังนี้
- int red_pin คือ ตัวเลขจำนวนเต็ม ของ pin บนบอร์ด arduino ที่ใช้งาน pwm ได้ สำหรับ RGB LED สีแดง
- int green_pin คือ ตัวเลขจำนวนเต็ม ของ pin บนบอร์ด arduino ที่ใช้งาน pwm ได้ สำหรับ RGB LED สีเขียว
- int blue_pin คือ ตัวเลขจำนวนเต็ม ของ pin บนบอร์ด arduino ที่ใช้งาน pwm ได้ สำหรับ RGB LED สีน้ำเงิน
- int red_duty คือ ตัวเลขจำนวนเต็ม สำหรับค่า Duty Cycle ของสีแดง
- int green_duty คือ ตัวเลขจำนวนเต็ม สำหรับค่า Duty Cycle ของสีเขียว
- int blue_duty คือ ตัวเลขจำนวนเต็ม สำหรับค่า Duty Cycle ของสีน้ำเงิน
- RGB_LED(int red_pin, int green_pin, int blue_pin)
คือ constructor method โดยรับอาร์กิวเมนต์ red_pin, green_pin และ blue_pin เป็นข้อมูลแบบ int ซึ่งใช้สำหรับกำหนดหมายเลข pin เอาต์พุตบนบอร์ด arduino ที่สามารถใช้งาน pwm ได้ - void setRed(int duty_cycle)
เป็นฟังก์ชันที่ใช้สำหรับกำหนดค่า duty cycle ให้กับสีแดงของ RGB LED โดยใช้คำสั่ง analogWrite() สำหรับบอร์ด arduino - void setGreen(int duty_cycle)
เป็นฟังก์ชันที่ใช้สำหรับกำหนดค่า duty cycle ให้กับสีเขียวของ RGB LED โดยใช้คำสั่ง analogWrite() สำหรับบอร์ด arduino - void setBlue(int duty_cycle)
เป็นฟังก์ชันที่ใช้สำหรับกำหนดค่า duty cycle ให้กับสีน้ำเงินของ RGB LED โดยใช้คำสั่ง analogWrite() สำหรับบอร์ด arduino - void update_red(int width)
เป็นฟังก์ชันที่ใช้สำหรับเปลี่ยนแปลงค่า duty cycle ของสีแดง เมื่อมีการกดปุ่มแต่ละครั้งค่า duty cycle จะเพิ่มขึ้น 8 ค่า และถ้ามีค่ามากกว่า 255 จะกลับมาเริ่มต้นใหม่ที่ 0 - void update_green(int width)
เป็นฟังก์ชันที่ใช้สำหรับ เปลี่ยนแปลงค่า duty cycle ของสีเขียว เมื่อมีการกดปุ่มแต่ละครั้งค่า duty cycle จะเพิ่มขึ้น 8 ค่า และถ้ามีค่ามากกว่า 255 จะกลับมาเริ่มต้นใหม่ที่ 0 - void update_blue(int width)
เป็นฟังก์ชันที่ใช้สำหรับ เปลี่ยนแปลงค่า duty cycle ของสีเขียว เมื่อมีการกดปุ่มแต่ละครั้งค่า duty cycle จะเพิ่มขึ้น 8 ค่า และถ้ามีค่ามากกว่า 255 จะกลับมาเริ่มต้นใหม่ที่ 0
หลังจากที่เราได้ประกาศคลาส, ตัวแปร และ method ต่างๆ แล้ว เราจะสร้างไฟล์ใหม่ที่มีชื่อว่า RGB_LED.cpp เพื่อที่จะเขียนโค้ดกำหนดการทำงานของ method ต่างๆ ตามที่ได้ประกาศไว้ในไฟล์แรก
โค้ดที่ได้เป็นดังนี้
#include "RGB_LED.h" // class implementation RGB_LED::RGB_LED(int red_pin, int green_pin, int blue_pin){ this->red_pin = red_pin; this->green_pin = green_pin; this->blue_pin = blue_pin; this->red_duty = 0; this->green_duty = 0; this->blue_duty = 0; pinMode(red_pin, OUTPUT); pinMode(green_pin, OUTPUT); pinMode(blue_pin, OUTPUT); setRed(0); setGreen(0); setBlue(0); } void RGB_LED::setRed(int duty_cycle){ analogWrite(red_pin, 255 - duty_cycle); } void RGB_LED::setGreen(int duty_cycle){ analogWrite(green_pin, 255 - duty_cycle); } void RGB_LED::setBlue(int duty_cycle){ analogWrite(blue_pin, 255 - duty_cycle); } void RGB_LED::update_red(int width){ red_duty += width; if (red_duty > 255) { red_duty = 0; } setRed(red_duty); } void RGB_LED::update_green(int width){ green_duty += width; if (green_duty > 255) { green_duty = 0; } setGreen(green_duty); } void RGB_LED::update_blue(int width){ blue_duty += width; if (blue_duty > 255) { blue_duty = 0; } setBlue(blue_duty); }หมายเหตุ: เนื่องจากเราใช้ RGB LED แบบ common anode จึงต้องใช้ค่า 255 - duty_cycle ในคำสั่ง analogWrite()
หลังจากที่เราได้ประกาศและสร้างคลาสพร้อมทั้ง method ต่างๆ แล้ว ต่อมาจะเป็นการนำคลาสที่เราสร้างมาใช้งานกับบอร์ด arduino โดยเขียนโค้ดภายในไฟล์ .ino ลองสร้าง object จากคลาสแล้วเรียกใช้งาน method ที่เราสร้าง เช่น เมื่อกดปุ่ม R แล้วปล่อยจะเรียกใช้งานฟังก์ชัน update_red(8) เพื่อให้ทำการเพิ่มค่า duty cycle ของสีแดงอีก 8 ค่า
โค้ดที่ได้เป็นดังนี้
#include "RGB_LED.h" RGB_LED led(3, 5, 6); int button_pin[] = {8, 9, 10}; void setup() { for(int i=0;i<3;i++){ pinMode(button_pin[i], INPUT); } } void loop() { // if push then release red button if (digitalRead(button_pin[0]) == LOW) { delay(15); if (digitalRead(button_pin[0]) == HIGH){ led.update_red(8); } } // if push and release green button if (digitalRead(button_pin[1]) == LOW) { delay(15); if (digitalRead(button_pin[1]) == HIGH){ led.update_green(8); } } // if push and release blue button if (digitalRead(button_pin[2]) == LOW) { delay(15); if (digitalRead(button_pin[2]) == HIGH){ led.update_blue(8); } } }
จากโค้ดด้านบน
- เราสร้าง object จากคลาส RGB_LED ชื่อว่า led โดยกำหนดเอาต์พุตของสีแดง, สีเขียว และสีน้ำเงิน เป็นหมายเลข pin คือ 3, 5 และ 6 ตามลำดับ
- กำหนดหมายเลข pin คือ 8, 9 และ 10 เป็นอินพุตจากปุ่มกดสีแดง, สีเขียว และสีน้ำเงินตามลำดับ
- เราใช้คำสั่ง delay(15); เพื่อช่วยในการ debounce ของปุ่มกด
ภาพแผนผังวงจร |
ภาพจากการต่อวงจรจริง |
จากที่ผ่านมาเราต้องกดปุ่มแล้วปล่อยแต่ละครั้งเพื่อให้ค่า duty cycle ของสีใดสีหนึ่งเพิ่มขึ้นทีละ 8 ค่า แต่ในตอนนี้เราต้องการให้ค่า duty cycle เพิ่มขึ้นทีละ 8 ค่า เมื่อกดปุ่มค้างไว้ทุกๆ 100 ms ดังนั้นเราจะทำการแก้ไขโค้ดในไฟล์ .ino ดังต่อไปนี้
#include "RGB_LED.h" RGB_LED led(3,5,6); int button_pin[] = {8, 9, 10}; void setup() { for(int i=0;i<3;i++){ pinMode(button_pin[i], INPUT); } } void loop() { // if press red button if (digitalRead(button_pin[0]) == LOW) { delay(100); led.update_red(8); } // if press green button if (digitalRead(button_pin[1]) == LOW) { delay(100); led.update_green(8); } // if press blue button if (digitalRead(button_pin[2]) == LOW) { delay(100); led.update_blue(8); } }
ภาพตัวอย่างการทำงานของวงจร |
ภาพตัวอย่างการทำงานของวงจร |
ไม่มีความคิดเห็น:
แสดงความคิดเห็น