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 ວິຊາ ไมโครคอนโทรลเลอร์และการประยุกต์

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

Published by lavanh5579, 2021-08-24 08:41:58

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

Search

Read the Text Version

122 pinMode(led2, OUTPUT); } void loop() { digitalWrite(led1, led_status); digitalWrite(led2, led_status = !(led_status)); delay(1000); } คำอธิบาย: มีการกำหนดตัวแปรนอกฟงกชัน 3 ตัวแปรคือ led1 และ led2 เปนตัวแปรแบบจำนวน เต็มสำหรบั เก็บตำแหนงอา งองิ ของ ตำแหนงขา 3 และ 4 ของบอรด Arduino และ led_status เปน ตัวแปรแบบ bool ถูกใชสำหรับเก็บสถานะ ของสัญญาณตำแหนงขาที่ 3 และ 4 ซึ่งมีสถานะที่ แตกตางกนั เสมอ ฟงกชัน Setup(): กำหนดใหตำแหนงขาที่ 3 และ 4 ทำหนา ทเี่ ปน เอาตพ ตุ ฟงกชัน loop(): กำหนดใหตำแหนงขาที่ 3 และ 4 มีสถานะที่แตกตางกันเสมอ เนื่องจาก สถานะของ led2 จะเกิดจากการเปลี่ยนสถานะของ led1 และในทุก ๆ 1 วินาที จะมีการเปลี่ยน สถานะของทั้งสองตำแหนงเสมอ เนื่องจากในรอบการทำงานรอบตอไป led1 จะใชสถานะเดียวกับ led2 ตัวอยา งที่ 4.3 โปรแกรมหลอดแอลอดี ี 8 ดวงตดิ ทลี ะ 1 ดวงเรยี งจากขวาไปซา ย การทำงาน: หลอดแอลอีดี 7 ดวงจะติดทลี ะ 1 ดวงเรียงจากขวาไปซายในทุก ๆ 1 วินาทีเม่อื ตดิ ครบ 8 ดวงแลว จะเร่ิมตดิ ทดี่ วงแรกใหมอ ีกคร้ัง วิธีทำ 1. สว นวงจรทดลอง รูปที่ 4.7 วงจรทดลองหลอดแอลอดี ี 8 ดวงติดทลี ะ 1 ดวงเรียงจากขวาไปซาย ทีม่ า: ผเู ขยี น

123 คำอธิบาย: ตอ หลอดแอลอดี เี ขากบั ตำแหนง ขาท่ี 0 - 7 ของบอรด Arduino 2. สวนโปรแกรม int led[8]; int led_on = 0; void setup() { for(int i =0;i < sizeof(led)/sizeof(int); i++){ led[i] = i; pinMode(led[i], OUTPUT); } } void loop() { for(int i =0;i < sizeof(led)/sizeof(int); i++){ if(i == led_on){ digitalWrite(led[i], HIGH); } else{ digitalWrite(led[i], LOW); } } delay(1000); led_on++; if(led_on == 8){ led_on = 0; } } คำอธิบาย: มกี ารกำหนดตวั แปรนอกฟงกชัน 2 ตวั แปรคือ led เปนตวั แปรแบบอารเ รยสำหรบั อางองิ ตำแหนงขาวงจรทดลองท้ัง 8 ตำแหนง และ led_on ใชสำหรบั กำหนดตำแหนง สำหรับสถานะที่มี แรงดันของตำแหนงขาของวงจรทดลอง ฟงกชัน Setup(): กำหนดใหตำแหนงอารเรยใหตรงกับขาของบอรด Arduino ทั้ง 8 ขาคือ ตำแหนงท่ี 0 – 7 ของอารเ รยจ ะตอ งตรงกับตำแหนงขาท่ี 0 – 7 ตามลำดบั โดยทำหนา ทเี่ ปนเอาตพุต ทั้งหมด ฟงกชัน loop(): เปนการแสดงสถานะของการติดของหลอดแอลอีดีทีละ 1 หลอดเรียงจาก ขวาไปซาย โดยตำแหนงของขาที่ตรงกับคา led_on จะมีการสงสถานะ “HIGH” ไปยังหลอดแอลอีดี

