อุปกรณและคําสัง่ ควบคุมอุปกรณแบบสัญญาณดิจิทัล ประกอบดวย แผงวงจรสวิตช : ZX-SWITCH01 - มีวงจรแสดงในรูปประกอบดวยสวิตชพรอมไฟแสดงผล - ใหเอาตพุต คือ หากมีการกดสวิตชจะสงลอจิก “0” (ระดับแรงดัน 0V) และไฟสีแดงติด หากไมมกี ารกดสวิตชจะสงลอจิก “1” (ระดับแรงดัน 5V) และไฟดับ
- สวิตชกดติดปลอยดับ (Push-button switch/Tact switch) เปนอุปกรณสําหรับตัดตอวงจรไฟฟาที่นิยมใชอยางมากในระบบไมโครคอนโทรลเลอรโดยสวิตชแบบนีป้ กติเมื่อไมมกี ารกดหนาสัมผัสของสวิตซจะแยกออกจากกัน หรือเรียกวา เปดวงจร เมือ่ มีการกดลงบนปุมดานบนซึ่งทํามาจากยางสังเคราะหหรือพลาสติกทําใหหนาสัมผัสตัวนําภายในสวิตชตอถึงกัน กระแสไฟฟาก็จะสามารถไหล ผานไปได รูปรางของสวิตชกดติดปลอยดับมีดวยกันหลายแบบทัง้ แบบบัดกรีตอสาย แบบลงแผนวงจรพิมพ แบบติดหนาปดและในบางแบบมีไฟแสดงในตัวสวนขาตอใช งานมีตั้งแต 2 ขาขึ้นไป ในการใชงานกับไมโครคอนโทรลเลอรนั้นมักใชสวิตชเปนอุปกรณสรางสัญญาณอินพุตแบบหนึง่ โดยตอปลายขางหนึ่งกับตัวตานทานและปลายของ ตัวตานทานนั้นตอกับไฟเลี้ยงหรือที่เรียกวา “พูลอัป” ที่จุดตอวงจรระหวางสวิตชกับตัวตานทานจะเปนจุดที่ตอเขากับไมโครคอนโทรลเลอร เพื่ออานคาลอจิกของการกด สวิตช ดังแสดงในรูป
ถาหากไมมีการกดสวิตชสถานะลอจิกของสวิตชตัวนั้นจะเปน “1” อันเนื่องจากการตอตัวตานทานพูลอัปและเมือ่ มีการกดสวิตชจะเกิดสถานะลอจิกเปน “0” เนื่องจากจุดตอสัญญาณนั้นถูกตอลงกราวด
การตอสวิตชเพื่อกําหนดลอจิกทางอินพุต รูปดานลางนี้เปนการตอสวิตชกดติดปลอยดับเพื่อสรางสัญญาณอินพุตลอจิก “0” ใหแกวงจร โดยเมื่อกดสวิตช S1 จะเปนการตอขาอินพุตลงกราวด อยางไรก็ตามการตอสวิตชเพียงตัวเดียวอาจ ทําใหสถานะลอจิกทางอินพุตในขณะที่ไมมกี ารกดสวิตชมีความไมแนนอนจึงควรตอตัวตานทานเขากับไฟเลี้ยงหรือลงกราวด เพื่อกําหนดสถานะทางลอจิกในขณะที่ไมมีการ กดสวิตช ใหแกวงจร
ในรูปนี้เปนการตอสวิตชเขากับอินพุตของไมโครคอนโทรลเลอร โดยมีการตอตัวตานทานเขาที่ขาอินพุตของวงจรและไฟเลี้ยง +5V เรียกการตอตัวตานทานแบบนี้ วา การตอตัวตานทานพูลอัป (pull-up) ดวยการตอตัวตานทานในลักษณะนี้ทําใหเมือ่ ยังไมมกี ารกดสวิตชสถานะลอจิกที่อินพุตตองเปนลอจิก “1” อยางแนนอน
สวนในรูปนีเ้ ปนการตอสวิตชเขากับอินพุตในอีกลักษณะหนึ่งที่มีการตอตัวตานทานเขาที่ขาอินพุตของวงจรและกราวด จะเรียกการตอตัวตานทานแบบนี้วา การตอ ตัวตานทานพูลดาวน (pulldown) ดวยการตอตัวตานทานในลักษณะนี้ทําใหเมื่อยังไมมีการกดสวิตชสถานะลอจิกที่ขาอินพุตเปนลอจิก “0”
สัญญาณรบกวนของการกดสวิตช ในทางทฤษฎีเมื่อสวิตชมีการเปดปดวงจรสัญญาณไฟฟาจะถูกปลดหรือตอเขาไปในวงจรและสามารถวิเคราะหผลการทํางานไดแตในความเปนจริงเมื่อมีการกดและ ปลอยสวิตซหนาสัมผัสของสวิตซจะเกิดการสั่นและกวาทีจ่ ะตอหรือเปดวงจรอยางสมบูรณนั้นจะตองใชเวลาชั่วขณะหนึ่งซึ่งมนุษยไมสามารถมองเห็นภาวะนั้นไดแตวงจร อิเล็กทรอนิกสจะตรวจจับความไมคงที่นั้นไดและมองเปนสัญญาณรบกวนสัญญาณรบกวนที่เกิดขึ้นนั้นเรียกวา สัญญาณรบกวนจากการสั่นของหนาสัมผัสสวิตช หรือ การเบาซ (bounce) ถาหากนําสวิตชนั้นไปใชเปนอุปกรณเพื่อปอนสัญญาณอินพุตใหแกวงจรนับในทางอุดมคติเมือ่ กดสวิตช 1 ครั้ง จะไดสญ ั ญาณพัลส เพียง 1 ลูกเพื่อ สงไปยังวงจรเพือ่ เปลี่ยนคาหนึง่ คาแตทางปฏิบัติจะมีสญ ั ญาณพัลสสงออกไปอาจจะมีเพียง1 ลูกตามตองการหรือมากกวานั้นก็ไดซึ่งไมอาจคาดเดาได โดยสัญญาณพัลสที่ เกิดขึ้นนั้นจะเกิดขึ้นเมื่อสวิตชเริ่มตอวงจรและเมื่อสวิตชกําลังเปดวงจรเนื่องจากการปลอยสวิตช ในรูปที่ดังแสดงปรากฏการณดังกลาว
แสดงการเกิดสัญญาณรบกวนเมื่อมีการกดและปลอยสวิตชในวงจรดิจิตอล
การแกไขสัญญาณรบกวนของการกดสวิตชเมื่อใชงานกับไมโครคอนโทรลเลอร หลักการแกไขสัญญาณรบกวนแบบนี้คือหนวงเวลาการเกิดขึ้นของสัญญาณพัลสเล็กนอยเพื่อใหวงจรไมสนใจสัญญาณทีเ่ กิดขึ้นในชวงเริ่มตนกดสวิตชเรียกการแกไข สัญญาณรบกวนนี้วา ดีเบาซ (debounce) วิธีการแรกทําไดโดยใชอุปกรณอิเล็กทรอนิกสพื้นฐานอยางตัวตานทานและตัวเก็บประจุ โดยตอกันในลักษณะวงจร RC อินดิเกรเตอร ดังรูป ดวยวิธีการนี้จะชวย ลดผลของสัญญาณรบกวนที่เกิดขึน้ จากการกดสวิตชไดในระดับหนึ่งโดยประสิทธิภาพของวงจรจะขึ้นกับการเลือกคาของตัวตานทานและตัวเก็บประจุหากเลือกคาของตัว เก็บประจุนอยเกินไป อาจไมสามารถลดสัญญาณรบกวนได แตถาเลือกคามากเกินไปจะทํา ใหความไวในการตรวจจับการกดสวิตชลดลงนั่น คือ อาจตองกดสวิตชมากกวา 1 ครั้งเพื่อใหไดสัญญาณที่ตองการ
การตอวงจร RC อินติเกรเตอรเพื่อแกไขปญหาสัญญาณรบกวนจากการกดสวิตช
วิธีการที่สองคือ ใชกระบวนการทางซอฟตแวรเขามาชวย ซึ่งมีขั้นตอนโดยสรุปดังนี้ (1) อานคาการกดสวิตชครั้งแรกเขามากอน (2) หนวงเวลาประมาณ 0.1 ถึง 1 วิ นาที (3) อานคาของการกดสวิตชอีกครัง้ วิธีการที่สองคือ ใชกระบวนการทางซอฟตแวรเขามาชวย ซึ่งมีขั้นตอนโดยสรุปดังนี้ (1) อานคาการกดสวิตชครั้งแรกเขามากอน (2) หนวงเวลาประมาณ 0.1 ถึง 1 วิ นาที (3) อานคาของการกดสวิตชอีกครัง้ ถาหากคาที่อานไดเหมือนกับการอานครั้งแรก แสดงวามีการกดสวิตชเกิดขึ้นจริง ถาคาที่อานไดไมเหมือนกับการอานครัง้ แรก แสดงวาสัญญาณที่เกิดขึ้นอาจเปนเพียงพัลสแคบๆ อาจตี ความไดวาเปนสัญญาณรบกวนจึงยังไมมีการกดสวิตช เกิดขึ้นจริง
ฟงกชั่นโปรแกรมภาษา C/C++ ในไลบรารี ipst.h ที่ใชในการทดลอง สําหรับคําสัง่ หรือฟงกชั่นของโปรแกรมภาษา C/C++ ที่ใชในการทดลองทั้งหมดในบทนี้ ไดรับการบรรจุไวในไฟลไลบรารี ipst.h คือ คําสั่ง in, sw_OK และ sw1 คําสั่ง in เปนฟงกชั่นอานคาสถานะลอจิกของพอรตที่กําหนด รูปแบบ char in(x) พารามิเตอร x - กําหนดขาพอรตที่ตองการอานคา มีคาตั้งแต 0 ถึง 50 สําหรับ IPST-SE ใชไดถึง 30 หมายเหตุ : ไมแนะนําใหใชฟงกชั่นนี้กับจุดตอ 19 และ 20 บนแผงวงจร IPST-SE การคืนคา เปน 0 หรือ 1 ตัวอยาง char x; // ประกาศตัวแปร x เพื่อเก็บคาผลลัพธจาการอานคาระดับสัญญาณ x = in(16); // อานคาดิจิตอลจากพอรตหมายเลข 16 แลวเก็บคาไวที่ตัวแปร x
คําสั่ง sw_OK() เปนฟงกชั่นตรวจสอบสถานะสวิตช OK บนแผงวงจร IPST-SE โดยใหสถานะ “เปนจริง” เมื่อการกดสวิตชและ “เปนเท็จ” เมื่อไมมีการกดสวิตช รูปแบบ unsigned char sw_ok()
การคืนคา 1 (เปนจริง) เมื่อมีการกดสวิตช 0 (เปนเท็จ) เมื่อไมมกี ารกดสวิตช ตัวอยาง #include <ipst.h> // ผนวกไฟลไลบรารีหลัก void setup() { glcdClear(); } void loop() { if (sw_OK()) // ตรวจสอบการกดสวิตช OK { glcdFillScreen(GLCD_YELLOW); // เปลี่ยนสีพื้นเปนสีเหลือง delay(3000); // แสดงสีพื้นใหมนาน 3 วินาที } glcdClear(); // เคลียรหนาจอแสดงผลกําหนดพื้นหลังเปนสีดํา }
คําสั่ง sw_OK_press() เปนฟงกชั่นวนตรวจสอบการกดสวิตช OK บนแผงวงจร IPST-SE ตองรอจนกระทัง่ สวิตชถูกปลอยหลังจากการกดสวิตชจึงจะผานฟงกชั่นนี้ไปกระทําคําสั่งอื่นๆ ตัวอยาง sw_OK_press(); // รอจนกระทั่งเกิดกดสวิตช OK คําสั่ง sw1_press เปนฟงกชั่นวนตรวจสอบการกดสวิตช SW1 บนแผงวงจร IPST-SE ตองรอจนกระทั่ง SW1 ถูกปลอยหลังจากมีการกดสวิตชจึงจะผานพนการทํางานของ ฟงกชั่นนี้ ไป รูปแบบ void sw1_press() ตัวอยาง sw1_press(); // รอจนกระทั่งสวิตช SW1 ถูกกดและปลอย
คําสั่ง sw1 เปนฟงกชั่นตรวจสอบการกดสวิตช SW1 ในขณะใดๆ รูปแบบ char sw1() การคืนคา เปน “0” เมื่อสวิตช SW1 ถูกกดและเปน “1” เมื่อไมมีการกดสวิตช SW1 ตัวอยาง char x; // ประกาศตัวแปร x เพื่อเก็บคาผลลัพธจากการอานคาดิจิตอล x = sw1(); // อานคาสถานะของสวิตช SW1 มาเก็บไวที่ตัวแปร x
ตัวอยางคําสั่งกดสวิตซในการนับจํานวน #include <ipst.h> //ผนวกไฟลไลบรารีหลัก int i=0; // ประกาศตัวแปรเก็บคาการนับ void setup() { setTextSize(2); //กําหนดขนาดตัวอักษร 2 เทา glcd(1,3,"Start"); // แสดงขอความ Start ออกหนาจอแสดงผล sw_OK_press(); // วนรอจนกระทั่งกดสวิตช OK glcdClear(); // เคลียรหนาจอแสดงผลกําหนดพื้นหลังเปนสีดํา glcd(1,2,"COUNTER"); // แสดงขอความ COUNTER เพื่อแจงชื่อการทดลอง setTextSize(3); // กําหนดขนาดตัวอักษร 3 เทา glcd(3,3,"0"); // กําหนดคาเริ่มตนเปน 0 } void loop() { if (in(16)==0) // ตรวจสอบการกดสวิตชที่พอรต 16 { i=i++; // เพิ่มคาตัวนับ glcd(3,3,"%d",i); // แสดงคาการนับ while (in(16)==0) // ตรวจสอบการปลอยสวิตช delay(5); } }
ผลลัพธคือ เมือกดสวิตซ์ เลข
COUNTER
จะเพิมจํานวนทีละ 1
การใชงานสวิตซเพื่อหลบสิ่งกีดขวาง การเชื่อมตออุปกรณ นําสวิตซมาเชื่อมตอกับบอรดเพื่อใชในการตรวจสอบการชนของหุนยนต
ตัวอยางคําสั่งเช็คสวิตซในการหลบหลีกสิ่งกีดขวาง #include <ipst.h> //ผนวกไฟลไลบรารีหลัก void setup() { sw_OK_press(); // วนรอจนกระทั่งกดสวิตช OK } void loop() { motor(1,80); // สั่งมอเตอร 1 เดินหนาดวยกําลัง 80 motor(2,80); // สั่งมอเตอร 2 เดินหนาดวยกําลัง 80 if (in(14)==0) // ตรวจสอบการกดสวิตชที่พอรต 14 { motor(1,-40); // สั่งมอเตอร 1 ถอยหลังดวยกําลัง 80 motor(2,-40); // สั่งมอเตอร 2 ถอยหลังดวยกําลัง 80 delay(500); motor(2,40); // สั่งมอเตอร 2 เดินหนาดวยกําลัง 40 delay(500); } }