โปรเจกต์ Button Switch โดยใช้งาน External Interrupt
มีตัวอย่างมากมายเกี่ยวกับวิธีการเชื่อมต่อ Button Switch ผ่าน External Interrupt ซึ่งตัวอย่างนี้จะนำเสนอแนวทางเลือกอื่น
มีตัวอย่างมากมายเกี่ยวกับวิธีการเชื่อมต่อ Button Switch ผ่าน External Interrupt ซึ่งตัวอย่างนี้จะนำเสนอแนวทางเลือกอื่น
Project Supporter Team
โพสต์โดย
หากคุณยังใหม่กับแนวคิดเรื่องการเชื่อมต่อ Button Switch และการต่อวงจรอย่างง่าย ลองดูบทเรียน Understanding and Using Button Switches - ซึ่งจะช่วยให้คุณเข้าใจพื้นฐานบางส่วน ก่อนที่จะไปดูตัวอย่างการใช้งานร่วมกับ External Interrupt ในทางกลับกัน หากคุณทราบทุกอย่างเกี่ยวกับ Button Switch, การต่อวงจร, ปัญหาที่อาจเกิดขึ้น และ External Interrupt อยู่แล้ว คุณก็น่าจะสนใจบทความนี้เช่นกัน เนื่องจากมีการนำเสนอวิธีการอื่นในการเชื่อมต่อและประมวลผล Button Switch และ Interrupt ของแต่ละตัว
Design Considerations
ก่อนที่เราจะไปดูวิธีที่นำเสนอ เราต้องกำหนดจุดเริ่มต้นก่อน เพราะมันมีผลต่อวิธีการเขียน Code
Button circuit - วงจร Button Switch ถูกกำหนดค่าตาม Figure 1 (Circuit 1) ด้านล่างนี้ นี่คือวิธีปกติที่ใช้ในการต่อวงจร Switch อย่างง่าย วงจรนี้ช่วยให้มั่นใจว่า Digital Input Pin ที่เราประกาศและใช้เป็น Interrupt Pin จะถูกรักษาไว้ที่ 0v เมื่อ Switch เปิด (Off) ซึ่งจะช่วยกำจัด Input รบกวนที่เกิดจากสัญญาณแทรกซ้อน ซึ่งอาจทำให้เกิดการ Trigger Interrupt ผิดพลาดได้ เมื่อ Switch ปิด (On) ค่าที่ Digital Pin จะเพิ่มขึ้นเป็น +5v และ Trigger Interrupt ตามที่เราต้องการ (ดูหัวข้อถัดไป)

Interrupt mode - ต่อไป เราต้องกำหนด Mode หรือประเภทของ Interrupt Trigger ที่ Digital Pin จะไวต่อการตอบสนองเพื่อสั่งให้ Interrupt ทำงาน เนื่องจากวงจรจะทำให้แรงดันไฟฟ้าเพิ่มขึ้นจาก 0v เป็น +5v เมื่อ Switch ปิด ดังนั้นตัวเลือก Mode และ Parameter ที่ชัดเจนสำหรับการทำ AttachInterrupt คือ 'RISING' ตัวอย่างเช่น attachInterrupt(...,..., RISING)
Switching style - Button Switch เป็น Momentary Switch ซึ่งหมายความว่าสถานะปกติของ Switch คือ Off จนกว่าจะถูกกด ซึ่งจะเป็น On จนกระทั่งปล่อยมือ สถานะจะกลับเป็น Off ดังนั้น Switch จะเป็น On เฉพาะในช่วงเวลาที่ถูกกดเท่านั้น เป็นเรื่องปกติใช่ไหม? แน่นอน อย่างไรก็ตาม ธรรมชาติของ Mechanical Button Switch หมายความว่าการสวิตช์ต้องผ่านวงจร Off-On และกลับไปเป็น Off ก่อนที่จะถือได้ว่าถูกกดอย่างสมบูรณ์ และควรสังเกตด้วยว่าเวลาที่กดค้างไว้นั้นไม่แน่นอน—ผมสามารถวางนิ้วบนปุ่มได้นานเท่าที่ต้องการ
หากเราพิจารณาด้วยว่า Switch ไม่ใช่ Digital Device ที่สมบูรณ์แบบ—พวกมันมักจะสร้าง Noise ซึ่งส่งผลให้เกิดการ Trigger ผิดพลาดได้ ข่าวดีก็คือ Noise ดังกล่าวสามารถจัดการได้ด้วยเทคนิคที่เรียกว่า 'debouncing' ซึ่งในความเป็นจริงแล้ว Sketch ที่นำเสนอนี้ได้รวมเทคนิคดังกล่าวไว้ด้วย
เพื่อให้เข้าใจสิ่งที่เกิดขึ้น Figure 2 แสดงเส้นสัญญาณจำลองของวงจรการสวิตช์ของ Button ทั่วไป แสดงให้เห็นตัวอย่างของ Noise ทันทีที่ Switch ถูกกด (จุด A) จนกระทั่ง On อย่างสมบูรณ์ (จุด B) และจากเวลาที่ถูกปล่อย (จุด C) จนกระทั่ง Off อย่างสมบูรณ์ (จุด D) ช่วงเวลาที่ถือได้ว่า Switch อยู่ในสถานะ On อย่างเสถียรคือจาก B ถึง C และนี่คือฟังก์ชันของระยะเวลาที่กด Switch ค้างไว้ แต่ในความเป็นจริง เราต้องคำนึงถึงค่าที่อ่านผิดพลาดซึ่งอาจเกิดจาก Noise ณ จุดใดก็ได้ระหว่าง A ถึง D ดังนั้น เรื่องนี้อาจจะดูวุ่นวายเล็กน้อย—Switch Interrupt สามารถถูก Trigger เมื่อไหร่ก็ได้ และเราไม่สามารถบันทึกว่า Switch ถูกกดแล้วจนกว่าจะถึงจุด D เป็นอย่างน้อย ช่างเป็นข้อกำหนดที่ซับซ้อนจริงๆ!
ถึงอย่างนั้น ก็มีตัวอย่างมากมายที่ทำงานได้ผลดี แต่อย่างไรก็ตาม วิธีที่นำเสนอที่นี่นั้นตรงไปตรงมา มีเหตุผล กระชับ และใช้งานได้จริง—โปรดอ่านต่อ