124 แตในตำแหนงอื่น ๆ ทั้งหมดจะไมมีการสงคาสถานะ โดยคา led_on จะมีการเพิ่มขึ้นรอบละ 1 คา และเมือ่ มคี า เปน 8 จะตองกลบั มามคี าเปน 0 เพอื่ ใหหลอดแอลอีดีเรม่ิ แสดงผลใหมทตี่ ำแหนงแรก จากตัวอยางที่ 4.3 สามารถเปลี่ยนการทำงานเปนหลอดแอลอีดี 8 ดวงติดทีละ 1 ดวงเรียง จากซายไปขวาไดโดยไมจำเปนตองมีการเปล่ียนสวนของวงจรทดลอง (วิลาศิณี วิสิทธิก์ าศ และคณะ, 2551) โดยมกี ารเปลยี่ นแปลงคำสงั่ ในสว นของโปรแกรมเพียงเลก็ นอ ยดังน้ี int led[8]; int led_on = 7; void setup() { for(int i =0;i < sizeof(led)/sizeof(int); i++){ led[i] = i; pinMode(led[i], OUTPUT); } } void loop() { for(int i =0;i < sizeof(led)/sizeof(int); i++){ if(i == led_on){ digitalWrite(led[i], HIGH); } else{ digitalWrite(led[i], LOW); } } delay(1000); led_on--; if(led_on == -1){ led_on = 7; } } คำอธิบาย: จากโปรแกรม สังเกตวามีลักษณะคลายกับโปรแกรมหลอดแอลอีดี 8 ดวงติดทีละ 1 ดวง เรยี งจากขวาไปซาย แตกตา งกันเพยี งสวนตัวหนาและขีดเสน ใต ดงั น้ี 1.การกำหนดคาให led_on จะตอ งเริ่มจากคามากทส่ี ดุ (led_on = 7 2.led_on จะตอ งเปนการลดคา 3.กรณที ี่ led_on มีคา เปน -1 จะตองเปลย่ี นคา ใหเ ปน 7 ซ่ึงเปน คา เรมิ่ ตน เพ่อื ใหมกี ารเริม่ ทำงานใหม

125 3. การใชคำส่ังควบคมุ แบบไบต จากหัวขอที่ 1 ใชฟงกชัน digitalWrite() เพื่อเปนคำสั่งควบคุมการทำงานของหลอดแอลอีดี โดย 1 ฟงกชันสามารถควบคุมการทำงานไดเพียง 1 หลอด หรอื เปนการควบคมุ คร้ังละ 1 บิต อยางไร ก็ตามสามารถใชบอรด Arduino สำหรับควบคุมการทำงานคร้ังละ 8 บิต หรอื 1 ไบตได โดยตำแหนง ขาที่ 0 – 7 ของวงจรทดลองคือ PORTD ซึ่งสามารถควบคุมพอรตดังกลาวไดทั้งพอรตพรอมกัน (Adith, 2015) โดยตองกำหนดคำสั่งตางๆ ทส่ี ำคญั เปน ดังนี้ 3.1 การกำหนดโหมดการใชง านของแตละตำแหนง หากตองการใหตำแหนง ขาใดทำหนาที่เปนโหมดเอาตพ ุต ตองกำหนดใหตำแหนงขาดังกลา ว มีคาเปน “1” ในทางกลับกันหากตองการใหขาใดทำหนาที่เปนอินพุตตองกำหนดใหตำแหนงขา ดังกลาวมีคาเปน “0” และเมื่อทราบสถานะของทั้ง 8 ตำแหนงแลวใหแปลงเปนเลขฐานสิบหกและ กำหนดคาให DDRD ตัวอยางเชนสมมติตองการใชงานทั้ง 8 ขา เปนเอาตพุต จะตองกำหนดสถานะ เปน ดังน้ี ตารางที่ 4.1 ตวั อยางการกำหนดโหมดการใชง านให PORTD จำนวน 8 ขา ตำแหนง 7 6 5 4 3 2 1 0 ขา สถานะ 1 1 1 1 1 1 1 1 จากตารางขางตนไดวา 111111112 = FF16 ดงั นน้ั การใชงานตองเขยี นคำสัง่ ตอ ไปนี้ DDRD = 0xFF; 3.2 การกำหนดสถานะของการใชง านเอาตพุตแบบไบต สมมติกำหนด PORTD ทั้ง 8 บิตทำหนาที่เปนเอาตพุต และขั้วแอโนดของหลอดแอลอีดีถูก เช่ือมกบั ขาของ Arduino การกำหนดสถานการณติด – ดับของหลอดแอลอดี ี เปนดงั น้ี หากตองการใหตำแหนงใดมีสถานะ “ติด” ใหกำหนด “1” ที่ตำแหนงขาดังกลาว ในทาง กลบั กันหากตองการใหต ำแหนง ใดมสี ถานะ “ดบั ” ใหก ำหนด “0” ทตี่ ำแหนง ขาดังกลาว ตัวอยางเชน หากตองการใหหลอดแอลอีดีในตำแหนงที่ 1, 4, 5 ,7 มีสถานะติด จะตองกำหนดสถานะใหแตละ ตำแหนง เปน ดังนี้

126 ตารางท่ี 4.2 ตัวอยา งการกำหนดสถานะให PORTD กรณถี กู ใชงานเปนเอาตพตุ ตำแหนง 7 6 5 4 3 2 1 0 ขา สถานะ 1 0 1 1 0 0 1 0 จากตารางท่ี 4.2 ไดวา 101100102 = B216 โดยการใชงานตองเขยี นคำสง่ั ตอไปนี้ PORTD = 0xB2; ตวั อยางที่ 4.4 โปรแกรมหลอดแอลอีดี 8 ดวงตดิ ทลี ะ 1 ดวงเรยี งจากขวาไปซา ย การทำงาน: หลอดแอลอีดี 7 ดวงจะติดทลี ะ 1 ดวงเรยี งจากขวาไปซายในทุก ๆ 1 วินาทีเม่ือตดิ ครบ 8 ดวงแลว จะเริ่มติดที่ดวงแรกใหมอ ีกครงั้ วิธีทำ 1. สว นวงจรทดลอง เชือ่ มตออปุ กรณภ ายนอก เขา กบั บอรด Arduino ดังตวั อยางที่ 4.3 2. สว นโปรแกรม int x = 0x01; void setup() { DDRD = 0xFF; } void loop() { PORTD = x; delay(300); if(x == 0x80){ x = 0x01; } else{ x = x<<1; } } คำอธิบาย: มกี ารกำหนดตัวแปรนอกฟง กชัน 1 ตวั แปรคือ x เปน ตัวแปรสำหรับเกบ็ สถานะของขาทั้ง 8 ขาของ PORTD โดยมีคา เริม่ ตน เปน 0x01 ซึ่งเปนคา ของเลขฐานสิบหก

127 ฟงกชัน Setup(): กำหนดตำแหนงขาทั้งหมดที่อยู PORTD ซึ่งมีทั้งหมด 8 ขาเปนเอาตพุต ทั้งหมด ฟงกชัน loop(): เปนการแสดงสถานะของการติดของหลอดแอลอีดีทีละ 1 หลอดเรียงจาก ขวาไปซาย โดยมีเงื่อนไขในการตรวจสอบคา x ซึ่งหากมีคาเปน 0x80 แสดงวาเปนการแสดงผล รูปแบบสุดทาย (หลอดไฟดวงที่ 8 ไดรับสถานะ “HIGH” เพียงหลอดเดียว) จะกำหนดใหกลับไป เรมิ่ ตน ใหม แตห ากคา x ยงั ไมเ ปน คา ดังกลา วจะใหม กี ารเล่อื นคา x ไปทางซายครง้ั ละ 1 บติ จากตัวอยางที่ 4.4 สามารถเปลี่ยนการทำงานเปนหลอดแอลอีดี 8 ดวงติดทีละ 1 ดวงเรียง จากซา ยไปขวาไดโดยไมจ ำเปนตองมีการเปลี่ยนสว นของบอรด Arduino โดยมีการเปลี่ยนแปลงคำสั่ง ในสวนของโปรแกรมเพียงเลก็ นอยดงั นี้ int x = 0x80; void setup() { DDRD = 0xFF; } void loop() { PORTD = x; delay(300); if(x == 0x01){ x = 0x80; } else{ x = x>>1; } } คำอธิบาย: จากโปรแกรมขางตน สังเกตวามีลักษณะคลายกับโปรแกรมหลอดแอลอีดี 8 ดวงติดทีละ 1 ดวงเรยี งจากขวาไปซาย แตกตางกนั เพียงสวนตัวหนาและขดี เสน ใต ดงั น้ี 1. การกำหนดคา เร่มิ ตน x จะตองเปน 0x80 ซ่ึงเปนรูปแบบที่อยูขวาสุด 2. เงือ่ นไขสดุ ทายคอื x จะตองมีคาเปน 0x01 ซ่ึงเปน รปู แบบทีอ่ ยซู ายสุด 3. การกลับไปเร่มิ รูปแบบเริ่มตนตองเปนคา x = 0x80 4. ตอ งเปลยี่ นจากเล่ือนไปตำแหนงทางซายเปนการเลอ่ื นไปตำแหนงขวา

128 4. การสรางคำสัง่ วนรอบในจำนวนท่จี ำกัด เนื่องจากฟงกชัน loop() ใน Arduino เปนฟงกชันสำหรับวนรอบการจำนวนไมจำกัด ซึ่งใน บางกรณีผูใชงานอาจตองการวนรอบการจำงานของโปรแกรมในรูปแบบจำนวนจำกัด จึงสามารถ ปรับแกคำสั่งภายในฟงกชัน loop() โดยการเพิ่มคำสั่งวนรอบไวในฟงกชันดังกลาวได ดังตัวอยาง ตอไปนี้ ตัวอยา งที่ 4.5 โปรแกรมไฟกระพริบ 1 ดวง (3 คร้ัง การทำงาน: หลอดแอลอดี ีจะมีสถานะของการตดิ -ดบั สลับกันในทุก 1 วินาทจี ำนวน 3 ครง้ั วธิ ีทำ 1. สวนวงจรทดลอง: เชื่อมตออปุ กรณภ ายนอกเขากบั บอรด Arduino ดังตวั อยางที่ 4.1 2. สว นโปรแกรม int led1 = 3; int count = 0; void setup() { pinMode(led1, OUTPUT); } void loop() { digitalWrite(led1, HIGH); delay(300); digitalWrite(led1, LOW); delay(300); count++; if(count == 3){ while(1); } } คำอธิบาย: ภายนอกฟง กชันมตี วั แปร count ไวสำหรับนับจำนวนรอบการทำงาน ฟงกชัน loop(): แตละรอบการทำงานสัญญาณไฟที่หลอดแอลอีดีจะมีสถานะติด-ดับพรอม กับเพิ่มคาตัวแปร count ขึ้นทีละ 1 คาและเมื่อคา count = 3 จะทำใหเงื่อนไขเปนจริงซึ่งจะพบ คำส่งั while(1 เปรยี บเสมือนการทำงานที่บรรทดั น้ตี ลอดการใชงาน

129 5. การเขยี นโปรแกรมควบคุมหลอดแอลอีดีทต่ี อขาแคโทดกับวงจรทดลอง หัวขอ 1 – 4 ที่ซึ่งไดถูกอธิบายไวกอนหนานี้ทั้งหมดนั้นคือการทดลองที่เกิดจากการตอขา แอโนดของหลอดแอลอีดีเขากับขาตางๆ ของบอรด Arduino สวนขาแคโทดถูกตอลงกราวด ดังน้ัน หากตองการใหหลอดแอลอีดีมีสถานะ “ติด” จะตองสงสถานะ “HIGH” ออกจากบอรด Arduino ที่ ตำแหนงขาที่เช่ือมตอกับขาแอโนดของหลอดแอลอีดีที่ตองการควบคุม ในทางกลับกันในหัวขอนี้จะ เปลย่ี นรปู แบบการเช่ือมตอ ระหวางหลอดแอลอีดี และบอรด Arduino โดยจะใชขาแคโทดเชือ่ มกับขา ของบอรด Arduino โดยขาแอโนดจะถูกตอ เขากับแรงดัน 5 โวลต ดงั นัน้ หากตอ งการใหหลอดแอลอีดี มีสถานะ “ติด” จะตองสงสถานะ “LOW” ออกจากบอรดที่ตำแหนงขาที่เชื่อมตอกับขาแคโทดของ หลอดแอลอดี ีท่ีตองการควบคมุ ตัวอยางที่ 4.6 โปรแกรมไฟกระพริบ 1 ดวง โดยการเชื่อมตอขาแคโทดของหลอดแอลอีดีกับขาของ บอรด Arduino การทำงาน: หลอดแอลอดี จี ะมสี ถานะของการติด-ดบั สลบั กนั ในทุก 1 วินาที วิธีทำ 1. สว นวงจรทดลอง รปู ท่ี 4.8 วงจรทดลองไฟกระพริบ 1 ดวงโดยการเชื่อมตอขาแคโทด ของหลอดแอลอกี ับบอรด Arduino ที่มา: ผูเขียน คำอธิบาย: ตอ หลอดแอลอีดีเขา กบั ตำแหนงขาท่ี 3 ของบอรด Arduino โดยจากภาพหากกำหนดใหมี สถานะ “HIGH” ออกจากขา 3 เพื่อทำใหหลอดแอลอีดีมีสถานะดับ แตหากกำหนดใหมีสถานะ “LOW” ออกจากตำแหนง ขา 3 ดงั กลา วสงผลใหห ลอดแอลอีดีมสี ถานะตดิ

130 2. สวนโปรแกรม void setup() { pinMode(3, OUTPUT); } void loop() { digitalWrite(3, HIGH); delay(1000 ; digitalWrite(3, LOW); delay(1000 ; } คำอธิบาย: ฟง กช ัน Setup(): กำหนดใหตำแหนง ขาท่ี 3 ของบอรด Arduino ทำหนา ที่เปน เอาตพ ุต ฟงกชัน loop(): กำหนดใหตำแหนงขาที่ 3 ของบอรด Arduino มีสถานะ “HIGH”และ สถานะ “LOW” สลับกันในทกุ ๆ 1 วนิ าที 6. บทสรุป แอลอีดี (Light Emitting Diode: LED) คือไดโอดเปลงแสงท่ีมีใหเลือกใชงานหลากหลายสี โดยใชไฟเล้ียงประมาณ 5 โวลต ดังนั้นผูใ ชง านตอ งตอไฟเลี้ยงท่ขี ้วั แอโนด และตอ กราวดท่ีขัว้ แคโทด การนำแอลอีดีมาตอใชงานกับไมโครคอนโทรลเลอรสามารถตอได 2 วิธี ดังนี้ วิธีที่ 1 ตอขา แอโนดเขากบั ตำแหนง ขาสำหรับรับสง สัญญาณแบบดิจิทัลของไมโครคอนโทรลเลอรจ ำนวน 1 ขา โดย ตอขาแคโทดลงกราวด หากตองการใหแอลอีดีมีสถานะ \"ติด\" ใหสงสถานะ \"HIGH\" (แรงดัน 5 โวลต ออกที่ตำแหนงขาอางอิง ในทางกลับกันหากใหแอลอีดีมีสถานะ \"ดับ\" ใหสงสถานะ \"LOW\" (ตอลง กราวด ออกที่ตำแหนงขาอางอิง วิธีที่ 2 ตอขาแคโทดเขากับตำแหนงขาสำหรับรับสงสัญญาณแบบ ดิจิทัลของไมโครคอนโทรลเลอรจำนวน 1 ขา โดยตอขาแอโนดเขากับแรงดันขนาด 5 โวลต หาก ตอ งการใหแ อลอีดมี สี ถานะ \"ตดิ \" ใหสงสถานะ \"LOW\" ออกท่ตี ำแหนง ขาอางอิง ในทางกลบั กันหากให แอลอดี มี สี ถานะ \"ดบั \" ใหส ง สถานะ \"HIGH\" ออกทต่ี ำแหนงขาอางอิง การเขียนโปรแกรมดวย Arduino IDE สำหรับควบคุมหลอดแอลอีดีจำเปนตองใชฟงกชัน pinMode() ซึ่งเปนฟงกชันสำหรับกำหนดตำแหนงขาอางอิงของบอรด Arduino ใหเปนโหมดอินพุต หรือเอาตพ ุต เนื่องจากแอลอดี เี ปน อปุ กรณท่ีรับสัญญาณจากบอรด Arduino ดังนั้นจงึ ตองกำหนดเปน โหมดเอาตพุต และใชฟงกชัน digitalWrite() สำหรับควบคุมสถานะของการติด และดับของหลอด แอลอดี ี

131 ฟงกชัน delay() คือฟงกชันที่ใชสำหรับการหนวงเวลาโดยมีการรับคาพารามิเตอรในหนวย มิลลวิ ินาที ฟงกชัน delayMicroseconds() คือฟงกชันที่ใชสำหรับการหนวงเวลาโดยมีการรับ คาพารามเิ ตอรใ นหนว ยไมโครวนิ าที การใชฟงกชัน digitalWrite() จะสามารถควบคุมการทำงานไดเพียง 1 บิต หรือควบคุมได เพียง 1 ขาของบอรด Arduino ดังนั้นหากตองการควบคุมจำนวนหลายขาสามารถทำไดโดยใชการ ควบคุมแบบไบตซึ่งสามารถควบคุมไดครั้งละ 8 บิต แตอยางไรก็ตามการควบคุมคุมลักษณะน้ี จำเปนตองตอการใชงานไวที่พอรตเดียวกันทั้งหมด ซึ่งสำหรับบอรด Arduino Uno R3 สังเกตไดวา พอรต D มีชองทางสำหรับรับและสงสัญาณจำนวน 8 ชองพอดี จึงเปนพอรตที่เหมาะสำหรับการใช คำสง่ั ควบคมุ แบบไบต

132 แบบฝก หดั ทา ยบท บทท่ี 4 1. แอลอีดีมีท้ังหมด 2 ขาซ่งึ แตล ะขามชี ่ืออะไรบาง 2. การควบคมุ ใชหลอดแอลอีดีมีสถานะติดจะตองทำอยางไร 3. ฟง กช ัน pinMode() เปนฟงกชนั ทมี่ ีไวเพือ่ อะไร 4. หากตอหลอดแอลอดี ที ่ีขา 3 ของบอรด Arduino จะตองกำหนดฟงกชนั pinMode อยา งไร 5. ฟง กชนั digitalWrite() เปนฟงกช ันที่มไี วเ พื่ออะไร 6. หากตอขั้วแอโนดหลอดแอลอดี ที ่ีขา 3 ของบอรด Arduino ขั้วแคโทดลงกราวดแ ละตองการให หลอดมีสถานะเปนติดจะตองกำหนดฟง กชัน digitalWrite() เปน อยางไร 7. ฟงกช ัน delay() แตกตา งจากฟงกช นั delayMicroseconds() อยา งไร 8. กำหนดใหหลอดแอลอีดจี ำนวน 8 ดวงถกู ตอ ที่ PORTD เรยี งจากตำแหนง ขวาไปซาย (ตำแหนง ขวา สุดถกู เช่อื มตอ กับตำแหนง 0 และตำแหนง ซายสดุ ถูกเชอื่ มตอ กับตำแหนง ท่ี 7) จงคำนวณหารหสั แบบ ไบตท่สี ง่ั ใหหลอดแอลอดี ตี ิดเฉพาะตำแหนงที่ 0, 2 และ 4

133 เอกสารอางองิ กอบเกียรติ สระอุบล. (2561). พัฒนา IoT บนแฟรตฟอรม Arduino และ Raspberry Pi. กรงุ เทพฯ: หสม สำนักพมิ พ อนิ เตอรมเี ดีย. เดชฤทธิ์ มณีธรรม. (2559). คัมภีรการใชงาน ไมโครคอนโทรลเลอร Arduino. กรุงเทพฯ: ซีเอ็ด ยเู คช่นั . ประภาส พุมพวง. (2561). การเขียนและการประยุกตใชงานโปรแกรม Arduino. กรุงเทพฯ: ซีเอ็ด ยูเคชั่น. วลิ าศิณี วิสิทธก์ิ าศ วรพจน กรแกว วฒั นกุล และ ชัยวัฒน ลิ้มพรจติ รวไิ ล. (2551). ทดลองและใชงาน. ไมโครคอนโทรลเลอร ATmega128 ดวยโปรแกรมภาษา C กับซอฟตแวร Wiring. กรงุ เทพฯ : อนิ โนเวตฟี เอ็กพอรเิ มนต. สนธยา นงนุช. (2560). การใชงาน ESP32 เบ้ืองตน. ชลบุรี: รา นไอโอเอก็ ซฮ อบ. 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.

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

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

บทที่ 5 การรับขอมลู จากวงจรรบั ขอ มลู วงจรรับขอมูล (เดชฤทธิ์ มณีธรรม, 2559) คือวงจรที่ใชสำหรับตัดตอวงจรไฟฟาเพื่อนำมา ประยุกตใชงานรวมกับบอรด Arduino วงจรดังกลาวนี้จะเปรียบเสมือนทำหนาที่เปนอินพุตที่สง สัญญาณไปยังบอรด โดยอุปกรณที่สามารถนำมาใชงานเปนอินพุตเพื่อสงสัญญาณไปยังบอรด Arduino เชน สวติ ซแบบกดตดิ ปลอยดบั หรอื สวติ ซแบบเลือ่ น (Don, 2015) เปนตน 1. สวิตซ สวิตซคอื อปุ กรณทนี่ ำหนาท่ีเปน ตัวสงสัญญาณไปยังบอรด Arduino ซงึ่ เปรียบเสมือนการทำ หนาที่เปนอินพุตใหกับบอรด โดยมีขาสำหรับการใชงานจริง 2 ขา ขาหนึ่งจะตองรับสถานะ “HIGH” สวนอีกขาหนึ่งรับสถานะ “LOW” (Tero & Kimmo, 2011) โดยสัญญาณที่สงไปยังบอรด Arduino ข้ึนอยสู ถานะปจ จบุ นั ของสวิตซซ่ึงมี 2 สถานะคือ กด หรือ ปลอ ย รปู ที่ 5.1 สวิตซ ท่มี า: ผเู ขียน รูปที่ 5.1 แสดงตัวอยางสวติ ซ ซึ่งจากรูปคือสวิตซแ บบกดติด ปลอยดับ ความหมายคือหากมี การกดสวิตซเพื่อทำใหเกิดการลัดวงจร จะสงสถานะ “HIGH” ไปยังบอรด Arduino แตหากปลอย สวิตซเพื่อใหเปนการเปดวงจรจะสงสถานะ “LOW” ไปยังบอรด ในทางกลับกันหากการกดสวิตซ สำหรบั เปดวงจรจะเปนการสงสถานะ “LOW” ไปยงั บอรด Arduino และหากปลอยสวิตซเพ่ือใหเกิด การลัดวงจร คอื การสง สถานะ “HIGH” ไปยงั บอรด รูปที่ 5.2 แสดงสวิตซแบบกดติด ปลอยดับในโปรแกรม Proteus ซึ่งมีใหเลือกใชงานจำนวน 1 ตวั โดยการเลือกอปุ กรณดงั กลาวนม้ี าใชงานดว ยคำคน “button” อยางไรก็ตามสามาถเลือกใชงานสวิตซประเภทอื่น ในโปรแกรม Proteus ไดโดยใชคำคน “switch” ซง่ึ จะพบอปุ กรณประเภทดงั กลา วใหเ ลอื กใชง านเปน จำนวนมาก

138 รูปที่ 5.2 สวิตซแบบกดติด ปลอ ยดบั ในโปรแกรม Proteus ท่ีมา: ผเู ขียน รูปที่ 5.3 สวิตซแบบกดเพอ่ื เปด และปด ในโปรแกรม Proteus ทีม่ า: ผเู ขยี น 2. การสรางวงจรสวิตซ การนำสวติ ซมาสรางเปนวงจรเพื่อเปนอินพุตแกบอรด Arduino สามารถดำเนินการได 2 วิธี คือวงจรสวิตซที่มีการทำงานที่สถานะ “HIGH” และวงจรสวิตซที่มีการทำงานที่สถานะ “LOW” (วิ ลาศิณี วิสิทธ์กิ าศ และคณะ, 2551) 2.1 วงจรสวิตซท่ีมกี ารทำงานที่สถานะ “HIGH” วงจรสวิตซที่มีการทำงานที่สถานะ “HIGH” คือวงจรที่จะสงสถานะ “LOW” ไปยังบอรด Arduino ในกรณีที่ผูใชไมไดเริ่มกดสัมผัสที่ปุม ในทางกลับกันหากผูใชทำการกดสัมผัสที่สวิตซ วงจร จะสง สถานะ “HIGH” ไปยงั บอรด Arduino รูปท่ี 5.4 วงจรสวติ ซท ่ีมีการทำงานทส่ี ถานะ “HIGH” ท่มี า: ผูเขยี น

139 จากรูป 5.4 คือวงจรสวิตซที่มีการทำงานที่สถานะ “HIGH” ซึ่งอธิบายการทำงานไดเปนดงั นี้ กรณีที่ยังไมมีการกดสวิตซจะเปนการเปดวงจรจึงไมมีแรงดันที่ขา sw ซึ่งคือตำแหนงขาที่จะถูก เชื่อมตอกับบอรด Arduino ในทางกลับกันหากมีการกดสวิตซจะสงผลใหเกิดการลัดวงจรซึ่งจะมี แรงดนั ขนาด 5 โวลตถูกสง ผานตำแหนงขา sw 2.2 วงจรสวติ ซท ่ีมกี ารทำงานที่สถานะ “LOW” วงจรสวิตซที่มีการทำงานที่สถานะ “LOW”คือวงจรที่จะสงสถานะ “HIGH” ไปยังบอรด Arduino ในกรณีที่ผใู ชไมไ ดเ ร่มิ กดสมั ผัสทีส่ วิตซ ในทางกลบั กันหากผใู ชทำการกดสมั ผัสท่สี วติ ซ วงจร จะสง สถานะ “LOW” ไปยังบอรด รูปที่ 5.5 วงจรสวติ ซท ี่มีการทำงานทส่ี ถานะ “LOW” ท่มี า: ผูเ ขียน จากรูป 5.5 คือวงจรสวติ ซท ี่มีการทำงานที่สถานะ “LOW” ซึ่งอธิบายการทำงานไดเ ปนดงั นี้ กรณีที่ยังไมมีการกดสวิตซจะเกิดแรงดันที่ตำแหนงขา sw ในทางกลับกันหากมีการกดปุมสงผลการ เกิดการลัดวงจรซ่ึงเช่ือมตอกับขากราวด ดังนนั้ กระแสไฟทง้ั หมดจะไหลลงสกู ราวดสงผลใหไ มมีกระแส ไหลผา นตำแหนง ขา sw 3. การเขยี นโปรแกรมเพอื่ รอรบั คาจากสวติ ซ หัวขอนี้จะกลาวถึงตัวอยางโปรแกรมที่รอรับคาจากสวิตซ เพื่อนำผลลัพธมาเปนเงื่อนไข สำหรบั การควบคมุ อปุ กรณแสดงผลจากภายนอกซ่งึ คือแอลอีดี ในโปรแกรม Arduino IDE มฟี งกชนั ชื่อ digitalRead() ซ่ึงเปนฟงกชันสำหรับเรียกใชงานเพื่อ รับคา สัญญาณดจิ ิทัลจากอุปกรณภ ายนอก (ประภาส พมุ พวง, 2561) และ (สนธยา นงนุช, 2560) ซึ่ง มีรปู แบบเปน ดังน้ี

140 รปู แบบ digitalRead(pin) พารามิเตอร pin คือ ตำแหนงขาของบอรด Arduino ที่ถูกเชื่อมตอกับอุปกรณภายนอกที่ทำหนาที่ใน โหมดอินพุตเพื่อสงสัญญาณสูวงจรทดลอง โดยผลลัพธหลังจากเรียกใชฟงกชันมี 2 สถานะคือ “HIGH” หรอื “LOW” ตัวอยางท่ี 5.1 ควบคุมหลอดแอลอดี ีดวยสวิตซ การทำงาน: หลอดแอลอีดจี ะมสี ถานะของการตดิ -ดับข้ึนอยกู ับการสบั สวิตซ วธิ ีทำ 1. สว นวงจรทดลอง รูปที่ 5.6 วงจรทดลองควบคุมหลอดแอลอดี ดี วยสวติ ซ ทม่ี า: ผเู ขียน

141 คำอธิบาย: ตอหลอดแอลอีดีเขากับตำแหนงขาที่ 3 และตอสวิตซเขากับตำแหนงขาที่ 13 ของวงจร ทดลอง โดยหากสับสวิตซทีต่ ำแหนงขา 13 ของบอรด Arduino จะรับสัญญาณ “LOW” แตหากเปด สวติ ซจะรับสญั ญาณ HIGH 2. สวนโปรแกรม int sw = 13; int led = 3; void setup() { pinMode(sw, INPUT); pinMode(led, OUTPUT); } void loop() { if(digitalRead(sw) == LOW){ digitalWrite(led, HIGH); } else{ digitalWrite(led, LOW); } } คำอธิบาย: ภายนอกฟงกชันมีการกำหนดตัวแปร sw ไวสำหรับควบคุมการกดสวิตซที่ขา 13 และ led ไวส ำหรับควบคมุ การ ตดิ -ดับของหลอดแอลอดี ีท่ีขา 3 ฟงกชัน Setup(): กำหนดใหตำแหนงขาที่ 13 ของบอรด Arduino ทำหนาที่เปนอินพุต และขาท่ี 3 ทำหนาท่เี ปน เอาตพุต ฟง กชนั loop(): เมื่อมกี ารกดสวิตซจะทำใหขาท่ี 13 ไดรับสถานะ “LOW” ซึ่งทำใหเง่ือนไข เปน จริงโดยจะส่ังใหหลอดแอลอดี ีมีสถานะติด ในทางกลับกนั หลอดแอลอีดจี ะมสี ถานะดบั ในกรณีที่ขา ท่ี 13 ไดร ับสถานะ “HIGH” ตวั อยางที่ 5.2 ควบคุมหลอดแอลอีดี 2 ดวงดวยปุม 2 ปุม การทำงาน: รปู แบบสำหรับสญั ญาณท่ีออกมาจากหลอดแอลอีดที ง้ั 2 ดวงถูกแบง ออกเปน 2 รปู แบบ ซงึ่ ขน้ึ อยูกบั วามีการกดสมั ผัสท่สี วิตซหรือไม วธิ ีทำ

142 1. สวนวงจรทดลอง รูปท่ี 5.7 วงจรทดลองควบคุมหลอดแอลอีดี 2 ดวงดว ยปุม 2 ปมุ ทีม่ า: ผูเขียน คำอธิบาย: ตอหลอดแอลอีดีเขากับตำแหนงขาที่ 3, 4 และสวิตซเขากับตำแหนงขาที่ 12, 13 ของ บอรด Arduino โดยหากกดสวิตซที่ตำแหนงใดสงผลใหบอรด Arduino จะรับสัญญาณสถานะ “LOW” ทต่ี ำแหนงน้ันแตหากไมมกี ารกดสวติ ซจะรับสญั ญาณที่มสี ถานะ “HIGH” 2. สว นโปรแกรม int sw1 = 13; int sw2 = 12; int led1 = 3; int led2 = 4; void setup() { pinMode(sw1, INPUT); pinMode(sw2, INPUT); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); } void loop() { if(digitalRead(sw1) == LOW){ digitalWrite(led1, HIGH); digitalWrite(led2, LOW); }

143 if(digitalRead(sw2) == LOW){ digitalWrite(led2, HIGH); digitalWrite(led1, LOW); } คำอธิบาย: กำหนดตัวแปร sw1, sw2 ไวสำหรับควบคุมการกดสวิตซที่ขา 13 และ 12 ตามลำดับ และ led1, led2 ไวส ำหรบั ควบคุมการ ติด-ดบั ของหลอดแอลอดี ีทข่ี า 3 และ 4 ตามลำดบั ฟงกช นั Setup(): กำหนดใหต ำแหนง ขาที่ 12, 13 ของบอรด Arduino ทำหนาทเ่ี ปนอินพุต และขาท่ี 3, 4 ทำหนาท่ีเปนเอาตพ ุต ฟงกชัน loop(): เมื่อมีการกดสวิตซจะทำใหขาที่ 13 ไดรับสัญญาณสถานะ “LOW” ซึ่งทำ ใหเ ง่อื นไขเปน จริงโดยจะสงั่ ใหหลอดแอลอีดีมสี ถานะติดในตำแหนงขาท่ี 3 และสถานะดับในตำแหนง ขาที่ 4 ในทางกลับกันหลอดแอลอีดีมีสถานะดับในตำแหนงขาที่ 3 แตมีสถานะติดในตำแหนงขาที่ 4 สำหรบั กรณีทขี่ าที่ 12 ไดรับสัญญาณสถานะ “LOW” 4. การเกดิ เบาซข องสญั ญาณ หากนำสวิตซไปประยุกตใชงานในรูปแบบการตรวจจับจำนวนครั้งของการกดสวิตซ จะเกิด ปญหาตรงที่การกดสัมผัสที่สวิตซของผูใชงานเพียง 1 ครั้ง แตผลลัพธแสดงโปรแกรมตรวจจับไดวามี การสมั ผัสทปี่ ุม มากกวา 1 ครงั้ สาเหตเุ น่อื งมาจากการกดปุม 1 ครัง้ จะทำใหเ กดิ การสน่ั ของหนาสัมผัส ซึ่งสงผลใหเกิดการตัดตอของหนาสัมผัสจำนวนหลายครั้ง (Adith, 2015) เรียกปญหานี้วาการเกิด เบาซของสญั ญาณ (Bounce) แรงดัน 5 0 x1 x2 เวลา รปู ท่ี 5.8 ตวั อยางการเกิดเบาซข องสญั ญาณ ทม่ี า: ผูเขียน

144 รูปที่ 5.8 แสดงตัวอยางการเกิดเบาซของสัญญาณ ซึ่งอธิบายไดดังนี้การกดสวิตซอยูในเวลา x1 แตเนื่องจากเกิดการสั่นของหนาสัมผัสหลังจากการกดสวิตซไปจนกระทั่งถึงชวงเวลา x2 สงผลให โปรแกรมตรวจสอบการกดสวติ ซไ ดม ากกวา 1 ครัง้ ถึงแมวา มีการกดสวิตซเกดิ ขึน้ เพยี งแคค รัง้ เดยี ว การแกเบาซของสัญญาณเรียกวาการดีเบาซ (Debounce) ผานกระบวนการเขียนโปรแกรม ซึ่งสามารถทำไดหลายวธิ ี สำหรับในเอกสารคำสอนนแ้ี สดงตวั อยางการดเี บาซ 3 วิธี ดังนี้ ตวั อยา งที่ 5.3 โปรแกรมหลอดแอลอีดี 8 ดวงติดทีละ 1 ดวงเรียงจากขวาไปซายผา นการกดสวิตซ (3 วิธี) การทำงาน: หลอดแอลอดี ี 7 ดวงจะตดิ ทีละ 1 ดวงเรยี งจากขวาไปซายในทุก ๆ ครง้ั ที่มีการกดสวิตซ 1 ครั้ง วิธที ำ 1. สว นวงจรทดลอง รูปที่ 5.9 วงจรทดลองหลอดแอลอดี ี 8 ดวงติดทลี ะ 1 ดวง เรียงจากขวาไปซายผา นการกดปุม ทมี่ า: ผูเขียน คำอธิบาย: ตอหลอดแอลอีดีเขากับตำแหนงขาที่ 0 - 7 และสวิตซท่ีตำแหนงขา 12 ของบอรด Arduino

145 2. สว นโปรแกรม (วิธีที่ 1: แกปญ หาดวยวธิ ีการหนวงเวลา int x = 0x01; int sw = 12; void setup() { DDRD = 0xFF; pinMode(sw, INPUT); } void loop() { PORTD = x; if(digitalRead(sw) == LOW){ if(x == 0x80){ x = 0x01; } else{ x = x<<1; } delay(100); } } คำอธิบาย: ภายนอกฟงกชันมีการกำหนดตัวแปร sw ไวสำหรับควบคุมการกดสวิตซที่ขา 12 และตัว แปร x ไวสำหรับควบคุมการ ตดิ -ดบั ของหลอดแอลอีดที ี่ขา 0 - 7 ตามลำดบั ฟงกชัน Setup(): กำหนดใหตำแหนงขาที่ 0 – 7 (พอรต D) ของบอรด Arduino ทำหนาท่ี เปน เอาตพุต และขาที่ 12 ทำหนา ที่เปนอนิ พุตจากอุปกรณภ ายนอก ฟงกชัน loop(): เมื่อมีการกดปุมจะทำใหขาที่ 12 ไดรับสัญญาณสถานะ “LOW” ซึ่งทำให เงือ่ นไขเปนจริงโดยจะสงั่ ใหห ลอดแอลอีดมี สี ัญญาณไฟในลักษณะของการชิฟจากขวาไปซายครั้งละ 1 ตำแหนง โดยมกี ารหนวงเวลาทกุ 100 มิลลิวินาทีเพื่อปอ งกันการเกิดเบาซข องสญั ญาณ ขอเสียของการดีเบาซดวยการหนวงเวลาคือ ตองกำหนดชวงเวลาการหนวงที่เหมาะสม เพราะหากกำหนดมากเกินไปจะติดอยูที่ฟงกชันนี้ซึ่งทำใหผูใชไมสามารถสั่งงานผานการกดสวิตซได หรือหากกำหนดนอยเกินไปจะทำใหก ารสัมผัสเพียง 1 ครั้งแตเกิดการทำงานของสญั ญาณไฟมากกวา 1 คำสง่ั

146 2. สวนโปรแกรม (วธิ ีท่ี 2: แกป ญหาดวยการรอหยดุ การสมั ผัสสวิตซแบบท่ี 1 int x = 0x01; int sw = 12; void setup() { DDRD = 0xFF; pinMode(sw, INPUT); } void loop() { PORTD = x; if(digitalRead(sw) == LOW){ if(x == 0x80){ x = 0x01; } else{ x = x<<1; } while(digitalRead(sw) == LOW); } } คำอธิบาย: ลักษณะการทำงานของวิธีท่ี 2 จะแตกตางจากวธิ ีที่ 1 ตรงที่วิธีที่ 2 จะดีเบาซโดยใชค ำส่งั วนรอบที่มีเงื่อนไขวาหากยังมีการกดสวิตซอยูจะติดอยูที่ลูปดังกลาว จนกวาจะหยุดสัมผัสปุมจึงจะ ออกจากการวนรอบและรอรับคำสง่ั การกดปุมในครงั้ ตอไป 2. สว นโปรแกรม (วธิ ีท่ี 3: แกปญ หาดวยการรอหยดุ การสัมผัสสวติ ซแ บบที่ 2 int x = 0x01; int sw = 12; int pulse = 0; void setup() { DDRD = 0xFF; pinMode(sw, INPUT); } void loop() {

147 PORTD = x; if(digitalRead(sw) == LOW){ pulse = 1; } if(pulse == 1 && digitalRead(sw) == HIGH){ if(x == 0x80){ x= 0x01; } else{ x = x<<1; } pulse = 0; } } คำอธิบาย: ลักษณะการทำงานของวิธีที่ 3 คือเมื่อมีการกดปุมจะทำให pulse มีคาเปน 1 และจะรอ ผูใชงานหยุดการสัมผัสปุมจึงจะทำใหเงื่อนไขที่ 2 จริงคือ pulse มีคาเปน 1 และมีการหยุดสัมผัสปุม จึงจะมกี ารเปลี่ยนตำแหนงการตดิ ของสัญญาณไฟ 5. บทสรุป สวิตซค ืออุปกรณทีน่ ำหนาที่เปนตัวสงสญั ญาณไปยังบอรด Arduino ซึ่งเปรียบเสมือนการทำ หนา ทีเ่ ปนอนิ พุตใหกับวงจรทดลอง โดยมีขาสำหรับการใชงานจริง 2 ขา โดยขาหน่ึงจะตองรับสถานะ “HIGH” และอีกขาหนึ่งรับสถานะ “LOW” ซึ่งมีใหเลือกใชงาน 2 ชนิดคือแบบกดติดปลอยดับ และ แบบกดเพอื่ เปดและกดเพ่อื ปด การนำสวิตซมาตอใชงานสามารถทำได 2 วิธีคือ วงจรสวิตซที่มีการทำงานที่สถานะ \"HIGH\" คือวงจรทจี่ ะสง สถานะ “LOW” ไปยงั วงจรทดลองในกรณที ีผ่ ใู ชไ มไ ดเริ่มกดสัมผัสทปี่ ุม ในทางกลับกัน หากผูใ ชทำการกดสมั ผสั ท่ีสวติ ซ วงจรจะสงสถานะ “HIGH” ไปยังบอรด Arduino และวงจรสวิตซทีม่ ี การทำงานที่สถานะ “LOW” คือวงจรที่จะสงสถานะ “HIGH” ไปยังบอรด Arduino ในกรณีที่ผูใช ไมไดเ ริม่ กดสมั ผสั ท่ีปมุ ในทางกลับกันหากผใู ชทำการกดสัมผัสทสี่ วติ ซ วงจรจะสงสถานะ “LOW” ไป ยังบอรด เนื่องจากสวิตซเปนอุปกรณที่ใชสำหรับสงสัญญาณสูบอรด Arduino ดังนั้นการเรียกใช ฟงกชัน pinMode() จึงตองกำหนดโหมดเปนแบบอินพุต และใชฟงกชัน digitalRead() เพื่ออานคา จากสวิตซส ตู ำแหนง ขาอา งองิ ของบอรด Arduino การเกิดเบาซของสัญญาณเกิดจากการที่โปรแกรมสามารถตรวจจับการสัมผัสสวิตซได มากกวา 1 ครงั้ ถึงแมวาผูใ ชงานประสงคเ พยี งใหเ กิดการสัมผัสเพียงครั้งเดียว สาเหตเุ นื่องมาจากเวลา

148 ของการวนรอบการทำงานเรว็ กวาเวลาของการยกน้ิวออกจากการสมั ผัสสวิตซ ซ่ึงสามารถแกไขปญหา ไดโดยใชก ารหนวงเวลา หรอื ใชการรอหยดุ การสมั ผสั สวติ ซ โดยเรยี กการแกปญหาลักษณะนี้วาการดี เบาซ

149 แบบฝก หัดทา ยบท บทท่ี 5 1. จากรูปทีก่ ำหนดให จงหาสถานะของ a เมื่อมีการกดที่สวิตซ 2. ฟง กช นั digitalRead() มีประโยชนอยา งไร 3. กำหนดใหวงจรสวิตซถูกเช่ือมตอท่ตี ำแหนง ขา 4 ของบอรด Arduino จงแสดงวิธีใชค ำส่งั สำหรับ กำหนดโหมดการทำงานที่ตำแหนงดังกลาว 4. ปญหาเบาตข องสญั ญาณเกดิ จากอะไร 5. การแกป ญหาเบาตข องสัญญาณเรยี กวา อะไร 6. การดเี บาตสญั ญาณสามารถทำอยางไรไดบ า ง 7. ขอ เสียของการดีเบาตด วยวิธกี ารหนวงเวลาคืออะไร 8. กำหนดใหวงจรสวิตซที่มีการทำงานที่สถานะ “LOW” ถูกเชื่อมตอกับบอรดทดลองที่ตำแหนงขา 12 จงเขียนโปรแกรมเพื่อแสดงสถานะการกดปุมผาน Serial Monitor โดยใหแสดงขอความ “Button is pressed” ทุกคร้งั ท่ปี ุมถกู สัมผสั

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

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

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

บทที่ 6 การควบคุมแอลอดี ี 7 สวน ในบทนจ้ี ะกลา วถึงการนำหลอดแอลอีดที ั้งหมด 7 ดวงมาวางเรยี งกันเรียกวา แอลอดี ี 7 สวน (7 Segment (เดชฤทธิ์ มณีธรรม, 2559) เพื่อใหสามารถแสดงผลออกมาใหอ ยูในรูปแบบของตัวเลข หรือตัวอักษรบางประเภทได โดยวิธีการกำหนดรูปแบบการแสดงผลสามารถทำไดโดยการกำหนดให ตำแหนงของหลอดแอลอีดที ีต่ รงกับรปู แบบท่ีตอ งการมสี ถานะติด ในทางกลบั กนั หลอดแอลอีดีท่ีไมอยู ในตำแหนงที่ตรงกับรปู แบบทีต่ อ งการจะถูกกำหนดใหเ ปนสถานะดบั 1. แอลอีดี 7 สว น แอลอีดี 7 สว นคือการนำหลอดแอลอดี มี าวางเรียงกนั เพ่ือใหสามารถแสดงผลใหอยใู นรูปแบบ ตางๆ ได ดงั รปู ที่ 6.1 รปู ที่ 6.1 แอลอดี ี 7 สวน ทมี่ า: ผเู ขียน รปู ที่ 6.1 แสดงหลอดแอลอดี ี 7 สวนโดยเรียงตอกนั เปนรูปรางคลายเลข “8” โดยจากการนำ แอลอดี มี าเรยี งตอ กนั ดังโครงสรางขางตนสามารถกำหนดการแสดงผลไดหลากหลายรปู แบบ อยางไรก็ ตามจากรูปนอกเหนือจากการนำแอลอีดีมาเรียงตอกัน 7 สวนแลวยังมีแอลอีดีอีก 1 ดวงซึ่งทำหนาที่ สำหรับแสดงผลเปนไดทงั้ ทศนยิ ม หรอื สญั ลกั ษณข องอณุ หภมู ิ รูปที่ 6.2 แสดงตัวอยางการนำแอลอีดี 7 สวนมาแสดงผลแบบตัวเลข นอกเหนือจากนั้นยัง สามารถนำมาแสดงผลใหอ ยูใ นรูปแบบอื่นๆ ไดเปนจำนวนมาก (วิลาศณิ ี วิสทิ ธิก์ าศ และคณะ, 2551) รูปที่ 6.3 แสดงโครงสรางของแอลอีดี 7 สวนประกอบดวยตำแหนง a, b, c, d, e, f และ g โดยหากตองการใหต ำแหนงแสดงผล จะตองกำหนดใหต ำแหนง ดังกลา วมีสถานะตดิ

154 รปู ที่ 6.2 ตวั อยา งการนำแอลอีดี 7 สว นมาแสดงผลเปนตวั เลขในรูปแบบตางๆ ท่ีมา: ทมี งานสมารท เลิรน นิ่ง, 2554 รปู ท่ี 6.3 โครงสรางแอลอีดี 7 สว น ทีม่ า: ทีมงานสมารท เลริ น น่ิง, 2554 รูปท่ี 6.4 แอลอีดี 7 สวนในโปรแกรม Proteus ท่ีมา: ผูเขยี น

155 รปู ที่ 6.4 แสดงตวั อยา งแอลอีดี 7 สว นในโปรแกรม Proteus ซึ่งมีใหเ ลอื กใชงานหลากหลาย ประเภท โดยสามารถเลือกใชอุปกรณดังกลา วไดโ ดยใชค ำคน “7seg-” ซึง่ จะพบอุปกรณการแสดงผล ประเภทแอลอีดี 7 สว นใหเลือกใชง านเปนจำนวนมาก รูปที่ 6.5 รายการแอลอีดี 7 สวนในโปรแกรม Proteus ท่ีมา: ผเู ขียน อยา งไรก็ตามในบทนจี้ ะเนน เก่ยี วกบั การนำแอลอีดี 7 สวนมาแสดงเปน ตัวเลข 0 – 9 สำหรับ สรางวงจรนบั ดังรปู ที่ 6.6 เลข 0 เลข 1 เลข 2 เลข 3 เลข 4 เลข 5 เลข 6 เลข 7 เลข 8 เลข 9 รปู ท่ี 6.6 การนำแอลอดี ี 7 สวนในโปรแกรม Proteus มาแสดงผลในรูปแบบตัวเลข 0 – 9 ทมี่ า: ผูเขียน แอลอีดี 7 สว นถูกแบง เปน 2 ประเภท (Tero & Kimmo, 2011) และ (สนธยา นงนุช, 2560) คือคอมมอนแคโทด (Common Cathode) คือขารวมของแอลอีดีจะถูกตอลงกราวด และหาก ตองการใหตำแหนงใดมีสถานะติด จะตองสงสถานะ “HIGH” ไปยังตำแหนงดังกลาว และคอมมอน

156 แอโนด (Common Anode) คือขารวมของแอลอีดีจะถูกตอกับแรงดันขนาด 5 โวลต และหาก ตองการใหตำแหนง ใดมีสถานะตดิ จะตองสงสถานะ “LOW” ไปยังตำแหนงดังกลา ว เนื่องจากจำนวนขาของแอลอีดี 7 สวนมีทั้งหมด 7 – 8 ขา ดังนั้นการเขียนโปรแกรมควบคมุ อปุ กรณด งั กลาวแบบไบตจ ะมคี วามสะดวกและรวดเร็วกวา โดยในบทท่ี 4 ไดก ลาวถึงคำส่ังแบบไบตที่ ใชสำหรับการควบคุมสถานะเอาตพุต ซึ่งอยูที่ตำแหนงขา 0 – 7 ของบอรด Arduino แลว ดังนั้นใน บทนีจ้ ะอธบิ ายวิธีการเขียนโปรแกรมควบคุมหลอดแอลอีดี 7 สวนโดยใชคำสั่งแบบไบต กำหนดใหตำแหนงขาที่เชื่อมตอกนั ระหวางบอรด Arduino และแอลอีดี 7 สว นเปนดังตารางท่ี 6.1 ตารางท่ี 6.1 ตวั อยางตำแหนงขาทีเ่ ชอื่ มตอ กนั ระหวา งบอรด Arduino และแอลอีดี 7 สว น ตำแหนงขา แอลอีดี 7 สวน บอรด Arduino a0 b1 c2 d3 e4 f5 g6 การควบคุมแอลอีดี 7 สวนเพื่อใหแสดงผลเปนตัวเลขจะอางอิงรูปแบบตัวเลขตามรูปที่ 6.6 และตำแหนง ของการเช่ือมตอกับบอรด Arduino ดังตารางท่ี 6.1 1.1 การควบคมุ แอลอีดี 7 สว นแบบคอมมอนแคโทดสำหรบั แสดงผลตัวเลข 0 – 9 แอลอีดี 7 สว นทต่ี อกนั แบบคอมมอนแคโทด คอื ตำแหนง ขารว มของหลอดแอลอีดีท้ังหมดจะ อยูติดกับขาแคโทดของหลอดแอลอีดี หรือตำแหนงปลายลูกศรสำหรับกรณีที่ใชโปรแกรม Proteus ดังนั้นหากกำหนดใหหลอดแอลอีดีทุกหลอดมีโอกาสที่จะเกิดสถานะ “ติด” จำเปนตองใหตำแหนง ของขารว มถกู เชอ่ื มตอกบั กราวด

157 โดยหากกำหนดสถานะ “HIGH” หรือ “1” ใหตำแหนงขาใดๆ ของหลอดแอลอีดี ตำแหนง ขาดังกลาวจะมีสถานะ “ติด” ในทางกลับกันหากกำหนดสถานะ “LOW” หรือ “0” ใหตำแหนงขา ใดๆ หลอดแอลอดี ีทต่ี ำแหนงขาดงั กลา วจะมสี ถานะ “ดบั ” ตารางที่ 6.2 แสดงการกำหนดสถานะใหแตล ะตำแหนงของแอลอีดี 7 สวนเพอื่ ใหแสดงผล เปน ตัวเลข 0 – 9 ตารางที่ 6.2 การกำหนดสถานะใหแ อลอดี ี 7 สวนแบบคอมมอนแคโทดแสดงผลเปน ตัวเลข 0 - 9 ตัวเลข g f e d c b a 0 01 1 1 111 1 00 0 0 110 2 10 1 1 011 3 10 0 1 111 4 11 0 0 110 5 11 0 1 101 6 11 1 1 101 7 00 0 0 111 8 11 1 1 111 9 11 0 1 111 จากตารางที่ 6.2 มีการใชงานทั้งหมด 7 ขา อยางไรก็ตามการใชงานคำสั่งแบบไบตมีความ จำเปน ตองกำหนดครั้งละ 8 บิต เนื่องจากตำแหนงขา 7 ของบอรด Arduino ไมไดถูกนำมาใชงาน ดังนั้นจึงสามารถกำหนดสถานะไดทั้ง “0” หรือ “1” โดยหากกำหนดใหต ำแหนงขาดังกลาวมีสถานะ เปน “0” เสมอสามารถกำหนดคาใหคำส่งั แบบไบตเพ่อื การแสดงผลเปน ตัวเลขรูปแบบตา งๆ ได ดังน้ี เลข 0: สถานะท่ีตำแหนงขา 7 - 0 มีคา เปน 00111111 = 3F16 ดังน้ัน จึงกำหนดการแสดงผลดวยคำสั่ง PORTD = 0x3F; เลข 1: สถานะที่ตำแหนง ขา 7 - 0 มีคาเปน 00000110 = 0616 ดงั นัน้ จงึ กำหนดการแสดงผลดวยคำส่ัง PORTD = 0x06; เลข 2: สถานะท่ีตำแหนงขา 7 - 0 มีคาเปน 01011011 = 5B16 ดงั นัน้ จึงกำหนดการแสดงผลดว ยคำสง่ั PORTD = 0x5B;

158 เลข 3: สถานะทีต่ ำแหนงขา 7 - 0 มคี าเปน 01001111= 4F16 ดงั นั้น จึงกำหนดการแสดงผลดว ยคำสงั่ PORTD = 0x4F; เลข 4: สถานะท่ีตำแหนงขา 7 - 0 มีคาเปน 01100110 = 6616 ดังนั้น จงึ กำหนดการแสดงผลดว ยคำสัง่ PORTD = 0x66; เลข 5: สถานะทีต่ ำแหนงขา 7 - 0 มคี า เปน 01101101 = 6D16 ดงั นั้น จงึ กำหนดการแสดงผลดวยคำส่ัง PORTD = 0x6D; เลข 6: สถานะท่ีตำแหนง ขา 7 - 0 มคี า เปน 01111101 = 7D16 ดงั นั้น จึงกำหนดการแสดงผลดว ยคำสง่ั PORTD = 0x7D; เลข 7: สถานะที่ตำแหนง ขา 7 - 0 มคี า เปน 00000111 = 0716 ดงั นัน้ จงึ กำหนดการแสดงผลดว ยคำส่งั PORTD = 0x07; เลข 8: สถานะทต่ี ำแหนง ขา 7 - 0 มคี าเปน 01111111 = 7F16 ดงั นน้ั จึงกำหนดการแสดงผลดวยคำสั่ง PORTD = 0x7F; เลข 9: สถานะทตี่ ำแหนง ขา 7 - 0 มคี า เปน 01101111 = 6F16 ดงั น้ัน จงึ กำหนดการแสดงผลดวยคำสง่ั PORTD = 0x6F; 1.2 การควบคมุ แอลอีดี 7 สว นแบบคอมมอนแอโทดสำหรบั แสดงผลตัวเลข 0 – 9 กรณีที่นำแอลอีดี 7 สวนมาเรียงตอ กันแบบคอมมอนแอโทด ไดวาตำแหนงขารวมของหลอด แอลอีดีทั้งหมดจะอยูติดกับขาแอโทดของหลอดแอลอีดี หรือตำแหนงหัวลูกศรสำหรับกรณีที่ใช โปรแกรม Proteus ดังนั้นหากกำหนดใหหลอดแอลอีดีทุกหลอดมีโอกาสที่จะเกิดสถานะ “ติด” จำเปนตอ งใหตำแหนง ของขารวมถูกเช่อื มตากับแรงดนั 5 โวลต โดยหากกำหนดสถานะ “HIGH” หรือ “1” ใหตำแหนงขาใดๆ ของหลอดแอลอีดี ตำแหนง ขาดังกลาวจะมีสถานะ “ดับ” ในทางกลับกันหากกำหนดสถานะ “LOW” หรือ “0” ใหตำแหนงขา ใดๆ หลอดแอลอีดที ี่ตำแหนงขาดงั กลา วจะมสี ถานะ “ติด” เนื่องจากการกำหนดสถานะใหตำแหนงตางๆ ของแอลอีดี 7 สวนแบบคอมมอนแอโนดเปน สวนกลับของแอลอีดี 7 สวนแบบคอมมอนแคโทด ดังนั้นการกำหนดคาใหคำสั่งแบบไบตเพื่อการ แสดงผลเปนตัวเลขรูปแบบตางๆ ได สามารถดำเนินการไดโดยการกลับบิตในแตละตำแหนงขาของ แอลอีดี 7 สว นแบบคอมมอนแคโทด ซึง่ ไดผลลพั ธเปน ดังนี้ เลข 0: สถานะท่ตี ำแหนง ขา 7 - 0 มีคาเปน 11000000 = C016 ดังนน้ั จึงกำหนดการแสดงผลดวยคำสงั่ PORTD = 0xC0; เลข 1: สถานะทตี่ ำแหนงขา 7 - 0 มคี า เปน 11111001 = F916 ดังน้ัน จงึ กำหนดการแสดงผลดวยคำสั่ง PORTD = 0xF9;

159 เลข 2: สถานะท่ีตำแหนงขา 7 - 0 มคี าเปน 10100100 = A416 ดังนั้น จึงกำหนดการแสดงผลดวยคำส่งั PORTD = 0xA4; เลข 3: สถานะท่ตี ำแหนงขา 7 - 0 มคี าเปน 10110000 = B016 ดงั นัน้ จงึ กำหนดการแสดงผลดว ยคำส่ัง PORTD = 0xB0; เลข 4: สถานะทีต่ ำแหนงขา 7 - 0 มีคาเปน 10011001 = 9916 ดังนน้ั จงึ กำหนดการแสดงผลดว ยคำสง่ั PORTD = 0x99; เลข 5: สถานะท่ตี ำแหนงขา 7 - 0 มคี า เปน 10010010 = 9216 ดงั น้นั จงึ กำหนดการแสดงผลดวยคำส่ัง PORTD = 0x92; เลข 6: สถานะทต่ี ำแหนง ขา 7 - 0 มีคา เปน 10000010 = 8216 ดังนั้น จึงกำหนดการแสดงผลดว ยคำสั่ง PORTD = 0x82; เลข 7: สถานะทต่ี ำแหนงขา 7 - 0 มคี า เปน 11111000 = F816 ดงั นั้น จงึ กำหนดการแสดงผลดว ยคำส่ัง PORTD = 0xF8; เลข 8: สถานะทีต่ ำแหนง ขา 7 - 0 มคี า เปน 10000000 = 8016 ดังนน้ั จงึ กำหนดการแสดงผลดว ยคำสง่ั PORTD = 0x80; เลข 9: สถานะท่ตี ำแหนง ขา 7 - 0 มคี าเปน 10010000 = 9016 ดงั นน้ั จึงกำหนดการแสดงผลดวยคำสัง่ PORTD = 0x90; ตวั อยางท่ี 6.1 โปรแกรมควบคุมแอลอดี ี 7 สว นแบบคอมมอนแคโทดเพื่อแสดงผลเปนตวั เลข 0 การทำงาน: หลอดแอลอีดี 7 สวนจะแสดงผลออกเปน เลข 0 วธิ ีทำ 1. สว นวงจรทดลอง รูปที่ 6.7 วงจรทดลองหลอดแอลอดี ี 7 สว นแบบคอมมอนแคโทด แสดงผลเปนตัวเลข 0 ท่มี า: ผูเขยี น

160 หมายเหตุ: ตำแหนงขา a ของแอลอีดี 7 สวนในโปรแกรม Proteus จะอยูเสนบนสุด และเรียงลง มาถึงเสน ลางสุดคอื ตำแหนงขา f คำอธิบาย: ตอหลอดแอลอีดี 7 สวนเขากับพอรต D ของวงจรทดลองโดยตำแหนง a, b, c,…,g ของ หลอดแอลอดี ี 7 สว นถกู ตอเขากบั ขาที่ 0 – 6 ตามลำดับ 2. สว นโปรแกรม void setup() { DDRD = 0xFF; PORTD = 0x3F; } void loop() { } คำอธิบาย: ฟงกชัน Setup(): กำหนดใหพอรต D ทั้งหมดทำหนาที่เปนเอาตพุต (DDRD = 0xFF และ กำหนดให PORTD = 0x3F เพ่ือใหแ อลอดี ี 7 สวนแบบคอมมอนแคโทดแสดงผลลพั ธเปน เลข 0 ฟง กช นั loop(): - 3. ผลการทดลอง รปู ที่ 6.8 ผลการทดลองหลอดแอลอีดี 7 สวนแบบคอมมอนแคโทด แสดงผลเปนตัวเลข 0 ทีม่ า: ผเู ขยี น

161 หมายเหตุ: ผอู า นสามารถทดลองเปล่ยี นคำสง่ั ของพอรต D เพอื่ เปล่ยี นรูปแบบการแสดงผลเปน ตัวเลข อื่น ๆ ตวั อยางที่ 6.2 โปรแกรมควบคมุ แอลอีดี 7 สว นแบบคอมมอนแอโนดเพ่ือแสดงผลเปน ตัวเลข 1 การทำงาน: หลอดแอลอีดี 7 สวนจะแสดงผลออกเปน เลข 1 วธิ ที ำ 1. สว นวงจรทดลอง รปู ท่ี 6.9 วงจรทดลองหลอดแอลอดี ี 7 สว นแบบคอมมอนแอโนด แสดงผลเปน ตัวเลข 1 ทม่ี า: ผูเขยี น คำอธิบาย: ตอหลอดแอลอีดี 7 สวนเขากับพอรต D ของบอรด Arduino โดยตำแหนง a, b, c,…,g ของหลอดแอลอีดี 7 สว นถูกตอเขากับขาที่ 0 – 6 ตามลำดบั 2. สว นโปรแกรม void setup() { DDRD = 0xFF; PORTD = 0xF9; } void loop() { }

162 คำอธิบาย: ฟงกชัน Setup(): กำหนดใหพอรต D ทั้งหมดทำหนาที่เปนเอาตพุต (DDRD = 0xFF และ กำหนดให PORTD = 0xF9 ความหมายคือ เพื่อใหแอลอีดี 7 สวนแบบคอมมอนแอโนดแสดงผลลพั ธ เปน เลข 1 ฟงกช นั loop(): - 3. ผลการทดลอง รปู ท่ี 6.10 ผลการทดลองหลอดแอลอดี ี 7 สวนแบบคอมมอนแอโนด แสดงผลเปนตวั เลข 1 ทีม่ า: ผเู ขยี น ตัวอยา งท่ี 6.3 โปรแกรมนับเลข 0 – 9 แสดงผลท่หี ลอดแอลอีดี 7 สวนแบบคอมมอนแคโทด การทำงาน: หลอดแอลอีดี 7 สวนจะแสดงผลออกเปน เลข 0 – 9 ตามลำดบั วธิ ีทำ 1. สว นวงจรทดลอง: เชื่อมตออุปกรณภ ายนอก เขา กบั บอรด Arduino ดงั ตัวอยา งที่ 6.1 2. สว นโปรแกรม int count = 0; int num[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; void setup() { DDRD = 0xFF; } void loop() { PORTD = num[count];

163 delay(300); count++; if(count == 10){ count = 0; } } คำอธิบาย: มีการกำหนดตัวแปรนอกฟงกชัน 2 ตัวแปรคือ num เปนตัวแปรแบบอารเรยที่เก็บคา ทั้งหมด 10 คาคือรูปแบบการแสดงผลของหลอดแอลอีดี 7 สวนแบบคอมมอนแคโทดเปนเลข 0 – 9 ตามลำดับ ตัวแปรอีก 1 ตัวคือ count เปนตัวแปรสำหรับนับคาจาก 0 – 10 เพื่อใชเก็บคาตำแหนง ของตวั แปร num ฟง กชัน Setup(): กำหนดใหพ อรต D ทงั้ หมดทำหนาทเ่ี ปน เอาตพ ตุ (DDRD = 0xFF ฟงกชัน loop(): กำหนดคา count ใหมีการเพิ่มคาขึ้นทุก ๆ 300 มิลลิวินาทีเพื่อใชเปนอิน เด็กซให num ดงั น้ันแอลอีดี 7 สว นจึงมกี ารแสดงผลเปนเลข 0 – 9 หมายเหตุ: กรณีใชแอลอีดี 7 สวนแบบคอมมอนแอโนดสำหรับวงจรนับ 0 – 9 ในสวน โปรแกรม ใหปรับแกคา ตัวแปร num ในบรรทัดท่ี 2 เปนดงั น้ี (ประภาส พุมพวง, 2561) int num[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; 2. การใชง านแอลอีดี 7 สวนมากกวา 1 หลกั แบบแสดงผลสลบั กนั จากตัวอยางที่ 6.1, 6.2 และ 6.3 ที่แสดงในหัวขอที่ 6.1 กลาวถึงการใชงานแอลอีดี 7 สวน เพียง 1 หลัก ซึ่งใชงานขาของบอรด Arduino 7 – 8 ขา ดังนั้นหากเปนการใชงานแอลอีดี 7 สวน จำนวน 2 หลัก หากการใชง านเปน แบบแยกสว นจะตองใชง านขาที่บอรด Arduino สูงถงึ 14 - 16 ขา เนื่องจากบอรด Arduino Uno R3 ซึ่งใชเปนตัวอยางในเอกสารคำสอนนี้มีจำนวนขาใหใช งานนอยมาก การตอใชง านแอลอีดี 7 สวนจำนวน 2 หลกั ข้นึ ไปจึงเปนวิธที ี่ไมเ หมาะสม อยางไรก็ตาม สามารถลดจำนวนการใชงานขาของบอรดเพื่อควบคุมการใชงานแอลอีดี 7 สวนที่มากกวา 1 หลักได โดยการตอใชงานขาของหลอดแอลอีดีแตละสวนรวมกัน และการควบคุมการนำงานจะใชวิธีสั่งให แอลอีดี 7 สวนแสดงผลครั้งละ 1 หลักซึ่งควบคุมโดยการปลอยสัญญาณไปที่ขาคอมมอนของแอลอีดี 7 สวนแตละหลักที่ตอแยกกัน (Don, 2015)

164 รูปที่ 6.11 การตอใชงานแอลอดี ี 7 สวนแบบคอมมอนแคโทดเพ่ือใชงาน 2 หลัก แบบแสดงผลสลับกนั ท่มี า: ผเู ขียน รูปที่ 6.11 คือการนำแอลอีดี 7 สวนแบบคอมมอนแคโทดมาตอใชงาน 2 หลักโดยใชวิธีการ แสดงผลแบบ สลบั กนั โดยจากรปู สังเกตไดวาตำแหนงขาท่ีตรงกันของแอลอดี ี 7 สว นทง้ั 2 หลักจะถูก เชอ่ื มตอ กัน เชนตำแหนง ขา a ของแอลอดี ี 7 สว นทงั้ 2 หลกั ถกู ตอ เช่ือมกนั เปนตน โดยขาคอมมอน ซึ่งจะเปนขาที่ถูกใชสำหรับควบคุมการสลับตำแหนงการแสดงผลจะถูกแยกสวนกัน ดังนั้นการตอใช งานตามรูปท่ี 6.11 มกี ารใชง านขาท่ีบอรด Arduino เหลือเพยี ง 9 ขาเทา นนั้ สำหรับวิธีการควบคมุ คือ มกี ารควบคมุ แอลอีดเี พยี งครง้ั ละ 1 หลกั เทาน้ันโดยหากตองการให หลักใดมีการแสดงผลจะเชื่อมตอขาคอมมอนของตำแหนงขาดังกลาวลงกราวด ในทางกลับกันจะ เชื่อมตอขาคอมมอนของแอลอีดี 7 สวนอีกตัวที่แรงดันขนาด 5 โวลต หรือไมมีการเชื่อมตอใดๆ ที่ ตำแหนงดงั กลา วเพ่ือไมมีการแสดงผลเกดิ ขึน้ รปู ท่ี 6.12 ควบคมุ การแสดงผลแอลอีดี 7 สวนตัวบน ที่มา: ผูเ ขียน

165 รปู ท่ี 6.13 ควบคมุ การแสดงผลแอลอดี ี 7 สวนตัวลา ง ที่มา: ผเู ขยี น รูปที่ 6.12 และ 6.13 แสดงตัวอยางการควบคุมใหแอลอีดี 7 สวนมีสถานะ “ติด” เฉพาะ ตำแหนงขา a ของแตล ะหลัก โดยรูปที่ 6.12 แสดงสถานการณท ำงานเฉพาะตัวบนโดยการเชื่อมตอขา คอมมอนของแอลอีดี 7 สวนตัวบนลงกราวด และปลอยลอยขาคอมมอนของตัวลาง ในทางกลับกัน โดยรูปที่ 6.13 แสดงสถานการณทำงานเฉพาะตัวลางโดยการเชื่อมตอขาคอมมอนของแอลอีดี 7 สว นตัวลา งลงกราวด และปลอยลอยขาคอมมอนของตวั บน หลักการควบคุมใหแอลอีดี 7 สวนทั้ง 2 หลักแสดงผลออกมาเปนรูปแบบที่แตกตางกัน สามารถทำ ไดโดยการเชื่อมตอขาคอมมอนของแอลอีดี 7 สวนกับบอรด Arduino แบบขาตอขา (ขา คอมมอนของแอลอีดี 7 สวนทั้งสองหลักไมไดถูกตอเชื่อมกัน และใชหลักการควบคุมครั้งละ 1 หลัก โดยหลักที่กำลังพิจารณาอยูจะถูกกำหนดใหตำแหนงขาของบอรด Arduino ที่เชื่อมกับขาคอมมอน ของหลักดังกลาวมีสถานะเปน “LOW” และกำหนดรูปแบบการแสดงผลที่ตำแหนงขา a – f โดย กำหนดสถานะ “HIGH” สูขาบอรดที่ถูกเชื่อมตอกับแอลอีดีอีกสวนที่ไมถูกใชงาน และกำหนด ชวงเวลาการแสดงผล เมื่อครบกำหนดชวงเวลาการแสดงผลจะเปล่ียนโหมดการแสดงผลไปยังแอลอีดี อีกหลักที่ยังไมไดถูกพิจารณาโดยการกำหนดสถานะ “LOW” ที่ตำแหนงขาคอมมอนพรอมกำหนด รูปแบบการแสดงผลใหม และเปลี่ยนสถานะที่ขาคอมมอนของแอลอีดี 7 สวนที่พึ่งถูกแสดงผลเปน “HIGH” เพื่อปดการแสดงผลที่หลักดังกลาว และกำหนดชวงเวลาการแสดงผลเพื่อที่จะกลับไป แสดงผลที่ตำแหนง แรก จากหลักการขางตนสังเกตวาหากกำหนดชวงเวลาการแสดงผลของแตละหลักนานเกินไป พบวาเกิดการแสดงผลสลับกันระหวางแอลอีดีทั้ง 2 หลัก แตหากกำหนดชวงของการหนวงเวลาท่ี เหมาะสมคือเกิดการหนวงเวลาระหวางเปลี่ยนการแสดงผลไปหลักตอไป แตชวงเวลาดังกลาวเร็วเกนิ กวาที่สายตามนุษยจะสามารถแยกแยะการสลับตำแหนงได จึงเสมือนวามนุษยเห็นการแสดงผลทั้ง 2 หลักพรอมกัน (Adith, 2015)

166 โดยนอกเหนอื จากการนำแอลอีดี 7 สวน 2 ตัวมาตอใชง านใหอยูในรูปแบบสลบั การแสดงเอง แลว ในโปรแกรม Proteus มีแอลอีดี 7 สวนที่ตอใหทำงานแบบสลับกันอยูเชนกัน โดยสามารถ เลือกใชง านอปุ กรณด ังกลา วดว ยคำคน “7seg-mpx” ซง่ึ จะพบรายการอุปกรณจ ำนวนมาก รูปที่ 6.14 แอลอดี ี 7 สวนแบบคอมมอนแคโทดในโปรแกรม Proteus แบบแสดงผลสลับกนั ทม่ี า: ผเู ขยี น รูปที่ 6.14 แสดงตัวอยางแอลอีดี 7 สวนแบบคอมมอนแคโทดท่ีแสดงผลสลับกัน โดยจากรูป เปน แอลอีดี แบบ 2 หลักและ 4 หลกั รปู ที่ 6.15 รายการแอลอีดี 7 สว นแบบแสดงผลสลับกัน ทัง้ หมดในโปรแกรม Proteus ที่มา: ผูเขียน ตัวอยางที่ 6.4 โปรแกรมหลอดแอลอีดี 7 สว น 2 หลกั แบบสลับการแสดงผลโดยแสดงผลเปนตวั เลข 15 การทำงาน: หลอดแอลอีดี 7 สว นจะแสดงผลออกเปนเลข 15 วธิ ที ำ 1. สวนวงจรทดลอง

167 รปู ท่ี 6.16 วงจรทดลองหลอดแอลอีดี 7 สวนแบบคอมมอนแคโทด แบบ 2 หลกั แสดงผลสลับกนั โดยแสดงผลเปนตวั เลข 15 ท่ีมา: ผเู ขียน คำอธิบาย: ตอหลอดแอลอีดี 7 สวนเขากับพอรต D ของบอรด Arduino โดยตำแหนง a, b, c,…,g ของหลอดแอลอีดี 7 สวนทั้งสองหลอดถูกตอเขากับขาที่ 0 – 7 ตามลำดับ และตอขาคอมมอนของ หลักสิบ (ตวั ซาย) และขาคอมมอนของหลักหนว ย (ตวั ขวา เชือ่ มกับขา 9 และ 8 ของบอรด ตามลำดับ 2. สว นโปรแกรม int dg1 = 9; int dg2 = 8; int num[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; void setup() { DDRD = 0xFF; pinMode(dg1, OUTPUT); pinMode(dg2, OUTPUT); } void loop() { digitalWrite(dg1, LOW); digitalWrite(dg2,HIGH); PORTD = num[1]; delay(15); digitalWrite(dg1, HIGH); digitalWrite(dg2,LOW); PORTD = num[5]; delay(15); }

168 คำอธิบาย: ฟงกชัน Setup(): กำหนดใหพอรต D ทั้งหมดรวมถึงขา 8 และ 9 ทำหนาที่เปนเอาตพุต ฟงกชัน loop(): โปรแกรมแบงเปน 2 สวนโดยแตละสวนถูกแบงดวยฟงกชัน delay() สวน ที่ 1 จะกำหนดใหพอรต D แสดงเลข 1 ที่ขา 9 และสวนท่ี 2 จะกำหนดใหพอรต D แสดงเลข 5 ที่ขา 8 ซึ่งท้ัง 2 สวนนมี้ รี ะยะเวลาแสดงผลส้นั ทำใหสายตามนษุ ยไ มสามารถแบงแยกไดทัง้ จึงเห็นเสมือนวา ทง้ั สองตำแหนง มีการแสดงผลเปน เลข 15 พรอ มกนั รูปท่ี 6.17 ผลการทดลองหลอดแอลอดี ี 7 สว นแบบคอมมอนแคโทด 2 หลกั แสดงผลเปน ตัวเลข 15 ท่มี า: ผเู ขยี น หมายเหตุ: ผูอา นสามารถทดลองเปล่ยี นคำสงั่ ของพอรต D เพื่อเปลยี่ นรูปแบบการแสดงผลเปนตัวเลข อน่ื ๆ 3. การใชงานสวิตซสำหรับควบคุมการทำงานแอลอดี ี 7 สวน หัวขอนี้กลาวถึงการนำสวิตซมาใชเปนอินพุตสำหรับบอรด Arduino เพื่อกำหนดเงื่อนไข สำหรับควบคมุ แอลอดี ี 7 สวน ตวั อยางท่ี 6.5 โปรแกรมหลอดแอลอดี ี 7 ผา นการกดสวิตซ การทำงาน: หลอดแอลอีดี 7 สว นจะแสดงผลออกเปนเลข 0 – 9 โดยจะมกี ารเปลย่ี นแปลงคาผาน การกดสวติ ซ วธิ ที ำ

169 1. สวนวงจรทดลอง รูปท่ี 6.18 วงจรทดลองหลอดแอลอีดี 7 ผา นการกดสวติ ซ ท่ีมา: ผเู ขยี น คำอธิบาย: เชือ่ มตอหลอดแอลอีดี 7 สว นเขากับพอรต D ของบอรด Arduino โดยตำแหนง a, b, c,…,g ของหลอดแอลอีดี 7 สวนถูกตอ เขากับขาที่ 0 – 7 ตามลำดบั และเชื่อมตอสวิตซเ ขาท่ขี า 13 ของบอรด Arduino 2. สวนโปรแกรม int sw = 13; int count = 0; int pulse = 0; int num[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; void setup() { DDRD = 0xFF; pinMode(sw, INPUT); } void loop() { PORTD = num[count]; if(digitalRead(sw) == LOW){ pulse = 1; } if(pulse == 1 && digitalRead(sw) == HIGH){ count++; if(count == 10){ count = 0; }

170 pulse = 0; } } คำอธิบาย: ฟงกชัน setup(): กำหนดใหพอรต D ทั้งหมด ทำหนาที่เปนเอาตพุต และขา 13 ทำหนาที่ เปน อนิ พตุ เพอ่ื รับขอ มูลจากภายนอก (สวิตซ ฟง กชนั loop(): โปรแกรมนจ้ี ะแสดงการนับเลขทม่ี ีการแสดงผลผา นแอลอีดี 7 สวนผา นการ กดสวติ ซ โดยใชเ ทคนคิ การแกป ญหาการเกิดเบาซข องสัญญาณเขา ชวยดว ย 4. บทสรปุ แอลอีดี 7 สวนคือการนำหลอดแอลอีดีมาวางเรียงกันใหอยูในลักษณะที่คลายคลึงกับเลข 8 เพื่อใหสามารถแสดงผลออกมาเปนลักษณะของตัวเลข หรือตัวอักษรบางตัว โดยถูกแบงเปน 2 ประเภทคือคอมมอนแคโทด (Common Cathode) คือขารวมของแอลอีดีจะถูกตอลงกราวด และ หากตองการใหตำแหนงใดมีสถานะติด จะตองสงสถานะ “HIGH” ไปยังตำแหนงดังกลาว และคอม มอนแอโนด (Common Anode) คือขารวมของแอลอีดีจะถูกตอกับแรงดันขนาด 5 โวลต และหาก ตอ งการใหต ำแหนงใดมีสถานะติด จะตองสงสถานะ “LOW” ไปยังตำแหนงดงั กลาว เนอ่ื งจากขอ จำกดั จำนวนขาสำหรับการรับสง สัญญาณระหวา งบอรด Arduino Uno R3 และ อุปกรณภายนอก ดังนั้นการนำแอลอีดี 7 สวนจำนวน 2 ตัวมาเชื่อมตอกับบอรดโดยตรงเพื่อมาใช สำหรับการแสดงผลแบบ 2 หลักจึงไมส ามารถดำเนินการได อยางไรก็ตามสามารถลดจำนวนการใชงานขาของบอรด เพ่ือควบคมุ การใชงานแอลอดี ี 7 สว น ที่มากกวา 1 หลักไดโดยการตอใชงานขาของหลอดแอลอีดีแตละสวนรวมกัน และการควบคุมการนำ งานจะใชวิธีส่ังใหแอลอีดี 7 สวนแสดงผลคร้ังละ 1 หลกั ซงึ่ ควบคุมโดยการปลอยสัญญาณไปท่ีขาคอม มอนของแอลอดี ี 7 สวนแตล ะหลักท่ตี อแยกกัน

171 แบบฝกหัดทายบท บทที่ 6 1. ประโยชนข องแอลอดี ี 7 สวนคืออะไร 2. แอลอดี ี 7 สวนมีกี่ประเภท อะไรบา ง 3. เพื่อใหหลอดแอลอีดีแตละสวนสามารถติดได จำเปนตองใหขาคอมมอนของแอลอีดี 7 สวนแบบ คอมมอนแคโทดมสี ถานะเปน อยา งไร 4. หากนำแอลอีดี 7 สวนจำนวน 3 ตัวมาตอใชงานแบบตอรวมกันจะตองใชงานขาสัญญาณที่บอรด Arduino ทั้งหมดก่ีขา (พจิ ารณาสายขอ มลู เพยี ง 7 เสน ไมน ับจดุ ทศนิยม หรือจดุ องศา) 5. จงหาสถานะของสายสัญญาณแตละตำแหนงเพื่อใหแอลอีดี 7 สวนแบบคอมมอนแคโทดแสดง ผลลัพธเ ปนดงั รูป 6. กำหนดใหส ว น a แทนตำแหนงนัยสำคญั ตำ่ ท่ีสดุ และเรยี งไปจนถงึ สว น g ซง่ึ แทนตำแหนง นัยสำคัญ สงู ทสี่ ดุ จงคำนวณหาผลลพั ธจ ากขอ 5 ในรูปแบบเลขฐานสบิ หก 7. จากรูปขอ 5 หากเปลี่ยนเปนแอลอีดีแบบคอมมอนแอโนด จงคำนวณหาผลลัพธในรูปแบบ เลขฐานสบิ หก 8. จากตวั อยา งท่ี 6.5 จงปรบั โปรแกรมเปน การนับลงคร้งั ละ 1 จงั หวะผานการสัมผสั ปุม

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


Like this book? You can publish your book online for free in a few minutes!
Create your own flipbook