325 คำอธิบาย: จากโจทยกำหนดใหตำแหนงการติดของหลอดแอลอีดีเปนดังตารางของตัวอยางที่ 12.6 โดยใชหลักการสแกนตามแนวคอลัมนครั้งละ 1 คอลัมนโดยเริ่มจากคอลัมนที่ 1 เรียงไปจนกระทั่งถึง คอลมั นส ุดทายโดยระยะของการหนวงเวลาในชว งการเปลย่ี นแนวคอลัมนเปล่ยี นแปลงอยา งรวดเร็วซึ่ง สงผลใหสายตามนุษยไมสามารถแยกแยะชวงทีเ่ กิดการประพริบของสัญญาณได โดยการกำหนดคาท่ี ขา Q0 – Q7 ของไอซี 74HC595 เปนดงั นี้ ตำแหนงท่ี 1 (คอลัมนท ่ี 1) ตำแหนงขาไอซี 7 6 5 4 3 2 1 15 (Q6) (Q5) (Q4) (Q3) (Q2) (Q1) (Q0) 74HC595 (Q7) แถวท่ี 3 แถวที่ 2 แถวที่ 1 ตำแหนงของ - คอลัมนท่ี คอลัมนท่ี คอลมั นที่ คอลมั นท่ี 4 3 2 1 1 0 1 เมตริกซแอลอีดี 0 0 0 1 สถานะ 0 ไดว า Q7Q6Q5Q4Q3Q2Q1Q0 = 00001101 = 0x0D ตำแหนงที่ 2 (คอลัมนท ี่ 2) ตำแหนงขาไอซี 7 6 5 4 3 2 1 15 (Q6) (Q5) (Q4) (Q3) (Q2) (Q1) (Q0) 74HC595 (Q7) แถวที่ 3 แถวท่ี 2 แถวท่ี 1 ตำแหนง ของ - คอลมั นท ี่ คอลัมนท ี่ คอลมั นท ่ี คอลมั นที่ 4 3 2 1 0 0 0 เมตริกซแ อลอดี ี 0 0 1 0 สถานะ 0 ไดวา Q7Q6Q5Q4Q3Q2Q1Q0 = 00010000 = 0x10 ตำแหนง ท่ี 3 (คอลมั นท ี่ 3) ตำแหนง ขาไอซี 7 6 5 4 3 2 1 15 (Q6) (Q5) (Q4) (Q3) (Q2) (Q1) (Q0) 74HC595 (Q7) แถวท่ี 3 แถวที่ 2 แถวที่ 1 ตำแหนงของ - คอลัมนท ี่ คอลมั นท ี่ คอลมั นท่ี คอลมั นท ี่ 4 3 2 1 1 0 1 เมตริกซแอลอดี ี 0 1 0 0 สถานะ 0 ไดว า Q7Q6Q5Q4Q3Q2Q1Q0 = 00100101 = 0x25
326 ตำแหนงท่ี 4 (คอลมั นท ่ี 4) ตำแหนงขาไอซี 7 6 5 4 3 2 1 15 (Q6) (Q5) (Q4) (Q3) (Q2) (Q1) (Q0) 74HC595 (Q7) แถวที่ 3 แถวที่ 2 แถวท่ี 1 ตำแหนง ของ - คอลมั นท ี่ คอลมั นท ี่ คอลัมนที่ คอลัมนท ่ี 4 3 2 1 1 0 1 เมตรกิ ซแ อลอดี ี 1 0 0 0 สถานะ 0 ไดว า Q7Q6Q5Q4Q3Q2Q1Q0 = 01000101 = 0x45 ภายในโปรแกรมมีการกำหนดตัวแปรนอกฟงชันก 1 ตัวแปรคือ pattern_led เปนตัวแปร แบบอารเ รยท่เี กบ็ คา รูปแบบการแสดงผลในแตล ะคอลมั น ฟงชันก Setup(): ตอขา 1, 2 และ 3 จากบอรด Arduino เขากับขา ST_CP, DS และ SH_CP ของไอซี 74HC595 ตามลำดบั และกำหนดใหข าที่ 1 มสี ถานะเปน “HIGH” กอ นทีจ่ ะเรียกใช ฟง ชันก ฟงชันก loop(): เรียกใชงานฟงกชัน Extended_Port() ทุกๆ 50 มิลลิวินาทีโดยคา อารกวิ เมนตท่ีถูกสงไปคือ pattern_led[index] ซึง่ คอื การแสดงผลในรูปแบบดงั ตารางแสดงตำแหนง การติดของหลอดแอลอีดี โดยในแตละชวงเวลาจะแสดงเพียงแค 1 คอลัมนซึ่งคาของ index แสดง ตำแหนงของคอลมั นปจ จุบัน ฟง ชนั ก Extened_Port( : รับพารามิเตอร 1 คา คือ p ซ่งึ เปนขอมูลขนาด 8 บติ ทใี่ ชสำหรับ แสดงสถานะเอาตพ ุตผา นไอซี 74HC595 ที่ Q0 – Q6 ผานฟง ชนั ก shiftOut( 5. การทดสอบใชงานเมตริกซแอลอีดสี ำเร็จรูปใน Proteus โปรแกรม Proteus มีเมตริกซแอลอีดีสำเร็จรูป 2 ขนาดใหเลือกใชงานคือ 5x7 และ 8x8 หัวขอนี้จะแนะนำการนำแอลอีดีสำเร็จรูปใน Proteus มาประยุกตใชงานในการแสดงผลใหอยูใน รูปแบบตวั อกั ษร ตัวเลข หรือขอความตา งๆ ท่ีผูใชงานตองการ (ทมี งานสมารทเลริ น นงิ่ , 2554) รปู ท่ี 12.9 อุปกรณเมตริกซแอลอดี ใี นโปรแกรม Proteus ทีม่ า: ผูเ ขยี น
327 รูปที่ 12.9 แสดงรายการอุปกรณเมตริกซแอลอีดีภายในโปรแกรม Proteus โดยผูใชงาน สามารถสบื คน ไดโดยใชค ำคน “matrix-” ซง่ึ โปรแกรมจะแสดงรายการอปุ กรณทงั้ หมดใหเ ลอื กใชง าน สำหรับตัวอยา งในหัวขอนีจ้ ะทดสอบเขียนโปรแกรมเพื่อควบคุมเมตริกซแอลอีดีแบบ 5x7 (5 แถว และ 7 คอลัมน ซึ่ งสามารถหมุนเพื่อใหแสดงในรูป 7 x 5 (7 แถว และ 5 คอลัมน โดยเลือกใช งานสัญลักษณ และโครงสรา งของเมตริกซแอลอดี ดี งั รูปท่ี 12.10 และ รูปท่ี 12.11 ตามลำดับ รปู ที่ 12.10 สัญลักษณเมตริกซแอลอดี ขี นาด 7 x 5 ทม่ี า: ผเู ขียน คอลมั น คอลัมน คอลัมน คอลมั น คอลัมน ที่ 1 ที่ 2 ท่ี 3 ท่ี 4 ที่ 5 แถวที่ 1 แถวที่ 2 แถวที่ 3 แถวท่ี 4 แถวที่ 5 แถวที่ 6 แถวท่ี 7 รูปที่ 12.11 โครงสรางเมตริกซแอลอีดีจากรปู 12.10 ท่มี า: ผเู ขยี น
328 รูปที่ 12.11 แสดงโครงสรางของเมตริกซแอลอีดีขนาด 7x5 ดังรูปที่ รูปที่ 12.10 ซึ่งจาก โครงสรางการควบคุมใหหลอดแอลอีดีมีสถานะ “ติด” จะตองสงสถานะ “HIGH” ไปยังตำแหนง คอลัมน และสงสถานะ “LOW” ไปยงั ตำแหนงแถวของแอลอดี หี ลอดดงั กลาว ตวั อยางที่ 12.7 การควบคุมเมตรกิ ซแ อลอดี ีใน Proteus โดยใชไ อซี 74HC595 สำหรับขยายพอรต การทำงาน: ตำแหนง การติดของหลอดแอลอีดเี ปนดงั น้ี แถวที่ คอลมั นที่ 4 5 1 23 ดับ ติด ดบั ดับ ดบั ติด 1 ดับ ดับ ติด 2 ดบั ดับ ดบั ดับ ติด 3 ตดิ ดบั ตดิ 4 ติด ติด ดบั ดับ ติด 5 ดบั ติด ดับ ตดิ ติด 6 ดับ ตดิ ดับ 7 ดับ ติด ดบั ติด ตดิ วิธที ำ 1. สว นบอรดทดลอง รปู ที่ 12.12 บอรดทดลองการควบคุมเมตริกซแ อลอดี ีใน Proteus เพ่อื แสดงผลเปน ตัวอักษร “ป”โดยใชไ อซี 74HC595 สำหรบั ขยายพอรต ท่ีมา: ผเู ขียน
329 คำอธิบาย: นำหลอดแอลอดี ีท้ังหมด 12 หลอดมาเรยี งกนั เปน แบบเมตริกซข นาด 7 แถว x 5 คอลัมน โดยใชไ อซี 74HC595 จำนวน 2 ตัวสำหรบั ขยายพอรต ซ่งึ การใชง านบอรด Arduino มเี พยี ง 6 ขา ตำแหนง ขา ตำแหนง ขา ตำแหนงขา ตำแหนง ขา (Arduino) (ไอซี 74HC595 ตัวบน (ไอซี 74HC595 ตัว (เมตรกิ ซแอลอีดี 1 12 ลา ง - (ST_CP) - 2 - 14 - 3 (DS) - 11 - - (SH_CP) คอลมั นท ี่ 1 - 15 (Q0) - คอลัมนที่ 2 - 1 (Q1) - คอลมั นท ่ี 3 - 2 (Q2) - คอลัมนท ี่ 4 - 3 (Q3) - คอลัมนท่ี 5 4 4 (Q4) - - 12 - 5 (ST_CP) - 14 - 6 (DS) - 11 - - (SH_CP) - - 15 (Q0) แถวที่ 1 - - 1 (Q1) แถวที่ 2 - - 2 (Q2) แถวท่ี 3 - - 3 (Q3) แถวที่ 4 - - 4 (Q4) แถวที่ 5 - - 5 (Q5) แถวท่ี 6 - 6 (Q6) แถวท่ี 7
330 2. สวนโปรแกรม int col[] = {0x01, 0x02, 0x04,0x08, 0x10}; int row[] = {0x73, 0x03, 0x3f, 0x3f, 0x00}; int index = 0; void setup() { pinMode(1, OUTPUT); // 1 = ST_CP ตวั ท่ี 1 pinMode(2, OUTPUT); // 2 = DS ตัวที่ 1 (ตำแหนง หลักสิบ pinMode(3, OUTPUT); // 3 = SH_CP ตัวท่ี 1 pinMode(4, OUTPUT); // 4 = ST_CP ตวั ท่ี 2 pinMode(5, OUTPUT); // 5 = DS ตัวท่ี 2 (ตำแหนง หลกั หนว ย pinMode(6, OUTPUT); // 6 = SH_CP ตวั ท่ี 2 digitalWrite(1, HIGH); digitalWrite(4, HIGH); } void loop() { Extended_Port(1, 2, 3, col[index]); Extended_Port(4, 5, 6, row[index]); index++; if(index == sizeof(col)/sizeof(int)){ index = 0; } delay(10); } void Extended_Port(byte st, byte ds, byte sh, byte p){ digitalWrite(st, LOW); shiftOut(ds, sh, MSBFIRST, p); digitalWrite(st, HIGH); } คำอธิบาย: จากโจทยกำหนดใหตำแหนงการติดของหลอดแอลอีดีเปนดังตารางของตัวอยางที่ 12.7 โดยใชหลักการสแกนตามแนวคอลมั นคร้ังละ 1 คอลัมนโดยเริ่มจากคอลัมนที่ 1 เรียงไปจนกระทั่งถึง คอลมั นสุดทายโดยระยะของการหนว งเวลาในชว งการเปลี่ยนแนวคอลมั นเ ปล่ียนแปลงอยา งรวดเร็วซ่ึง สงผลใหสายตามนุษยไมสามารถแยกแยะชวงท่ีเกิดการประพริบของสัญญาณได โดยการกำหนดคาท่ี ขา Q0 – Q7 ของไอซี 74HC595 ท้ัง 2 ตัวเปนดังน้ี
331 ตำแหนงท่ี 1 (คอลมั นท ี่ 1) ไอซี 74HC595 ตวั บน (ควบคมุ แนวคอลมั น) ตำแหนง ขาไอซี 7 6 5 4 3 2 1 15 (Q3) (Q2) (Q1) (Q0) 74HC595 (Q7) (Q6) (Q5) (Q4) ตำแหนง ของ คอลัมนท ่ี คอลมั นท ี่ คอลัมนท่ี คอลัมนท ่ี - - - คอลมั นท ี่ 4 3 2 1 เมตริกซแอลอดี ี 5 0 0 0 1 สถานะ 000 0 ไดว า col[0] = Q7Q6Q5Q4Q3Q2Q1Q0 = 00000001 = 0x01 ไอซี 74HC595 ตวั ลาง (ควบคมุ แนวแถว) ตำแหนงขาไอซี 765 4 3 2 1 15 74HC595 (Q7) (Q6) (Q5) (Q4) (Q3) (Q2) (Q1) (Q0) แถวที่ 5 แถวท่ี 4 แถวที่ 3 แถวท่ี 2 แถวที่ 1 ตำแหนง ของ - แถวท่ี 7 แถวท่ี 6 เมตริกซแอลอดี ี 1 0 0 1 1 สถานะ 0 1 1 ไดว า row[0] = Q7Q6Q5Q4Q3Q2Q1Q0 = 01110011 = 0x73 ตำแหนง ท่ี 2 (คอลัมนท่ี 2) ไอซี 74HC595 ตวั บน (ควบคมุ แนวคอลัมน) ตำแหนง ขาไอซี 7 6 5 4 3 2 1 15 (Q3) (Q2) (Q1) (Q0) 74HC595 (Q7) (Q6) (Q5) (Q4) ตำแหนง ของ คอลมั นท่ี คอลมั นที่ คอลัมนที่ คอลัมนท ี่ - - - คอลัมนที่ 4 3 2 1 เมตรกิ ซแอลอดี ี 5 0 0 1 0 สถานะ 000 0 ไดวา col[0] = Q7Q6Q5Q4Q3Q2Q1Q0 = 00000010 = 0x02
332 ไอซี 74HC595 ตัวลาง (ควบคมุ แนวแถว) ตำแหนงขาไอซี 7 6 5 4 3 2 1 15 (Q4) (Q3) (Q2) (Q1) (Q0) 74HC595 (Q7) (Q6) (Q5) แถวท่ี 5 แถวท่ี 4 แถวที่ 3 แถวท่ี 2 แถวที่ 1 ตำแหนง ของ - แถวที่ 7 แถวที่ 6 0 0 0 1 1 เมตรกิ ซแ อลอีดี สถานะ 0 0 0 ไดวา row[0] = Q7Q6Q5Q4Q3Q2Q1Q0 = 00000011 = 0x03 ตำแหนงท่ี 3 (คอลัมนท ่ี 3) ไอซี 74HC595 ตวั บน (ควบคมุ แนวคอลมั น) ตำแหนง ขาไอซี 7 6 5 4 3 2 1 15 (Q3) (Q2) (Q1) (Q0) 74HC595 (Q7) (Q6) (Q5) (Q4) คอลัมนท ่ี คอลมั นท่ี คอลัมนที่ คอลัมนท ่ี ตำแหนง ของ - - - คอลัมนท ี่ 4 3 2 1 เมตริกซแ อลอดี ี 5 0 1 0 0 สถานะ 000 0 ไดว า col[0] = Q7Q6Q5Q4Q3Q2Q1Q0 = 00000100 = 0x04 ไอซี 74HC595 ตวั ลาง (ควบคมุ แนวแถว) ตำแหนงขาไอซี 7 6 5 4 3 2 1 15 (Q4) (Q3) (Q2) (Q1) (Q0) 74HC595 (Q7) (Q6) (Q5) แถวที่ 5 แถวท่ี 4 แถวที่ 3 แถวที่ 2 แถวที่ 1 ตำแหนง ของ - แถวท่ี 7 แถวท่ี 6 1 1 1 1 1 เมตรกิ ซแ อลอีดี สถานะ 0 0 1 ไดวา row[0] = Q7Q6Q5Q4Q3Q2Q1Q0 = 01110011 = 0x3f
333 ตำแหนงที่ 4 (คอลมั นที่ 4) ไอซี 74HC595 ตวั บน (ควบคุมแนวคอลมั น) ตำแหนง ขาไอซี 7 6 5 4 3 2 1 15 (Q3) (Q2) (Q1) (Q0) 74HC595 (Q7) (Q6) (Q5) (Q4) ตำแหนงของ คอลัมนท ี่ คอลมั นที่ คอลัมนท่ี คอลัมนท ่ี - - - คอลัมนที่ 4 3 2 1 เมตริกซแ อลอีดี 5 1 0 0 0 สถานะ 000 0 ไดว า col[0] = Q7Q6Q5Q4Q3Q2Q1Q0 = 00001000 = 0x08 ไอซี 74HC595 ตัวลา ง (ควบคมุ แนวแถว) ตำแหนง ขาไอซี 765 4 3 2 1 15 74HC595 (Q7) (Q6) (Q5) (Q4) (Q3) (Q2) (Q1) (Q0) แถวที่ 5 แถวที่ 4 แถวที่ 3 แถวท่ี 2 แถวที่ 1 ตำแหนง ของ - แถวที่ 7 แถวที่ 6 เมตริกซแอลอดี ี 1 1 1 1 1 สถานะ 0 0 1 ไดวา row[0] = Q7Q6Q5Q4Q3Q2Q1Q0 = 01110011 = 0x3f ตำแหนง ท่ี 5 (คอลมั นที่ 5) ไอซี 74HC595 ตวั บน (ควบคุมแนวคอลมั น) ตำแหนงขาไอซี 7 6 5 4 3 2 1 15 (Q3) (Q2) (Q1) (Q0) 74HC595 (Q7) (Q6) (Q5) (Q4) ตำแหนง ของ คอลมั นท ่ี คอลัมนท่ี คอลมั นที่ คอลัมนท ี่ - - - คอลัมนท่ี 4 3 2 1 เมตรกิ ซแ อลอดี ี 5 0 0 0 0 สถานะ 000 1 ไดวา col[0] = Q7Q6Q5Q4Q3Q2Q1Q0 = 00010000 = 0x10
334 ไอซี 74HC595 ตวั ลาง (ควบคมุ แนวแถว) ตำแหนง ขาไอซี 7 6 5 4 3 2 1 15 (Q4) (Q3) (Q2) (Q1) (Q0) 74HC595 (Q7) (Q6) (Q5) แถวท่ี 5 แถวท่ี 4 แถวท่ี 3 แถวท่ี 2 แถวที่ 1 ตำแหนง ของ - แถวท่ี 7 แถวท่ี 6 0 0 0 0 0 เมตรกิ ซแอลอดี ี สถานะ 0 0 0 ไดวา row[0] = Q7Q6Q5Q4Q3Q2Q1Q0 = 01110011 = 0x00 ภายในโปรแกรมมีการกำหนดตัวแปรนอกฟงชันก 2 ตัวแปรคือ row และ col เปนตัวแปร แบบอารเรยทีเ่ ก็บคา รปู แบบการแสดงผลในแตล ะ แถว และ คอลมั น ฟงชันก Setup():กำหนดใหตำแหนงขาที่ 1, 2, 3, 4, 5 และ 6 ของบอรด Arduino ทำ หนา ที่เปน เอาตพุต และกำหนดใหขาท่ี 1 และ 4 มีสถานะเปน “HIGH” เนอื่ งจากยังไมมีการสงขอมูล เกิดขึ้น ฟงชันก loop(): เรียกใชงานฟงกชัน Extended_Port() จำนวน 2 ครั้งสำหรับควบคุม Q0 – Q4 ของไอซี 74HC595 ตัวบนและ ควบคมุ Q0 – Q6 ของไอซี 74HC595 ตวั ลา งโดยคา อารกิวเมนต ท่ถี กู สง ไปคอื ST_CP, DS, SH_CP และสถานะของเอาตพ ตุ (Q0 – Q4 ของไอซี 74HC595 ตวั บนและ Q0 – Q6 ของไอซี 74HC595 ตัวลาง ซง่ึ คาของ index แสดงตำแหนงของแถว และคอลมั นปจ จบุ นั ฟง ชนั ก Extened_Port( : รบั พารามิเตอร 4 คา คอื st, ds, sh และ p สำหรับควบคุมการ ทำงานที่ขา ST_CP, DS, SH_CP และ ขาเอาตพุตของไอซี 74HC595 ตามลำดบั 3. ผลการทดลอง รูปท่ี 12.13 ผลการทดลองการควบคุมเมตริกซแ อลอีดใี น Proteus เพือ่ แสดงผลเปน ตวั อักษร “ป”โดยใชไ อซี 74HC595 สำหรับขยายพอรต ทมี่ า: ผเู ขียน
335 6. บทสรุป ไอซีเบอร 74HC595 คือไอซีใชสำหรับการขยายพอรตของไมโครคอนโทรลเลอรโดยใช หลกั การเล่ือนขอมลู คร้ังละ 1 บติ และเนอ่ื งจากบอรด Arduino Uno R3 มพี อรตสำหรับเช่ือมตอกับ อุปกรณภายนอกจำนวนไมมาก ดังนั้นการนำไอซีเบอร 74HC595 (หรือไอซีรุนอื่น เชน 74LS595 หรือ TPIC6B595 มาประยุกตใชงานเพื่อขยายพอรตการทำงานจึงอีกแนวทางที่นาสนใจ เนื่องจาก สามารถเพิ่มจำนวนพอรตการเชื่อมตอโดยใชงบประมาณที่ไมสูงได ไอซีเบอร 74HC595 เปนไอซี ขนาด 16 ขา โดยใชขารับสัญญาณทีจ่ ำเปนตองเชอ่ื มตอ กับบอรด Arduino เพียง 3 ขา แตส ามารถใช เปนขาสำหรับควบคุมสถานะของการทำงานอุปกรณภายนอกไดสูงถึง 8 ขา โดยขาที่จะเชื่อมกับ Arduino มีทั้งหมด 3 ขาประกอบไปดวย SH_CP, ST_CP และ DS โดยวิธีการสำหรับควบคุม สถานะการทำงาน Q0 – Q7 โดยมีขั้นตอนคือกำหนดสถานะของ ST_CP ใหมีสถานะเปน “LOW” เพ่อื รอการสงขอ มลู มาจากบอรด Arduino และ กำหนดใหข า DS มีคา ตรงกับสถานะของเอาตพุตโดย การรับคาครั้งละ 1 บิตจำนวน 8 คาขั้นตอนสุดทายกำหนดสัญญาณนาิกาที่ขา SH_CP จำนวน 1 ลูกตอการรับคาที่ขา DS จำนวน 1 บิต ดังนั้นหากตองควบคุมสถานะทั้งหมด 8 บิตจะตองสราง สญั ญาณนาิกาจำนวนท้งั หมด 8 ลกู ฟง ชันก shiftOut() คือฟง กช นั ท่ีมอี ยใู นไลบรารี่ของโปรแกรม Arduino IDE ซงึ่ เปนฟงกชันท่ี มหี นา ที่สำหรบั การเลื่อนบิตขอมูลขนาด 1 บิตซงึ่ มีรปู แบบการเล่ือนได 2 วธิ คี ือการเล่ือนจากบิตท่ีอยู ในตำแหนงนัยสำคญั สูงสุด หรือ บิตที่อยูตำแหนงนัยสำคญั ตำ่ ทีส่ ุดซ่ึงขอดีของการใชง านฟงกชันนี้คือ ไมจ ำเปน ตองเขียนคำสัง่ ควบคมุ การทำงานชิฟรจี ิสเตอรขน้ึ เอง
336 แบบฝกหัดทา ยบท บทที่ 12 1. ไอซีขยายพอรตมีประโยชนอยางไร 2. ไอซขี ยายพอรตมหี ลักการทำงานเปน อยา งไร 3. จงยกตวั อยา งไอซีขยายพอรต 4. หากเลือกใชง าน 74HC595 จำเปนตองใชง านขาไมโครคอนโทรลเลอรอยา งนอยก่ีขา และขยาย พอรต เพ่มิ ขึ้นไดกีข่ า 5. ตำแหนง ขาของไอซี 74HC595 ทใ่ี ชส ำหรบั ควบคุมอปุ กรณภ ายนอกคือตำแหนง ใด 6. ฟงกชัน shiftOut() มีประโยชนอยา งไร 7. เน่อื งจากการใชงานไอซี 74HC595 จำเปนตองกำหนดสัญญาณนาิกาทุกคร้ังที่เปลย่ี นสถานะของ เอาตพตุ ซึ่งอยูทีต่ ำแหนงขาใด 8. จากวงจรดังตัวอยางที่ 12.2 จงเขียนโปรแกรมควบคมุ การนับถอยหลงั ฉบับเลขคจ่ี าก 9 – 1
337 เอกสารอา งองิ ดอนสนั ปงผาบ. (2560). ภาษาซีและ Arduino อา นงาย เขาใจงาย. กรงุ เทพฯ: ซีเอด็ ยเู คช่ัน. เดชฤทธิ์ มณีธรรม. (2559). คัมภีรการใชงาน ไมโครคอนโทรลเลอร Arduino. กรุงเทพฯ: ซีเอ็ด ยเู คชั่น. ทีมงานสมารทเลิรนนิ่ง. (2554). Advanced PIC Microcontroller in C : การประยุกตใชงาน PIC ขั้นสูงดว ยภาษา C. กรงุ เทพฯ: สมารท เลริ นน่ิง. ธวชั ชยั เลอ่ื นฉวี และ อนุรักษ เถ่ือนฉวี. (2527). ดจิ ติ อลเทคนิคเลม 1. กรุงเทพฯ: มติ รนราการพิมพ. Adith, J. B. (2015). Arduino by Example. Birmingham: Packt Publishing Ltd. Jeremy, B. (2013). Exploring Arduino: Tools and Techniques for Engineering Wizardry. Indianapolis: John Wiley & Sons, Inc.
แผนบริหารการสอนประจำบทท่ี 13 การสรา งสัญญาณพีดบั เบลิ ยูเอม็ หวั ขอเนอื้ หา 1. สญั ญาณพดี ับเบลิ ยูเอ็มและคาดวิ ต้ีไซเคิล 2. การคำนวณแรงดันจากคาดิวตีไ้ ซเคลิ 3. ฟง ชนั ก analogWrite() 4. บทสรปุ แบบฝก หดั เอกสารอางอิง วัตถุประสงคเ ชงิ พฤติกรรม เมอ่ื ผูเ รยี น เรยี นจบบทนแี้ ลวผูเรยี นควรมคี วามสามารถ ดังนี้ 1. อธบิ ายเก่ยี วกบั สัญญาณพีดบั เบลิ ยเู อ็มและคา ดิวต้ีไซเคลิ ได 2. อธบิ ายวิธีการคำนวณหาคาแรงดันจากคา ดวิ ต้ีไซเคลิ ได 3. เขยี นโปรแกรมควบคมุ สถานะอุปกรณอเิ ลก็ ทรอนิกสดว ยสญั ญาณพีดับเบิลยเู อ็มได 4. มคี วามตั้งใจในการเรียนและการฝกปฏิบตั กิ ารเขยี นโปรแกรม วิธกี ารสอนและกจิ กรรมการเรยี นการสอนประจำบท 1. บรรยายเนือ้ หาในแตละหวั ขอ พรอมยกตัวอยางประกอบ โดยใชเอกสารคำสอน และส่ือ power point 2. ทดลองปฏิบัติจริง โดยการเขียนโปรแกรมควบคุมสถานะอุปกรณอิเล็กทรอนิกสดวย สัญญาณพดี ับเบลิ ยูเอ็ม 3. ผูสอนสรปุ เนอ้ื หา 4. ทำแบบฝกหัดเพื่อทบทวนบทเรยี น 5. เปด โอกาสใหผเู รยี นถามขอสงสัย 6. ผูส อนทำการซักถาม
340 สอ่ื การเรียนการสอน 1. เอกสารคำสอนวิชาการประยุกตใ ชง านไมโครคอนโทรลเลอร 2. สอ่ื power point การวัดผลและการประเมนิ 1. การเขาเรยี นตรงตอ เวลา และการแตง กาย 2. ความรวมมอื และความรับผดิ ชอบตอการเรยี น 3. การถาม-ตอบ 4. จากการสงงานทีไ่ ดร ับมอบหมายภายในเวลาที่กำหนด 5. จากการทำแบบฝกหัดที่มคี วามถูกตองไมน อยกวา 80%
บทที่ 13 การสรา งสัญญาณพีดับเบิลยูเอม็ สัญญาณพีดับเบิลยูเอ็ม (PWM) เปนชื่อยอมาจาก Pulse-Width Modulation คือการ กำหนดสถานะ “LOW” และสถานะ “HIGH” ในชวงเวลาที่แตกตางกันในขณะที่คาความถี่ยังคงเดมิ (กอบเกียรติ สระอุบล, 2561) ซึ่งจะสงผลใหแรงดันเฉลี่ยของแตละความถี่ในแตละกรณีมีความ แตกตางกัน ประโยชนของสัญญาณ พีดับเบิลยูเอ็ม คือสามารถนำมาใชสำหรับการปรับความสวาง ของหลอดไฟ หรือการนำมาใชส ำหรับการควบคุมความเร็วรอบการหมุนของมอเตอรได 1. สญั ญาณพดี ับเบิลยเู อ็มและคาดิวตีไ้ ซเคลิ ลักษณะของสัญญาณพีดับเบิลยูเอ็มคือจะมีคาความถี่คงที่ โดยในแตละชวงความถี่จะมี ชวงเวลาของการเกิดสถานะ “LOW” และสถานะ “HIGH” ที่แตกตางกัน (ประภาส พุมพวง, 2561) โดยสง่ิ ทีส่ ำคัญของสัญญาณพีดับเบลิ ยูเอ็มคือคา ทเ่ี รียกวาคา ดิวตี้ไซเคิล (Duty Cycle ซึ่งการพิ จาณา คาดิวตี้ไซเคิลสามารถทำไดโดยการพิจารณาคาความกวางของสัญญาณ (pulse width) ที่อยูสถานะ “HIGH” pulse width รปู ที่ 13.1 ตวั อยางความกวา งของสญั ญาณ ทม่ี า: ผเู ขยี น รูปที่ 13.1 แสดงตัวอยางของการหาคาความกวางของสัญญาณซึง่ สามารถคำนวณหาคา ดิวต้ี ไซเคิลไดโดยพิจาณาคาเปอรเซ็นตของคาความกวางของสัญญาณของความถี่ 1 ลูก ยกตัวอยางเชน หากชว งเวลาในการเกดิ สถานะ “HIGH” มีคา เปน 70 วนิ าที และคาความถี่ 1 ลูกคลนื่ จะใชเ วลา 100 วินาที ดงั น้นั คาดวิ ตไ้ี ซเคลิ มีคาเทากับ 70% รูปท่ี 13.2 – 13.5 แสดงตัวอยา งคา ดวิ ตไ้ี ซเคลิ ทแ่ี ตกตางกันจำนวน 4 คา ดังนี้
342 แรงดนั (โวลต คาดิวตไ้ี ซเคิลคือ 0% 5 0 เวลา 100 200 300 400 (วินาที รูปท่ี 13.2 ตัวอยางคา ดวิ ตี้ไซเคลิ 0% ท่ีมา: ผเู ขียน จากรูปที่ 13.2 เนื่องจากไมมีชวงเวลาใดที่มีสถานะเปน “HIGH” ภายในชวงความถี่ 1 ลูก คล่นื จึงสรปุ ไดว าคาดิวตีไ้ ซเคิลมคี าเปน 0% แรงดนั คา ดิวต้ีไซเคิลคอื 25% (โวลต 5 0 25 100 200 300 เวลา 400 (วินาที รปู ที่ 13.3 ตัวอยางคา ดวิ ตี้ไซเคลิ 25% ที่มา: ผูเขยี น จากรปู ที่ 13.3 เนื่องจากชว งเวลาใดท่ีมีสถานะเปน “HIGH” ภายในชวงความถ่ี 1 ลูกคลื่นใช เวลาท้ังหมด 25 วินาทจี งึ สรุปไดวา คา ดวิ ตไ้ี ซเคลิ มีคา เปน 25% คา ดิวต้ีไซเคิลคือ 50% แรงดัน (โวลต 5 0 50 100 200 300 เวลา 400 (วินาที รปู ท่ี 13.4 ตวั อยางคาดิวต้ีไซเคิล 50% ทีม่ า: ผเู ขยี น
343 จากรปู ท่ี 13.4 เน่อื งจากชวงเวลาใดที่มสี ถานะเปน “HIGH” ภายในชวงความถ่ี 1 ลูกคล่ืนใช เวลาทั้งหมด 50 วนิ าทจี ึงสรุปไดว าคาดิวตไ้ี ซเคิลมีคาเปน 50% คาดิวตีไ้ ซเคิลคอื 75% แรงดนั (โวลต 5 0 200 300 เวลา 75 100 400 (วินาที รูปที่ 13.5 ตัวอยางคาดิวต้ีไซเคลิ 75% ทีม่ า: ผูเขยี น จากรูปที่ 13.5 เน่ืองจากชว งเวลาใดท่ีมสี ถานะเปน “HIGH” ภายในชว งความถ่ี 1 ลูกคล่ืนใช เวลาทง้ั หมด 75 วินาทจี งึ สรุปไดว าคา ดวิ ตี้ไซเคลิ มคี าเปน 75% คาดวิ ตีไ้ ซเคิลคอื 100% แรงดัน (โวลต 5 0 เวลา 100 200 300 400 (วินาที รูปที่ 13.6 ตวั อยางคา ดิวต้ีไซเคลิ 100% ทม่ี า: ผูเขยี น จากรูปท่ี 13.6 เน่อื งจากชว งเวลาใดที่มสี ถานะเปน “HIGH” ภายในชว งความถ่ี 1 ลูกคล่ืนใช เวลาทงั้ หมด 100 วินาทจี ึงสรปุ ไดว าคา ดวิ ตไ้ี ซเคลิ มีคา เปน 100%
344 2. การคำนวณแรงดันจากคาดวิ ต้ไี ซเคิล สำหรับบอรด Arduino สถานะ “HIGH” คือคาแรงดัน 5 โวลต ซึ่งเปรียบเสมือนคาดิวตี้ ไซเคิล 100% กรณีทีก่ ำหนดคาดังกลาวนี้เต็มคาบเวลา ดงั นนั้ การคำนวณคา แรงดันจากคาดิวต้ีไซเคิล สามารถคำนวณไดด ว ยสตู รดังตอไปนี้ (Don, 2015) v = d x 5 (13.1) 100 เมอ่ื d คือคา ดวิ ตไี้ ซเคลิ v คอื คา แรงดนั ตัวอยา งที่ 13.1 กำหนดใหคาดิวต้ีไซเคิลคือ 30% จงคำนวณหาคา แรงดันสำหรบั บอรด Arduino วิธที ำ จากสมการ 13.1 แทนคา ไดดังนี้ 5 v = 30 x 100 = 1.5 โวลต ดงั น้นั คา แรงดันคือ 1.5 โวลต 3. ฟง ชนั ก analogWrite() เปน ฟง ชนั กท่ีใชส ำหรบั เขียนคา แรงดันที่คำนวณจากพีดับเบลิ ยูเอ็มไปยังตำแหนงขาพนิ 1 ขา ที่บอรด Arduino (Adith, 2015) ซ่ึงโดยสวนใหญจะรองรับฟง ชันกดังกลา วนี้ทต่ี ำแหนงขา 3, 5, 6, 9, 10 และ 11 รูปแบบ analogWrite(pin, value) พารามิเตอร 1. pin คอื ตำแหนงขาของบอรด Arduino โดยตองเปน ขา 3, 5, 6, 9, 10 หรอื 11 เทา นน้ั 2. value คือคา ดวิ ตีไ้ ซเคลิ ท่เี ปน ชนดิ ขอมลู แบบจำนวนเตม็ (int มีคา อยูระหวาง 0 – 255
345 พารามิเตอร value (ดิวตี้ไซเคิลที่มีคาอยูระหวาง 0 – 255) มีความหมายคือหากคาดิวต้ี ไซเคลิ มคี า เปน 0% จะไดค า value คอื 0 แตห ากดิวตไี้ ซเคิลมีคาเปน 100% จะไดคา value คือ 255 ดังนน้ั สามารถคำนวณหาคาดังกลา วไดโ ดยใชส ูตรดังนี้ value = d x 255 (13.2) 100 ตัวอยางที่ 13.2 กำหนดใหคาดิวตี้ไซเคิลคือ 30% จงคำนวณหาคาพารามิเตอร value สำหรับ ฟง กชัน analogWrite() วธิ ที ำ จากสมการ 13.2 แทนคาไดด ังนี้ 255 100 value = 30 x = 76.5 เนื่องจาก value เปนขอมูลประเภทจำนวนเต็ม ดังนั้นตองกำหนดคา value เปน 76 หรือ 77 โดยประมาณ ตัวอยางที่ 13.3 การควบคมุ สถานะของหลอดแอลอีดดี ว ยคาดิวต้ไี ซเคลิ การทำงาน: สถานะของหลอดแอลอีดจี ะขึ้นอยูคา ดวิ ตีไ้ ซเคิลที่เพมิ่ ขึ้นในทุกๆ 300 มิลลิวนิ าที และ แสดงคาดิวต้ไี ซเคลิ ผา น Virtual Terminal วธิ ที ำ 1. สวนวงจรทดลอง รูปที่ 13.7 วงจรทดลองการทดลองควบคุมสถานะหลอดแอลอดี ีดวยคา ดวิ ตี้ไซเคิล ท่ีมา: ผูเขยี น
346 คำอธิบาย: ตอหลอดแอลอีดีที่ตำแหนงขา 9 ของบอรด Arduino และเชื่อมตอ Virtual Terminal กับบอรด ดังนี้ ตำแหนง ขา ตำแหนงขา Virtual Terminal บอรด ทดลอง TXD (ขา 1 RXD RXD (ขา 0) TXD 2. สว นโปรแกรม int led_pin = 9; int duty; void setup() { Serial.begin(9600 ; pinMode(led_pin, OUTPUT); } void loop() { for(duty = 0; duty < 1024; duty += 25 { analogWrite(led_pin, duty/4 ; Serial.println(duty); delay(300 ; } } คำอธิบาย: มกี ารกำหนดตัวแปรชื่อ led_pin เปนชนดิ ขอมูลแบบจำนวนเต็ม มคี าเรม่ิ ตน เปน 9 ซ่ึงใช แทนตำแหนงขาของบอรด Arduino และกำหนดตัวแปรชื่อ duty ซึ่งเปนตัวแปรสำหรับกำหนด คาพารามเิ ตอร value สำหรบั ฟงกช ัน analogWrite() ฟงกชัน Setup(): กำหนดใหตำแหนง ขาที่ 9 ของบอรด Arduino ซ่งึ ตออยูกับหลอดแอลอีดี มโี หมดการทำงานเปน เอาตพุต ฟงกชัน loop(): มีการใชคำสั่ง for เพื่อวนรอบการทำงานโดยใชคา duty เปนตัวแปร สำหรับการวนรอบการทำงาน มีการใชฟงกชัน analogWrite() และใชตัวแปร duty แทนคาดิวต้ี
347 ไซเคิลเพื่อควบคุมสถานะการทำงานของหลอดแอลอีดี โดยมีคาการแสดงคา duty ผาน Virtual Terminal ผลการทดลองจากตัวอยางนี้จะพบวาหลอดแอลอีดีจะคอยๆ สวางขึ้น และดับลงเมื่อสิ้นสุด คำสั่ง for เนื่องจากเขาสูรอบการคำนวณใหมของฟงกชัน loop() สงผลใหตัวแปร duty ถูกรีเซตคา กลบั มาเปน 0 ตัวอยางนี้สังเกตวาผูเขียนกำหนดใหคา duty มีคาอยูระหวาง 0 – 1024 เพื่อจำลอง สถานการณวาคา duty ดังกลาวนี้คือการท่ีอานมาจากเซน็ เซอรขนาด 10 บิต ดังนั้นการนำมาใชงาน จริงรว มกบั ฟงกช ัน analogWrite() จำเปน ตองแปลงใชอ ยูใ นชวง 0 – 255 โดยหารคา duty ดวย 4 3. ผลการทดลอง รูปท่ี 13.8 ผลการทดลองการทดลองควบคมุ สถานะหลอดแอลอีดดี วยคาดวิ ตไ้ี ซเคิล ที่มา: ผูเขยี น หมายเหตุ: ผลการทำงานที่โปรแกรม Proteus อาจจะไมตรงกับการทดลองบนบอรดจริง โดยหาก พิจารณาที่โปรแกรม Proteus อาจจะไมเห็นการสวางขึ้นอยางตอเนื่องของหลอดไฟ (Tero & Kimmo, 2011) ดังนั้นการทดลองน้ีผูเขยี นแนะนำใหทดลองกับบอรดจริง
348 ตวั อยา งที่ 13.4 การควบคุมสถานะของหลอดแอลอดี ีดว ยตวั ตา นทานปรับคาได การทำงาน: สถานะของหลอดแอลอีดีจะข้นึ อยูคา ดวิ ต้ไี ซเคิลท่ีเพ่ิมข้นึ ในทุกๆ 300 มลิ ลิวนิ าที และ แสดงคาดวิ ต้ไี ซเคิลผา น Virtual Terminal วธิ ที ำ 1. สวนวงจรทดลอง รูปท่ี 13.9 วงจรทดลองการทดลองควบคุมสถานะหลอดแอลอีดดี ว ยตวั ตา นทานปรับคาได ทีม่ า: ผูเ ขยี น คำอธิบาย: ตอวงจรคลายกับวงจรจากตัวอยางที่ 13.7 โดยเพิ่มการตอตัวตานทานปรับคาไดกับ ตำแหนงขา A0 ของบอรด Arduino 2. สว นวงจรทดลอง int led_pin = 9; int duty; void setup() { Serial.begin(9600); pinMode(led_pin, OUTPUT); } void loop() { int val = analogRead(A0);
349 val = map(val, 0 ,1023, 0, 255); Serial.println(val); analogWrite(led_pin, val); delay(300); } คำอธิบาย: มีการกำหนดตัวแปรชื่อ led_pin เปนชนิดขอมลู แบบจำนวนเต็ม มีคาเรม่ิ ตนเปน 9 ซ่ึงใช แทนตำแหนงขาของบอรด Arduino และกำหนดตัวแปรชื่อ duty ซึ่งเปนตัวแปรสำหรับกำหนด คาพารามเิ ตอร value สำหรับฟง กช นั analogWrite() ฟงกชัน Setup(): กำหนดใหตำแหนงขาที่ 9 ของบอรด Arduino ซ่ึงตอ อยกู บั หลอดแอลอีดี มีโหมดการทำงานเปนเอาตพตุ ฟงกชัน loop(): เรียกใชงานฟงกชัน analogRead() เพื่อรับคาจากตัวตานทานปรับคาได ผานตำแหนงขา A0 และใชฟงกชัน map() เพื่อคาปรับชวงคาของสัญญาณอนาล็อกใหมใหอยูในชวง 0 – 255 เพ่ือนำผลลัพธท ไ่ี ดม ากำหนดเปน คาดวิ ต้ีไซเคิลเพ่อื ควบคุมหลอดแอลอีดี 3.1 ผลการทดลอง (กรณปี รบั คา ตวั ตานทานปรับคา ไดใ หมีคา ต่ำสุด) รูปท่ี 13.10 ผลการทดลองการทดลองควบคุมสถานะหลอดแอลอีดดี ว ยตวั ตานทานปรับคา ได กรณที ปี่ รบั ตวั ตานทานปรับคาไดใหมีคาตำ่ สุด ท่ีมา: ผเู ขยี น
350 จากรปู ท่ี 13.10 แสดงผลการทดลองการทดลองควบคุมสถานะหลอดแอลอีดดี วยตัวตา นทาน ปรับคาได กรณที ี่ปรบั ตัวตา นทานปรับคาไดใหม ีคา ต่ำสุด จงึ ทำใหคา ดิวตไ้ี ซเคิลมีคาเปน 0% ดงั นน้ั คาแรงดนั จงึ เปน 0 โวลต สง ผลใหหลอดแอลอดี ีมีสถานะ “LOW” หรอื ดบั 3.2 ผลการทดลอง (กรณีปรับคา ตัวตา นทานปรับคา ไดใหม ีคา สงู สุด) รปู ท่ี 13.11 ผลการทดลองการทดลองควบคมุ สถานะหลอดแอลอีดีดวยตัวตา นทานปรบั คา ได กรณที ีป่ รับตัวตานทานปรบั คาไดใหมีคาสูงสุด ท่ีมา: ผูเขยี น จากรปู ท่ี 13.11 แสดงผลการทดลองการทดลองควบคุมสถานะหลอดแอลอีดีดว ยตัวตานทาน ปรับคาได กรณีที่ปรับตัวตานทานปรับคาไดใหมีคาต่ำสุด จึงทำใหคาดิวตี้ไซเคิลมีคาเปน 100% ดังนั้น คาแรงดนั จงึ เปน 5 โวลต สงผลใหหลอดแอลอีดีมสี ถานะ “HIGH” หรือ สถานะติด 4. บทสรปุ สัญญาณพีดับเบิลยูเอ็ม (PWM) เปนชื่อยอมาจาก Pulse Width Modulation คือการ กำหนดสถานะ “LOW” และสถานะ “HIGH” ในชวงเวลาที่แตกตางกันแตความถี่ยังคงเดิมซึ่งจะ สงผลใหแรงดันเฉลี่ยของแตละความถี่ในแตละกรณีมีความแตกตางกัน โดยประโยชนของสัญญาณ พีดับเบิลยูเอ็ม เชนสามารถนำมาใชสำหรับการปรับความสวา งของหลอดไฟ หรือการนำมาใชสำหรับ การควบคุมความเร็วรอบการหมุนของมอเตอรได ลักษณะของสัญญาณพีดับเบิลยูเอ็มคือจะมี
351 คาความถี่คงที่ โดยในแตละชวงความถี่จะมีชวงเวลาของการเกิดสถานะ “LOW” และสถานะ “HIGH” ที่แตกตางกนั โดยสิ่งทีส่ ำคัญของสญั ญาณพีดบั เบิลยเู อ็มคือคา ท่เี รยี กวาคาดวิ ต้ีไซเคิล (Duty Cycle) ซงึ่ การพจิ าณาคาดวิ ตีไ้ ซเคลิ สามารถทำไดโ ดยการพิจารณาคา ความกวางของสัญญาณ (pulse width) ที่อยูสถานะ “HIGH” ฟงชันก analogWrite() เปนฟงชันกที่ใชสำหรับเขียนคาแรงดันที่คำนวณจากพีดับเบิลยูเอ็ม ไปยังตำแหนง ขาพิน 1 ขาทีบ่ อรด Arduino โดยท่ีบอรด Arduino สว นใหญจะรองรบั ฟงชนั กดังกลาว นที้ ี่ตำแหนงขา 3, 5, 6, 9, 10 และ 11
352 แบบฝกหดั ทายบท บทที่ 13 1. สัญญาณพีดบั เบิลยูเอม็ มีประโยชนอยางไร 2. คาดิวต้ไี ซเคิล 20% หมายความวา อยา งไร 3. จากคา ดิวตไี้ ซเคิลดงั คำถามขอ ที่ 2 จงคำนวณหาคาแรงดันสำหรับบอรด Arduino 4. ฟงชันก analogWrite() มีประโยชนอ ยา งไร 5. จากคาดิวตี้ไซเคิลดังคำถามขอที่ 2 จงคำนวณหาคาพารามิเตอร value สำหรับฟงกชัน analogWrite()
353 เอกสารอา งองิ กอบเกียรติ สระอุบล. (2561). พัฒนา IoT บนแฟรตฟอรม Arduino และ Raspberry Pi. กรงุ เทพฯ: หสม สำนักพมิ พ อนิ เตอรม ีเดีย. ประภาส พุมพวง. (2561). การเขียนและการประยุกตใชงานโปรแกรม Arduino. กรุงเทพฯ: ซีเอ็ด ยเู คช่ัน. Adith, J. B. (2015). Arduino by Example. Birmingham: Packt Publishing Ltd. Don, W. (2015). Arduino Electronics Blueprints. Birmingham: Packt Publishing Ltd. Tero, K. and Kimmo, K. (2011). Make: Arduino Bots and Gadgets. Canada: O’Reilly Media, Inc.
แผนบริหารการสอนประจำบทท่ี 14 อินเตอรร ัพท หวั ขอเนื้อหา 1. การอนิ เตอรร พั ท 2. อินเตอรร ัพทจากภายนอกสำหรับบอรด Arduino Uno R3 3. ฟง กช นั attachInterrupt() 4. ฟงกช ัน Interrupts() 5. ฟง กชนั noInterrupts() 6. ฟง กชัน detachInterrupt() 7. บทสรุป แบบฝกหดั เอกสารอางอิง วัตถุประสงคเชงิ พฤติกรรม เมอ่ื ผเู รียน เรยี นจบบทนี้แลวผูเรยี นควรมคี วามสามารถ ดังนี้ 1. อธบิ ายเกีย่ วกับการเกดิ อินเตอรรพั ทได 2. เขียนโปรแกรมสรา งอนิ เตอรรัพทท เี่ กิดจากอปุ กรณภายนอกสำหรับบอรด Arduino ได 3. มีความต้งั ใจในการเรียนและการฝก ปฏบิ ตั กิ ารเขยี นโปรแกรม วิธีการสอนและกิจกรรมการเรียนการสอนประจำบท 1. บรรยายเนอื้ หาในแตละหัวขอ พรอ มยกตวั อยา งประกอบ โดยใชเ อกสารคำสอน และสอ่ื power point 2. ทดลองปฏบิ ตั ิจริง โดยการสรา งอินเตอรร พั ทส ำหรบั บอรด Arduino Uno R3 3. ผสู อนสรุปเน้ือหา 4. ทำแบบฝกหดั เพ่ือทบทวนบทเรียน 5. เปดโอกาสใหผเู รียนถามขอสงสยั 6. ผูสอนทำการซักถาม
356 สอ่ื การเรยี นการสอน 1. เอกสารคำสอนวิชาการประยุกตใ ชง านไมโครคอนโทรลเลอร 2. สื่อ power point การวดั ผลและการประเมิน 1. การเขา เรียนตรงตอเวลา และการแตงกาย 2. ความรว มมอื และความรบั ผดิ ชอบตอ การเรยี น 3. การถาม-ตอบ 4. การสง งานที่ไดรับมอบหมายภายในเวลาทก่ี ำหนด 5. การทำแบบฝกหดั ทม่ี ีความถูกตองไมนอ ยกวา 80%
บทที่ 14 อินเตอรร ัพท อินเตอรรรัพท (Interrupt หรือการขัดจังหวะคือการขัดจังหวะงานประจำของโปรแกรมซึ่ง เปนเหตุการณที่อาจจะเกิดขึ้นหรือไมก็เปนไดในชวงเวลาของการใชงานระบบงานที่มีการนำ อินเตอรรัพทมาใชงานรวมดวย (ทีมงานสมารทเลิรนนิ่ง, 2555) หากนำอินเทอรรัพทมาเปรียบเทียบ กับชีวิตประจำวัน เชน สมมติเรากำลังรับประทานอาหารเชาอยูแลวมีเสียงสัญญาณสายเรียกเขาจาก โทรศัพทมือถือขึ้นมา เราจึงจำเปนตองหยุดรับประทานอาหารเพื่อรับสายโทรศัพทกอนที่จะกลับมา รับประทานอาหารตอหลังจากเสร็จสิ้นการสนทนา จากตัวอยางเหตุการณคือการรับสายจากเสียง เรียกเขาคอื เหตุการณของอินเตอรรัพทซ่ึงจะสังเกตไดว าสญั ญาณสายเรียกเขาจะไมจ ำเปนตองเกิดข้ึน ระหวา งการรับประทานอาหารและเราไมสามารถทราบเวลาทแี่ นนอนของการเกิดสัญญาณดังกลาวได สำหรบั ในบทนี้จะกลา วถงึ การใชส ัญญาณอินเทอรร ัพทสำหรับบอรด Arduino Uno R3 1. การอินเตอรร พั ท การอินเตอรรัพทคือการขดั จงั หวะการทำงานหลักของโปรแกรม โดยซีพียูจะยา ยไปทำงานใน สวนของอินเตอรรัพทเมื่อเกิดการอินเตอรรัพขึ้น และกลับมาทำงานหลักของโปรแกรมที่ตำแหนง ลาสุดกอนเกิดสัญญาณอินเตอรรัพท โดยที่การเกิดอินเตอรรัพทถูกแบงออกเปน 2 ประเภทคือการ เกิดอินเตอรรัพทจากภายนอก เชนการเกิดอินเตอรรัพทเนื่องจากการกดสวิตซ และการเกิดอินเทอร รัพทจ ากภายใน เชนการเกิดอนิ เตอรร ัพทเน่อื งจากไทเมอร (ทมี งานสมารทเลิรน น่ิง, 2554) ซึ่งในบทนี้ จะกลาวเพียงการเกดิ อินเตอรรพั ทจากภายนอกเทานน้ั ขอดีของการใชง านอนิ เตอรรัพทคือผูพัฒนาไม จำเปนตองเขียนชุดคำสั่งเงื่อนไขเพื่อดักรอการเกิดอินเตอรรัพทเพียงแตเรียกใชชุดคำสั่งของการเกิด อนิ เตอรรัพทเ พือ่ ใชงาน 2. อินเตอรรัพทจ ากภายนอกสำหรับบอรด Arduino Uno R3 เนื่องจากบอรดที่ตางชนิดกันมีตำแหนงขาของการใชงานอินเตอรรัพทที่แตกตางกัน สำหรับ บอรด Arduino Uno R3 จะสามารถใชงานอนิ เตอรรัพทจากภายนอกได 2 ชนิดคอื อนิ เตอรร พั ท int0 ซึ่งถูกติดตั้งไวที่ตำแหนงขา 2 ของบอรด และอินเตอรรัพท int1 ซึ่งถูกติดตั้งไวที่ตำแหนงขา 3 ของ บอรด (Barrett, 2013)
358 3. ฟงกช ัน attachInterrupt() เปน ฟง กชันทใี่ ชสำหรับกำหนดการใหบริการสัญญาณอินเตอรร ัพท เพื่อรอเหตุการณของการ เกดิ อินเตอรร พั ทและการเรยี กใชช ดุ คำสั่งเม่ือเกดิ การอนิ เตอรรัพทข้ึน รูปแบบ attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) พารามเิ ตอร 1. pin คอื ตำแหนงขาท่ใี ชง านอินเตอรร พั ท 2. ISR คอื ชอ่ื ของฟงกชนั ที่จะถกู เรยี กใชง านเมอ่ื เกิดสัญญาณอินเตอรรัพท 3. mode คือ รูปแบบของการเกิดอินเตอรรัพทที่ขึ้นอยูก ับสถานะของตำแหนงขาที่เชื่อมกับ สัญญาณอินเตอรร ัพทแบง ออกเปน 4 สถานะดังน้ี 3.1 mode = “LOW” คือ เกิดอินเตอรรัพทเมื่อสถานะของตำแหนงขาที่เชื่อมกับ สญั ญาณอนิ เตอรร พั ทเ ปน “LOW” 3.2 mode = “CHANGE” คือ เกิดอินเตอรรัพทเมื่อเกิดเหตุการณเปล่ียนสถานะ ของตำแหนงขาทีเ่ ช่ือมกบั สญั ญาณอนิ เตอรรัพท 3.3 mode = “RISING” คือ เกดิ อินเตอรร ัพทเม่ือสถานะของตำแหนงขาท่ีเชื่อมกับ สัญญาณอนิ เตอรร ัพทเกดิ การเปลีย่ นสถานะจาก “LOW” เปน “HIGH” 3.4 mode = “FALLING” คือ เกิดอินเตอรรัพทเมื่อสถานะของตำแหนงขาที่เชื่อม กบั สัญญาณอินเตอรรัพทเกดิ การเปล่ยี นสถานะจาก “HIGH” เปน “LOW” สำหรับ pin หากใชงานบอรด Arduino Uno R3 จะสามารถใชงานได 2 ขาคือตำแหนงขา 2 สำหรับควบคุมการเกิดสัญญาณอินเตอรรัพท int0 และ ตำแหนงขา 3 สำหรับควบคุมการเกิด สัญญาณอินเตอรรพั ท int1 ตัวอยางท่ี 14.1 การควบคุมสถานะหลอดแอลอีดีดว ยสัญญาณอินเตอรร ัพท int0 การทำงาน: แสดงขอความ “Hello World!” บนจอแอลซีดี แตหากมีการกดสวิตซเกิดขึ้นจะทำให เกิดเหตุการณของการขัดจังหวะโดยที่จอแอลซีดีซึ่งจะแสดงขอความ “--Interrupt--” พรอมสถานะ ของการติดของหลอดแอลอดี ีเหตุการณขัดจังหวะจะเกดิ จนกระท่ังผใู ชง านหยุดสมั ผสั ปมุ
359 วธิ ีทำ 1. สว นวงจรทดลอง รูปที่ 14.1 วงจรทดลองการแสดงการขัดจงั หวะผานการกดปมุ ทมี่ า: ผเู ขยี น คำอธิบาย: กำหนดตำแหนง ขาทเี่ ชื่อมตอกบั บอรด Arduino ดงั น้ี 1. ขา E ของแอลซีดีเชื่อมตอกับ ตำแหนง ขาท่ี 11 ของบอรด Arduino 2. ขา RS ของแอลซีดเี ชอ่ื มตอ กับ ตำแหนง ขาที่ 12 ของบอรด Arduino 3. ขา RW ของแอลซีดีเช่ือมตอกับสายดิน 4. ขา D4 – D7 ของแอลซีดีเชื่อมตอกบั ตำแหนงขาที่ 7 - 4 ของบอรด Arduino ตามลำดบั 5. เช่อื มตอสวติ ซกับตำแหนง ขา 2 ของ บอรด Arduino เพื่อใชง านเปนการขดั จังหวะตัวท่ี 0 (int0 6. เชือ่ มตอหลอดแอลอดี ีกับตำแหนง ขาที่ 13 ของ บอรด Arduino 2. สวนโปรแกรม #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 7, 6, 5, 4); int led = 13;
360 int i0 = 2; void setup() { pinMode(led, OUTPUT); digitalWrite(led, LOW); attachInterrupt(digitalPinToInterrupt(i0), startInterrupt, CHANGE); lcd.begin(16, 2); } void loop() { lcd.clear(); lcd.setCursor(0,0); lcd.print(\"Hello World!\"); delay(1000); } void startInterrupt(){ lcd.clear(); lcd.setCursor(0,0); lcd.print(\"--Interrupt--\"); digitalWrite(led, HIGH); while(digitalRead(i0) == LOW); digitalWrite(led, LOW); } คำอธิบาย: กำหนดตำแหนงขาตาง ๆ ของแอลซีดีที่เชื่อมกับบอรด Arduino ใหตรงกับการเชื่อมตอ จริง และกำหนดตัวแปรชนิดจำนวนเต็ม i0 สำหรับอางอิงการเกิดการขัดจังหวะตัวที่ 0 และ led สำหรบั อา งอิงตำแหนงขาท่ี 13 ของบอรด ฟงกชัน Setup(): กำหนดใหมีการควบคุมแอลซีดขี นาด 2 แถว 16 คอลัมน กำหนดตัวแปร led เปนเอาตพุตซึ่งสถานะเริ่มตนคือแอลอีดีดับ และประกาศใหมีการใชงานการขัดจังหวะโดยที่หาก มีการเปลี่ยนแปลงสถานะที่ชองสัญญาณ int0 (มีการกดปุมที่ตำแหนงขา 2 ของบอรด Arduino) จะ เกิดเหตุการณข ัดจงั หวะเกิดข้ึนโดยการเรยี กใชงานฟงกช นั startInterrupt() ฟง กช ัน loop(): สำหรบั เหตกุ ารณป กติ (ไมมีการขัดจงั หวะ จะมีการแสดงขอ ความ “Hello World!” ทีจ่ อแอลอดี ี ฟงกชัน: startInterrupt(): มีการทำงานที่ฟงกชันนี้เมื่อมีเหตุการณขัดจังหวะของ int0 เกิดขึ้นโดยที่จอแอลซีดีจะเปลี่ยนเปนแสดงขอความ “--Interrupt--” และหลอดแอลอีดีจะมีสถานะ ตดิ ของสัญญาณ โดยจะแสดงผลลกั ษณะนี้จนกระทั่งผูใชงานหยุดสมั ผสั สวติ ซท ี่ทำหนาท่ีการขัดจังหวะ ของสญั ญาณ int0
361 3.1 ผลการทดลอง (เหตุการณย ังไมเ กดิ อนิ เตอรร ัพท) รูปที่ 14.2 ผลการทดลองการแสดงการขดั จังหวะผานการกดปมุ กอ นเกดิ เหตุการณก ารอนิ เตอรร พั ท ท่มี า: ผเู ขยี น จากรูปที่ 14.2 แสดงเหตุการณกอนการเกิดการอินเตอรร ัพท ซึ่งสังเกตุไดวาท่ีหลอดแอลซีดี จะแสดงขอความ “Hello World” ติดคา งตลอด 3.2 ผลการทดลอง (เหตุการณเ มอ่ื เกิดอินเตอรรัพท) รปู ท่ี 14.3 ผลการทดลองการแสดงการขัดจังหวะผานการกดปมุ เม่ือเกิดเหตกุ ารณการขัดจงั หวะ ท่ีมา: ผเู ขียน
362 จากรูปที่ 14.3 แสดงเหตุการณเมื่อมีการกดปุมทำใหเกิดการอินเตอรรัพท โดยสังเกตุไดวาท่ี หลอดแอลซีดีจะแสดงขอความ “--Interrupt--” ติดคางตลอด และหลอดแอลอดี จี ะสวาง ตัวอยางท่ี 14.2 การควบคุมสถานะแอลอีดี 7 สวนดวยสญั ญาณอินเตอรรัพท int0 การทำงาน: ทกุ คร้งั ทีม่ ีการกดปมุ จะเกิดการนบั ข้นึ คร้งั ละ 1 จังหวะพรอมท้ังแสดงผลผานแอลอีดี 7 สว น วิธีทำ 1. สว นวงจรทดลอง รปู ท่ี 14.4 วงจรทดลองการควบคุมแอลอดี ี 7 สวนดวย การขดั จังหวะผา นการกดปุม ทม่ี า: ผเู ขียน คำอธิบาย: กำหนดตำแหนงขาที่เชือ่ มตอกับบอรด Arduino ดงั นี้ 1. ขา a ของแอลซีดี 7 สว นเช่อื มตอกับตำแหนงขาที่ 0 ของบอรด Arduino 2. ขา b ของแอลซดี ี 7 สวนเชอ่ื มตอกับตำแหนงขาท่ี 1 ของบอรด Arduino 3. ขา c ของแอลซีดี 7 สว นเชือ่ มตอกบั ตำแหนง ขาที่ 3 ของบอรด Arduino 4. ขา d ของแอลซีดี 7 สว นเช่อื มตอกบั ตำแหนงขาที่ 4 ของบอรด Arduino 5. ขา e ของแอลซีดี 7 สว นเช่ือมตอ กับตำแหนงขาท่ี 5 ของบอรด Arduino 6. ขา f ของแอลซีดี 7 สว นเชื่อมตอ กับตำแหนง ขาที่ 6 ของบอรด Arduino 7. ขา g ของแอลซีดี 7 สวนเช่ือมตอ กับตำแหนง ขาท่ี 7 ของบอรด Arduino
363 8. เชื่อมตอ ปุมกับตำแหนง ขา 2 ของบอรด Arduino เพื่อใชงานเปนการขดั จังหวะตวั ที่ 0 (int0 2. สวนโปรแกรม int i0 = 2; int num = 0; void setup() { pinMode(0, OUTPUT); pinMode(1, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); attachInterrupt(digitalPinToInterrupt(i0), startInterrupt, CHANGE); } void loop() { if(num == 0){ show_zero(); } else if(num == 1){ show_one(); } else if(num == 2){ show_two(); } else if(num == 3){ show_three(); } else if(num == 4){ show_four(); } else if(num == 5){ show_five(); } else if(num == 6){ show_six();
364 } else if(num == 7){ show_seven(); } else if(num == 8){ show_eight(); } else{ show_nine(); } } void show_zero(){ digitalWrite(0, HIGH); digitalWrite(1, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); } void show_one(){ digitalWrite(0, LOW); digitalWrite(1, HIGH); digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); } void show_two(){ digitalWrite(0, HIGH); digitalWrite(1, HIGH); digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, LOW); digitalWrite(7, HIGH); } void show_three(){ digitalWrite(0, HIGH); digitalWrite(1, HIGH);
365 digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, HIGH); } void show_four(){ digitalWrite(0, LOW); digitalWrite(1, HIGH); digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, HIGH); digitalWrite(7, HIGH); } void show_five(){ digitalWrite(0, HIGH); digitalWrite(1, LOW); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, HIGH); digitalWrite(7, HIGH); } void show_six(){ digitalWrite(0, LOW); digitalWrite(1, LOW); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); } void show_seven(){ digitalWrite(0, HIGH); digitalWrite(1, HIGH); digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW);
366 } void show_eight(){ digitalWrite(0, HIGH); digitalWrite(1, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); } void show_nine(){ digitalWrite(0, HIGH); digitalWrite(1, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, HIGH); digitalWrite(7, HIGH); } void startInterrupt(){ num = num + 1; if(num > 9){ num = 0; } while(digitalRead(i0) == LOW); } คำอธิบาย: กำหนดตำแหนงขาตาง ๆ ของแอลซีดีที่เชื่อมกับบอรด Arduino ใหตรงกับการเชื่อมตอ จริง และกำหนดตัวแปรชนิดจำนวนเต็ม i0 สำหรับอางอิงการเกิดการขัดจังหวะตัวที่ 0 และ ตัวแปร num สำหรบั การนบั เลขทุกครัง้ ทีม่ ีการกดปุม ฟงกชัน Setup(): กำหนดใหขา 0, 1, 3, 4, 5, 6 และ 7 ของบอรด Arduino มีสถานะ เริ่มตนเปนโหมดเอาตพุต และประกาศใหมีการใชงานการขัดจังหวะโดยที่หากมีการเปลี่ยนแปลง สถานะที่ชองสัญญาณ int0 (มีการกดปุมที่ตำแหนงขา 2 ของบอรด Arduino) จะเกิดเหตุการณ ขดั จังหวะเกดิ ข้ึนโดยการเรียกใชง านฟง กชนั startInterrupt() ฟงกชัน loop(): ตรวจสอบเงื่อนไขของคา num เพื่อเรียกใชฟงกชันที่ตรงกับคาของ num โดยฟงกช ันท้งั หมดจะทำหนา ที่แสดงผลของตวั เลขผา นแอลอีดี 7 สวน ดงั น้ี num = 0, เรียกใชฟ งกช นั show_zero() เพื่อแสดงเลข 0 ผา นแอลอดี ี 7 สวน
367 num = 1, เรียกใชฟงกชนั show_one() เพอื่ แสดงเลข 1 ผานแอลอีดี 7 สวน num = 2, เรียกใชฟงกช นั show_two() เพื่อแสดงเลข 2 ผานแอลอีดี 7 สว น num = 3, เรียกใชฟง กช ัน show_three() เพอื่ แสดงเลข 3 ผานแอลอีดี 7 สว น num = 4, เรียกใชฟ งกชนั show_four() เพอ่ื แสดงเลข 4 ผานแอลอีดี 7 สว น num = 5, เรียกใชฟง กช นั show_five() เพ่อื แสดงเลข 5 ผา นแอลอดี ี 7 สว น num = 6, เรียกใชฟ งกช นั show_six() เพื่อแสดงเลข 6 ผานแอลอดี ี 7 สวน num = 7, เรยี กใชฟ งกชัน show_seven() เพือ่ แสดงเลข 7 ผา นแอลอดี ี 7 สวน num = 8, เรยี กใชฟ งกชนั show_eight() เพือ่ แสดงเลข 8 ผานแอลอดี ี 7 สวน num = 9, เรียกใชฟง กช นั show_nine() เพ่ือแสดงเลข 9 ผา นแอลอดี ี 7 สว น ฟงกชัน: startInterrupt(): มีการเพิ่มคา num ขึ้นทุกครั้งที่มีการกดปุม เนื่องจากการเกิด อนิ เตอรร ัพทส ำหรับขอนจี้ ะพิจารณาจากการกดปุม โดยจะรีเชตคาเปน 0 เมือ่ นับคา ถึง 9 3.1 ผลการทดลอง (เหตกุ ารณยังไมเ กดิ อนิ เตอรร ัพท) รปู ที่ 14.5 ผลการทดลองการควบคุมแอลอีดี 7 สวนดวย การขดั จังหวะผา นการกดปมุ กอ นเกดิ เหตุการณการอินเตอรร ัพท ทีม่ า: ผเู ขียน จากรปู ที่ 14.5 แสดงผลการทดลองการควบคุมแอลอีดี 7 สว นดว ยการขดั จังหวะผานการกด สวิตซกอนเกดิ เหตุการณการอินเตอรรัพท ซึ่งพบวาเกิดการแสดงเลข 0 ที่แอลอีดี 7 สวนเนื่องจากคา เรม่ิ ตนของตวั แปร num มคี าเปน 0
368 3.2 ผลการทดลอง (เกิดอนิ เตอรรัพท) รูปท่ี 14.6 ผลการทดลองการควบคมุ แอลอดี ี 7 สวนดว ย การขดั จงั หวะผานการกดปุม เมือ่ เกิดเหตกุ ารณก ารอนิ เตอรรัพท ทีม่ า: ผูเขียน จากรปู ท่ี 14.6 แสดงผลการทดลองการควบคุมแอลอีดี 7 สว นดวยการขดั จังหวะผานการกด สวิตซเมื่อเกิดเหตุการณการอินเตอรรัพท ซึ่งพบวาเกิดการแสดงเลข 1 ที่แอลอีดี 7 โดยหากเกิด อนิ เทอรรัพทคร้ังถดั ไปตวั เลขจะนับเพ่ิมข้นึ ครั้งละ 1 คา 4. ฟง กชนั Interrupts() เปน ฟงกช นั ทใี่ ชสำหรบั การเปด การใชงานอนิ เตอรร ัพทท้ังหมดใหส ามารถใชงานได (ประภาส พมุ พวง, 2561) รปู แบบ Interrupts() 5. ฟงกชนั noInterrupts() เปนฟงกช ันท่ใี ชส ำหรบั การปด การใชงานอนิ เตอรร ัพทท้งั หมดไว รูปแบบ noInterrupts()
369 ดังนั้นจากตัวอยา งที่ 14.1 และ ตัวอยา งที่ 14.2 หากมีการเรียกใชง านฟง กช ันนี้จะสงผลใหไ ม มีการอนิ เตอรร ัพทใดๆ เกิดขึ้นถึงแมว าจะมีการกดสวติ ซท ี่เชือ่ มตอกับสญั ญาณอินเตอรรัพท อยางไรก็ ตามสามารถเปดการใชงานอินเตอรรพั ทไ ดอกี คร้งั โดยใชฟ งกช ัน Interrupts() 6. ฟงกชัน detachInterrupt() เปน ฟงกช นั ทีใ่ ชส ำหรบั การปดการใชงานอินเตอรรัพทท่เี ลือก รูปแบบ detachInterrupt(digitalPinToInterrupt(pin)) พารามเิ ตอร 1. pin คอื ตำแหนงขาทใ่ี ชงานอินเตอรรัพทท ต่ี อ งการปดการใชงาน 7. บทสรุป การอนิ เตอรร ัพทคือการขดั จังหวะการทำงานหลักของโปรแกรม โดยซีพียูจะยา ยไปทำงานใน สวนของอินเตอรรัพทเมื่อเกิดการอินเตอรรัพขึ้น และกลับมาทำงานหลักของโปรแกรมที่ตำแหนง ลาสุดกอนเกิดสัญญาณอินเตอรรัพท โดยที่การเกิดอินเตอรรัพทถูกแบงออกเปน 2 ประเภทคือการ เกิดอินเตอรรัพทจากภายนอก เชนการเกิดอินเตอรรัพทเนื่องจากการกดสวิตซ และการเกิด อนิ เทอรรัพทจากภายใน เชนการเกิดอินเตอรร ัพทเ นื่องจากไทเมอร โดยบอรด Arduino Uno R3 จะ สามารถใชงานอินเตอรรัพทจากภายนอกได 2 ชนิดคืออินเตอรรัพท int0 ซึ่งถูกติดตัง้ ไวท่ีตำแหนงขา 2 ของบอรด และอินเตอรรัพท int1 ซงึ่ ถูกตดิ ต้ังไวท ตี่ ำแหนง ขา 3 ของบอรด สำหรับฟงกชันที่มีในโปรแกรม Arduino IDE ที่เกี่ยวกับการขัดจังหวะประกอบไปดวยดังน้ี ฟงกชัน attachInterrupt() เปนฟงกชันที่ใชสำหรับกำหนดการใหบริการสัญญาณอินเตอรรัพท เพื่อ รอเหตุการณของการเกิดอินเตอรรัพทและการเรียกใชชุดคำสั่งเมื่อเกิดการอินเตอรรัพทขึ้น ฟงกชัน Interrupts() เปนฟงกชันที่ใชสำหรับการเปดการใชงานอินเตอรรัพททั้งหมดใหสามารถใชงานได ฟงกชัน noInterrupts() เปน ฟงกช นั ท่ีใชสำหรับการปดการใชงานอินเตอรรพั ทท ง้ั หมดไว และฟง กชัน detachInterrupt() เปน ฟง กชันทใี่ ชส ำหรับการปดการใชงานอนิ เตอรรพั ทท เ่ี ลือก
370 แบบฝก หัดทา ยบท บทท่ี 14 1. อินเทอรร ัพทค ืออะไร 2. อินเทอรร ัพทถ ูกแบงเปน ก่ีประเภทอะไรบาง 3. ตำแหนง ขาพินของบอรด Arduino Uno R3 ท่สี ามารถสรา งสัญญาณอนิ เทอรร ัพทจากภายนอกได คือตำแหนง ใดบาง 4. จากคำถามขอ 2 แตละตำแหนง รองรบั สญั ญาณอนิ เทอรรพั ทท ี่มชี ่ือเรียกวา อะไร 5. ฟงกชนั attachInterrupt() มปี ระโยชนอ ยางไร 6. จงสรางฟงกชันที่ใชสำหรับกำหนดการใหบริการสัญญาณอินเตอรรัพท เพื่อรอเหตุการณของการ เกิดอินเตอรรพั ท โดยกำหนดใหใชงานอินเทอรรพั ท int1 และเรียกใชฟงกชันชื่อ test() ทุกครั้งที่เกิด อนิ เทอรรัพทดงั กลาวนขี้ ้ึน 7. ฟง กชนั ท่ใี ชส ำหรับปดการใชง านอนิ เทอรรัพทมีชื่อวาอะไร 8. จากรปู ที่กำหนดใหตอไปนี้ จงเขยี นโปรแกรมท่ีกำหนดใหหลอดแอลอดี ี 2 หลอดซึ่งตอกบั ตำแหนง ขา 3 และ 4 ของบอรดทดลองมีสถานะ “ติด” และ “ดบั ” ตามลำดับเสมอ แตห ากเกดิ อินเทอรร ัพท int0 จะเกดิ การกลับสถานะของหลอดแอลอีดที ้งั 2 ดวง
371 เอกสารอา งองิ ทีมงานสมารทเลิรนนิ่ง. (2554). Advanced PIC Microcontroller in C : การประยุกตใชงาน PIC ขน้ั สูงดวยภาษา C. กรุงเทพฯ: สมารท เลริ นน่ิง. ทีมงานสมารทเลิรนนิ่ง. (2555). เรียนรูไมโครคอนโทรลเลอร MCS-51 ดวยภาษา C. กรุงเทพฯ: สมารทเลิรนนิ่ง. ประภาส พุมพวง. (2561). การเขียนและการประยุกตใชงานโปรแกรม Arduino. กรุงเทพฯ: ซีเอ็ด ยเู คช่ัน. Barrett, S.F. (2013). Arduino Microcontroller Processing for Everyone!. United States: Morgan & Claypool Publishers.
แผนบรหิ ารการสอนประจำบทที่ 15 หนวยความจำอีอพี รอม หวั ขอเน้อื หา 1. หนว ยความจำออี ีพรอม 2. ฟง กชนั EEPROM.write() 3. ฟงกชนั EEPROM.read() 4. ฟงกช นั EEPROM.update() 5. ฟง กชัน EEPROM.put() 6. ฟงกช นั EEPROM.get() 7. บทสรปุ แบบฝก หดั เอกสารอา งอิง วัตถุประสงคเ ชิงพฤติกรรม เม่ือผูเรยี น เรยี นจบบทนแ้ี ลว ผเู รียนควรมีความสามารถ ดังนี้ 1. อธบิ ายเกีย่ วกับหนว ยความจำอีอีพรอมได 2. เขียนและอานขอมลู ลงบนตำแหนง ตา งๆ ภายในหนวยความจำอีอพี รอมได 3. มคี วามต้งั ใจในการเรียนและการฝกปฏิบัติการเขียนโปรแกรม วิธีการสอนและกจิ กรรมการเรียนการสอนประจำบท 1. บรรยายเน้ือหาในแตล ะหวั ขอ พรอ มยกตัวอยา งประกอบ โดยใชเอกสารคำสอน และสื่อ power point 2. ทดลองปฏิบัติจริง เขียนโปรแกรมเพื่อใชงานหนวยความจำอีอีพรอมสำหรับบอรด Arduino Uno R3 3. ผูสอนสรุปเนือ้ หา 4. ทำแบบฝก หดั เพื่อทบทวนบทเรียน 5. เปดโอกาสใหผ ูเรียนถามขอสงสยั 6. ผูสอนทำการซักถาม
374 สอ่ื การเรยี นการสอน 1. เอกสารคำสอนวิชาการประยุกตใ ชง านไมโครคอนโทรลเลอร 2. สื่อ power point การวดั ผลและการประเมิน 1. การเขาเรียนตรงตอเวลา และการแตงกาย 2. ความรวมมอื และความรบั ผดิ ชอบตอ การเรยี น 3. การถาม-ตอบ 4. การสงงานที่ไดรับมอบหมายภายในเวลาทก่ี ำหนด 5. การทำแบบฝกหดั ทม่ี ีความถูกตองไมนอ ยกวา 80%
บทที่ 15 หนว ยความจำออี ีพรอม ในการใชงานอุปกรณอิเล็กทรอนิกสที่มีการใชงานไมโครคอนโทรลเลอรนั้น หากเลิกใชงาน โดยการหยุดจายไฟเลี้ยงคาขอมูลที่ถูกใชงานกอนที่จะเลิกใชนั้นจะไมสามารถถูกนำกลับมาใชใหมได เนื่องจากขอมูลเหลานี้จะหายไปทันทีเมื่อหยุดจายไฟเลี้ยง (กอบเกียรติ สระอุบล, 2561) และหาก ผใู ชงานนำอปุ กรณอิเล็กทรอนิกสดงั กลาวน้ีกลบั มาใชง านใหมอีกคร้ัง ขอ มลู ท้งั หมดท่ีจำเปนตองถูกใช งานกับอุปกรณจะถูกรีเซ็ตใหมเปนคาเริ่มตนซึ่งเปรียบเสมือนการเริ่มใชงานใหม (ประภาส พุมพวง, 2561) ดังนนั้ ในบทนีจ้ ะกลา วถึงวิธกี ารเกบ็ ขอ มูลกอนท่จี ะหยดุ จายไฟเล้ียงอุปกรณไวเ พื่อใชงานในคร้ัง ถัดไปโดยใชห นวยความจำทีเ่ รียกวาอีอพี รอม 1. หนวยความจำอีอีพรอม อีอีพรอม (EEPROM ยอมาจาก Electrical Erasable Programmable Read Only Memory คอื หนวยความจำชนดิ หน่งึ ท่สี ามารถอาน, เขยี น ลบ และแกไขขอมูลทถ่ี ูกเก็บไวใ นตำแหนง ตางๆ ภายในหนวยความจำไดโดยใชสัญญาณไฟฟาสำหรับจัดการขอมูล สำหรับพื้นที่การจัดเก็บ ขอมูลหนวยความจำอีอีพรอมคือ 1 กิโลไบต (Nandanwar, Kashif & Ankushe, 2017) จุดเดนของ หนวยความจำอีอีพรอมคือขอมูลที่ถูกเก็บไวจะยังคงอยูถึงแมวาจะหยุดจายไฟเลี้ยง ดังนั้นการเขียน ขอมลู ลงหนว ยความจำอีอีพรอมจงึ เปรียบเสมือนการบันทึกขอมูล อยางไรก็ตามการนำหนวยความจำ อีอีพรอมมาใชสำหรับการอาน และการเขียนขอมูลจะสามารถดำเนินการไดทั้งหมดอยูที่ประมาณ 1 แสนคร้ัง (Bell, 2016) 2. ฟงกชนั EEPROM.write() เปนฟงกชนั ทีใ่ ชสำหรับเขียนขอมลู ท่มี ีขนาดไมเกิน 1 ไบต (0 – 255) ไปยังตำแหนงหน่ึงของ หนว ยความจำอีอีพรอม รูปแบบ EEPROM.write(address, value)
376 พารามเิ ตอร 1. address คอื ตำแหนงทีอ่ ยูของหนว ยความจำอีอีพรอมท่ตี องการใชส ำหรบั เกบ็ ขอมลู 2. value คอื คา ขอ มลู ทต่ี อ งการเขยี นลงหนว ยความจำอีอีพรอมซึ่งมีขนาดไมเกนิ 1 ไบต 3. ฟงกช นั EEPROM.read() เปนฟงกชันที่ใชสำหรับอานขอมูลที่มีขนาดไมเกิน 1 ไบต (0 – 255) จากตำแหนงหนึ่งของ หนว ยความจำอีอีพรอม รปู แบบ EEPROM.read(address, value) พารามเิ ตอร 1. address คือ ตำแหนงทอ่ี ยูของหนว ยความจำออี ีพรอมที่ตองการอานขอมลู ตัวอยางที่ 15.1 ทดสอบใชงานหนวยความจำออี ีพรอม การทำงาน: ตัวอยางนี้แสดงวิธกี ารเขียนขอมูลลงหนวยความจำอีอพี รอมในตำแหนง ท่ี 0 และทดสอบ อา นขอมลู จากตำแหนงดงั กลาวและแสดงผลลพั ธผาน Virtual Terminal วิธที ำ 1. สว นวงจรทดลอง รูปท่ี 15.1 วงจรทดสอบการใชง านหนวยความจำออี ีพรอม และแสดงผลลพั ธผา น Virtual Terminal ที่มา: ผูเขียน
377 คำอธิบาย: เชือ่ มตอ Virtual Terminal กบั บอรด Arduino ดงั น้ี ตำแหนง ขา ตำแหนงขา Virtual Terminal บอรด ทดลอง TXD (ขา 1 RXD RXD (ขา 0) TXD 2. สวนโปรแกรม #include <EEPROM.h> byte x; void setup() { Serial.begin(9600 ; EEPROM.write(0, 21 ; x = EEPROM.read(0 ; Serial.println(x); } void loop() { } คำอธิบาย: กำหนดตวั แปรช่อื x ท่ีมชี นดิ ขอ มูลเปนแบบ byte ฟงกชัน Setup(): เขียนขอมูลที่มีคาเทากับ 21 ลงหนวยความจำตำแหนงที่ 0 ดวยฟงกชัน EEPROM.write() และดึงขอมูลจากตำแหนงดังกลาวดวยฟงกชัน EEPROM.read() กอนที่จะแสดง ผลลัพธที่ดงึ ออกมาผาน Virtual Terminal ฟงกชัน loop(): -
Search
Read the Text Version
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
- 396
- 397
- 398
- 399
- 400
- 401
- 402
- 403
- 404
- 405
- 406
- 407
- 408
- 409
- 410
- 411
- 412
- 413
- 414
- 415
- 416
- 417
- 418
- 419
- 420
- 421
- 422
- 423
- 424
- 425
- 426
- 427
- 428
- 429
- 430
- 431
- 432
- 433
- 434
- 435
- 436
- 437
- 438
- 439
- 440
- 441
- 442
- 443
- 444
- 445
- 446
- 447
- 448
- 449
- 450
- 451
- 452
- 453
- 454
- 455
- 456
- 457
- 458
- 459
- 460
- 461
- 462
- 463
- 464
- 465
- 466
- 467
- 468
- 469
- 470
- 471
- 472
- 473
- 474
- 475
- 476
- 477
- 478
- 479
- 480
- 481
- 482
- 483
- 484
- 485
- 486
- 487
- 488
- 489
- 490
- 491
- 492
- 493
- 494
- 495
- 496
- 497
- 498
- 499
- 500
- 501
- 502
- 503
- 504
- 505
- 506
- 507
- 508
- 509
- 510
- 511
- 512
- 1 - 50
- 51 - 100
- 101 - 150
- 151 - 200
- 201 - 250
- 251 - 300
- 301 - 350
- 351 - 400
- 401 - 450
- 451 - 500
- 501 - 512
Pages: