อุปกรณและคําสัง่ ควบคุมอุปกรณแบบสัญญาณดิจิทัล ประกอบดวย แผงวงจรสวิตช : 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) อานคาของการกดสวิตชอีกครัง้ ถาหากคาที่อานไดเหมือนกับการอานครั้งแรก แสดงวามีการกดสวิตชเกิดขึ้นจริง ถาคาที่อานไดไมเหมือนกับการอานครัง้ แรก แสดงวาสัญญาณที่เกิดขึ้นอาจเปนเพียงพัลสแคบๆ อาจตี ความไดวาเปนสัญญาณรบกวนจึงยังไมมีการกดสวิตชเกิดขึ้นจริง
ฟงกชั่นโปรแกรมภาษา 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); } }