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

แผนบรหิ ารการสอนประจำบทที่ 7 การควบคมุ หลอดแอลอีดีแบบเมตริกซ หวั ขอเนื้อหา 1. หลอดแอลอดี ีแบบเมตริกซ 2. การควบคมุ หลอดแอลอดี ีแบบเมตริกซแ สดงผลคร้งั ละ 1 คอลัมน 3. การควบคมุ หลอดแอลอีดีแบบเมตริกซแ สดงผลคร้ังละ 1 แถว 4. บทสรุป แบบฝกหัดทา ยบท เอกสารอางองิ วตั ถปุ ระสงคเชิงพฤติกรรม เมอื่ ผเู รียน เรยี นจบบทน้ีแลวผูเรียนควรมีความสามารถ ดังน้ี 1. อธบิ ายเกี่ยวกับโครงสรางของแอลอดี ีแบบเมตริกซได 2. เขยี นโปรแกรมการควบคุมแอลอีดแี บบเมตริกซแบบครง้ั ละ 1 คอลัมน 3. เขียนโปรแกรมการควบคุมแอลอดี ีแบบเมตริกซแ บบครง้ั ละ 1 แถว 4. มคี วามตงั้ ใจในการเรยี นและการฝกปฏบิ ัตกิ ารเขยี นโปรแกรม วิธีการสอนและกิจกรรมการเรียนการสอนประจำบท 1. บรรยายเนอื้ หาในแตละหวั ขอ พรอ มยกตัวอยา งประกอบ โดยใชเ อกสารคำสอน และส่อื power point 2. ทดลองปฏิบัติจริง โดยการเขียนโปรแกรม Arduino เพื่อควบคุมแอลอีดีแบบเมตริกซผาน โปรแกรม Proteus เพ่อื ใหแสดงผลเปนรปู แบบตา งๆ ที่ตองการ 3. ผสู อนสรปุ เน้อื หา 4. ทำแบบฝกหัดเพื่อทบทวนบทเรียน 5. เปด โอกาสใหผ ูเรียนถามขอสงสยั 6. ผูส อนทำการซักถาม

174 สอ่ื การเรยี นการสอน 1. เอกสารคำสอนวิชาการประยุกตใ ชง านไมโครคอนโทรลเลอร 2. สื่อ power point การวดั ผลและการประเมิน 1. การเขาเรียนตรงตอเวลา และการแตงกาย 2. ความรวมมอื และความรบั ผดิ ชอบตอ การเรยี น 3. การถาม-ตอบ 4. การสงงานที่ไดรับมอบหมายภายในเวลาทก่ี ำหนด 5. การทำแบบฝกหดั ทม่ี ีความถูกตองไมนอ ยกวา 80%

บทที่ 7 การควบคมุ หลอดแอลอดี แี บบเมตรกิ ซ เน้อื หาในบทที่ 6 ไดก ลาวถงึ การเขียนโปรแกรมเพ่ือควบคุมแอลอีดี 7 สวนเพอ่ื ใหแสดงผลใน รปู แบบของตัวเลข หรอื ตวั อักษรบางประเภท อยา งไรกต็ ามขอเสยี ของแอลอีดี 7 สวนคือรูปแบบของ การแสดงผลมีไมหลากหลาย (วิลาศิณี วสิ ทิ ธ์ิกาศ และคณะ, 2551) เน่อื งจากแอลอีดี 7 สวนใชหลอด แอลอีดเี พียง 7 – 8 ตวั ดังน้นั หากตอ งการความหลากหลายสำหรับรปู แบบการแสดงผลจงึ จำเปนตอง ใชงานหลอดแอลอีดีที่มีจำนวนมากขึ้น อยางไรก็ตามจำนวนแอลอีดีที่มากขึ้น สงผลตอจำนวนการใช งานตำแหนง ขาของบอรด Arduino เพิ่มมากข้ึน เชน กัน ในบทนี้จะกลาวถึงเทคนิคการควบคุมแอลอีดีที่มีอยูเปนจำนวนมาก โดยใชตำแหนงขาของ บอรด Arduino สำหรับการเชื่อมตอจำนวนไมมาก โดยการนำแอลอีดีทั้งหมดมาเรียงตอกันเปนแบบ เมตริกซ 1. หลอดแอลอีดแี บบเมตรกิ ซ หลอดแอลอีดีแบบเมตริกซคือการนำหลอดแอลอีดีมาวางเรียงกันตามแนวแถวและคอลัมน โดยจะมีการใชสายสัญญาณรวมกันทั้งตามแนวแถว และคอลัมนทำใหจำนวนสายสัญญาณที่จะนำไป เชอื่ มตอ กบั ขาของบอรด Arduino ลดลง (เดชฤทธิ์ มณีธรรม, 2559) โดยจำนวนสายสญั ญาณทั้งหมด ท่จี ำเปน ตอ งนำมาใชส ำหรับเชื่อมตอกับขาของบอรดคือ r + c แตม ีจำนวนหลอดแอลอดี ีไดส ูงสุดคือ r x c เมื่อ r แทนจำนวนแถว และ c แทนจำนวนคอลัมน ตัวอยา งเชน หากมีการนำหลอดแอลอีดีมาวาง เรียงกันทั้งหมด 8 แถว และ 8 คอลัมน จะตองใชขาของบอรดเพื่อเชื่อมตอกับแอลอีดีแบบเมตริกซ ทงั้ หมด 16 ขาแตสามารถควบคมุ หลอดแอลอดี ไี ดส ูงสดุ 64 ตวั รูปที่ 7.1 ตวั อยางการประยุกตใ ชง านแอลอดี ีแบบเมตริกซ ท่มี า: ทมี งานสมารท เลิรน นิ่ง, 2553

176 รูปที่ 7.1 แสดงตัวอยางการประยุกตใชงานแอลอีดีแบบเมตริกซซึ่งสามารถนำมาใชสำหรับ การแสดงผลได หลากหลายรูปแบบ รปู ที่ 7.2 ตวั อยา งและโครงสรางของแอลอดี ีแบบเมตริกซขนาด 8x8 ทม่ี า: ทมี งานสมารทเลริ นน่ิง, 2554 รูปที่ 7.2 แสดงตัวอยาง และโครงสรางของแอลอีดีแบบเมตริกซขนาด 8x8 โดยจาก โครงสรางสังเกตไดวามีแอลอีดีในตำแหนงแถวเดียวกันจะมีการใชงานขาแอโนดรวมกัน ดังนั้นการใช งานหากตองการควบคุมสถานะของการติด – ดับของหลอดแอลอีดีในแถวใดๆ จำเปนตองสงสถานะ “HIGH” ไปยังแถวดังกลาว และจากแถวที่กำหนดหากตองการใหหลอดแอลอีหลอดใดมีสถานะ “ติด” จะตองสงสถานะ “LOW” ไปยังตำแหนงคอลัมนของหลอดที่ตองการควบคุม (Tero & Kimmo, 2011) ในทางกลับกันตามแนวคอลัมนแอลอีดีจะใชงานขาแคโทดรวมกัน ดังนั้นการใชงาน หากตองการควบคุมสถานะของการติด – ดับของหลอดแอลอีดีในคอลัมนใดๆ จำเปนตองสงสถานะ “LOW” ไปยังคอลัมนดังกลาว และจากคอลัมนที่กำหนดหากตองการใหหลอดแอลอีหลอดใดมี สถานะ “ติด” จะตอ งสง สถานะ “HIGH” ไปยังตำแหนงแถวของหลอดท่ตี อ งการควบคมุ คอลมั น คอลมั น คอลัมน คอลมั น ที่ 1 ท่ี 2 ท่ี 3 ท่ี 4 แถวที่ 2 แถวที่ 2 แถวท่ี 3 รปู ที่ 7.3 ตวั อยางการใชแ อลอีดแี บบเมตริกซขนาด 3x4 ในโปรแกรม Proteus ท่มี า: ผเู ขียน

