เราได้ดูการเชื่อมต่อปุ่มกับ Arduino แล้วและได้กล่าวถึงปัญหาการติดต่อ "ตีกลับ" นี่เป็นปรากฏการณ์ที่น่ารำคาญมากที่ทำให้เกิดการกดปุ่มซ้ำๆ และทำให้ยากต่อการจัดการการคลิกปุ่มโดยทางโปรแกรม มาพูดถึงวิธีกำจัดการตีกลับของผู้ติดต่อกัน
จำเป็น
- - Arduino;
- - ปุ่มชั้นเชิง;
- - ตัวต้านทานที่มีค่าเล็กน้อย 10 kOhm
- - ไดโอดเปล่งแสง;
- - สายเชื่อมต่อ
คำแนะนำ
ขั้นตอนที่ 1
การตีกลับของหน้าสัมผัสเป็นปรากฏการณ์ทั่วไปในสวิตช์เชิงกล ปุ่มกด สวิตช์สลับ และรีเลย์ เนื่องจากหน้าสัมผัสมักจะทำจากโลหะและโลหะผสมที่มีความยืดหยุ่น เมื่อปิดทางกายภาพ จะไม่สร้างการเชื่อมต่อที่เชื่อถือได้ในทันที ภายในช่วงเวลาสั้น ๆ ผู้ติดต่อจะปิดหลายครั้งและผลักกัน เป็นผลให้กระแสไฟฟ้าใช้ค่าสถานะคงที่ไม่ใช่ในทันที แต่หลังจากการขึ้น ๆ ลง ๆ หลายครั้ง ระยะเวลาของผลกระทบชั่วคราวนี้ขึ้นอยู่กับวัสดุสัมผัส ขนาด และการออกแบบ ภาพประกอบแสดงออสซิลโลแกรมทั่วไปเมื่อปิดหน้าสัมผัสของปุ่มชั้นเชิง จะเห็นได้ว่าเวลาจากช่วงเวลาที่เปลี่ยนเป็นสถานะคงตัวนั้นมีหลายมิลลิวินาที นี้เรียกว่า "ตีกลับ"
ผลกระทบนี้ไม่ปรากฏให้เห็นในวงจรไฟฟ้าเพื่อควบคุมแสง มอเตอร์ หรือเซ็นเซอร์และอุปกรณ์เฉื่อยอื่นๆ แต่ในวงจรที่มีการอ่านและประมวลผลข้อมูลอย่างรวดเร็ว (ซึ่งความถี่อยู่ในลำดับเดียวกับพัลส์ "ตีกลับ" หรือสูงกว่า) นี่เป็นปัญหา โดยเฉพาะอย่างยิ่ง Arduino UNO ซึ่งทำงานที่ 16 MHz นั้นยอดเยี่ยมในการจับการตีกลับของผู้ติดต่อโดยยอมรับลำดับของหนึ่งและศูนย์แทนที่จะเป็นสวิตช์ 0 ถึง 1
ขั้นตอนที่ 2
เรามาดูกันว่าการเด้งสัมผัสส่งผลต่อการทำงานที่ถูกต้องของวงจรอย่างไร มาเชื่อมต่อปุ่มนาฬิกากับ Arduino โดยใช้วงจรตัวต้านทานแบบดึงลง โดยการกดปุ่มเราจะเปิดไฟ LED และปล่อยทิ้งไว้จนกว่าจะกดปุ่มอีกครั้ง เพื่อความชัดเจน เราเชื่อมต่อ LED ภายนอกกับพินดิจิตอล 13 แม้ว่าจะสามารถจ่ายไฟในตัวได้
ขั้นตอนที่ 3
ในการทำภารกิจนี้ให้สำเร็จ สิ่งแรกที่นึกถึง:
- จำสถานะก่อนหน้าของปุ่ม;
- เปรียบเทียบกับสถานะปัจจุบัน
- หากสถานะเปลี่ยนไปเราจะเปลี่ยนสถานะของ LED
มาเขียนสเก็ตช์และโหลดลงในหน่วยความจำ Arduino
เมื่อเปิดวงจร จะเห็นผลของการเด้งสัมผัสทันที มันปรากฏตัวในความจริงที่ว่า LED ไม่สว่างขึ้นทันทีหลังจากกดปุ่มหรือสว่างขึ้นแล้วดับลงหรือไม่ปิดทันทีหลังจากกดปุ่ม แต่ยังคงเปิดอยู่ โดยทั่วไปวงจรจะทำงานไม่เสถียร และหากสำหรับงานที่เปิดไฟ LED สิ่งนี้ไม่สำคัญนัก สำหรับงานอื่นๆ ที่จริงจังกว่านั้น ก็ไม่สามารถยอมรับได้
ขั้นตอนที่ 4
เราจะพยายามแก้ไขสถานการณ์ เราทราบดีว่าการติดต่อกลับเกิดขึ้นภายในไม่กี่วินาทีหลังจากการปิดผู้ติดต่อ มารอกัน 5ms หลังจากเปลี่ยนสถานะของปุ่ม เวลานี้สำหรับบุคคลนั้นเกือบจะเกิดขึ้นทันที และการกดปุ่มโดยบุคคลมักจะใช้เวลานานกว่ามาก - หลายสิบมิลลิวินาที และ Arduino ก็ใช้งานได้ดีในช่วงเวลาสั้นๆ เช่นนี้ และ 5 มิลลิวินาทีเหล่านี้จะช่วยให้สามารถตัดการเด้งของผู้ติดต่อจากการกดปุ่มได้
ในภาพร่างนี้ เราจะประกาศขั้นตอน debounce () ("bounce" ในภาษาอังกฤษเป็นเพียง "bounce" คำนำหน้า "de" หมายถึงกระบวนการย้อนกลับ) ไปยังอินพุตที่เราระบุสถานะก่อนหน้าของปุ่ม หากการกดปุ่มใช้เวลานานกว่า 5 มิลลิวินาที แสดงว่าเป็นการกดปุ่มจริงๆ
โดยการตรวจจับการกด เราจะเปลี่ยนสถานะของ LED
อัปโหลดภาพร่างไปยังบอร์ด Arduino ตอนนี้ทุกอย่างดีขึ้นมาก! ปุ่มทำงานไม่มีสะดุด เมื่อกดแล้ว ไฟ LED จะเปลี่ยนสถานะตามที่เราต้องการ
ขั้นตอนที่ 5
ฟังก์ชันที่คล้ายกันมีให้โดยไลบรารีพิเศษ เช่น ไลบรารี Bounce2คุณสามารถดาวน์โหลดได้จากลิงก์ในส่วน "แหล่งที่มา" หรือบนเว็บไซต์ https://github.com/thomasfredericks/Bounce2 ในการติดตั้งไลบรารี่ ให้วางไว้ในไดเร็กทอรีไลบรารีของสภาพแวดล้อมการพัฒนา Arduino และรีสตาร์ท IDE
ไลบรารี "Bounce2" มีวิธีการดังต่อไปนี้:
ตีกลับ () - การเริ่มต้นของวัตถุ "ตีกลับ";
ช่วงเวลาเป็นโมฆะ (ms) - ตั้งเวลาหน่วงเป็นมิลลิวินาที
แนบเป็นโมฆะ (หมายเลขพิน) - ตั้งค่าพินที่เชื่อมต่อปุ่ม
int update () - อัปเดตอ็อบเจ็กต์และคืนค่า จริง หากสถานะพินเปลี่ยนไป และเป็นเท็จมิฉะนั้น
int read () - อ่านสถานะใหม่ของพิน
มาเขียนร่างของเราใหม่โดยใช้ห้องสมุด คุณยังสามารถจำและเปรียบเทียบสถานะในอดีตของปุ่มกับสถานะปัจจุบันได้ แต่มาทำให้อัลกอริทึมง่ายขึ้นกันเถอะ เมื่อกดปุ่ม เราจะนับการกด และการกดคี่แต่ละครั้งจะทำให้ไฟ LED ติด และการกดแต่ละครั้งจะดับลง ภาพร่างนี้ดูกระชับ อ่านง่าย และใช้งานง่าย