แผนบรหิ ารการสอนประจำบทที่ 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” ความบนแอลซดี ี ท่ีมา: ผูเขียน
Search
Read the Text Version
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
- 396
- 397
- 398
- 399
- 400
- 401
- 402
- 403
- 404
- 405
- 406
- 407
- 408
- 409
- 410
- 411
- 412
- 413
- 414
- 415
- 416
- 417
- 418
- 419
- 420
- 421
- 422
- 423
- 424
- 425
- 426
- 427
- 428
- 429
- 430
- 431
- 432
- 433
- 434
- 435
- 436
- 437
- 438
- 439
- 440
- 441
- 442
- 443
- 444
- 445
- 446
- 447
- 448
- 449
- 450
- 451
- 452
- 453
- 454
- 455
- 456
- 457
- 458
- 459
- 460
- 461
- 462
- 463
- 464
- 465
- 466
- 467
- 468
- 469
- 470
- 471
- 472
- 473
- 474
- 475
- 476
- 477
- 478
- 479
- 480
- 481
- 482
- 483
- 484
- 485
- 486
- 487
- 488
- 489
- 490
- 491
- 492
- 493
- 494
- 495
- 496
- 497
- 498
- 499
- 500
- 501
- 502
- 503
- 504
- 505
- 506
- 507
- 508
- 509
- 510
- 511
- 512
- 1 - 50
- 51 - 100
- 101 - 150
- 151 - 200
- 201 - 250
- 251 - 300
- 301 - 350
- 351 - 400
- 401 - 450
- 451 - 500
- 501 - 512
Pages: