วันพฤหัสบดีที่ 28 สิงหาคม พ.ศ. 2557

การควบคุม หลอด RGB LED โดยใช้ปุ่มกด ด้วยการใช้ Arduino [RGB LED / PWM-based Dimming]

โจทย์ Warm up ทบทวน Arduino
และการเขียนโปรแกรมภาษา C/C++


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 ใหม่

จากโจทย์ดังกล่าวข้างต้น เป็นการทำงานโดยอาศัยการสร้างคลาสด้วยภาษา C++ มาสร้างเป็นไลบารี่ไว้ใช้งานในโปแกรม Arduino ซึ่งเป็นการเขียนโค้ดโดยใช้หลักการเชิงวัตถุหรือ O-op ซึ่งสะดวกต่อการใช้งาน และนำคลาสที่สร้างได้มาเป็นไลบารี่เพื่อใช้งานกับโปรแกรม Arduino 
      จากโจทย์สามารถแบ่งการทำงานของโค้ดได้ทั้งหมด 3 ส่วน คือ 
             - ไฟล์ .h ซึ่งเป็นไฟล์ที่ใช้สำหรับสร้างชื่อคลาส และชื่อเมธอดต่างๆ ภายในคลาสนั้นๆ
             - ไฟล์ .cpp ซึ่งเป็นไฟล์ที่ใช้สำหรับสร้างรายละเอียดการทำงานของคลาสและเมธอดต่างๆ ที่สร้างไว้แล้วในไฟล์ .h
             - ไฟล์ .ino ซึ่งเป็นไฟล์ที่ใช้สำหรับติดต่อและทำงานร่วมกันกับบอร์ด Arduino โดยใช้คำสั่งต่างๆ ทั้งจากไลบารี่ที่ตัวโปรแกรมมีอยู่แล้วและจากไลบารี่ที่สร้างขึ้นเอง


โค้ดการทำงานสำหรับโจทย์ข้อที่ 1


    ในส่วนแรกเป็นส่วนของไฟล์ .h จะเป็นการสร้างชื่อคลาสและชื่อเมธอดภายในคลาสนั้นๆ จากรูปด้านล่างเป็นเป็นโค้ดไฟล์ .h ที่สร้างมาใช้งานกับโจทย์ข้างต้น ซึ่งจะประกอบด้วย การประกาศคลาส RGB_LED() ซึ่งประกอบด้วย Constructor REB_LED ซึ่งมีอากิวเมนต์ 3 ตัว คือ red_pin, green_pin และ blue_pin ซึ่งเป็นค่าของการกำหนดขาให้กับขา R G และ B และการประกาศ method  3 method ที่ไว้ใช้สำหรับเซ็ตค่า DutyCycleให้กับขา red green และ blue ซึ่งก็คือ setRed() ,setGreen() และ setBlue()



     ต่อมาส่วนที่สองจะเป็นส่วนของไฟล์ .cpp จะเป็นการกำหนดรายละเอียดการทำงานของคลาสและmethod ต่างๆ ที่ได้สร้างไว้ในไฟล์ .h จากส่วนที่ 1 โดยมีรายละเอียดคือ ในส่วนของ constructor เป็นการเก็บค่า pin ของขาแต่ละขา โดยนำค่ามาเก็บใน array เพื่อสะดวกต่อการเรียกใช้งาน และมีการกำหนดค่า DutyCycle ให้กับ pin ใน method setRed(), setGreen() และsetBlue() โดยใช้คำสั่ง analogWrite


     และสุดท้ายเป็นส่วนของไฟล์ .ino ที่ใช้ในการติดต่อและทำงานร่วมกันกับบอร์ด Arduino ในส่วนนี้จะแบ่งการทำงานออกเป็น 2 ส่วนหลัก คือ void setup() และ void loop() โดย void setup() จะเป็นการตั้งค่าให้กับขาต่างๆ ดังภาพด้านล่าง ก็จะเป็นการกำหนด ขา 3,5 และ 7 ให้เป็นขา Input 


     ต่อมาเป็นการทำงานในส่วนของ void loop()  จะแบ่งเป็น 3 if ใหญ่ๆ แต่ละ if จะรับผิดชอบ 1 สี โดยแต่ละ if จะเริ่มจากการตรวจสอบว่าปุ่มไหนมีการกดหรือไม่ ถ้ามีการกดแสดงว่าค่าที่อ่านได้จากปุ่มนั้นคือ 0 จากนั้นให้วนลูป while ไปเรื่อยๆ จนกว่าจะมีการปล่อยปุ่ม แสดงว่าค่าลอจิกที่อ่านได้ก็จะมีค่าเป็น 1 จากนั้นก็จะให้เพิ่มค่า dutycycle ของสีที่มีการกดปุ่มขึ้น 8 ตามที่โจทย์ได้กำหนด แล้วนำค่าที่ได้ไปเป็นค่า argument ให้กับคำสั่งที่ใช้สำหรับกำหนดค่า output ให้กับ RGB LED(setRed, setGreen, setBlue) จากนั้นให้ break เพื่อออกจากลูป while เพราะเกิดการกดแล้วปล่อยที่ปุ่มกดเรียบร้อยแล้ว ดังรูปด้านล่าง









