บทที่ 4 PWM - Pulse Width Modulation |
||
[วิดีโอประจำบท] | ||
ในบทที่ 1 และ 2 ที่ผ่านมา เราได้เรียนรู้ถึง OUTPUT ดิจิตอลกัน และได้รู้ว่าในระบบดิจิตอลนั้นมันมีเพียงสองค่า HIGH และ LOW เท่านั้น คือไม่ 0 ก็อัดเต็มร้อยไปเลย แล้วทีนี้ถ้าเราอยากได้แค่ 50% 70% มันคงทำไม่ได้สินะ จะว่าไปแม้สัญญาณระบบดิจิตอลมันมีแค่ศูนย์กับปล่อยมาเต็มที่ แต่มันก็ยังมีวิธีที่จะทำให้สัญญาณมันลดลงมาเหลือครึ่ง หรือ 75 หรือค่าอื่นๆที่เราต้องการได้อยู่เหมือนกันครับ เช่นเคยครับ บทนี้มีส่วนที่เป็นเรื่องการกำหนดตัวแปรเขามาเกี่ยวข้อง และเป็นเพียงการอธิบายคร่าวๆให้พอรู้พอเข้าใจเรื่อง PWM นะครับ แนะนำให้ศึกษาแบบละเอียดที่คอร์ส Basic Arduino ที่เป็นหลักการมากกว่าคอร์สนี้ |
||
![]() |
เริ่มกันง่ายๆกับตัวอย่างที่โปรแกรมให้มาอีกเช่นเคย เปิด Arduino IDE ขึ้นมา คลิก File > Examples > 01.Basics > Fade | |
ทำการต่อวงจรตามรูป อัพโหลดโค้ดลงบอร์ดแล้วดูผลที่เกิดขึ้น จะเห็นว่าหลอด LED จะค่อยๆสว่างขึ้นทีละนิดๆ จนถึงจุดที่สว่างมากที่สุดแล้วค่อยๆหรี่ลงทีละนิดๆจนดับแล้ววนกลับมาเริ่มสว่างใหม่ |
||
เพื่อให้เห็นความแตกต่างชัดเจนมากขึ้น ให้ลองแก้ไขโค้ดในส่วนของการกำหนด fadeAmount และ delay จะได้โค้ดใหม่เป็นตามนี้
|
||
จากโค้ดเราได้กำหนดค่าต่างๆ คือ ตั้งชื่อขาว่า led และกำหนดให้มันคือขา 9 กำหนดความสว่างของ LED = 0 ไว้ ตอนเริ่มโปรแกรมครั้งแรกมันจะได้ดับสนิท กำหนด fadeAmount = 25 คือให้มันเพิ่มขึ้นทีละ 25 ระดับนั่นเอง ในฟังก์ชั่น setup นั้นก็กำหนดหน้าที่ของขาเหมือนบทที่ผ่านๆมา ในฟังก์ชั่น loop จะเห็นมีคำสั่ง analogWrite ซึ่งเป็นคำสั่งที่ให้ใช้ PWM มาควบคุมขานั้นๆ ให้ขา LED มีค่า PWM เท่ากับตัวแปร brightness ที่กำหนด = 0 เอาไว้ เมื่อปล่อยระดับสถานะนั้นออกไปแล้วก็ให้ brightness = brightness + fadeAmount ที่เรากำหนดไว้ว่า = 25 ตอนนี้ค่า brightness ที่เดิมเป็น 0 ก็จะเท่ากับ 25 แล้ว เมื่อได้ค่า 25 นี้มา ก็ไปเช็ดกับคำสั่ง if ให้ค่านั้นอยู่ระหว่าง 0 – 255 (เพราะ analogWrite ของ Arduino มีค่า 0-255 เท่านั้นครับ ให้ใช้ค่านี้ไปเลย) ถ้าค่าน้อยกว่า 0 หรือเกิน 255 (|| แปลว่า “หรือ”)ให้กลับค่า fadeAmount เป็นค่าตรงข้าม บวกกลับเป็นลบ ลบกลับเป็นบวก แล้วก็ delay ก่อนจะกลับไปวนซ้ำใหม่ |
||
หลายคนอาจจะยังงงอยู่นะครับ ไฟมันหรี่ได้แสดงว่าไฟที่จ่ายออกมามันโดนลดลงไปสิ อันที่จริงไฟที่ออกมาจากขา 9 มันมีค่า 5V ตามปกติครับ (ระบบดิจิตอลมีแค่ HIGH กับ LOW ไงครับ) แต่ที่มันโดนลดลงไปเนี่ยเพราะมันมี PWM มาผสมลงไป ผมขอเทียบเหมือนกับน้ำหวาน ขา 9 มันก็ปล่อยน้ำหวานออกมาจากขวดปกติ แต่ PWM มันคือน้ำเปล่า เมื่อมีน้ำเปล่ามาเจือจางน้ำหวาน ความเข้มข้นมันก็ลดลงไป คล้ายๆกันนั่นแหละครับ มันต่างกันแค่น้ำยิ่งเยอะน้ำหวานยิ่งจาง แต่ PWM นั้นจะเป็นไปตามค่าของ PWM แทน โดยความเข้มของ PWM จะเรียกว่า Duty Cycle เป็นเปอร์เซ็นต์ เช่น ถ้าไฟฟ้าแรงดัน 5V ผสมกับ PWM ที่มี Duty Cycle 75% ก็จะเหลือไฟฟ้าแค่ 75% ของ 5V หรือไฟฟ้าแรงดัน 5V ผสมกับ PWM ที่มี Duty Cycle 50% จากไฟฟ้า 5V ก็จะเหลือเพียงแค่ครึ่งเดียว เป็นต้น | ||
![]() |
รูปนี้แสดงรูปคลื่นของ PWM จะเห็นว่ามันมีช่วงที่เป็น HIGH ต่างๆกัน PWM 0% ก็คือค่าเป็น HIGH 0% ต่อหนึ่งคาบเวลา(คือไม่มีเลย) 25% ก็คือมีค่า HIGH 25% ต่อหนึ่งคาบเวลา ส่วนค่า digitalWrite(HIGH) ที่ผ่านมาจากบทก่อนๆนั้น มันจ่ายไฟ HIGH ตลอดเวลาเหมือนกับ PWM 100% อันล่างสุด |
|
เพื่อความเข้าใจมากขึ้น มาดูตัวอย่างต่อไปกันดีกว่า ต่อวงจรใหม่ตามนี้ |
||
มีโค้ดดังนี้
|
||
ครั้งนี้ได้เพิ่ม LED เป็น 2 ชุด แต่แทนที่จะให้มันค่อยๆสว่างแล้วก็ค่อยๆดับพร้อมกัน ผมได้ทำการกลับในส่วนของ led2 ทั้งหมดจากบวกเป็นลบ ค่าตอนเริ่ม led1 = 0 คือดับสนิท ของ led2 ก็ให้เป็น 255 สว่างสุดๆซะ ทีนี้มันก็จะทำงานสลับกัน ขณะที่ led1 ค่อยๆสว่าง led2 จะค่อยๆหรี่ลง | ||
ผ่านไปสำหรับ PWM พอจะได้คอนเซ็ปกันรึเปล่าครับ หากยังงงๆก็แนะนำเหมือนเดิม ลองปรับเปลี่ยนเพิ่มแต่งเล่นดูครับ และเราจะใช้ PWM ได้เป็นบางขาเท่านั้นนะครับ คือเฉพาะขาที่มีเครื่องหมาย ~ เท่านั้น ในขาที่ไม่ใช่ PWM ถึงเขียนโปรแกรมไปมันก็ไม่สามารถทำงานเป็น PWM ได้ | ||
[ดาวน์โหลด] [กลับหน้าหลักของคอร์ส] |