177 รูปที่ 7.3 แสดงตัวอยางของการตอแอลอีดีแบบเมตริกซขนาด 3x4 ดวยโปรแกรม Proteus โดยโครงสรางของรูปดังกลาวจะมีความคลายคลึงกับแอลอีดีแบบเมตริกซจากรูปที่ 7.2 เนื่องจาก แอลอีดีในตำแหนงแถวเดียวกันจะมีการใชงานขาแคโนดรวมกัน ในทางกลับกันใชขาแอโนดรวมกัน ตามแนวคอลัมน ดังนั้นการกำหนดสถานะของการ ติด-ดับ ของหลอดแอลอีดีแบบเมตริกซตามรูปท่ี 7.3 จะตรงกันกับการตอแอลอีดีแบบเมตริกซตามรูปที่ 7.2 วิธีการเขียนโปรแกรมเพื่อควบคุมการ ทำงานของแอลอีดีแบบเมตริกซจะคลายกับการควบคุมการทำงานแอลอีดี 7 สวนแบบสลับกัน แสดงผลที่มีจำนวนมากกวา 1 หลัก คือสามารถควบคุมการแสดงผลไดครั้งละ 1 คอลัมน (หรือ 1 แถว) ในแตละชวงเวลา และเมื่อหมดชวงเวลาของการแสดงผลจะเปลี่ยนตำแหนงและรูปแบบการ แสดงผลไปยังตำแหนงคอลัมน (หรือแถวถัดไป โดยจะกำหนดชวงเวลาของการแสดงผลในแตละ ตำแหนงที่เหมาะสมที่ทำใหสายตามนุษยไมสามารถสังเกตเห็นชวงเวลาดังกลาวที่ใชสำหรับการ เปลี่ยนตำแหนงของการแสดงผล มนุษยจึงสังเกตเห็นแอลอีดีแบบเมตริกซแสดงผลพรอมกันทั้งชุด โดยสามารถเลือกวิธีการควบคุมการทำงานแอลอีดีแบบเมตริกซได 2 วิธีคือ การควบคุมใหแสดงผล ครั้งละ 1 คอลัมนในแตละชวงเวลา และการควบคุมใหแสดงผลครั้งละ 1 แถวในแตละชวงเวลา (ประภาส พุมพวง, 2561) 2. การควบคุมหลอดแอลอีดแี บบเมตริกซแสดงผลคร้งั ละ 1 คอลัมน การควบคุมหลอดแอลอีดีแบบเมตริกซแสดงผลครั้งละ 1 คอลัมน คือการกำหนดชวงเวลา การแสดงผลสำหรับ 1 คอลัมน และกำหนดตำแหนงการแสดงผลของแถวที่ตองการที่อยูในตำแหนง ของคอลัมนดังกลาว และเปลี่ยนไปควบคุมการทำงานยังคอลัมนถัดไปเมื่อหมดชวงเวลาของการ แสดงผล (Adith, 2015) ตวั อยา งท่ี 7.1 การควบคมุ เมตริกซแ อลอีดแี บบ 1 คอลัมน การทำงาน: ตำแหนงการติดของหลอดแอลอีดีคือคอลมั นท่ี 1 และแถวที่ 1, 3 วิธที ำ 1. สว นวงจรทดลอง

178 รูปท่ี 7.4 วงจรทดลองการควบคุมเมตริกซแอลอีดีแบบ 1 คอลมั น ทีม่ า: ผเู ขยี น คำอธิบาย: นำหลอดแอลอีดแี บบเมตริกซขนาด 3 x 4 โดยมีโครงสรา งดังรูปที่ 7. 3 โดยแถวที่ 1 – 3 จะถูกเชื่อมตอกับขาที่ 0 – 2 ของบอรด และคอลัมนที่ 1 – 4 เชื่อมตอกับขาที่ 3 – 6 ของบอรดซึ่ง เปนการใชง านพอรต 0 - 6 ของพอรต D 2. สว นโปรแกรม void setup() { DDRD = 0xFF; PORTD = 0x0A; } void loop() { } คำอธิบาย: จากโจทยกำหนดใหตำแหนงการติดของหลอดแอลอีดีคือคอลัมนที่ 1 และแถวที่ 1, 3 ดังนั้นในแถวที่ 1 และ 3 ตองมีสถานะเปน “0” สวนแถวที่ 2 ใหมีสถานะเปน “1” และในแนว คอลัมนคือ กำหนดใหคอลัมนที่ 1 มีสถานะเปน “1” สวนคอลัมนที่ 2 – 4 มีสถานะเปน “0” ไดเปน ดังน้ี ตำแหนง ขาวงจร 7 6 5 4 3 210 ทดลอง ตำแหนง ของ - คอลมั นที่ คอลัมนท่ี คอลมั นท่ี คอลัมนท ี่ แถวท่ี 3 แถวที่ 2 แถวที่ 1 เมตริกซแ อลอีดี 4 321 สถานะ 0 0 0 0 1 0 1 0

179 เนื่องจากตำแหนงขาที่ 7 ของพอรต D ไมไดถูกใชงานจึงสามารถกำหนดใหเปนสถานะที่ไม สนใจได คือมีคาเปนไดทั้ง “0” หรือ “1” (Don, 2015) โดยหากกำหนดใหเปน “0” เมื่อแปลงเปน เลขฐานสิบหกจะได PORTD = 0x0A แตหากกำหนดใหเปน “1” เมื่อแปลงเปนเลขฐานสิบหกจะได PORTD = 0x8A โดยในหนงั สือเลมน้ีกำหนดใหสถานะทีไ่ มสนใจมคี า เปน “0” จึงไดผ ลลัพธเปนดงั นี้ ฟงกชัน Setup(): กำหนดใหพอรต D ทั้งหมดทำหนาที่เปนเอาตพุต (DDRD = 0xFF และ กำหนดให PORTD = 0x0A ฟง กชัน loop(): - หมายเหตุ: ผูอานสามารถทดลองเปลี่ยนคำสั่งของพอรต D เพื่อเปลี่ยนรูปแบบการแสดงผลเปน รปู แบบอ่นื ๆ 3. ผลการทดลอง รูปท่ี 7.5 ผลการทดลองการควบคมุ เมตริกซแ อลอีดีแบบ 1 คอลมั น ที่มา: ผูเขยี น ตวั อยางที่ 7.2 การควบคมุ เมตริกซแอลอดี ีทั้งแผงโดยใชหลักการควบคุมครงั้ ละ 1 คอลัมน การทำงาน: ตำแหนงการติดของหลอดแอลอีดีคือ คอลัมนที่ 1 ใหติดในแถวที่ 1, 3 คอลัมนที่ 2 – 4 ใหติดเฉพาะในแถวท่ี 2 ทัง้ หมด ดงั ตารางตอ ไปนี้

180 แถวที่ คอลัมนท ่ี 3 4 1 2 ดบั ดับ ดบั 1 ตดิ ตดิ ติด 2 ดบั ติด ดบั ดบั 3 ติด ดับ วิธีทำ 1. สวนวงจรทดลอง: เช่ือมตออปุ กรณภายนอก เขา กับบอรด Arduino ดงั ตวั อยา งท่ี 7.1 2. สวนโปรแกรม int pattern_led[] = {0x0A, 0x15, 0x25, 0x45}; int index = 0; void setup() { DDRD = 0xFF; } void loop() { PORTD = pattern_led[index]; index++; if(index == sizeof(pattern_led)/sizeof(int)){ index = 0; } delay(50); } คำอธิบาย: จากโจทยกำหนดใหตำแหนงการติดของหลอดแอลอีดีเปนดังตารางของตัวอยางที่ 7.2 โดยใชหลักการสแกนตามแนวคอลมั นคร้ังละ 1 คอลัมนโดยเริ่มจากคอลัมนท่ี 1 เรียงไปจนกระทั่งถึง คอลมั นส ดุ ทา ยโดยระยะของการหนว งเวลาในชวงการเปลีย่ นแนวคอลมั นเ ปลีย่ นแปลงอยา งรวดเร็วซึ่ง สงผลใหส ายตามนุษยไ มสามารถแยกแยะชวงทีเ่ กดิ การประพริบของสัญญาณได ตำแหนง ท่ี 1 (คอลัมนท ี่ 1 ตำแหนงขาวงจร 7 6 5 4 3 2 1 0 แถวท่ี 3 แถวที่ 2 แถวท่ี 1 ทดลอง คอลมั นที่ คอลมั นท ี่ คอลัมนท่ี คอลมั นท ี่ 4 3 2 1 0 1 0 ตำแหนง ของ - 0 0 0 1 เมตรกิ ซแอลอดี ี สถานะ 0

181 ไดว า PORTD = 0x0A ตำแหนงที่ 2 (คอลัมนท ี่ 2 ตำแหนงขาวงจร 7 6 5 4 3 2 1 0 แถวท่ี 3 แถวที่ 2 แถวที่ 1 ทดลอง คอลมั นที่ คอลมั นท่ี คอลัมนที่ คอลมั นท ่ี 4 3 2 1 1 0 1 ตำแหนงของ - 0 0 1 0 เมตรกิ ซแ อลอีดี สถานะ 0 ไดว า PORTD = 0x15 ตำแหนง ท่ี 3 (คอลัมนท ี่ 3 ตำแหนง ขาวงจร 7 6 5 4 3 2 1 0 ทดลอง แถวที่ 3 แถวที่ 2 แถวท่ี 1 คอลมั นท ่ี คอลัมนท ่ี คอลมั นที่ คอลัมนท ี่ ตำแหนง ของ - 4 3 2 1 1 0 1 เมตรกิ ซแ อลอดี ี 0 1 0 0 สถานะ 0 ไดว า PORTD = 0x25 ตำแหนงท่ี 4 (คอลัมนที่ 4 ตำแหนงขาวงจร 7 6 5 4 3 2 1 0 แถวที่ 3 แถวที่ 2 แถวที่ 1 ทดลอง คอลัมนท่ี คอลัมนท่ี คอลัมนท ่ี คอลมั นท ี่ 4 3 2 1 1 0 1 ตำแหนงของ - 1 0 0 0 เมตรกิ ซแ อลอดี ี สถานะ 0 ไดวา PORTD = 0x45 ภายในโปรแกรมมีการกำหนดตัวแปรนอกฟง กช ัน 2 ตวั แปรคอื pattern_led เปนตัวแปรแบบ อารเรยที่เก็บคารูปแบบการแสดงผลในแตละคอลัมน และตัวแปร index สำหรับเก็บตำแหนงการ แสดงผลของ pattern_led ฟง กช นั Setup(): กำหนดใหพ อรต D ท้งั หมดทำหนา ที่เปน เอาตพตุ (DDRD = 0xFF

182 ฟงกชัน loop(): กำหนดใหพอรต D มีรูปแบบการแสดงผลตามคาตัวแปร pattern_led โดยมีตัวแปร index เก็บคาตำแหนงของ pattern_led ซึ่งจะเพิ่มตำแหนงขึ้นรอบละ 1 คาอยาง รวดเรว็ เพอื่ ปองกนั การมองเห็นการกระพริบจากสายตามนษุ ย หมายเหตุ: ผูอ า นสามารถทดลองเปลีย่ นการหนว งเวลากรณที ย่ี ังสงั เกตเห็นการกระพรบิ ของสญั ญาณ 3. การควบคุมหลอดแอลอดี ีแบบเมตรกิ ซแสดงผลคร้งั ละ 1 แถว การควบคุมหลอดแอลอีดีแบบเมตริกซแสดงผลครั้งละ 1 แถว จะคลายคลึงกลับการควบคุม ตามแนวคอลัมนเพียงแตเปลี่ยนมาควบคุมตามแนวแถวแทน คือการกำหนดชวงเวลาการแสดงผล สำหรับ 1 แถว และกำหนดตำแหนงการแสดงผลของคอลัมนที่ตองการที่อยูในตำแหนงของแถว ดังกลาว และเปลี่ยนไปควบคุมการทำงานยังแถวถัดไปเมื่อหมดชวงเวลาของการแสดงผล (Adith, 2015) ตวั อยางท่ี 7.3 การควบคมุ เมตรกิ ซแ อลอีดีแบบ 1 แถว การทำงาน: ตำแหนงการติดของหลอดแอลอีดีคอื แถวท่ี 2 และคอลัมนท ่ี 2, 4 วิธที ำ 1. สว นวงจรทดลอง: เช่ือมตออปุ กรณภ ายนอก เขา กบั บอรด Arduino ดงั ตวั อยา งท่ี 7.1 2. สวนโปรแกรม void setup() { DDRD = 0xFF; PORTD = 0x55; } void loop() { } คำอธิบาย: จากโจทยกำหนดใหตำแหนงการติดของหลอดแอลอีดีคือแถวที่ 2 และคอลัมนที่ 2, 4 ดงั น้ันในแถวที่ 2 ตองมสี ถานะเปน “0” สวนแถวที่ 1, 3 ใหม ีสถานะเปน “1” และในแนวคอลัมนคือ ตองกำหนดใหคอลัมนท ่ี 2, 4 มีสถานะเปน “1” สว นคอลมั นท ่ี 1, 3 มสี ถานะเปน “0” ไดเ ปนดังน้ี

183 ตำแหนง ขาวงจร 7 6 5 4 3 210 ทดลอง ตำแหนง ของ - คอลมั นท่ี คอลมั นท ี่ คอลมั นท่ี คอลัมนท ี่ แถวที่ 3 แถวที่ 2 แถวที่ 1 เมตริกซแอลอีดี 4 321 สถานะ 0 1 0 1 0 1 0 1 ไดวา PORTD = 0x55 ฟงกชัน setup(): กำหนดใหพอรต D ทั้งหมดทำหนาที่เปนเอาตพุต (DDRD = 0xFF และ กำหนดให PORTD = 0x55 ฟงกชนั loop(): - 3. ผลการทดลอง รูปท่ี 7.6 ผลการทดลองการควบคมุ เมตริกซแ อลอดี ีแบบ 1 แถว ทมี่ า: ผูเขยี น หมายเหตุ: ผูอานสามารถทดลองเปล่ยี นคำส่งั ของพอรต D เพื่อเปลีย่ นรปู แบบการแสดงผลเปน รูปแบบอนื่ ๆ ตัวอยางท่ี 7.4 การควบคมุ เมตรกิ ซแ อลอดี ีแบบ 1 แถวแบบไฟกระพรบิ การทำงาน: ตำแหนงการติดของหลอดแอลอีดีเปนดังตัวอยางที่ 7.3 เพียงแตใหมีการกระพริบของ หลอดแอลอีดี วิธที ำ 1. สว นวงจรทดลอง: เช่ือมตออุปกรณภายนอก เขากับบอรด Arduino ดงั ตัวอยางท่ี 7.1

184 2. สวนโปรแกรม void setup() { DDRD = 0xFF; } void loop() { PORTD = 0x55; delay(300); PORTD = 0x00; delay(300); } คำอธิบาย: จากโจทยกำหนดใหตำแหนง การตดิ ของหลอดแอลอีดีเปนดังตัวอยางท่ี 7.3 ดังนั้นสถานะ ของการ “ตดิ ” ของพอรต D ยงั คงเปน 0x55 สวนสถานการณดับท้ังหมดสามารถกำหนดสถานะ ‘0’ ใหทกุ ขาของพอรต D จึงไดเปน 0x00 ฟงกชนั setup(): กำหนดใหพอรต D ท้ังหมดทำหนา ทีเ่ ปน เอาตพ ตุ (DDRD = 0xFF ฟงกชัน loop(): กำหนดให PORTD = 0x55 คือตำแหนงการติดของหลอดแอลอีดีตามท่ี โจทยก ำหนด และควบคุมการดบั ของหลอดแอลอดี ดี ว ยคำส่ัง PORTD = 0x00 ตัวอยา งท่ี 7.5 การควบคมุ เมตรกิ ซแอลอีดีทั้งแผงโดยใชห ลกั การควบคุมคร้งั ละ 1 แถว การทำงาน: ตำแหนง การตดิ ของหลอดแอลอีดีเปนดังตารางในตัวอยา งท่ี 7.2 วิธีทำ 1. สวนวงจรทดลอง: เช่ือมตออปุ กรณภ ายนอก เขากับบอรด Arduino ดังตัวอยา งที่ 7.1 2. สว นโปรแกรม int pattern_led[] = {0x0E, 0x75, 0x0B}; int index = 0; void setup() { DDRD = 0xFF; } void loop() { PORTD = pattern_led[index]; index++; if(index == sizeof(pattern_led)/sizeof(int)){ index = 0;

185 } delay(50); } คำอธิบาย: จากโจทยกำหนดใหตำแหนงการติดของหลอดแอลอีดีเปนดังตารางของตัวอยางที่ 7.2 โดยใชหลักการสแกนตามแนวคอลัมนครั้งละ 1 แถวโดยเริ่มจากแถวที่ 1 เรียงไปจนกระทั่งถึงแถว สุดทายโดยระยะของการหนวงเวลาในชวงการเปลี่ยนแนวคอลัมนเปลี่ยนแปลงอยางรวดเร็วซึ่งสงผล ใหส ายตามนุษยไ มสามารถแยกแยะชวงทเ่ี กดิ การประพริบของสัญญาณได ตำแหนง ที่ 1 (แถวท่ี 1 ตำแหนงขาวงจร 7 6 5 4 3 210 ทดลอง ตำแหนง ของ - คอลมั นท่ี คอลัมนท ่ี คอลมั นท ี่ คอลมั นท ่ี แถวท่ี 3 แถวท่ี 2 แถวท่ี 1 4 3 2 1 1 1 0 เมตรกิ ซแอลอดี ี 0 0 0 1 สถานะ 0 ไดวา PORTD = 0x0E ตำแหนงท่ี 2 (แถวที่ 2 ตำแหนง ขาวงจร 7 6 5 4 3 210 ทดลอง ตำแหนง ของ - คอลมั นท ี่ คอลัมนท ี่ คอลมั นท่ี คอลัมนท ่ี แถวท่ี 3 แถวท่ี 2 แถวท่ี 1 4 3 2 1 1 0 1 เมตรกิ ซแอลอดี ี 1 1 1 0 สถานะ 0 ไดว า PORTD = 0x75 ตำแหนง ท่ี 3 (แถวที่ 3 ตำแหนงขาวงจร 7 6 5 4 3 210 ทดลอง ตำแหนง ของ - คอลมั นท่ี คอลมั นท่ี คอลัมนท ่ี คอลัมนที่ แถวที่ 3 แถวที่ 2 แถวที่ 1 เมตริกซแ อลอดี ี 4 3 2 1 0 1 1 สถานะ 0 0 0 0 1 ไดว า PORTD = 0x0B

186 ภายในโปรแกรมมีการกำหนดตัวแปรนอกฟงกชัน 2 ตัวแปรคือ pattern_led เปนตัวแปร แบบอารเรยที่เก็บคารูปแบบการแสดงผลในแตละคอลัมน และตัวแปร index สำหรับเก็บตำแหนง การแสดงผลของ pattern_led ฟงกช ัน Setup(): กำหนดใหพ อรต D ทัง้ หมดทำหนาทเ่ี ปนเอาตพ ุต (DDRD = 0xFF ฟงกชัน loop(): กำหนดใหพอรต D มีรูปแบบการแสดงผลตามคาตัวแปร pattern_led โดยมีตัวแปร index เก็บคาตำแหนงของ pattern_led ซึ่งจะเพิ่มตำแหนงขึ้นรอบละ 1 คาอยาง รวดเร็วเพือ่ ปองกนั การมองเห็นการกระพริบจากสายตามนุษย หมายเหตุ: ผูอานสามารถทดลองเปล่ยี นการหนวงเวลากรณที ี่ยงั สงั เกตเหน็ การกระพรบิ ของสญั ญาณ 4. บทสรุป หลอดแอลอีดีแบบเมตริกซคือการนำหลอดแอลอีดีมาวางเรียงกันตามแนวแถวและคอลัมน โดยจะมีการใชสายสญั ญาณรวมกันทั้งตามแนวแถว และคอลัมนทำใหจำนวนสายสัญญาณที่จะนำไป เชื่อมตอกับขาของบอรด Arduino ลดลง โดยจำนวนสายสัญญาณทั้งหมดที่จำเปนตองนำมาใช สำหรับเชื่อมตอกับขาของบอรดคือจำนวนแถว + จำนวนคอลัมน แตมีจำนวนหลอดแอลอีดีไดสูงสุด คือจำนวนแถว x จำนวนคอลัมน หลอดแอลอีดีที่วางตอในแนวแถวเดียวกันจะใชขาสัญญาณชนิดเดียวกัน เชนเดียวกับแนว คอลัมนท ่ีจำเปนตองใชขาสัญญาณชนิดเดยี วกันท้ังหมด ยกตัวอยางเชน หากพิจารณาตาวแนวแถวจะ ใชขาแอโนดทัง้ หมด และใชข าแคโทดทั้งหมดตามแนวคอลมั น โดยจากตัวอยางนี้หากตองการควบคุม สถานะของการติด – ดับของหลอดแอลอีดีในแถวใดๆ จำเปนตองสงสถานะ “HIGH” ไปยังแถว ดงั กลา ว และจากแถวท่ีกำหนดหากตองการใหหลอดแอลอีหลอดใดมสี ถานะ “ตดิ ” จะตอ งสงสถานะ “LOW” ไปยังตำแหนงคอลัมนของหลอดท่ีตอ งการควบคุม ในทางกลบั กนั ตามแนวคอลัมนแอลอีดีจะ ใชงานขาแคโทดรวมกัน ดังนั้นการใชงานหากตองการควบคุมสถานะของการติด – ดับของหลอด แอลอดี ีในคอลัมนใดๆ จำเปน ตองสงสถานะ “LOW” ไปยงั คอลัมนด ังกลาว และจากคอลมั นท ีก่ ำหนด หากตองการใหหลอดแอลอีหลอดใดมีสถานะ “ติด” จะตองสงสถานะ “HIGH” ไปยังตำแหนงแถว ของหลอดท่ีตองการควบคมุ เนื่องจากขาสัญญาณสำหรับแตละแถว หรือคอลัมนถูกตอรวมกัน จึงสามารถควบคุมการ ทำงานหลอดแอลอีดีแบบเมตริกซไดเพียงครั้งละ 1 แถว หรือ 1 คอลัมน อยางไรก็ตามหากจำเปน ตองการควบคุมทุกแถว หรือทุกคอลัมนสามารถประยุกตใชโดยใชหลักการหนวงเวลาเพื่อสับเปลี่ยน ตำแหนงการแสดงผลในแตล ะชว งเวลา

187 แบบฝกหดั ทายบท บทที่ 7 1. จงบอกขอดีและขอเสยี ของแอลอีดแี บบเมตรกิ ซเ ม่ือนำไปเปรยี บเทยี บกับแอลอดี ี 7 สวน 2. หากแอลอดี ีแบบเมตริกซมีขนาด 5 แถว และ 5 คอลมั น จะตองใชส ายสญั ญาณทั้งหมดกี่เสน 3. จากคำถามขอ 2 สามารถควบคมุ หลอดแอลอดี ีไดท้งั หมดกี่หลอด 4. แอลอีดีแบบเมตริกซสามารถแสดงผลลัพธไดมากกวา 1 แถวและมากกวา 1 คอลัมนพรอมกันได หรอื ไมไ ด 5. กำหนดใหแอลอีดแี บบเมตรกิ ซขนาด 8 แถว และ 8 คอลัมนโดยทข่ี าแอโนดจะถูกเชอื่ มตอตามแนว แถว ในทางกลับกันขาแคโทดจะถูกเชื่อมตอตามแนวคอลัมน จงกำหนดสถานะที่จะทำใหหลอด แอลอดี ีในตำแหนง คอลัมนท่ี 2 และแถวที่ 3, 4 มสี ถานะติด (การแสดงผลครงั้ ละ 1 คอลัมน 6. จากแอลอีดีแบบเมตริกซดังขอ 5 จงกำหนดสถานะที่จะทำใหหลอดแอลอีดีในตำแหนงแถวที่ 3 และแถวท่ี 1, 2, 4 มสี ถานะตดิ (การแสดงผลคร้ังละ 1 แถว 7. จงยกตัวอยางอุปกรณอิเล็กทรอนิกสที่นำแอลอีดีแบบเมตริกซมาประยุกตใชงานและพบไดใน ชวี ติ ประจำวัน

188 เอกสารอา งอิง ทีมงานสมารทเลิรนนิ่ง. (2553). เรียนรูไมโครคอนโทรลเลอร PIC ดวยภาษา Basic. กรุงเทพฯ: สมารท เลิรน น่ิง. ทีมงานสมารทเลิรนนิ่ง. (2554). Advanced PIC Microcontroller in C : การประยุกตใชงาน PIC ขั้นสูงดว ยภาษา C. กรงุ เทพฯ: สมารท เลริ นนงิ่ . เดชฤทธิ์ มณีธรรม. (2559). คัมภีรการใชงาน ไมโครคอนโทรลเลอร Arduino. กรุงเทพฯ: ซีเอ็ด ยเู คชนั่ . ประภาส พุมพวง. (2561). การเขียนและการประยุกตใชงานโปรแกรม Arduino. กรุงเทพฯ: ซีเอ็ด ยูเคช่นั . วลิ าศิณี วสิ ิทธก์ิ าศ วรพจน กรแกววฒั นกุล และ ชยั วัฒน ลม้ิ พรจิตรวไิ ล. (2551). ทดลองและใชงาน. ไมโครคอนโทรลเลอร ATmega128 ดวยโปรแกรมภาษา C กับซอฟตแวร Wiring. กรงุ เทพฯ : อนิ โนเวตฟี เอก็ พอรเิ มนต. 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.

แผนบรหิ ารการสอนประจำบทท่ี 8 การรบั ขอ มูลจากอปุ กรณรบั ขอมลู แบบเมตรกิ ซ หัวขอเน้ือหา 1. อุปกรณร บั ขอ มลู แบบเมตรกิ ซ 2. ไลบรารีสำหรบั อปุ กรณรบั ขอมลู แบบเมตรกิ ซ 2.1 การดาวโหลดและตงั้ คาการใชงานอปุ กรณรบั ขอมลู แบบเมตริกซ 2.2 คำสั่งทสี่ ำคญั ในไลบรารสี ำหรบั อปุ กรณร ับขอมลู แบบเมตริกซ 3. การประยุกตใชอุปกรณรับขอมลู แบบเมตริกซสำหรับควบคุมแอลอดี ี 7 สว น 4. บทสรปุ แบบฝก หดั ทา ยบท เอกสารอางอิง วัตถุประสงคเชงิ พฤติกรรม เม่อื ผูเรียน เรียนจบบทน้ีแลว ผเู รียนควรมคี วามสามารถ ดังน้ี 1. อธิบายเกีย่ วกับอุปกรณร ับขอมูลแบบเมตรกิ ซได 2. เขียนโปรแกรมการเพื่อรับขอมูลจากอุปกรณรับขอมูลแบบเมตริกซโดยการเรียกใชงาน ไลบรารี เพ่ือเปนเง่ือนไขสำหรับควบคุมการทำงานของอุปกรณเ อาตพุต 3. มีความตงั้ ใจในการเรียนและการฝกปฏบิ ตั ิการเขยี นโปรแกรม วิธกี ารสอนและกจิ กรรมการเรียนการสอนประจำบท 1. บรรยายเนอื้ หาในแตล ะหัวขอ พรอ มยกตวั อยางประกอบ โดยใชเ อกสารคำสอน และส่อื power point 2. ทดลองปฏิบัติจริง โดยการเขียนโปรแกรม Arduino รับขอมูลจากอุปกรณรับขอมูลแบบ เมตรกิ ซโ ดยการเรียกใชง านไลบรารี เพอื่ เปน เงื่อนไขสำหรบั ควบคุมการทำงานของอุปกรณ เอาตพ ตุ ผานโปรแกรม Proteus 3. ผูส อนสรุปเน้อื หา 4. ทำแบบฝกหัดเพื่อทบทวนบทเรยี น 5. เปดโอกาสใหผเู รียนถามขอสงสยั

190 6. ผสู อนทำการซักถาม สอ่ื การเรยี นการสอน 1. เอกสารคำสอนวิชาการประยุกตใ ชงานไมโครคอนโทรลเลอร 2. สือ่ power point การวัดผลและการประเมิน 1. การเขาเรยี นตรงตอ เวลา และการแตงกาย 2. ความรวมมือและความรับผิดชอบตอการเรยี น 3. การถาม-ตอบ 4. การสง งานที่ไดรบั มอบหมายภายในเวลาท่กี ำหนด 5. การทำแบบฝกหัดที่มีความถูกตอ งไมน อยกวา 80%

บทที่ 8 การรบั ขอ มลู จากอุปกรณรับขอ มลู แบบเมตรกิ ซ ปญหาเชนเดียวกันกับการใชงานแอลอีดีซึ่งเปนอุปกรณเอาตพุต ที่หากตองมีการใชงานเปน จำนวนมากจำเปนตองนำมาตอใชงานแบบเมตริกซเพื่อลดจำนวนการใชงานขาของบอรด Arduino เน่ืองจากหากตอใหง านแบบปกติขาหนง่ึ ของสวิตซจะถกู เช่ือมตอ กับขาของบอรด ซึง่ ตอ งใชง านขาของ บอรด Arduino เปนจำนวนมาก (Wilmshutst, 2007) ดังนั้นในบทนี้แนะนำการนำสวิตซมาตอใช งานแบบเมตรกิ ซ เพือ่ ลดจำนวนของการใชงานขาบนบอรด 1. อปุ กรณรบั ขอมูลแบบเมตริกซ อุปกรณรับขอมูลแบบเมตริกซ หรือที่นิยมเรียกวา Keypad คือ วงจรที่เกิดจากการนำสวิตซ จำนวนมากมาเรียงกันตามแนวแถว และคอลมั น ลกั ษณะคลา ยกบั แอลอีดีแบบเมตรกิ ซ คอื จะมีการใช สายสัญญาณรวมกันทั้งตามแนวแถว และคอลัมนทำใหจำนวนสายสัญญาณที่จะนำไปเชื่อมตอกับขา ของบอรด Arduino ลดลง (Borowik, 2011 โดยจำนวนสายสัญญาณทั้งหมดที่จำเปนตองนำมาใช สำหรับเชื่อมตอกับขาของบอรดคือ r + c แตมีจำนวนสวิตซไดสูงสุดคือ r x c เมื่อ r แทนจำนวนแถว และ c แทนจำนวนคอลัมน รปู ที่ 8.1 อปุ กรณรับขอมลู แบบเมตรกิ ซแบบ 4x4 ท่ีมา: ผูเขยี น

192 รูปที่ 8.2 ตัวอยางและโครงสรางของอปุ กรณรบั ขอมูลแบบเมตริกซขนาด 4x3 ที่มา: ทีมงานสมารทเลริ นนงิ่ , 2555 รูปที่ 8.2 แสดงตัวอยางและโครงสรางของอุปกรณรับขอมูลแบบเมตริกซขนาด 4x3 ซ่ึง สังเกตไดวาสวิตซที่ตอในแถว หรือคอลัมนเดียวกัน จะมีการตอใชงานขาสัญญาณรวมกัน 1 ขา สำหรับหลักการเขียนโปรแกรมเพื่อ ควบคุมอุปกรณรับขอมูลแบบเมตริกซจะคลายกับการควบคุม แอลอีดีแบบเมตริกซค ือ สามารถควบคุมการทำงานของสวิตซไดครัง้ ละ 1 แถว (หรือคอลัมน) โดยจะ เปล่ยี นไปควบคุมแถว (หรือ คอลมั น) ถดั ไปเมื่อหมดชว งเวลาของการควบคุมที่ต้ังไว โดยทีก่ ารกำหนด ชว งของการหนว งเวลาไมค วรสูงเกนิ ไป (อภชิ าติ ภูพลับ, 2552) เนือ่ งจากจะสง ผลใหโ ปรแกรมติดอยูท่ี การหนว งเวลาดังกลาว และไมส ามารถตรวจจบั การกดสวติ ซได รูปที่ 8.3 อปุ กรณรับขอมลู แบบเมตรกิ ซขนาด 4x3 ในโปรแกรม Proteus ท่ีมา: ผเู ขียน

193 รูปที่ 8.3 แสดงตัวอยางของอุปกรณรับขอมูลแบบเมตริกซขนาด 4x3 ในโปรแกรม Proteus ซ่ึงนอกเหนอื จากขนาด 4x3 แลว ในโปรแกรม Proteus ยงั มีอปุ กรณร บั ขอมูลแบบเมตริกซใหเลือกใช งานอีก 2 ขนาดคือขนาด 4x4 และ 4x6 โดยสามารถเลือกใชง านไดโ ดยใชค ำคน “keypad” รูปท่ี 8.4 รายการอุปกรณร ับขอ มูลแบบเมตริกซท้งั หมดในโปรแกรม Proteus ที่มา: ผูเขียน 2. ไลบรารีสำหรับอุปกรณร บั ขอมลู แบบเมตริกซ เพ่อื ใหงา ยตอ การใชงานจงึ มีกลมุ นักพฒั นาระบบไดพฒั นาไลบรารสี ำหรบั การควบคมุ อุปกรณ รบั ขอ มลู แบบเมตริกซโดยการตง้ั คา และการใชงานเปน ดังน้ี 2.1 การดาวโหลดและต้ังคา การใชงานอปุ กรณร ับขอมูลแบบเมตริกซ ในหัวขอนี้จะกลาวถึงแหลงดาวโหลด และการตั้งคาสำหรับใชงานไลบรารีสำหรับควบคุม อุปกรณร ับขอมลู แบบเมตริกซ โดยมลี ำดบั ขั้นตอนเปน ดังนี้ ลำดับที่ 1: ดาวโหลดไลบรารีโดยเขาไปท่ี “http://playground.arduino.cc/Code/ Keypad” และคนหาไฟลชอ่ื keypad.zip รปู ที่ 8.5 ดาวโหลดไลบรารีสำหรับอุปกรณรับขอมลู แบบเมตริกซ ท่ีมา: ผูเขยี น

194 ลำดับที่ 2: แตกไฟล “keypad.zip” จะพบโฟลเดอรชื่อ “Keypad” โดยใหนำโฟลเดอร ดังกลาวน้ไี ปเก็บไวที่ “arduino\\libraries” ลำดับที่ 3: เพิ่มไฟลไปยัง Arduino IDE เปด โปรแกรม Arduino IDE เลอื ก Sketch -> Add file -> Keypad และเม่อื สังเกตที่ Sketch -> Include Libraly จะพบไลบรารชี ื่อ “Keypad” ซึ่งคือ ไลบรารีสำหรบั ควบคุมอุปกรณรบั ขอมูลแบบเมตริกซ รปู ท่ี 8.6 ไลบรารสี ำหรับอปุ กรณรับขอมูลแบบเมตรกิ ซ ทมี่ า: ผูเขยี น ลำดับที่ 4: กรณีที่ผูใชงานตอ งการใชงานไลบรารีของ keypad ใหเขาในสวนของ editor ได โดยเลอื กที่ Sketch -> Include Library -> Keypad ซึ่งจะมกี ารประกาศไฟลส วนหวั (Header File) ของไลบรารดี ังกลา วที่สวนบนสดุ ของโปรแกรม รปู ที่ 8.7 การประกาศไฟลสวนหัวไลบรารสี ำหรบั อปุ กรณร ับขอ มลู แบบเมตริกซ ท่ีมา: ผูเขยี น

195 2.2 คำสั่งทส่ี ำคญั ในไลบรารสี ำหรับอปุ กรณร ับขอมลู แบบเมตรกิ ซ หัวขอนี้จะกลาวถึงวิธีการควบคุมอุปกรณรับขอมูลแบบเมริกซโดยการสรางออปเจคและ เรยี กใชงานฟง กชนั ภายในไลบรารี ทส่ี ำคัญดงั น้ี 1. การสรา งออปเจคสำหรบั คลาส Keypad กอ นทจี่ ะควบคมุ อุปกรณร บั ขอ มลู แบบเมตริกซจำเปนตองสรา งอ็อบเจคสำหรับคลาส Keypad ข้ึนมาใชง านเสียกอ น (เดชฤทธิ์ มณธี รรม, 2559) โดยมรี ปู แบบการใชงานเปนดงั น้ี รูปแบบ Keypad ชื่อตวั แปร (ออ็ บเจค) = Keypad(makeKeymap(keys), int[] rowPins, int[] colPins, int ROWS, int COLS ) ความหมาย เปน คำส่งั ท่ใี ชในการกำหนดใหตำแหนงของตวั อกั ษรของตวั แปร keys ท่เี ปน ตวั แปรแบบ อารเรยมีคาตรงกับตำแหนงของ keypad ที่ถูกเชื่อมตอกับบอรด Arduino โดยตองสรางอ็อบเจค สำหรบั คลาส Keypad เพื่อเก็บคา ดงั กลาว พารามเิ ตอร 1.1 makeKeymap(keys) คือสั่งใหตัวแปร keys ซึ่งเก็บชื่อตัวอักษรของแตละตำแหนง มีคา ตรงตามแถวและคอลัมนข อง keypad 1.2 rowPins คือ ตำแหนง ขาของบอรด Arduino ทีเ่ ชื่อมตอกับแถวของ keypad ทง้ั หมด 1.3 colPins คือ ตำแหนงขาของบอรด Arduino ท่ีเชือ่ มตอกบั คอลมั นข อง keypad ท้งั หมด 1.4 ROWs คอื จำนวนแถวของ keypad 1.5 Cols คอื จำนวนคอลัมนข อง keypad จากรูปที่ 8.8 แสดงตัวอยางการทดลองใชงานอุปกรณรับขอมูลแบบเมตริกซดวยวิธีการ เรียกใชงานไลบรารี โดยจากรูปเปนการกำหนดให keypad ขนาด 4 แถว x 3 คอลัมนมีการเชื่อมตอ แถวที่ 1-4 ที่ขา 0 – 3 ของบอรด Arduino และมีการเชื่อมตอคอลัมนที่ขา 4 – 6 ของบอรด Arduino โดยมตี ำแหนงตวั อักษรท่เี ปน ตัวแทนดงั ตาราง 8.1

196 char keys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'#','0','*'} }; byte rowPins[ROWS] = { 0, 1, 2, 3}; byte colPins[COLS] = { 4, 5, 6 }; Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, 4, 3 ); รปู ท่ี 8.8 ตัวอยางการประกาศใชงานไลบรารสี ำหรบั อปุ กรณร ับขอมูลแบบเมตริกซ ทีม่ า: ผูเขยี น ตารางท่ี 8.1 แสดงตัวอยางการแทนคาสำหรับแตล ะตำแหนงของแถวและคอลัมนส ำหรับตวั แปร keys ซ่งึ เปน ตัวแปรชนดิ อารเรยแบบ 2 มิติ ดังรูปท่ี 8.8 ตัวอยางเชน แถวที่ 1 คอลัมนท ี่ 1 เก็บ คา “1” หรือ แถวที่ 4 คอลมั นท ่ี 3 เก็บคา “*” เปนตน ตารางที่ 8.1 การอางอิงคาตัวอักษรตามตำแหนง แถวและคอลัมนจ ากตวั อยา งรปู ท่ี 8.8 แถวที่ คอลัมนท ี่ ตวั อกั ษร 11 1 12 2 13 3 21 4 22 5 23 6 31 7 32 8 33 9 41 # 42 0 43 *

197 2. การใชใ ชงานฟง กชัน getKey() ฟงกชัน getKey() คือฟงกชันที่รับคาจากอุปกรณรับคาแบบเมตริกซ และมีการคืนคา เปนชนิดขอมูลแบบ char ดังนั้นจึงตองสรางตัวแปรที่มีชนิดขอมูลเปน char ขึ้นมาสำหรับรับคาจาก ฟงกชันดังกลาวโดยคาที่สงคนื จะขึ้นอยูกับ keys ซึ่งถูกจัดตำแหนงจากฟงกช นั makeKeymap ที่จะ ทำการจัดเรียงตำแหนงสวิตซแตละตำแหนงของอุปกรณรับคาแบบเมตริกซใหตรงกับตำแหนงของ ออ็ บเจค keys เพอื่ ท่ีจะนำตัวแปรดังกลา วไปสรา งเปนเงอื่ นไขเพื่อควบคุมอุปกรณเอาตพตุ ตางๆ รปู แบบ char ชอ่ื ตวั แปร = ช่ือออ็ บเจค.getkey(); ความหมาย เปนคำสั่งทีใ่ ชสำหรับการคืนคาตัวอักษรทีต่ รงกับตำแหนงการกดของอุปกรณร บั คาแบบ เมตริกซ อยางไรก็ตามเนื่องจาก getkey() เปนฟงกชันของคลาส Keypad ดังน้ันการเรียกใชงานตอ ง เรียกผา นอ็อบเจคของ Keypad ตัวอยา งที่ 8.1 การทดลองการใชงานอปุ กรณร ับขอมูลแบบเมตริกซเพื่อควบคมุ หลอแอลอีดี การทำงาน: กด “*” ใหหลอดแอลอีดีมาถานะ “ติด” และกด “#” เพ่ือใหหลอดแอลอดี ีมีสถานะ “ดับ” วิธีทำ 1. สวนวงจรทดลอง รปู ท่ี 8.9 วงจรทดลองการทดลองควบคมุ อุปกรณร ับขอมลู แบบเมตรกิ ซ ที่มา: ผเู ขียน

198 คำอธิบาย: ตออุปกรณรับขอมูลแบบเมตริกซ โดยแถวที่ 1 – 4 กับขา 0 – 3 ของบอรด Arduino และคอลัมนท ี่ 1 – 3 เขากับขาที่ 4 – 6 ของบอรด และตอ หลอดแอลอดี ีเขากบั ขาท่ี 13 ของบอรด 2. สว นโปรแกรม #include <Keypad.h> const byte ROWS = 4; const byte COLS = 3; char keys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; byte rowPins[ROWS] = { 0, 1, 2, 3}; byte colPins[COLS] = { 4, 5, 6 }; Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); #define ledpin 13 void setup() { pinMode(ledpin, OUTPUT); } void loop() { char key = kpd.getKey(); if(key) { switch (key) { case '*': digitalWrite(ledpin, LOW); break; case '#': digitalWrite(ledpin, HIGH); break; } } }

199 คำอธิบาย: จากโจทยเ น่อื งจากกำหนดขาแนวแถวใหอ ปุ กรณร ับขอมลู แบบเมตริกซ ตรงกับตำแหนง 0 – 3 ของบอรด Arduino และแนวคอลัมนตรงกับตำแหนง 4 – 6 ของบอรด Arduino ซึ่งตรงกับ ตำแหนง อางองิ กบั ตวั อยา งการใชง านในรปู ที่ 8.8 จงึ สามารถอางอิงการกดสวิตซไ ดต ามตาราง 8.1 ฟงกชัน Setup(): กำหนดใหตำแหนงขาที่ 13 ของบอรดซึ่งตออยูกับหลอดแอลอีดีมีโหมด การทำงานเปน เอาตพ ุต ฟงกชัน loop(): มีการตรวจสอบการกดสวิตซที่อยูบนอุปกรณรับขอมูลแบบเมตริกซ โดย หากกด “#” หลอดแอลอดี ีจะมสี ถานะ “ติด” แตห ากกด “*” หลอดแอลอดี ีจะดับ โดยสวติ ซอนื่ ๆ ไม มีผลตอ การทำงาน เนือ่ งจากไมไดมีคำสั่งควบคมุ 3. ผลการทดลอง (กรณกี ด “#”) รปู ท่ี 8.10 ผลการทดลองการทดลองควบคมุ อุปกรณรบั ขอ มลู แบบเมตริกซเ มื่อกด “*” ที่มา: ผเู ขียน ผลการทดลอง (กรณกี ด “*”) รปู ท่ี 8.11 ผลการทดลองการทดลองควบคุมอุปกรณรับขอมลู แบบเมตริกซเมื่อกด “#” ท่ีมา: ผเู ขียน

200 ตวั อยางท่ี 8.2 การทดลองควบคมุ อปุ กรณรับขอมลู แบบเมตรกิ ซควบคุมหลอดแอลอีดี 4 หลอดแบบ เลขฐานสอง การทำงาน: รูปแบบการตดิ ของหลอดแอลอดี ีเปนเลขฐานสองท่ีตรงกับตัวอักษรเลขฐานสิบของสวิตซ แตละตัวบน อปุ กรณรบั ขอมูลแบบเมตรกิ ซ ดังนี้ ตำแหนง รปู แบบการแสดงผลของหลอดแอลอีดี สวติ ซ led4 led3 led2 led1 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 อ่ืน ๆ 0000 วธิ ีทำ 1. สวนวงจรทดลอง รูปท่ี 8.12 วงจรทดลองการทดลองอุปกรณร ับขอ มลู แบบเมตริกซ ควบคมุ หลอดแอลอดี ี 4 หลอดแบบเลขฐานสอง ทีม่ า: ผูเขยี น

201 คำอธิบาย: ตอ อุปกรณร ับขอ มลู แบบเมตริกซโ ดยแถวท่ี 1 – 4 กับขา 0 – 3 ของบอรด Arduino และ คอลัมนที่ 1 – 3 เขากับขาที่ 4 – 6 ของบอรด และตอหลอดแอลอีดี 4 ดวงเขากับขาที่ 10 - 13 ของ บอรด 2. สวนโปรแกรม #include <Keypad.h> const byte ROWS = 4; const byte COLS = 3; const byte led1 = 13; const byte led2 = 12; const byte led3 = 11; const byte led4 = 10; char keys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'#','0','*'} }; byte rowPins[ROWS] = { 0, 1, 2, 3}; byte colPins[COLS] = { 4, 5, 6 }; Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); #define ledpin 13 void setup() { pinMode(led1,OUTPUT); pinMode(led2,OUTPUT); pinMode(led3,OUTPUT); pinMode(led4,OUTPUT); } void loop() { char key = kpd.getKey(); if(key) { switch (key) { case '0': digitalWrite(led1, LOW);

202 digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); break; case '1': digitalWrite(led1, HIGH); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); break; case '2': digitalWrite(led1, LOW); digitalWrite(led2, HIGH); digitalWrite(led3, LOW); digitalWrite(led4, LOW); break; case '3': digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, LOW); digitalWrite(led4, LOW); break; case '4': digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, HIGH); digitalWrite(led4, LOW); break; case '5': digitalWrite(led1, HIGH); digitalWrite(led2, LOW); digitalWrite(led3, HIGH); digitalWrite(led4, LOW); break; case '6': digitalWrite(led1, LOW); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, LOW); break; case '7':

203 digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, LOW); break; case '8': digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, HIGH); break; case '9': digitalWrite(led1, HIGH); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, HIGH); break; default: digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); } } } คำอธิบาย: จากโจทยเ นอ่ื งจากกำหนดขาแนวแถวใหอปุ กรณรับขอมูลแบบเมตริกซต รงกบั ตำแหนง 0 – 3 ของบอรด Arduino และแนวคอลมั นต รงกับตำแหนง 4 – 6 ของบอรด ซ่ึงตรงกบั ตำแหนงอางอิง กบั ตวั อยา งการใชงานในรูปท่ี 8.8 ดงั นั้นจงึ สามารถอา งอิงการกดสวิตซไ ดตามตาราง 8.1 ฟงกชัน Setup(): กำหนดใหตำแหนง ขาที่ 10 - 13 ของบอรด Arduino ซึ่งตออยูกบั หลอด แอลอดี อี ยูในโหมดเอาตพ ุต ฟงกชัน loop(): มีการตรวจสอบการกดสวิตซที่อยูบนอุปกรณรับขอมูลแบบเมตริกซโดย หากกดตวั เลขบนสวติ ซใ ด หลอดแอลอีดจี ะแสดงคาเลขฐานสองของตัวอกั ษรดังกลา ว

204 3. การประยกุ ตใชอุปกรณร บั ขอมลู แบบเมตรกิ ซส ำหรับควบคุมแอลอดี ี 7 สวน หัวขอนี้จะกลาวถึงตัวอยางการนำอุปกรณรับขอมูลแบบเมตริกซมาเปนเงื่อนไขสำหรับ ควบคมุ แอลอดี ี 7 สว น (Adith, 2015) ดังน้ี ตัวอยางท่ี 8.3 การทดลองประยกุ ตใ ชอุปกรณรับขอมูลแบบเมตริกซส ำหรบั ควบคุมแอลอดี ี 7 สวน การทำงาน: กดสวติ ซท ่ีถูกแทนดวยตวั เลขใด (0 - 9 ใหแสดงรปู แบบของตวั เลขดังกลาวผานแอลอดี ี 7 สว น โดยหากกด “*” หรอื “#” ใหเปน การเคลยี รเ ปน สถานะ “ดับ” ของแอลอีดี 7 สวนทั้งหมด วิธีทำ 1. สว นวงจรทดลอง รปู ท่ี 8.13 วงจรทดลองการทดลองอปุ กรณร บั ขอมลู แบบเมตรกิ ซ ควบคุมแอลอีดี 7 สว น ทมี่ า: ผเู ขยี น คำอธิบาย: ตำแหนงการเชื่อมตออุปกรณรับขอมูลแบบเมตริกซ แอลอีดี 7 สวนและบอรด Arduino เปนดังตารางตอ ไปนี้

205 ตำแหนง ขา ตำแหนงขา ตำแหนงขา (Arduino) อุปกรณรบั ขอมูลแบบ แอลอดี ี 7สว น 0 เมตรกิ ซ - 1 แถวที่ 1 - 2 แถวท่ี 2 - 3 แถวท่ี 3 - 4 แถวที่ 4 - 5 คอลมั นท ี่ 1 - 6 คอลมั นท ี่ 2 - 7 คอลมั นท่ี 3 a 8 b 9 - c 10 - d 11 - e 12 - f 13 - g - - 2. สวนโปรแกรม #include <Keypad.h> const byte ROWS = 4; const byte COLS = 3; char keys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; byte rowPins[ROWS] = { 0, 1, 2, 3}; byte colPins[COLS] = { 4, 5, 6 }; Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); #define a 7 #define b 8

206 #define c 9 #define d 10 #define e 11 #define f 12 #define g 13 void setup() { pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); } void loop() { char key = kpd.getKey(); if(key) { switch (key) { case '0': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW); break; case '1': digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case '2':

207 digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; case '3': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; case '4': digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '5': digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '6': digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH);

208 digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '7': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case '8': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '9': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '#': digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case '*': digitalWrite(a, LOW);

209 digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; } } } คำอธิบาย: จากโจทยกำหนดตำแหนงขาการเชื่อมตอระหวางบอรด Arduino และอุปกรณรับขอมูล แบบเมตริกซเ ปนดงั รูปท่ี 8.8 ดังนน้ั จึงสามารถอา งอิงคาจากการกดสวิตซไดต ามตาราง 8.1 ฟงกชัน Setup(): กำหนดใหตำแหนงขาที่ 7 - 13 ของบอรด Arduino ซึ่งตออยูกับหลอด แอลอดี ีอยใู นโหมดของเอาตพตุ ฟงกชัน loop(): มีการตรวจสอบการกดสวิตซที่อยูบนอุปกรณรับขอมูลแบบเมตริกซโดย หากกดบนสวติ ซท ่ีมตี วั เลขใด แอลอีดี 7 สวนจะแสดงผลลัพธในรูปแบบของตัวเลขดงั กลาว แตหากกด “*” หรอื “#” จะเปนการเคลยี รสถานะแอลอดี ี 7 สวน 4. บทสรุป อุปกรณรับขอมูลแบบเมตรกิ ซ หรือที่นิยมเรียกวา Keypad คือ วงจรที่เกิดจากการนำสวิตซ จำนวนมากมาเรียงกันตามแนวแถว และคอลมั น ลกั ษณะคลา ยกับแอลอดี แี บบเมตรกิ ซ คือจะมีการใช สายสัญญาณรวมกันทั้งตามแนวแถว และคอลัมนทำใหจำนวนสายสัญญาณที่จะนำไปเชื่อมตอกับขา ของวงจรทดลองลดลง โดยจำนวนสายสัญญาณทั้งหมดที่จำเปนตองนำมาใชสำหรับเชื่อมตอกับขา ของบอรด Arduino คือ จำนวนแถว + จำนวนคอลัมน แตมีจำนวนสวิตซไดสูงสุดคือ จำนวนแถว x จำนวนคอลมั น ตอไดมีกลุมนักพัฒนาไดพัฒนาไลบรารีสำหรับการ ควบคุมอุปกรณรับขอมูลแบบเมตริกซ เพือ่ ใหงา ยตอการใชงาน โดยกอนการใชง านจำเปนตองดาวโหลดไลบรารีมาเสียกอน และหลังจากน้ัน จึงสามารถเรียกใชงานฟงกชันตางๆ ที่สำคัญและจำเปนสำหรับควบคุมการทำงานอุปกรณรับขอมูล แบบเมตริกซได

210 แบบฝกหดั ทา ยบท บทที่ 8 1. Keypad คอื อะไร 2. Keypad ตัวหนึ่งถูกเชื่อมตัวกับบอรด Arduino ซึ่งใชสายสัญญาณทั้งหมด 9 เสน จงหาจำนวน สวิตซทสี่ ามารถใชงานไดส งู สดุ 3. ฟงกช ัน getkey() มีประโยชนอยางไร 4. หากจำเปนตองใชงานสวิตซจำนวน 6 ตัวจงหาวิธีการตอใชงานสวิตซเพื่อใหประหยัดจำนวนขาที่ บอรดใหมากท่สี ุด 5. จงตัวอยา งที่ 8.1 จงปรับเปลย่ี นคำสง่ั ใหมโ ดยใช if – else if – else แทน switch case

211 เอกสารอา งองิ เดชฤทธิ์ มณีธรรม. (2559). คัมภีรการใชงาน ไมโครคอนโทรลเลอร Arduino. กรุงเทพฯ: ซีเอ็ด ยเู คชั่น. ทีมงานสมารทเลิรนนิ่ง. (2555). เรียนรูไมโครคอนโทรลเลอร MCS-51 ดวยภาษา C. กรุงเทพฯ: สมารท เลิรนนง่ิ . อภชิ าติ ภพู ลับ. (2552). เขยี นโปรแกรมควบคุม Microcontroller ดวยภาษา C, Assembly และ VB. กรงุ เทพฯ: บรษิ ัท ไอดซี ี อินโฟ ดสิ ทริบวิ เตอร เซ็นเตอร จำกัด. Adith, J. B. (2015). Arduino by Example. Birmingham: Packt Publishing Ltd. Borowik, B. (2011). Interfacing PIC Microcontrollers to Peripherial Devices. United States: Springer Dordrecht. Wilmshutst, T. (2007). Designing Embeded Systems with PIC Microcontrollers Principles and Application. United Kingdom: Newnes.

แผนบริหารการสอนประจำบทที่ 9 การควบคุมแอลซีดี หัวขอเน้ือหา 1. แอลซดี ี 2. การควบคมุ แอลซีดีโหมด 8 บิต 2.1 การเขยี นเพ่ือควบคุมการทำงานแอลซดี ี 2.2 การเขียนเพือ่ กำหนดการแสดงผลบนแอลซีดี 3. การควบคุมแอลซีดโี หมด 4 บติ 3.1 ไลบรารี LiquidCrystal 3.2 ฟงกชนั LiquidCrystal() 3.3 ฟง กช นั begin() 3.4 ฟง กช นั print() 3.5 ฟงกช ัน setCursor() 3.6 ฟง กช ัน cursor() 3.7 ฟงกชัน noCursor() 3.8 ฟง กช นั blink() 3.9 ฟงกช นั noBlink() 3.10 ฟง กชนั clear() 3.11 ฟง กชัน home() 3.12 ฟง กช ัน leftToRight() 3.13 ฟง กช ัน rightToLeft() 4. บทสรุป แบบฝกหัดทา ยบท เอกสารอา งองิ

214 วตั ถุประสงคเชิงพฤติกรรม เมอื่ ผเู รยี น เรยี นจบบทนแ้ี ลว ผเู รยี นควรมีความสามารถ ดังนี้ 1. อธิบายเกยี่ วกับแอลซีดีได 2. อธิบายเกี่ยวกับการควบคุมแอลซดี ีแบบ 8 บิต และ 4 บิตได 3. เขยี นโปรแกรมการเพ่ือควบคุมการทำงานแอลซดี ที ั้งแบบโหมด 8 บติ และโหมด 4 บิตได 4. มีความตัง้ ใจในการเรียนและการฝก ปฏบิ ตั กิ ารเขยี นโปรแกรม วิธีการสอนและกิจกรรมการเรียนการสอนประจำบท 1. บรรยายเนื้อหาในแตละหัวขอ พรอมยกตัวอยางประกอบ โดยใชเอกสารคำสอน และสื่อ power point 2. ทดลองปฏิบัติจริง โดยการเขียนโปรแกรม Arduino เพื่อควบคุมแอลซีดีทั้งแบบการ ออกแบบคำสง่ั เอง และแบบโดยการเรยี กใชง านไลบรารี ผา นโปรแกรม Proteus 3. ผูส อนสรปุ เนื้อหา 4. ทำแบบฝกหดั เพื่อทบทวนบทเรียน 5. เปด โอกาสใหผ ูเ รียนถามขอสงสัย 6. ผสู อนทำการซักถาม สื่อการเรยี นการสอน 1. เอกสารคำสอนวชิ าการประยุกตใชงานไมโครคอนโทรลเลอร 2. สอ่ื power point การวัดผลและการประเมนิ 1. การเขา เรยี นตรงตอเวลา และการแตง กาย 2. ความรว มมือและความรบั ผดิ ชอบตอ การเรยี น 3. การถาม-ตอบ 4. การสง งานที่ไดรบั มอบหมายภายในเวลาที่กำหนด 5. การทำแบบฝกหัดที่มีความถูกตอ งไมน อ ยกวา 80%

บทที่ 9 การควบคุมแอลซีดี ในบทนี้จะกลาวถึงอุปกรณที่ใชสำหรับแสดงผลในรูปแบบตัวอักษร ตัวเลข หรือสัญลักษณ อื่นๆ อีกชนิดหนึ่งที่สามารถแสดงตัวอักษรไดจำนวนหลายตัวอักษรโดยใชสายสัญญาณเพียงไมกี่เสน อุปกรณดงั กลาวคือแอลซีดี (Adith, 2015 นอกเหนือจากน้ันในโปรแกรม Arduino IDE ยังมีไลบรารี ที่ใชส ำหรับการควบคมุ การทำงานของแอลซดี ีทจี่ ะชว ยใหก ารส่งั งานแอลซีดีทำไดงายมากยิ่งขน้ึ 1. แอลซดี ี แอลซดี ี (LCD ยอมาจาก Liquid Crystal Display คืออปุ กรณท่ีใชส ำหรับแสดงผลตัวอักษร ตัวเลข และภาพกราฟฟกอยางงาย (ดอนสัน ปงผาบ และทิพวัลย คำน้ำนอง, 2557) โดยแอลซีดีเปน อุปกรณที่ใชสายสัญญาณนอย แตสามารถแสดงตัวอักษรไดเปนจำนวนมากเมื่อเปรียบเทียบกับ แอลอีดีแบบเมตริกซ อยางไรก็ตามหากเปรียบเทียบความสวยความในสวนการแสดงผลจะแตกตาง จากแอลอีดีแบบเมตริกซที่มีความสวยงามสูงกวามากเนื่องจากผูพัฒนาสามารถออกแบบรูปแบบ ตัวอักษรเพื่อแสดงผลที่แอลอีดีแบบเมตริกซไดเองตามตองการโดยเฉพาะอยางยิ่งกรณีที่มีหลอด แอลอีดีจำนวนมาก ดังนั้นแอลซีดีจึงนิยมถูกนำมาใชสำหรับแสดงผลการทดลองที่ไมตองการความ สวยงามเทานั้น เชนแสดงผลการอานคาจากเซ็นเซอร แจงสถานะของโหมดการทำงานตางๆ เปนตน ตัวอยางของอปุ กรณทมี่ กี ารใชง านแอลซีดี เชน เครือ่ งคิดเลข โทรศพั ท เปนตน รูปท่ี 9.1 แอลซดี บี นเคร่ืองคิดเลข ทม่ี า: ผเู ขียน

216 รปู ท่ี 9.2 แอลซีดบี นโทรศพั ทมอื ถือ ทีม่ า: ผูเขียน รูปที่ 9.1 และ 9.2 แสดงการนำแอลซีดีไปประยุกตใชงานบนเครื่องคิดเลข และโทรศัพท สำหรบั การแสดงผลการทำงานแกผใู ชงาน รูปที่ 9.3 แอลซดี ี ท่ีมา: ผูเ ขยี น รูปที่ 9.3 แสดงตวั อยางแอลซดี ที สี่ ามารถแสดงผลได 2 บรรทดั ซึ่งนอกจากนแ้ี ลวยังมีแอลซีดี ขนาดอื่นๆ ใหเลือกใชงานเชน แอลซีดีแบบ 1 บรรทัด หรือ แอลซีดีแบบ 4 บรรทัด เปนตน โดย ผใู ชงานสามารถเลอื กใชง านไดตามความเหมาะสม

217 รปู ท่ี 9.4 แอลซดี ีในโปรแกรม Proteus ท่ีมา: ผูเ ขยี น รูปที่ 9.4 แสดงตัวอยางของแอลซีดีในโปรแกรม Proteus ซึ่งจากตัวอยางมีขนาดการ แสดงผลคอื 2 แถว แถวละ 16 ตวั อักษร (16 x 2 นอกเหนอื จากขนาดดังกลา ว ในโปรแกรม Proteus ยงั มีแอลซดี ีขนาดอนื่ ๆ ใหเ ลือกใชง านโดยใชคำคนทข่ี ้ึนตนดวย “LM” รูปที่ 9.5 รายการแอลซีดีทง้ั หมดในโปรแกรม Proteus ทม่ี า: ผเู ขียน ตารางที่ 9.1 แสดงตำแหนงขาและความหมายของแอลซีดี (Davis II, 2013) โดยพิจารณา จากรูปที่ 9.4 โดยการสงขอมูลไปยังสายสัญญาณ D0 – D7 ซึ่งมีขนาด 8 บิตสามารถทำได 2 วิธีคือ การสง ขอ มลู จากบอรด Arduino ไปยงั แอลซีดี 4 บิต (โหมด 4 บิต) ซึ่งจะใชส ายสญั ญาณเพียง 4 เสน ระหวางบอรดและขาสัญญาณที่ตำแหนง D4 – D7 และการสงขอมูลจากบอรด Arduino ไปยังแอล ซีดี 8 บติ (โหมด 8 บิต) ซ่งึ จำเปนตองใชส ายสัญญาณท้ังหมด 8 เสน สำหรบั วิธีการควบคุมการทำงาน จะคลายคลึงกันเพียงแตจะมีความแตกตางกันตรงที่โหมด 8 บิตจะรับ-สงขอมูลไดเร็วกวา 4 บิต อยางไรก็ตามถึงแมจะรับ-สงขอมูลไดเร็วกวาโหมด 4 บิต แตจากความเร็วในการรับสงที่แตกตางกัน

218 ไมมาก และโหมด 4 บิตยังคงสามารถแสดงผลไดทันจากการสังเกตดวยสายตามนุษย ดังนั้นโหมด 4 บิตท่ีซง่ึ ใชสายสญั าณนอยกวา จงึ เปนที่นิยมมากกวา ตารางที่ 9.1 ตำแหนงขา และความหมายของแอลซดี ี ตำแหนงขา สัญลักษณ รายละเอียด 1 VSS ขากราวด 2 VCC ขาไฟเลย่ี ง 5 โวลต 3 VEE ขาปรบั ความสวา งของหนาจอ 4 RS ขาสำหรับรับขอมูลเพื่อแสดงผล หรือควบคุมการทำงานของ แอลซีดี 5 R/W ขาสำหรับอาน/เขียนขอมูลแอลซีดี 6 E ขาสัญญาณอนี าเบลิ สำหรบั รบั สญั ญาณนากิ า 7 D0 ขาสำหรับรบั -สงขอ มลู 8 D1 ขาสำหรับรับ-สงขอ มลู 9 D2 ขาสำหรับรับ-สง ขอมูล 10 D3 ขาสำหรบั รับ-สง ขอมูล 11 D4 ขาสำหรับรับ-สงขอ มลู 12 D5 ขาสำหรบั รบั -สงขอ มูล 13 D6 ขาสำหรบั รบั -สงขอมูล 14 D7 ขาสำหรับรับ-สง ขอมูล นอกเหนอื จากสายสัญญา D0 – D7 แลวยงั มีสายสัญญาณท่ีสำคัญอีก 3 สัญญาณดงั นี้ 1. ขา 4 (RS) คือขาสัญญาณท่ีทำหนาที่รับขอมูลเพื่อแสดงผล หรือรับคำสั่งเพื่อควบคุมการ ทำงานของแอลซดี ีดังนี้ RS = “LOW” คอื รบั คำสั่งเพ่ือควบคุมการทำงานแอลซดี ี RS = “HIGH” คอื รับขอมูลเพื่อแสดงผลผานแอลซีดี สำหรับการคำสั่งเพ่อื ควบคมุ การทำงานของแอลซีดี คอื การควบคุมใหแอลซีดีแสดงผลลัพธท่ี ตรงตามรหสั คำส่ัง เชน การเคลยี รห นาจอแอลซีดี การสง่ั ใหเ คอรเซอรต ิดแบบกระพริบ เปน ตน 2. ขา 5 (R/W) คือขาสัญญาณสำหรับอา น หรอื เขยี นขอ มลู ลงแอลซีดี ดังน้ี

219 R/W = “LOW” คือ เขยี นขอมูลลงแอลซดี ี R/W = “HIGH” คือ อา นขอมลู จากแอลซดี ี โดยหากการใชงานมีเพียงแคควบคุมการแสดงผลผานแอลซีดี (เขียนขอมูลลงแอลซีดี สามารถเชื่อมตอขา 5 ของแอลซีดีลงกราวด ซึ่งจะชวยใหประหยัดการใชงานขาสัญญาณบนบอรด Arduino 3. ขา 6 (E คือขาสัญญาณที่ทำหนาที่รับสัญญาณนาิกาเพื่อใหแอลซีดีทำงานตามคำสั่ง ตางๆ ไดโดยทุกครั้งท่ีสั่งงานแอลซีดีจำเปน ตองสรา งสัญญาณนาิกาที่ขา 6 นี้ดวยเสมอ ตัวอยางการ สรา งสญั ญาณนากิ าทข่ี า 6 ของแอลซดี เี ปนดงั นี้ สมมตขิ า 6 ของแอลซดี ีถูกเช่ือมตอกับขา 11 ของบอรด Arduino การสรา งสัญญาณนาิกา 1 ลูกเปน ดงั นี้ digitalWrite(11, HIGH); delay(10); digitalWrite(11, LOW); delay(10); รปู ที่ 9.6 ตวั อยางการสรา งสัญญาณนาิกาอยา งงายผาน Arduino ที่มา: ผูเขยี น 2. การควบคุมแอลซีดโี หมด 8 บิต การเขยี นขอ มลู ลงแอลซแี บงออกเปน 2 สว นคือการเขียนคำสั่งเพ่ือควบคมุ การทำงานแอลซีดี และการเขียนเพ่ือกำหนดรปู แบบการแสดงผลที่จอแอลซีดี 2.1 การเขยี นเพือ่ ควบคมุ การทำงานแอลซีดี การเขียนเพื่อควบคุมการทำงานแอลซีดีจะตองกำหนดใหขา R/W มีสถานะ “LOW” (การ เขียนขอมูลลงแอลซีดี และ ขา RS มีสถานะ “LOW” (การรับคำสั่งเพื่อควบคุมการทำงานแอลซีดี ซงึ่ มีลำดับการทำงานเปน ดงั น้ี ลำดบั ที่ 1: กำหนดใหขา R/W = 0 ลำดับที่ 2: กำหนดใหข า RS = 0 ลำดับท่ี 3: กำหนดรหัสคำส่งั ขนาด 8 บิตท่ขี า D0 – D7 ลำดับที่ 4: สรางสัญญาณนากิ าที่ขา E

220 โดยตารางที่ 9.2 แสดงตัวอยางของรหัสคำสั่งขนาด 8 บิต และความหมายที่ใชสำหรับ ควบคมุ การทำงานแอลซีดี ตารางท่ี 9.2 ตัวอยา งของรหสั คำส่งั ขนาด 8 บติ และความหมายเพอื่ ควบคุมแอลอดี โี หมด 8 บติ รหสั คำสง่ั ขนาด 8 R/W RS ความหมาย บิต 0x01 0 0 เคลียรห นาจอแอลซดี ี 0x02 0 0 เลื่อนเคอรเ ซอรไ ปยงั ตำแหนงเริม่ ตน 0x04 0 0 กำหนดใหมีการแสดงผล และเลื่อนเคอรเซอรไ ปทางขวา 0x05 0 0 เลอื่ นเคอรเ ซอรไปทางขวา 0x06 0 0 กำหนดใหม ีการแสดงผล และเลอื่ นเคอรเ ซอรไ ปทางซาย 0x07 0 0 เลือ่ นเคอรเ ซอรไ ปทางซา ย 0x08 0 0 ปดโหมดการแสดงผลทั้งขอความและเคอรเซอร 0x0A 0 0 กำหนดใหม ีการแสดงเฉพาะเคอรเ ซอร 0x0C 0 0 กำหนดใหมีการแสดงเฉพาะขอความ 0x0E 0 0 เปด โหมดการแสดงผลทง้ั ขอความและเคอรเซอร 0x0F 0 0 กำหนดใหเคอรเซอรเกดิ การกระพริบ 0x10 0 0 เลื่อนเคอรเ ซอรไปทางซา ย 1 ตำแหนง 0x14 0 0 เลื่อนเคอรเซอรไปทางขวา 1 ตำแหนง 0x18 0 0 เลือ่ นตัวอักษรทมี่ กี ารแสดงใหมไ ปทางซาย 0x1C 0 0 เล่อื นตวั อกั ษรทีม่ ีการแสดงใหมไ ปทางขวา 0x80 0 0 กำหนดใหเริม่ แสดงผลที่บรรทดั บนตำแหนง ซายสุด 0xC0 0 0 กำหนดใหเริ่มแสดงผลท่ีบรรทัดลา งตำแหนง ซายสุด 0x38 0 0 กำหนดใหการแสดงผลแบบ 2 บรรทัดมีความละเอียด 5x7 จดุ

221 2.2 การเขยี นเพ่ือกำหนดการแสดงผลบนแอลซดี ี การเขียนเพื่อกำหนดรูปแบบการแสดงผลบนแอลซีดีจะตองกำหนดใหขา R/W มีสถานะ “LOW” (การเขียนขอมลู ลงแอลซดี ี และ ขา RS มสี ถานะ “HIGH” (การรับคำสงั่ เพอ่ื กำหนดรูปแบบ การแสดงผลบนแอลซดี ี ซงึ่ มลี ำดบั การทำงานเปน ดงั น้ี ลำดับท่ี 1: กำหนดใหข า R/W = 0 ลำดบั ท่ี 2: กำหนดใหข า RS = 1 ลำดบั ที่ 3: กำหนดการแสดงตวั อักขระ 1 ตวั ผา นขา D0 – D7 ลำดับที่ 4: สรางสญั ญาณนากิ าทข่ี า E ตวั อยางที่ 9.1 การแสดงขอความบนแอลซีดโี หมด 8 บิต การทำงาน: แสดงขอ ความ “ARDUINO” บนแอลซดี ี วิธที ำ 1. สวนวงจรทดลอง รปู ท่ี 9.7 วงจรทดลองการแสดงขอ ความบนแอลซดี ี ที่มา: ผูเขยี น คำอธิบาย: ทหี่ ลอดแอลซดี ีมีการกำหนดตำแหนงขาทเ่ี ชื่อมตอ กับบอรด Arduino ดงั น้ี 1. ขา E ของแอลซดี เี ช่ือมตอกบั ตำแหนง ขาท่ี 11 ของบอรด Arduino 2. ขา RS ของแอลซีดีเช่ือมตอกับตำแหนงขาที่ 12 ของบอรด Arduino 3. ขา RW ของแอลซดี เี ช่ือมตอกับกราวด 4. ขา D0 – D7 ของแอลซดี ีเช่ือมตอกับตำแหนง ขาที่ 0 - 7 ของบอรด Arduino ตามลำดับ

222 2. สว นโปรแกรม int E = 11; int RS = 12; void setup() { DDRD = 0xFF; pinMode(E, OUTPUT); pinMode(RS, OUTPUT); digitalWrite(RS, LOW); PORTD = 0x38; enable(); PORTD = 0x01; enable(); PORTD = 0x0E; enable(); PORTD = 0x04; enable(); } void loop() { digitalWrite(RS, LOW); PORTD = 0x01; enable(); digitalWrite(RS, HIGH); PORTD = 'A'; enable(); PORTD = 'R'; enable(); PORTD = 'D'; enable(); PORTD = 'U'; enable(); PORTD = 'I'; enable(); PORTD = 'N'; enable(); PORTD = 'O'; enable(); delay(500); } void enable(){

223 digitalWrite(E, HIGH); delay(5); digitalWrite(E, LOW); delay(5); } คำอธิบาย: มีการกำหนดตวั แปรภายนอกฟงกชนั 2 ตัวแปรคือ E มีคาเปน 11 เพื่อใชแทนการอางอิง ตำแหนง ขา 11 ของบอรด Arduino และ RS มีคา เปน 12 เพ่ือใชอางองิ ตำแหนง ขา 12 ของบอรด ฟงกชัน Setup(): กำหนดให PORTD ซึ่งถูกเชื่อมตอกับ D0 – D7 ขา E และ ขา RS ทำ หนาที่เปนเอาตพุต และกำหนดสถานะเร่ิมตนใหแ อลอีดีทั้งหมด 4 โหมดคือ กำหนดการแสดงผลเปน แบบ 2 บรรทัดความละเอียด 5x7 จุด (0x38) เคลียรหนาจอแอลซีดี (0x01) เปดโหมดการแสดง ขอ ความและเคอรเซอร (0x0E) และ กำหนดใหม ีการแสดงผล และเลือ่ นเคอรเซอรไปทางขวา (0x04) โดยจะตอ งกำหนดสถานะ “HIGH” ทขี่ า RS กอ นที่จะรบั ทงั้ 4 คำสัง่ เพอ่ื ควบคุมการทำงานแอลซดี ี ฟงกชัน loop(): เริ่มการทำงานโดยสั่งเคลียรหนาจอแอลซีดีเพื่อใหทุกครั้งที่โปรแกรมวน กลับมาเริ่มทำงานใหมมีการลางหนาจอเสมอ และหลังจากนั้นเปนชุดคำสั่งแสดงขอความ “ARDUINO” โดยการจะเขาสูโหมดการแสดงผลจำเปนตองกำหนดสถานะ “HIGH” ที่ขา RS กอน เสมอ และคำสั่งการแสดงผลจะสั่งการแสดงผลไดครั้งละ 1 ตวั อกั ษร ดังนน้ั จากตวั อยางมี 7 ตัวอักษร จึงตองมคี ำส่งั แสดงผลทงั้ หมด 7 ครัง้ ฟงกชัน enable(): ฟงกชันสำหรับสรางสัญญาณนาิกา ซึ่งสังเกตไดวาทุกครั้งที่มีการ ควบคุมแอลซีดี (ทง้ั สงั่ ควบคุมและแสดงผล) จำเปน ตอ งเรยี กใชง านฟง กช นั นีห้ ลังเสร็จส้ินคำส่ังเสมอ 3. ผลการทดลอง รูปที่ 9.8 ผลการทดลองการแสดงขอ “ARDUINO” ความบนแอลซดี ี ท่ีมา: ผูเขียน