And The Solution Is...
ตัวอย่างวิธีแก้ปัญหาคือ Sketch ที่ตอบโจทย์ข้อควรพิจารณาและข้อกำหนดข้างต้นทั้งหมดด้วยวิธีที่เรียบง่าย กระชับ และสวยงาม สิ่งที่น่าสังเกตและเป็นพื้นฐานของการออกแบบคือ วิธีนี้แยกการเริ่มต้นการสวิตช์ (กระบวนการ Interrupt) และการสวิตช์ที่เสร็จสมบูรณ์ออกจากกัน (นั่นคือ การรอให้ปล่อยปุ่มและการจัดการ Debounce)
นอกจากนี้ ยังคุ้มค่าที่จะกล่าวถึงว่ากระบวนการอ่าน Switch นั้นเป็นแบบ Non-exclusive (Non-blocking) ทั้งเมื่อทดสอบ Digital Input และเมื่อประมวลผล Debounce แนวทางนี้ช่วยให้ Sketch สามารถทำงานอื่นได้ แม้ในขณะที่ Switch กำลังอยู่ในช่วงเปลี่ยนสถานะ
ลองดู Sketch โหลดโปรแกรม และทดลองใช้งานดู
หากคุณพอใจกับ Sketch และวิธีการทำงานของมัน ทำไมไม่ลองดูว่าต้องเปลี่ยนอะไรบ้างหากคุณใช้วงจร Switch ที่แตกต่างออกไป? ตัวอย่างเช่น วงจรที่ไม่ต้องใช้ Pull Down Resistor โดยวงจรจะมีลักษณะเหมือน Figure 3 ด้านล่าง

Sketch จะต้องถูกปรับเปลี่ยนอย่างไร?
คำใบ้: Digital Read Pin จะต้องอยู่ที่ +5v (HIGH) เนื่องจาก Button Switch จะทำให้กระแสไหลจาก Digital Pin ลง Ground เมื่อถูกกด ซึ่งจะส่งผลให้เกิดการ Trigger Interrupt (Switch จะต้องต่อวงจรตาม Circuit_C2 ด้านบน) นอกจากนี้ ใน setup() จะต้องมีการเรียกใช้ pinMode ของ Switch โดยใช้ Parameter INPUT_PULLUP แทนที่จะเป็น INPUT และเรียกใช้ attachInterrupt โดยใช้ Parameter 'FALLING' แทนที่จะเป็น 'RISING'
แค่นั้นใช่ไหม? ยังไม่เชิง เพราะภายใต้สภาวะวงจรเปิด Digital Pin จะอ่านค่าได้ HIGH ซึ่งหมายความว่า Switch คือ open และเป็น LOW เมื่อ Switch คือ closed - ซึ่งจะตรงกันข้าม ลองดูว่าคุณจะหาคำตอบได้ไหม แต่ถ้าไม่ได้ ลองดูบทเรียนเกี่ยวกับ Button Switch ด้านล่างนี้น่าจะช่วยได้
หากคุณสนุกกับการอ่านและทำตามบทความนี้ ลองมาดูวิธีที่เราสามารถใช้ Interrupt Service Routine (ISR) เพียงตัวเดียวเพื่อจัดการ Switch จำนวนเท่าใดก็ได้ โดยแทบไม่มีการต่อสายเพิ่มเติมเกินกว่าจำนวน Switch ที่เราต้องการกำหนดค่า บทความนี้ชื่อว่า "Multiple Switches, One Interrupt" และมีการใช้งาน Library ez_switch_lib (ดูด้านล่างที่ Further Reading) วิธีนี้สามารถขยายเพื่อรองรับ Switch จำนวนเท่าใดก็ได้ ไม่ว่าจะเป็นแบบ Button หรือ Toggle และต่อวงจรด้วยรูปแบบการต่อสายทั่วไปแบบใดก็ได้
คุณอาจพบว่าบทความเหล่านี้ของนักเขียนคนเดียวกัน ก็น่าสนใจและมีประโยชน์เช่นกัน:
Other Online Resources
ขอให้สนุก!
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้