โค้ดการทำงานสำหรับโจทย์ข้อที่ 2

          โค้ดการทำงานของข้อนี้จะประกอบด้วยการทำงานของโค้ดทั้งหมด 3 ไฟล์ คือ .h, .cpp และ .ino โดยไฟล์ .cpp และ .ino จะใช้ไฟล์เดียวกับโจทย์การทดลองในข้อที่ 1 แต่ไฟล์ .ino จะมีการเปลี่ยนแปลงดังรูปด้านล่าง











         จากโค้ดข้างต้นจะมีการเปลี่ยนแปลงเฉพาะในส่วนของ void loop() ซึ่งจะแบ่งเป็น 3 if เหมือนเดิมคือ ส่วนของปุ่มกด R, G และ B การทำงานจะเริ่มจากเมื่อมีการกดปุ่มใดปุ่มใดปุ่มหนึ่งทำให้สถานะลอจิกของปุ่มนั้นเป็น 0 จากนั้นให้นับ delay 100 msec แล้วทำการบวกค่า Dutycycle เพิ่มขึ้น 8 วนไปเรื่อยๆ พร้อมกับการสั่งให้ไฟสีนั้นมี Dutycycle ตามที่กำหนด โดยแต่ละรอบจะมีการตรวจสอบว่าปุ่มที่ทำการกดอยู่ขณะนั้น ถูกปล่อยหรือยังถ้าปุ่มกดได้ถูกปล่อยแล้ว ก็จะหยุดการทำงานของการเพิ่มความเข้มสีนั้น โดยการ break ในส่วนของสีนั้นๆ ไป


การต่อวงจรสำหรับการควบคุม LED RGB ในโจทย์การทดลองข้อ 1 และข้อ 2




รูปแสดงแบบจำลองการต่อวงจร







                                         รูปแสดงการจำลองการต่อจร แบบ Schematic

  


รูปแสดงการต่อวงจรจริง


จากวงจรข้างต้นประกอบด้วย 2 ส่วน  คือ

      1. ส่วน Input จะรับมาจากผู้ใช้งาน ผ่านทางปุ่มกด ( Push Switch ) ซึ่งต่อแบบ Pull up (Active-low) ประกอบด้วย 3 ปุ่ม ที่เอาไว้เพิ่มค่า Dutycycle ของทั้ง 3 สีคือ R,G และ B
      2. ส่วน Output จะเป็นส่วนของการสั่งการให้ RGB LED แสดงค่า Dutycycle ตามที่ได้รับมาจากปุ่มกด Switch ซึ่ง RGB LED  ที่ใช้เป็นแบบ Common Cathode

RGB LED คืออะไร????

       RGB LED คือ หลอด LED ที่มี แม่สี ทั้งสามสี อยู่ในหลอดเดียวกัน และมี 4 ขา ได้แก่ 
  ขาของหลอดสีแดง กราวน์ เขียว น้ำเงิน ตามลำดับ ซึ่งทั้งสามสีจะผสมกันออกมากลายเป็นสีต่างๆ
ตามปริมาณแต่ละสีที่ใส่ค่าเข้าไป ซึ่งมีทั้งแบบ Common Anode และ Common Cathode  ซึ่งถ้าเป็น
แบบ Common Anode ขากราวน์ จะต่อกับไฟบวก แต่ถ้าเป็นแบบ Common Cathode ขากราวน์จะต่อกับ กราวน์


                           



ผลการทดสอบการทำงานจริง
ทำการวัดค่า กระแสที่ไหผ่านLED RGB และแรงดันที่ตกคร่อมแต่ละขา มีค่าดังนี้
แรงดันตกคร่อม สีแดง 0.224 V สีเขียว 0.35 V สีฟ้า 0.488 V และมีแรงดันอยู่ระหว่าง 
สีแดง 0.27mA - 8.36mA สีเขียว 0.19mA-5.86mA สีฟ้า 0.2mA  - 6.24mA


วิดิโอแสดงการทำงานจริงของโจทย์การทดลอง ข้อที่ 1


ผลการทดลองทดสอบ วัดกับเครื่อง oscilloscope ข้อที่ 1


วิดิโอแสดงการทำงานจริงของโจทย์การทดลองข้อที่ 2


ผลการทดลองทดสอบ วัดกับเครื่อง oscilloscope ข้อที่ 2


       สามารถดาวน์โหลดไฟล์ RGB_LED.zip เพื่อทดสอบการทำงานของโค้ดและวงจรได้ 


ไม่มีความคิดเห็น:

แสดงความคิดเห็น