Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

Home Explore ไมโครคอนโทรลเลอร์และการประยุกต์

ไมโครคอนโทรลเลอร์และการประยุกต์

Description: ไมโครคอนโทรลเลอร์และการประยุกต์

Search

Read the Text Version

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(): -