Unicon 181
การอานคาหรือรับคาจากสวิตช เปนความสามารถหนึงที ่ ไมโครคอนโทรลเลอร ่ สมัยใหมตองรองรับและ เชือมต ่ อใชงานได โดยเฉพาอยางยิ่งกับการติดตอสวิตชกดจํานวนมากเปน 10 ตัวขึ้นไป การตอแบบพื้นฐานใน ลักษณะสวิตชหนึงตั ่ วตอขาพอรตหนึงขา ่ เปนการเชือมต ่ อทีง่ ายทังทางฮาร ้ ดแวรและกระบวนการทางซอฟตแวร แตจะสินเปลื ้ องและทําใหขาพอรตของไมโครคอนโทรลเลอรไดรับการจัดสรรไปใชงานแบบไมคุมค า ทางออกของการใชงานสวิตชจํานวนมากกับไมโครคอนโทรลเลอรคือ ทําการจัดวงจรการเชื่อมตอ สวิตชใหมใหเปนแบบเมตริกซ เรียกวา วงจรสวิตชแบบเมตริกซ (matrix switch) ดังแสดงตัวอยางวงจรในรูป ที่ 8-1 สวิตชจะถูกตอกันในแนวแกนตังและแกนนอน ้ เรียกสายสัญญาณในแนวตังว ้ า หลัก หรือ คอลัมน (column) ในขณะทีสายสั ่ ญญาณในแนวนอนจะเรียกวา แถว หรือ โรว (row) ดังนันค ้ าของสวิตชจึงประกอบดวย ตําแหนง ในแนวคอลัมนและโรว กระบวนการทีจะทํ ่ าใหไดมาซึงค ่ าของสวิตชมีขันตอนพอสมควร ้ แตวงจรของสวิตชแบบ นีมี้ ขอดีคือ รองรับการเพิมของสวิ ่ ตชไดอยางสะดวก เพียงเพิมเติ ่ มจํานวนสวิตชและแกไขซอฟตแวรอีกเล็กนอยเทา นัน้ ทําใหวงจรสวิตชเมตริกซเปนทีนิ่ ยมใชมากในระบบควบคุมอัตโนมัติหรือกึงอั ่ ตโนมัติทีมี่ จํานวนสวิตชมากกวา 8 ตัว ในการใชงานทัวไปจะเรี ่ ยกสวิตชแบบเมตริกซนีว้ า คียแพด (keypad) R1-C1
R1-C2
R1-C3
R1-C4
R2-C1
R2-C2
R2-C3
R2-C4
R3-C1
R3-C2
R3-C3
R3-C4
R4-C1
R4-C2
R4-C3
R4-C4
R1
R2
R3
R4 C1
C2
C3
C4
รูปที่ 8-1 วงจรพื้นฐานของสวิตชมเตริกซหรือคียแพด 4x4 จุด และหนาตาของคียแพด 4x4 จุดทีมี่ พืนฐานโครงสร ้ างวงจรมาจากสวิตชเมตริกซ 4x4 จุด (ภาพประกอบจาก www.digitkey.com, www.mikroe.com, www.futurelec.com)
182
Unicon
มีตัวอยางวงจรเชื่อมตอสวิตชเมตริกซขนาด 4x4 จุดกับไมโครคอนโทรลเลอรแสดงในรูปที่ 8-2 ใชขา พอรตของไมโครคอนโทรลเลอรเชื่อมตอเขากับสวิตชเมตริกซรวม 8 เสนคือ สายของคอลัมน 4 สาย (C1 ถึง C4) และสายทางโรวอีก 4 สาย (R1 ถึง R4) โดยเฉพาะที่ขาพอรตทีต่ อกับแนวคอลัมนทั้งหมดจะตองกําหนด ใหทํางานเปนอินพุต และควรมีตัวตานทานตอพูลอัปไวเพื่อกําหนดสภาวะเริ่มตนทีไม ่ มีการกดสวิตช ในการทํางานไมโครคอนโทรลเลอรจะสงขอมูล “0” ไปยังขาพอรตทีต่ อกับสายโรวของสวิตชเมตริกซ เริมจาก ่ R1 ไลไปจนถึง R4 นันคื ่ อขอมูลทีส่ งออกไปจะมีดวยกัน 4 คาคือ 1110, 1101, 1011 และ 0111 ในทุกครังที ้ ่ มีการสงขอมูลไปยังสายโรวหรือแถวของสวิตชเมตริกซ ไมโครคอนโทรลเลอรจะอานคาทีขาพอร ่ ตซึงต ่ อกับสาย คอลัมนทัง้ 4 ขาเขามาดวย หากไมมีการกดสวิตช คาของขาพอรตทีต่ อกับสายคอลัมนของสวิตชเมตริกซจะเปน 1111 ทังหมด ้ ถาหากมีการกดคีย คาของขอมูลก็จะไมเปน 1111 อีกตอไป เปนการแจงใหทราบวา มีการกดสวิตชเมตริกซ ขึนแล ้ ว จากนันไมโครคอนโทรลเลอร ้ ก็จะคนหาตําแหนงตอไป
R1-C1
R1-C2
R1-C3
R1-C4
R2-C1
R2-C2
R2-C3
R2-C4
R3-C1
R3-C2
R3-C3
R3-C4
R4-C1
R4-C2
R4-C3
R4-C4
ไมโครคอนโทรลเลอร R1
R2
พอรตเอาตพุต R3
R4
+5V
C1
C2
C3
C4
พอรตอินพุต 4.7k~10k
รูปที่ 8-2 วงจรเชือมต ่ อสวิตชเมตริกซขนาด 4x4 จุดเขากับไมโครคอนโทรลเลอร
Unicon 183
เพื่ อความสะดวกในการเรียนรูและทดลองการเชื่อมตอกับสวิตชเมตริกซหรือคียแพดของฮารดแวร Wiring I/O ในที่นีจึ้ งนํา ZX-SW16 แผงวงจรสวิตชเมตริกซ 4x4 จุดมาใชประกอบในการทดลอง ในรูปที่ 8-3 แสดงการจัดวางตําแหนงของสวิตชบนแผงวงจร ZX-SW16 และวงจรสมบูรณ แผงวงจร ZX-SWITCH16 ไดรับการออกแบบใหสามารถเลือกติดตังตั ้ วตานทานทังแบบพู ้ ลอัปหรือพูล ดาวนเพือกํ ่ าหนดสถานะของสายสัญญาณในขณะทีไม ่ มีการกดสวิตช โดยตัวตานทานทีแนะนํ ่ าคือ ตัวตานทานแบบ เน็ตเวิรก 5 ขา ซึงภายในจะมี ่ โครงสรางเปนตัวตานทาน 4 ตัวทีต่ อขาหนึงร ่ วมกัน ดังแสดงในรูปที่ 8-4 จุดตอทีไม ่ ไดกําหนดชือหรื ่ อจุดตอรูปสี่เหลียมจะเป ่ นจุดบัดกรีลอย ผูใชงานสามารถตอเขากับไฟเลียง ้ หรือกราวดก็ได ดังในรูปที่ 8-5 หากตอเขากับไฟเลี้ยงก็จะเปนการกําหนดใหการตอตัวตานทานเขากับแผงวงจร สวิตชนีเป ้ นแบบพูลอัป นันคื ่ อ มีการกําหนดสถานะลอจิก “1” ใหกับสายคอลัมนในขณะที่ไมมีการกดสวิตช หากตอกราวดก็จะเปนการกําหนดใหการตอตัวตานทานเขากับแผงวงจรสวิตชนีเป ้ นแบบพูลดาวน นันคื ่ อ มีการ กําหนดสถานะลอจิก “0” ใหกับสายคอลัมนในขณะที่ไมมีการกดสวิตช
R1-C1
R1-C2
R1-C3
R1-C4
R2-C1
R2-C2
R2-C3
R2-C4
R3-C1
R3-C2
R3-C3
R3-C4
R4-C1
R4-C2
R4-C3
R4-C4
C1 C2 C3 C4 R1 R2R3 R4
R1-C1
R1-C2
R1-C3
R1
R1-C4
R2
R3 R2-C1
R2-C2
R2-C3
R2-C4
R4
R3-C1
R3-C2
R3-C3
R3-C4
R4-C1
R4-C2
R4-C3
R4-C4
C1
(ก) รูปรางและการกําหนดตําแหนงสวิตชของ ZX-SW16 แผงวงจรสวิตชเมตริกซ 4x4 จุด
C2
C3
C4
(ข) วงจรสมบูรณของ ZX-SW16 แผงวงจรสวิตชเมตริกซ 4x4 จุด
รูปที่ 8-3 หนาตาและวงจรของแผงวงจรสวิตชเมตริกซขนาด 4x4 จุดรุน ZX-SW16
184
Unicon
472
(ก) รูปรางของตัวตานทานเน็ตเวิรก แบบ 5 ขา
(ข) วงจรภายในของตัวตานทานเน็ตเวิรก แบบ 5 ขา
รูปที่ 8-4 ลักษณะของตัวตานทานเน็ตเวิรกและวงจรภายในทีแนะนํ ่ าใหใชกับ ZX-SW16 แผงวงจร สวิตชเมตริกซ 4x4 จุด ถาตอกับไฟเลี้ยง เปนการกําหนดใหตอตัวตานทานพูลอัป ถาตอกับกราวด เปนการกําหนดใหตอตัวตานทานพูลดาวน
บัดกรีติดตั้งตัวตานทาน เน็ตเวิรกแบบ 5 ขา คา 4.7k ถึง 10k
C1 C2 C3 C4 R1R2 R3R4
R1-C1
R1-C2
R1-C3
R1-C4
R2-C1
R2-C2
R2-C3
R2-C4
R3-C1
R3-C2
R3-C3
R3-C4
R4-C1
R4-C2
R4-C3
R4-C4
รูปที่ 8-5 แสดงแนวทางการบัดกรีเพือต ่ อตัวตานทานเน็ตเวิรกเขากับแผงวงจรสวิตชเมตริกซ ZX-SW16 เพือกํ ่ าหนดสถานะลอจิกในกรณีทีไม ่ มีการกดสวิตช
Unicon 185
ในการทดลองนี้เปนการอานคาสวิตชที่ถูกกดบนแผงวงจร ZX-SW16 แลวนําคาของสวิตชตัวนั้นมา แสดงบนจอแสดงผลของ GLCD-XT
8.6.1 เตรียมการบอรด Unicon (1) ถอดบอรด GLCD-XT ออกจากบอรด Unicon กอน หากมีการติดตั้งอยู (2) บัดกรีคอนเน็กเตอร IDC ตัวเมีย 16 ขาแถวเดี่ยว เขาที่จุดบัดกรีของขาพอรตทีว่ างอยูทางซายมือ ของบอรด Unicon (3) บัดกรีคอนเน็กเตอร IDC ตัวเมีย 10 ขาแถวเดียว ่ เขาที่จุดบัดกรีของขาพอรตทีว่ างอยูทางขวามื อของ บอรด Unicon (4) นําบอรด GLCD-XT กลับมาติดตั้งเขากับบอรด Unicon จะไดบอรด Unicon ที่พรอมสําหรับการทดลองเชื่อมตอกับแผงวงจรสวิตชเมตริกซ ZX-SW16 ดังรูป ที่ 8-6 อยางไรก็ตาม อาจใชคอนเน็กเตอร IDC ตัวผูแถวเดี ่ยวแทนก็ได
8.6.2 เตรียมการแผงวงจร ZX-SW16 บัดกรีตัวตานทานเน็ตเวิรก 4.7k 5 ขา เขาที่ตําแหนง COLUMN ของแผงวงจร โดยใหขารวมอยูชิด ขวา ใชรูปที่ 8-5 ในการอางอิง
รูปที่ 8-6 แสดงบอรด Unicon ทีบั่ ดกรีคอนเน็กเตอร IDC ทังแบบตั ้ วเมีย (ภาพดานซาย) และแบบตัวผู (ภาพดานขวา) สําหรับใชงานกับแผงวงจรเมตริกซสวิตช ZX-SW16
186
Unicon
8.6.3 เชื่อมตอวงจร ทําการเชื่อมตอวงจรตามรูปที่ 8-7 ที่บอรด Unicon หากเลือกใชคอนเน็กเตอร IDC ตัวเมีย ใหใชสาย ตอวงจรเบอร #22AWG ที่ใชกับแผงตอวงจรเบรดบอรดในการเชื่อมตอ หรือจะใชสาย IDC-1MF จํานวน 9 เสน ในการเชื่อมตอก็ได หากเลือกใชคอนเน็กเตอรตัวผู แนะนําใหใชสาย IDC-1MF หรือ IDC-1FF ในการเชื่อมตอ ในรูปที่ 8-8 แสดงหนาตาของสายแบบตางๆ ที่ใชในการเชื่อมตอวงจร
+5V
3
1
2 0
1
4 30 12 6
ZX-SW16
R1-C1
R1-C2
R1-C3
R1-C4
R2-C1
R2-C2
R2-C3
R2-C4
R3-C1
R3-C2
R3-C3
R3-C4
R4-C1
R4-C2
R4-C3
R4-C4
Unicon port
C1 C2 C3 C4 R1 R2 R3 R4
R1-C1
R2-C1
R1-C2
R2-C2
R1-C3
R2-C3
R1-C4
R3-C2
R3-C3
3
R2
2
R3
0
R4
1
R2-C4
+5V R3-C1
R1
R3-C4
C1
C2
C3
C4
4 30
R4-C1
R4-C2
R4-C3
R4-C4
บัดกรีตัวตานทานเน็ตเวิรก 4.7k 5 ขา
12 6 R1 4.7k *4
ตอวงจรลงบนเบรดบอรด
รูปที่ 8-7 วงจรทดลองใชงานบอรด Unicon กับแผงวงจรสวิตชเมตริกซ ZX-SW16 อานคาสวิตชทีถู่ กกด มาแสดงผลทีจอแสดงผลของบอร ่ ด GLCD-XT
Unicon 187
(ค) สายตอวงจรแบบสายไฟเดี่ยว เบอร #22AWG (ก) สาย IDC-1FF
(ข) สาย IDC-1MF
รูปที่ 8-8 แสดงสายสัญญาณทีใช ่ ในการทดลองนี้ (ก) ตัวอยางการตอวงจร ดวยสายตอวงจรเบอร #22AWG
(ข) ตัวอยางการตอวงจร ดวยสาย IDC-1MF หรือ IDC-1FF
รูปที่ 8-9 ภาพตัวอยางของการตอวงจรระหวางบอรด Unicon กับแผงวงจรสวิตชเมตริกซ ZX-SW16
188
Unicon
จากวงจรใชขาพอรต 3, 2, 0 และ 1 ตอกับสายคอลัมน C1 ถึง C4 ของสวิตชเมตริกซ และกําหนดให ทํางานเปนขาพอรตอินพุตดิจิตอล สวนขาพอรต 4, 30, 12 และ 6 ตอกับสายโรว R1 ถึง R4 ของสวิตชเมตริกซ และกําหนดใหทํางานเปนขาพอรตเอาตพุตดิจิตอล ขารวมของแผงวงจรสวิตชตอกับขาไฟเลียง ้ +5V ของบอรด Unicon จึงทําใหขาพอรต 4, 30, 12 และ 6 มีการตอตัวตานทานพูลอัปคา 4.7k กับไฟเลี้ยง เพื่อกําหนดสถานะ ลอจิกใหแนนอนในกรณีที่ไมมีการกดสวิตช
8.6.4 โปรแกรมทดลอง แสดงรายละเอียดของโปรแกรมสําหรับทดลองในโปรแกรมที่ 8-1 #include <unicon.h> char Rpin[4] = {4,30,12,6}; char Cpin[4] = {3,2,0,1}; char i,j,key=16; void Keypad() { for (i=0;i<4;i++) { out(Rpin[i],0); for(j=0;j<4;j++) { if (in(Cpin[j])==0) { key=(i*4)+j; } } out(Rpin[i],1); } } void setup() { glcdClear(); setTextSize(5); glcd(1,1,"??"); while (key==16) { Keypad(); } } void loop() { Keypad(); glcd(1,1,"%d ",key); }
// Include main library // Define ROW Pin // Define COL Pin // Scan key function // ROW counter // Set ROW ==> LOW
// Check the key pressed in COL at ROW ===> LOW // ROW * COL = KEY data
// Set ROW ==> HIGH
// // // //
Clear screen of GLCD-XT Set text size of GLCD-XT Show title character Wait for key pressing
// Scan and get key data function // Show key ==> GLCD-XT
โปรแกรมที่ 8-1 ไฟล Keypad4x4_simple.ino โปรแกรมภาษา C/C++ ของ Arduino สําหรับบอรด Unicon เพือเชื ่ อมต ่ อและอานคาจากแผงวงจรสวิตชเมตริกซ ZX-SW16 แสดงผลทีจอแสดงผลกราฟ ่ ก LCD สีของบอรด GLCD-XT
Unicon 189
หลักการของการสแกนคียหรือตรวจสอบการกดคียในโปรแกรม อธิบายไดดังนี้ ที่ตอนตนของโปรแกรมมีการประกาศตัวแปรแบบอะเรยไว 2 ตัวคือ Rpin และ Cpin char Rpin[4] = {4,30,12,6}; // Define ROW Pin char Cpin[4] = {3,2,0,1};
// Define COL Pin
โดยตัวแปรแตละตัวมีสมาชิก 4 ตัว ซึงก็ ่ คือขาพอรตทีใช ่ งานนันเอง ่ ดวยการกําหนดตําแหนงขาพอรต ในลักษณะนี้ จึงกําหนดตําแหนงของสวิตชไดดังรูปที่ 8-10 เมื่อเริ่มโปรแกรม กําหนดใหตัวแปร i เปนตัวนับตําแหนงของสายสัญญาณดานแถวหรือโรว มีคา 0 ถึง 3 (ไมเกิน 4) และเพิ่มคาครั้งละหนึง่ จากนั้นทําการสงคาลอจิก “0” ออกมายังขาพอรตแถวแรกที่กําหนด ดวย Rpin ดวยคําสั่ง out(Rpin[i],0); จากนั้นทําการกําหนดคาตัวแปร j ใหมีคา 0 ถึง 3 และมีการเพิ่ม คาทีละหนึ่ง ตัวแปร j ใชในการชี้ตําแหนงของสวิตชที่ถูกกดในแนวหลักหรือคอลัมน โดยจะวนตรวจสอบวา มีการกดสวิตชหรือไม ดวยคําสั่ง if (in(Cpin[j])==0) Unicon port +5V
3 2 0 1
4 30 12 6
C1 C2 C3 C4 R1 R2R3 R4
0
1
2
3
R1-C1
R1-C2
R1-C3
R1-C4
4
5
6
7
R2-C1
R2-C2
R2-C3
R2-C4
8 R3-C1
9 10 11 R3-C2
R3-C3
R3-C4
12 13 14 15 R4-C1
R4-C2
R4-C3
R4-C4
รูปที่ 8-10 แสดงความสัมพันธระหวางขาพอรตของบอรด Unicon กับตําแหนงของสวิตชบนแผงวงจร สวิตช ZX-SW16
190
Unicon
R1-C1
R1-C2
0
R1-C3
1
Unicon
R1-C4
2
3
R2-C1
R2-C2
R2-C3
R2-C4
R3-C1
R3-C2
R3-C3
R3-C4
R4-C1
R4-C2
R4-C3
R4-C4
if (in(Cpin[j])==0)
+5V
C1
C2
C3
R1
0
4
R2
1
30
R3
1
12
R4
1
6
C4
1 0
R1 4.7k *4
2 3
รูปที่ 8-11 กลไกการทํางานของโปรแกรมในการตรวจสอบการกดสวิตชเมือ่ i = 0 หากมีการกดสวิตชเกิดขึ้นเมือค ่ า j เปน “0” ตําแหนงของสวิตชที่กดจะคํานวณไดจากคําสั่ง key=(i*4)+j;
เมื่อ i=0 เนืองจากเริ ่ ่มตนสแกนแถวแรกและ j=0 คาของ key จึงเทากับ (0 * 4) + 0 = 0 นันคื ่ อ สวิตช 0 ถูกกด ในรูปที่ 8-11 แสดงกลไกการทํางานของโปรแกรมในการตรวจสอบการกดสวิตชเมื่อ i = 0 หากไมมีการกดสวิตชเกิดขึ้น คาของ j จะเพิ่มเปน 1, 2 และ 3 หากยังไมมีการกดสวิตชเลย โปรแกรม จะออกจากเงือนไขของลู ่ ปตรวจสอบการกดสวิตชเมื่อ i=0 จากนั้นจะเพิ่มคาของ i เปน 1 ก็จะเลือนการสแกน ่ มายั งแถวที่ 2 ขาพอรต 30 จะทําหนาที่นี้ มีการเขียนขอมูล “0” มายังขาพอรต 30 เพื่อสงมายังขาของสวิตช ตําแหนง 4, 5, 6 และ 7 จากนั้นเขาสูลูปตรวจสอบการกดสวิตชดวยคําสั่ง if (in(Cpin[j])==0) อีกครั้ง คาของ j ก็จะเริ่มจาก 0 ถึง 3 หากมีกดสวิตชเกิดขึ้นเมือ่ j=2 คาของ key จากคําสั่ง key=(i*4)+j; จะได (1 * 4) + 2 = 4 + 2 = 6 นันคื ่ อ สวิตช 6 ถูกกด ในรูปที่ 8-12 แสดงกลไกการทํางานของโปรแกรมในการตรวจ สอบการกดสวิตชเมื่อ i=1 การทํางานจะวนเชนนี้สําหรับ i=2 และ i=3 หากไมมีการกดสวิตชใดๆ ก็จะวนกลับไปที่ i=0 ไป ตลอดการทํางาน รูปที่ 8-13 และ 8-4 แสดงกลไกการทํางานของโปรแกรมในการตรวจสอบการกดสวิตชเมื่อ i=2 และ i=3
Unicon 191
R1-C1
R1-C2
R1-C3
R1-C4
R2-C1
R2-C2
R2-C3
R2-C4
4
if (in(Cpin[j])==0)
5
6
R3-C2
R3-C3
R3-C4
R4-C1
R4-C2
R4-C3
R4-C4
+5V
C2
R1
1
4
R2
0
30
R3
1
12
R4
1
6
7
R3-C1
C1
Unicon
C3
C4
1 0 2
R1 4.7k *4
3
รูปที่ 8-12 กลไกการทํางานของโปรแกรมในการตรวจสอบการกดสวิตชเมือ่ i = 1
R1-C1
R1-C2
R1-C3
R1-C4
R2-C1
R2-C2
R2-C3
R2-C4
R3-C1
R3-C2
R3-C3
R3-C4
Unicon
if (in(Cpin[j])==0)
8
9
R4-C1
+5V
R4-C2
C1
10 R4-C3
C2
11
R1
1
4
R2
1
30
R3
0
12
R4
1
6
R4-C4
C3
C4
1 0
R1 4.7k *4
2 3
รูปที่ 8-13 กลไกการทํางานของโปรแกรมในการตรวจสอบการกดสวิตชเมือ่ i = 2
192
Unicon
R1-C1
R1-C2
R1-C3
R1-C4
R2-C1
R2-C2
R2-C3
R2-C4
R3-C1
R3-C2
R3-C3
R3-C4
R4-C1
R4-C2
R4-C3
R4-C4
Unicon
if (in(Cpin[j])==0)
12
+5V
C1
13
C2
14
C3
15
R1
1
4
R2
1
30
R3
1
12
R4
0
6
C4
1 0
R1 4.7k *4
2 3
รูปที่ 8-14 กลไกการทํางานของโปรแกรมในการตรวจสอบการกดสวิตชเมือ่ i = 3