โจทย์ Warm up ทบทวน Arduino
และการเขียนโปรแกรมภาษา C/C++
และการเขียนโปรแกรมภาษา C/C++
1) จงเขียนโค้ดสำหรับ Arduino และวงจรที่ทำงานได้ตามข้อกำหนดต่อไปนี้
RGB LED / PWM-based Dimming
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
ต่อมาเป็นการทำงานในส่วนของ void loop() จะแบ่งเป็น 3 if ใหญ่ๆ แต่ละ if จะรับผิดชอบ 1 สี โดยแต่ละ if จะเริ่มจากการตรวจสอบว่าปุ่มไหนมีการกดหรือไม่ ถ้ามีการกดแสดงว่าค่าที่อ่านได้จากปุ่มนั้นคือ 0 จากนั้นให้วนลูป while ไปเรื่อยๆ จนกว่าจะมีการปล่อยปุ่ม แสดงว่าค่าลอจิกที่อ่านได้ก็จะมีค่าเป็น 1 จากนั้นก็จะให้เพิ่มค่า dutycycle ของสีที่มีการกดปุ่มขึ้น 8 ตามที่โจทย์ได้กำหนด แล้วนำค่าที่ได้ไปเป็นค่า argument ให้กับคำสั่งที่ใช้สำหรับกำหนดค่า output ให้กับ RGB LED(setRed, setGreen, setBlue) จากนั้นให้ break เพื่อออกจากลูป while เพราะเกิดการกดแล้วปล่อยที่ปุ่มกดเรียบร้อยแล้ว ดังรูปด้านล่าง
- มีเมธอดอย่างเช่น
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
โค้ดการทำงานของข้อนี้จะประกอบด้วยการทำงานของโค้ดทั้งหมด 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
รูปแสดงแบบจำลองการต่อวงจร
รูปแสดงการต่อวงจรจริง
จากวงจรข้างต้นประกอบด้วย 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 ขากราวน์จะต่อกับ กราวน์
ที่มา http://imall.iteadstudio.com/media/wysiwyg/Products/Discrete_LED/5mm_LED_RGB_-_Common_Anode.jpg
ผลการทดสอบการทำงานจริง
ทำการวัดค่า กระแสที่ไหผ่าน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 เพื่อทดสอบการทำงานของโค้ดและวงจรได้
ไม่มีความคิดเห็น:
แสดงความคิดเห็น