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

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

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

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

Search

Read the Text Version

224 3. การควบคมุ แอลซีดโี หมด 4 บติ จากที่เคยกลาวแลววาถึงแมวา แอลซีดีโหมด 8 บิตจะทำงานไดเร็วกวาโหมด 4 บิต แตโหมด 8 บติ นั้นจำเปน ตองใชส ายสัญญาณถงึ 8 เสนสำหรับเช่ือมตอ ระหวางบอรด Arduino และขาสัญญาณ D0 – D7 ของแอลอีดี ในขณะในโหมด 4 บิตจะใชสายสัญญาณเพียง 4 เสนซึ่งจะชวยลดการใชงาน จำนวนขาสัญญาณของบอรดลงได (เดชฤทธิ์ มณีธรรม, 2559) ดังนั้นในปจจุบันโหมด 4 บิตถึงไดรับ ความนิยมสงู กวา 3.1 ไลบรารี LiquidCrystal นอกเหนือจากนั้นภายในโปรแกรม Arduino IDE ยังมีไลบรารีชื่อ “LiquidCrystal” ซึ่งเปน ไลบรารีสำหรับควบคุมการทำงานแอลซีดีผานการเรียกใชฟงกชันภายในไลบรารีดังกลาว (ประภาส พุมพวง, 2561) จึงชวยใหก ารเขียนโปรแกรมควบคุมการทำงานแอลซีดที ำไดงา ยข้นึ กรณีที่ผูใชงานตองการใชงานไลบรารีของ LiquidCrystal ใหเขาในสวนของ editor ไดโดย เลือกที่ Sketch -> Include Library -> LiquidCrystal ซึ่งจะมีการประกาศไฟลสวนหัว (Header File) ของไลบรารีดงั กลา วที่สวนบนสดุ ของโปรแกรม รูปท่ี 9.9 ไลบรารีสำหรับควบคุมแอลซดี ี ทีม่ า: ผูเ ขยี น

225 รูปที่ 9.10 การประกาศไฟลสวนหัวไลบรารีสำหรบั ควบคุมแอลซีดี ทีม่ า: ผูเ ขียน ภายในไลบรารี LiquidCrystal มฟี งกช ันที่สำคญั สำหรับควบคุมแอลซดี ีอยเู ปนจำนวนมากซึ่ง จะอธิบายฟง กชนั ท่ีนิยมถูกเรียกใชงาน ดังนี้ 3.2 ฟงกช ัน LiquidCrystal() เปนฟงกชันที่ใชสำหรับกำหนดขาของการเชื่อมตอระหวางแอลซีดี และบอรด Arduino ซึ่ง เปนฟงกชันแรกที่จำเปนตองถูกประกาศใชงานเพื่อใหสามารถเรียกใชงานฟงกชันอื่นในไลบรารี LiquidCrystal มีรปู แบบการใชงานเปน ดังน้ี รูปแบบ LiquidCrystal ช่อื ออ็ บเจค(RS, RW, E, D4, D5, D6, D7) หรือ LiquidCrystal ชือ่ ออ็ บเจค(RS, E, D4, D5, D6, D7) พารามเิ ตอร 1. RS คอื ตำแหนงขาของบอรด Arduino ท่ีเช่อื มกบั ขา RS ของแอลซดี ี 2. RW คือ ตำแหนงขาของบอรด Arduino ที่เชื่อมกับขา R/W ของแอลซดี ี 3. E คอื ตำแหนงขาของบอรด Arduino ทเี่ ชอื่ มกบั ขา E ของแอลซดี ี 4. D4 – D7 ตำแหนงขาของบอรด Arduino จำนวน 4 ขาที่เชื่อมกับขา D4 – D7 ของแอล ซีดี

226 หลงั จากประกาศฟงกชัน LiquidCrystal() เรยี บรอ ยแลวสามารถเรียกใชงานฟงกชนั อ่ืนๆ ใน ไลบรารี LiquidCrystal โดยทุกฟงกชันในไลบรารีดังกลาวจะตองเรียกผานออบเจ็คที่ถูกสรางใน ฟงกชัน LiquidCrystal() 3.3 ฟงกชนั begin() เปนฟงกชันที่ใชสำหรับกำหนดอินเตอรเฟสสำหรับการใชงานแอลซีดี ซึ่งควรจะตองตรงกับ คณุ ลกั ษณะของแอลซีดที ถี่ ูกนำมาใชงาน รปู แบบ ชอ่ื ออบเจ็ค.begin(cols, rows) พารามิเตอร 1. cols คือ จำนวนคอลมั นของแอลซีดี หรอื จำนวนตวั อักขระท้ังหมดที่สามารถแสดงไดใน 1 บรรทัด 2. rows คือ จำนวนแถวของแอลซีดี 3.4 ฟงกชัน print() เปนฟง กชันที่ใชสำหรับแสดงขอความทแ่ี อลซีดี รูปแบบ ช่ือออบเจค็ .print(data) หรอื ชือ่ ออบเจ็ค.print(data, base) พารามิเตอร 1. data คอื ขอมูลที่จะถูกนำมาแสดงที่แอลซดี ี 2. base คือ เลขฐานกรณีท่แี สดงตวั เลขที่แอลซีดี

227 ตัวอยา งท่ี 9.2 การแสดงขอความบนแอลซีดี การทำงาน: แสดงขอ ความ “Hello World!” บนแอลซดี ี วธิ ที ำ 1. สว นวงจรทดลอง รูปท่ี 9.11 วงจรทดลองการแสดงขอความบนแอลซดี ีโหมด 4 บิต ที่มา: ผูเ ขียน คำอธิบาย: ท่ีหลอดแอลซดี ีมีการกำหนดตำแหนง ขาท่เี ชือ่ มตอ กบั บอรด Arduino ดังน้ี 1. ขา E ของแอลซดี เี ชื่อมตอกบั ตำแหนงขาที่ 11 ของบอรด Arduino 2. ขา RS ของแอลซดี เี ชื่อมตอกับ ตำแหนงขาที่ 12 ของบอรด Arduino 3. ขา RW ของแอลซดี เี ชื่อมตอกับกราวด 4. ขา D4 ของแอลซดี เี ชอื่ มตอกับ ตำแหนง ขาที่ 5 ของบอรด Arduino 5. ขา D5 ของแอลซีดเี ช่อื มตอกับ ตำแหนง ขาที่ 4 ของบอรด Arduino 6. ขา D6 ของแอลซดี ีเชื่อมตอกับ ตำแหนง ขาที่ 3 ของบอรด Arduino 7. ขา D7 ของแอลซีดีเชอ่ื มตอกับ ตำแหนงขาที่ 2 ของบอรด Arduino 2. สวนโปรแกรม #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.print(\"hello, world!\"); } void loop() { }

228 คำอธิบาย: เนื่องจากมีการควบคุมแอลซีดี ดังนั้นจึงตองมีการเรยี กใชง านไลบรารี LiquidCrystal ซ่ึง ประกาศไวทส่ี ว นบนสดุ ของโปรแกรม และจำเปนตองกำหนดตำแหนงขาตาง ๆ ของแอลซีดที เ่ี ชื่อมกับ บอรด Arduino ใหตรงกับการเช่อื มตอจริง ฟงกชัน Setup(): กำหนดใหมีการควบคุมแอลซีดขี นาด 2 แถว 16 คอลัมน และกำหนดให แสดงขอความ “Hello World!” ออกที่แอลซีดี เนื่องจากไมมีการกำหนดตำแหนงการแสดงผล ผลลัพธจ งึ ถกู แสดงท่ตี ำแหนงเร่ิมตน คอื ตำแหนงบนซายของแอลซดี ี (แถวที่ 0 และคอลัมนท่ี 0 ฟง กชนั loop(): - 3. ผลการทดลอง รปู ที่ 9.12 ผลการทดลองการแสดงขอความบนแอลซีดี ทม่ี า: ผูเขียน 3.5 ฟง กช นั setCursor() เปน ฟง กช นั ที่ใชส ำหรบั กำหนดตำแหนง ของเคอรเซอรเ พื่อเปน ตำแหนงท่จี ะแสดงตวั ขระ รปู แบบ ชอ่ื ออบเจค็ .setCursor(col, row) พารามิเตอร 1. col คือ ตำแหนงทถ่ี ูกกำหนดเปน ตำแหนงคอลัมนปจจุบันของเคอรเ ซอร 2. row คอื ตำแหนง ที่ถูกกำหนดเปน ตำแหนง แถวปจ จุบนั ของเคอรเ ซอร

229 ตัวอยา งท่ี 9.3 การแสดงขอความบนแอลซีดีแบบกำหนดตำแหนง การทำงาน: แสดงขอ ความ “Hello World!” บนแอลซดี ี วธิ ีทำ 1. สวนวงจรทดลอง: เชื่อมตออปุ กรณภายนอก เขากับบอรด Arduino ดังตัวอยา งที่ 9.2 2. สวนโปรแกรม #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.setCursor(4, 1); lcd.print(\"hello, world!\"); } void loop(){ } คำอธิบาย: ฟงกชัน Setup(): ตัวอยางนี้คลายกับตวั อยางที่ 1 โดยมีความแตกตางกันเพียงตัวอยางที่ 2 นี้จะมีการกำหนดตำแหนงการแสดงผลท่ีแอลซีดี โดยใหตำแหนงเริ่มตนอยูแถวที่ 1 (บรรทัดที่ 2 เนือ่ งจากบรรทดั แรกคอื แถวท่ี 0) คอลัมนท่ี 4 ฟง กชัน loop(): - 3. ผลการทดลอง รูปที่ 9.13 ผลการทดลองการแสดงขอ ความบนแอลซีดี ทม่ี า: ผเู ขยี น

230 3.6 ฟงกชัน cursor() เปนฟง กช นั ที่ใชสำหรบั กำหนดใหเ ปดการแสดงเคอรเซอรแ บบติดนิ่ง รูปแบบ ชอ่ื ออบเจ็ค.cursor() 3.7 ฟงกช นั noCursor() เปน ฟงกช นั ท่ใี ชสำหรับกำหนดใหปดการแสดงเคอรเ ซอรแบบติดน่ิง รปู แบบ ชือ่ ออบเจ็ค.noCursor() 3.8 ฟง กช นั blink() เปน ฟง กชนั ท่ใี ชสำหรับกำหนดใหเ ปดการแสดงเคอรเ ซอรแบบบล็อคติดกระพรบิ รูปแบบ ชื่อออบเจ็ค.blink() 3.9 ฟง กชัน noBlink() เปนฟงกช ันทีใ่ ชสำหรับกำหนดใหปด การแสดงเคอรเ ซอรแบบบล็อคตดิ กระพรบิ รปู แบบ ชื่อออบเจ็ค.noBlink()

231 ตัวอยางท่ี 9.4 การเปด การแสดงเคอรเ ซอรแ บบตดิ นิง่ การทำงาน: แสดงขอ ความชุดเดียวกันกับตวั อยางท่ี 9.3 แตมีการเปดการแสดงเคอรเ ซอร วิธที ำ 1. สว นวงจรทดลอง: เช่ือมตออปุ กรณภ ายนอก เขา กบั บอรด Arduino ดงั ตัวอยางท่ี 9.2 2. สวนโปรแกรม #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.setCursor(2, 1); lcd.print(\"hello, world!\"); lcd.cursor(); } void loop() { } คำอธิบาย: ฟง กช ัน Setup(): ตัวอยางนีม้ ีรูปแบบการทำงานคลา ยตวั อยา งที่ 9.3 เพียงแตม สี ว นเพิม่ เติม คอื เปดการแสดงเคอรเ ซอรแ บบติดน่งิ ฟงกช นั loop(): - 3. ผลการทดลอง รปู ที่ 9.14 ผลการทดลองการแสดงขอ ความบนแอลซดี ที ี่มี การแสดงเคอรเ ซอรแบบติดน่ิง ทีม่ า: ผูเขียน

232 จากรูปท่ี 9.14 สงั เกตไดวา สญั ญาณของเคอรเ ซอรเ ปน แบบเสนตรงและแสดงแบบติดน่ิง อยางไรก็ตามจากสวนของโปรแกรมตัวอยางที่ 9.4 หากทดลองเปลี่ยนจากฟงกชัน cursur() เปน blink() จะพบวารปู แบบการแสดงผลจะเปลีย่ นเปนลักษณะท่เี ปนแบบสญั ญาณแบบติดกระพริบ 3. ผลการทดลอง (กรณเี ปลยี่ นจากฟง กช นั cursur() เปน blink()) รปู ที่ 9.15 ผลการทดลองการแสดงขอความบนแอลซีดีที่มี การแสดงเคอรเ ซอรแบบตดิ กระพริก ทีม่ า: ผเู ขยี น ตวั อยา งท่ี 9.5 การประยกุ ตใชง านเคอรเซอรแ บบติดนงิ่ ใหมีการแสดงผลแบบสญั ญาณกระพรบิ การทำงาน: มกี ารกระพรบิ ของเคอรเ ซอรแ บบติดนิ่ง วธิ ที ำ 1. สวนวงจรทดลอง: เชื่อมตออุปกรณภายนอก เขากับบอรด Arduino ดงั ตัวอยางท่ี 9.2 2. สวนโปรแกรม #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.print(\"hello, world!\"); } void loop(){ lcd.noCursor(); delay(100); lcd.cursor(); delay(100);

233 } คำอธิบาย: ฟงกชัน Setup():กำหนดใหมีการควบคุมแอลซีดีขนาด 2 แถว 16 คอลัมน และกำหนดให แสดงขอความ “Hello World!” ออกท่ีแอลซีดี เนื่องจากไมมีการกำหนดตำแหนงการแสดงผล ผลลพั ธจงึ ถกู แสดงท่ีตำแหนงเรม่ิ ตน คอื ตำแหนง บนซา ยของแอลซดี ี (แถวที่ 0 และคอลมั นที่ 0 ฟงกชัน loop(): กำหนดใหแสดงเคอรเซอรดวยคำสั่ง และไมแสดงเคอรเซอรสลับกันดวย การหนวงเวลา จงึ ทำใหผลการทำงานเปรียบเสมือนการกระพริบของสัญญาณเคอรเซอร 3.10 ฟง กช นั clear() เปน ฟงกชันที่ใชสำหรบั การเคลยี รท ห่ี นาจอแอลซีดี รูปแบบ ชือ่ ออบเจ็ค.clear() ตวั อยางท่ี 9.6 การแสดงขอความแบบชวั่ คราว การทำงาน: มกี ารแสดงขอ ความ “Hello World” 1 วินาที กอ นทจ่ี ะมีการเคลียรหนา จอ วธิ ีทำ 1. สว นวงจรทดลอง: เช่ือมตออุปกรณภ ายนอก เขากับบอรด Arduino ดังตัวอยางท่ี 9.2 2. สวนโปรแกรม #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); } void loop() { lcd.print(\"Hello world!\"); delay(1000); lcd.clear(); while(1); }

234 คำอธิบาย: ฟงกช ัน Setup():กำหนดใหมกี ารควบคุมแอลซดี ขี นาด 2 แถว 16 คอลมั น ฟงกชัน loop(): กำหนดใหแสดงขอความ “Hello World!” ออกท่ีแอลซีดี และมีการ เคลียรหนา จอดวยคำสั่ง lcd.clear( และใหเ คลยี รแบบถาวรดว ยคำสงั่ while(1 ตัวอยา งท่ี 9.7 การนับเลข 1 หลักแสดงผลผานแอลซดี ี การทำงาน: ท่แี อลซดี จี ะแสดงการนบั เลข 0 – 9 โดยมกี ารชวงเวลา 100 มลิ ลวิ นิ าทีตอการนับ 1 ครงั้ วธิ ที ำ 1. สว นวงจรทดลอง: เชื่อมตออุปกรณภายนอก เขากับบอรด Arduino ดงั ตวั อยางที่ 9.2 2. สว นโปรแกรม #include <LiquidCrystal.h> int num = 0; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); } void loop() { lcd.clear(); lcd.setCursor(0,0); lcd.print(num); num++; if(num > 9){ num = 0; } delay(100); } คำอธิบาย: มีการประกาศตัวแปร num ภายนอกฟงกชันที่มีคาเริ่มตนเปน 0 เพื่อใชเปนตัวแปร สำหรบั การนับคา ฟงกชัน Setup():กำหนดใหม กี ารควบคุมแอลซดี ีขนาด 2 แถว 16 คอลมั น ฟงกชัน loop(): มีการแสดงคาตัวแปร num คาปจจุบันผานแอลซีดี ซึ่งในทุก ๆ 1 มลิ ลิวินาทตี วั แปร num จะถกู เพิ่มขึน้ คร้งั ละ 1 คาและเมอื่ มีคามากกวา 9 จะถูกกำหนดคาใหมใหเปน 0 โดยจะแสดงผลในตำแหนง แถวที่ 0 และคอลัมนที่ 0

235 3. ผลการทดลอง รปู ที่ 9.16 ผลการทดลองการนับเลข 1 หลักแสดงผลผา นแอลซีดี ท่ีมา: ผเู ขียน 3.11 ฟงกชัน home() เปนฟงกชันที่ใชสำหรับกำหนดเคอรเซอรกลับไปอยูตำแหนงเริ่มตน (ตำแหนงบนทาง ดา นซา ย รูปแบบ ชือ่ ออบเจ็ค.home() 3.12 ฟง กชัน leftToRight() เปนฟงกชันทีใ่ ชสำหรับการเลื่อนเคอรเซอรไปทางขวา โดยหากมีการใชค ำสั่งการแสดงผลจะ แสดงผลตำแหนง แรกตรงกับตำแหนง ปจจุบนั ของเคอรเ ซอร รปู แบบ ช่ือออบเจ็ค.leftToRight() 3.13 ฟงกชนั rightToLeft() เปน ฟงกชนั ที่ใชส ำหรับการเลื่อนเคอรเ ซอรไปทางซาย โดยหากมกี ารใชคำส่ังการแสดงผลจะ แสดงผลตำแหนงแรกตรงกบั ตำแหนงปจ จบุ ันของเคอรเซอร

236 รูปแบบ ชือ่ ออบเจค็ .rightToLeft() ตวั อยา งที่ 9.6 ทดสอบการแสดงการพิมพขอความจากขวาไปซาย การทำงาน: มีการแสดงขอ ความ “Hello World” และถูกเขยี นแทนดว ย “a” ในทกุ ๆ 200 มลิ ลิวนิ าทจี ำนวน 12 ตัวอักษร วิธที ำ 1. สว นวงจรทดลอง: เชื่อมตออปุ กรณภายนอก เขา กบั บอรด Arduino ดังตัวอยา งที่ 9.2 2. สว นโปรแกรม #include <LiquidCrystal.h> int count = 12; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.print(\"hello, world!\"); } void loop() { if(count > 1){ lcd.rightToLeft(); lcd.print(\"a\"); delay(200); count--; } } คำอธิบาย: มกี ารประกาศตวั แปรภายนอกฟง กชันคือ count ซง่ึ เปน ตัวแปรสำหรับนบั จำนวนคร้งั การ แทนคาตวั อกั ษรจากขวาไปซา ย ฟงกชัน Setup():กำหนดใหมีการควบคุมแอลซีดีขนาด 2 แถว 16 คอลัมน และแสดง ขอ ความ “hello, world!” ออกทางแอลซีดี ฟงกชัน loop(): กำหนดให แตละตัวอักษรที่แสดงผลอยู (hello, world!) ถูกแทนดวย ตัวอักษร “a” เริ่มจากตำแหนงขวาสุดไปทางซายในทุกๆ 200 มิลลิวินาทีจำนวน 12 ตัวอักษร

237 เนื่องจากความยาวของประโยคตนฉบับคือ 13 (จำนวนตัวอักษร แตมีการแทนคาตัวอักษรเพียง 12 ตัวอักษร เพราะฉะนั้นผลลพั ธส ดุ ทา ยคอื “haaaaaaaaaaaa” 3. ผลการทดลอง รปู ท่ี 9.17 ผลการทดลองการแทนคาดว ยตัวอักษร “a” จากขวาไปซาย ระหวางดำเนนิ งาน ท่ีมา: ผเู ขยี น รูปที่ 9.18 ผลการทดลองการแทนคา ดวยตวั อักษร “a” จากขวาไปซาย ท่เี ปน ผลลพั ธสดุ ทาย ทม่ี า: ผูเขยี น

238 4. บทสรปุ แอลซดี ี (LCD ยอ มาจาก Liquid Crystal Display) คืออุปกรณที่ใชสำหรบั แสดงผลตัวอักษร ตัวเลข และภาพกราฟฟกอยางงาย โดยแอลซีดีเปนอุปกรณที่ใชสายสัญญาณนอย แตสามารถแสดง ตัวอักษรไดเปนจำนวนมากเมื่อเปรียบเทียบกับแอลอีดีแบบเมตริกซ โดยเหมาะที่จะนำไวใชสำหรับ การแสดงผลการทดลองตางๆ ที่ไมมุงเนนความสวยงามเชน แสดงผลลัพธของคาที่อานไดจาก เซ็นเซอร การควบคุมแอลซีดีสามารถดำเนินการได 2 วิธีคือ การสงขอมูลจากบอรด Arduino ไปยัง แอลซีดีแบบ 4 บติ ซึ่งจะใชสายสัญญาณเพยี ง 4 เสน และการสงขอ มลู จากบอรด Arduino ไปยังแอล ซีดี 8 บิต ซึ่งจำเปนตองใชสายสัญญาณท้ังหมด 8 เสน สำหรับวิธีการควบคุมการทำงานจะคลา ยคลึง กันเพียงแตจะมีความแตกตางกันตรงที่โหมด 8 บิตจะรับ-สงขอมูลไดเร็วกวา 4 บิต อยางไรก็ตาม ถึงแมจะรับ-สงขอมูลไดเร็วกวาโหมด 4 บิต แตจากความเร็วในการรับสงที่แตกตางกันไมมาก และ โหมด 4 บิตยังคงสามารถแสดงผลไดทันจากการสังเกตดวยสายตามนุษย ดังนั้นโหมด 4 บิตที่ซึ่งใช สายสัญาณนอยกวาจงึ เปนท่นี ยิ มมากกวา โปรแกรม Arduino IDE มีไลบรารีชื่อ \"LiquidCrystal\" ซึ่งเปนไลบรารีสำหรับควบคุมการ ทำงานแอลซีดีแบบ 4 บิต ผานการเรียกใชฟงกชันที่มีอยูภายในไลบรารีดังกลาว จึงชวยใหการเขียน โปรแกรมควบคมุ การทำงานแอลซดี ีทำไดง ายขน้ึ

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

240 เอกสารอางอิง ดอนสัน ปงผาบ และ ทิพวัลย คำน้ำนอง. (2557). ไมโครคอนโทรลเลอร PIC และการประยุกตใช งาน. กรุงเทพฯ: สำนักพิมพ ส.ส.ท. เดชฤทธิ์ มณีธรรม. (2559). คัมภีรการใชงาน ไมโครคอนโทรลเลอร Arduino. กรุงเทพฯ: ซีเอ็ด ยูเคชน่ั . ประภาส พุมพวง. (2561). การเขียนและการประยุกตใชงานโปรแกรม Arduino. กรุงเทพฯ: ซีเอ็ด ยูเคชนั่ . Adith, J. B. (2015). Arduino by Example. Birmingham: Packt Publishing Ltd. Davis II, R.J. (2013). Arduino LCD Projects. United States: CreateSpace Independent Publishing Platform.

แผนบรหิ ารการสอนประจำบทท่ี 10 การควบคมุ มอเตอร หัวขอเน้อื หา 1. มอเตอรด ีซี 2. สเตป็ มอเตอร 2.1 การควบคมุ สเต็ปมอเตอรแบบ 1 เฟส 2.2 การควบคมุ สเตป็ มอเตอรแบบ 2 เฟส 2.3 การควบคุมสเตป็ มอเตอรแบบคร่ึงจังหวะ 3. เซอรโ วมอเตอร 3.1 ฟงกชนั attach() 3.2 ฟง กช นั write() 3.3 ฟง กชัน writeMicroseconds() 3.4 ฟง กช นั read() 3.5 ฟงกช นั attached() 3.6 ฟง กชัน detach() 4. บทสรปุ แบบฝกหัดทายบท เอกสารอางอิง วัตถปุ ระสงคเ ชงิ พฤติกรรม เมอ่ื ผเู รียน เรยี นจบบทนี้แลว ผเู รยี นควรมคี วามสามารถ ดังนี้ 1. อธิบายเกี่ยวกับการทำงานของมอเตอรดีซีได 2. อธิบายเก่ยี วกับการทำงานสเต็ปมอเตอรไ ด 3. อธิบายเกย่ี วกับการทำงานเซอรโวมอเตอรได 4. เลอื กใชฟ งกช นั ที่อยูใ นไลบรารี Servo ในโปรแกรม Arduino IDE เพอ่ื ควบคุมเซอรโ ว มอเตอรได 5. เขียนโปรแกรมควบคุมกำทำงานของมอเตอรแ ตล ะประเภทได 6. มีความตั้งใจในการเรยี นและการฝก ปฏิบตั กิ ารเขียนโปรแกรม

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

บทท่ี 10 การควบคุมมอเตอร มอเตอร คอื อุปกรณไฟฟา ชนดิ หน่ึงทใ่ี ชส ำหรบั เปลยี่ นพลังงานไฟฟา เปนพลงั งานกลที่นิยมถูก นำมาใชเปนสวนหนึ่งของอุปกรณไฟฟาจำนวนมาก เชน พัดลม เครื่องปมน้ำ หรือ เครื่องตัดหญา ไฟฟา เปน ตน (John, Josh & Harald, 2011) มอเตอรถ กู แบง เปน 2 ประเภทคอื มอเตอรก ระแสตรง และมอเตอรกระแสสลับ สำหรบั ในบท น้ีจะกลา วเพยี งการใชง านมอเตอรกระแสตรงรวมกบั ไมโครคอนโทรเลอรเทานัน้ รปู ที่ 10.1 มอเตอรก ระแสตรง ท่ีมา: ผูเ ขยี น โดยทั่วไปหากเปรียบเทียบกับอุปกรณภายนอกที่ถูกกลาวมาในบทที่ 4 – 9 ซึ่งถูกนำมา เชื่อมตอกับบอรด Arduino ซ่งึ ลวนแตเ ปนอุปกรณท ่ีกินกระแสนอย อยา งไรกต็ ามมอเตอรคืออุปกรณ ไฟฟาที่กินกระแสสูงมาก ดังนั้นจึงจำเปนตองใชอุปกรณขับ (Driver เพื่อใชสำหรับจายแรงดัน และ กระแสที่สูงได (ประภาส พุมพวง, 2561) โดยการสรางอุปกรณขับมีหลากหลายวิธี เชน ใชวงจร ทรานซิสเตอร หรือ ใชไอซีสำเร็จรูป เปนตน สำหรับบทนี้เลือกไอซีเบอร ULN2003A ซึ่งเปนไอซี สำเร็จรปู สำหรับเพมิ่ แรงดัน และกระแสแกมอเตอร

244 รปู ท่ี 10.2 ไอซีเบอร ULN2003A ท่มี า: Omar, Shahnawaz & Zainulabideen, 2012 รปู ท่ี 10.2 แสดงตัวอยางไอซี ULN2003A IN 1 1 16 OUT 1 IN 2 2 IN 3 3 15 OUT 2 IN 4 4 14 OUT 3 IN 5 5 IN 6 6 13 OUT 4 IN 7 7 12 OUT 5 GND 8 11 OUT 6 10 OUT 7 9 Commond Free รูปที่ 10.3 โครงสรา งไอซีเบอร ULN2003A ท่มี า: ผเู ขยี น รูปที่ 10.3 แสดงโครงสรางของไอซีเบอร ULN2003A โดยภายในไอซีน้ีบรรจุอินเวอรเตอร เกตจำนวน 7 ตัวซึ่งสามารถทนแรงดันไดสูงถึง 50 โวลต และสำหรับแตละขาสามารถทนกระแสได สูงสุดถึง 500 มิลลิแอมแปร นอกเหนือจากนั้นที่ขาเอาตพุตของอินเวอรเตอรแตละตัวถูกเชื่อมตอกับ ไดโอดเพอ่ื ปอ งกนั การไหลยอ นกลับของแรงดนั จากอปุ กรณเ อาตพตุ

245 รปู ที่ 10.4 ไอซเี บอร ULN2003A ในโปรแกรม Proteus ที่มา: ผเู ขียน รูปที่ 10.4 แสดงตัวอยางไอซีเบอร ULN2003A ในโปรแกรม Proteus ซึ่งสามารถคนหาได โดยใชคำคน “ULN2003A” นอกเหนือจากไอซี ULN2003A ซึ่งใชสำหรับขับกระแสและแรงดันแลว อุปกรณ อิเล็กทรอนิกสอีกชนิดหนึ่งที่จำเปนตองถูกนำมาใชสำหรับควบคุมการทำงานของมอเตอรคือ รีเลย (Relay ซึ่งเปนอุปกรณไฟฟาที่ทำหนาที่สำหรับเปลี่ยนพลังงานไฟฟาเปนพลังงานแมเหลก็ ที่สามารถ นำมาใชส ำหรบั การเปด – ปด หนา สมั ผัสสำหรับวงจรของมอเตอร รปู ที่ 10.5 รีเลย ทีม่ า: ผูเขยี น รูปท่ี 10.5 แสดงตัวอยา งของวงจรรีเลยจำนวน 4 ตัว

246 รปู ท่ี 10.6 รเี ลยในโปรแกรม Proteus ท่ีมา: ผูเขยี น รูปที่ 10.6 แสดงตัวอยางรีเลยในโปรแกรม Proteus โดยสามารถคนหาไดโดยใชคำคน “Relay” 1. มอเตอรด ซี ี มอเตอรดีซี (DC Motor คอื มอเตอรก ระแสตรงซึ่งมใี หเ ลือกใชงานอยูหลายขนาด โดยตองใช แรงดนั อยางนอ ย 12 โวลตซ งึ่ ขน้ึ อยูกับขนาดของมอเตอร มอเตอรดีซีมีขาสำหรับตอใชงานทั้งหมด 2 ขา โดยวิธีการควบคุมใหมอเตอรหมุนคือจาย ไฟฟากระแสตรงเขาขาขางหนึ่ง สวนขาอีกขางจะถูกตอกราวดเพื่อใหเกิดความตางศักยระหวางข้ัว มอเตอรจึงสงผลใหเกิดการหมุนของมอเตอรขึ้น (ดอนสัน ปงผาบ, 2560) ในทางกลับกันหากสลับ ตำแหนงการเชื่อมตอที่ขาของมอเตอรคือจายไฟฟากระแสตรงที่ขาอีกขาง (ขาที่ตอกราวด และสลับ ขาที่ถูกตอกับไฟฟากระแสตรงมาตอกราวดสงผลใหมอเตอรหมุนในทิศทางตรงกันขาม อยางไรก็ตาม หากเชื่อมตอสัญญาณลักษณะเดียวกันกับทั้ง 2 ขาของมอเตอร เชน ตอขาทั้งสองขางลงกราวด หรือ ตอ ไฟฟากระแสตรงที่ขาทัง้ สองของมอเตอรดีซี จะไมมกี ารหมุนเกดิ ขนึ้ รูปที่ 10.7 มอเตอรดีซใี นโปรแกรม Proteus ท่ีมา: ผเู ขยี น รูปที่ 10.7 แสดงตัวอยางรีเลยในโปรแกรม Proteus โดยสามารถคนหาไดโดยใชคำคน “motor-dc”

247 ตวั อยางที่ 10.1 การควบคุมการทำงานของมอเตอรใหหมุนในทศิ ทวนเข็มนากิ า การทำงาน: มอเตอรหมุนในทศิ ทวนเข็มนาิกา วิธีทำ 1. สว นวงจรทดลอง. รูปท่ี 10.8 วงจรทดลองการควบคมุ การทำงานของมอเตอร ใหห มุนในทิศทวนเข็มนาิกา ทม่ี า: ผูเขียน คำอธิบาย: ตอวงจรรีเลยเขากับขาทั้ง 2 ขางของมอเตอรซึ่งถูกเชื่อมตอกับบอรด Arduino ผานไอซี เบอร ULN2003A ซงึ่ ชว ยใหกระแสคงที่ และปองกนั การไหลยอ นกลบั ของกระแสไฟจากมอเตอร โดย การตอเปนดังน้ี ขาซา ย เช่ือมตอ กับตำแหนง ขาที่ 12 ของบอรด Arduino ขาขวา เชอื่ มตอ กบั ตำแหนงขาท่ี 13 ของบอรด Arduino 2. สว นโปรแกรม int motorLeft = 12; int motorRight = 13; void setup() { pinMode(motorLeft, OUTPUT); pinMode(motorRight, OUTPUT); } void loop() { digitalWrite(motorLeft, HIGH); digitalWrite(motorRight, LOW); delay(100);

248 digitalWrite(motorLeft, LOW); digitalWrite(motorRight, LOW); delay(100); } คำอธิบาย: กำหนดตัวแปรภายนอกฟงกชัน motorLeft สำหรับควบคุมการหมุนตำแหนงขาซา ยของ มอเตอร และ motorRight สำหรับความคมุ การหมุนตำแหนงขาขวาของมอเตอร ฟง กช ัน Setup(): กำหนดใหตวั แปร motorLeft และ motorRight มสี ถานะเปนเอาตพตุ ฟงกชัน loop(): กำหนดใหมอเตอรมีการหมุนในทิศทวนเข็มนาิกาโดย motorLeft = 1 และ motorRight = 0 โดยมีการควบคุมความเร็วดวยการสลับกับการใหมอเตอรหยุดหมุนซึ่งมีการ หนว งเวลาระหวา งการหมุนและหยุดหมนุ 100 มิลลิวินาที หมายเหตุ: 1. สามารถปรับความเร็วของมอเตอรไดโดยการปรับคาพารามิเตอรของฟงกชันของการ หนวงเวลา โดยหากตองการใหมอเตอรหมุนเรว็ ใหปรับคาการหนวงเวลาของการหมุนมอเตอรใ หนาน ขน้ึ หรอื ลดฟง กชนั การหนวงเวลาของการหยุดหมุนมอเตอรใ หนอยลง หรือดำเนินการทง้ั สองกรณี แต หากตองการใหมอเตอรหมุนชาลงสามารถทำไดโดยการกำหนดสถานะที่ตรงกันขามกับการเพ่ิม ความเรว็ ของมอเตอร 2. กรณีตองการเปลี่ยนทิศทางการหมุนของมอเตอรสามารถทำไดโดยกำหนดคา motorLeft และ motorRight ใหมีสถานะตรงขามกับการหมุนทวนเข็มนาิกา นั่นคือ motorLeft = 0 และ motorRight = 1 ตัวอยา งที่ 10.2 การเปลย่ี นทิศการหมุนของมอเตอร การทำงาน: มอเตอรจ ะมีการเปลยี่ นทศิ ทางการหมนุ ในทุก 10 วนิ าที วิธีทำ 1. สวนวงจรทดลอง.: เช่ือมตออุปกรณภายนอกเขากับบอรด Arduino ดงั ตัวอยา งที่ 10.1 2. สว นโปรแกรม int motorLeft = 12; int motorRight = 13; int status = 1; void setup() { pinMode(motorLeft, OUTPUT);

249 pinMode(motorRight, OUTPUT); } void loop() { if(status == 0){ for(int i=0;i<5;i++){ digitalWrite(motorLeft, LOW); digitalWrite(motorRight, HIGH); delay(500); digitalWrite(motorLeft, LOW); digitalWrite(motorRight, LOW); delay(1500); } status = 1; } else{ for(int i=0;i<5;i++){ digitalWrite(motorLeft, HIGH); digitalWrite(motorRight, LOW); delay(500); digitalWrite(motorLeft, LOW); digitalWrite(motorRight, LOW); delay(1500); } status = 0; } } คำอธิบาย: ภายนอกฟงกชันมีการประกาศตัวแปรเพิ่มจากตัวอยางที่ 10.1 อีก 1 ตัวแปร คือตัวแปร status เปนตัวแปรที่ใชกำหนดสถานะ การหมุนของมอเตอรที่จะมีการเปลี่ยนทิศทางการหมุนในทุก 10 วนิ าที ฟงกชัน Setup():กำหนดใหต ัวแปร motorLeft และ motorRight มีสถานะเปนเอาตพุต ฟงกชัน loop():กำหนดใหมีการหมุนในแตละทิศทางเปนระยะเวลา 10 วินาที โดย กำหนดใหมกี ารวนรอบการทำงาน 5 รอบสำหรับแตละทิศทาง เนื่องจากในแตละรอบการทำงานจะใช เวลา 2 วินาที (1500 มิลลิวินาทีสำหรับการหยุดหมุนของมอเตอร และ 500 มิลลิวินาทีสำหรับการ หมุนของแตละทศิ ทางสำหรบั แตล ะรอบการทำงานของมอเตอร

250 2. สเตป็ มอเตอร สเต็ปมอเตอร (Stepping Motor คือมอเตอรชนิดหนึ่งที่สามารถควบคุมจังหวะ และทิศ ทางการหมุนได โดยผูใชงานสามารถควบคุมมุมองศาของการหมุนได เนื่องจากสเต็ปมอเตอรจะหมุน เปนจังหวะ แตอยางไรก็ตามมุมที่หมุนตอการหมุน 1 จังหวะจะขึ้นอยูกับโครงสรางของสเต็ปมอเตอร แตละชนดิ ซึ่งมีจงั หวะการหมนุ ท่แี ตกตา งกนั รูปที่ 10.9 สเตป็ มอเตอร ที่มา: ทีมงานสมารท เลิรนนง่ิ , 2554 โดยทั่วไปสเต็ปมอเตอรจะเปนแบบชนิด 4 เฟส และมีขดลวดอยู 2 ชุด ซึ่งแตละชุดจะถูก แบง เปนชดุ ละ 2 เฟส นอกเหนอื จากนั้นขดลวดแตล ะชุดจะมีจดุ รวมอยู 1 จดุ ดงั นน้ั สเต็ปมอเตอรจึงมี สายสัญญาณทั้งหมด 6 เสน อยางไรก็ตามสเต็ปมอเตอรบางประเภทอาจมีสายสัญญาณเพียง 5 เสน เนอ่ื งจากมกี ารนำจดุ รวมมาเชอื่ มตอกัน รปู ที่ 10.10 สเต็ปมอเตอรใ นโปรแกรม Proteus ทมี่ า: ผูเ ขยี น รูปที่ 10.10 แสดงตัวอยางสเต็ปมอเตอรในโปรแกรม Proteus โดยสามารถคนหาไดโดยใช คำคน “motor-stepper” โดยผูใชงานสามารถกำหนดมุมการหมุนสำหรับการหมุนสเต็ปมอเตอรใน 1 จังหวะโดยการคลิกเมาสขวาที่สเต็ปมอเตอรจะพบหนาตาง “Edit Component” และเลือก กำหนดมุมทีต่ องการไดในสว นของ “Step Angle”

251 รปู ที่ 10.11 แสดงตวั อยางการกำหนดมุมใหสเต็ปมอเตอร โดยจากตวั อยา งคือกำหนดใหการ หมุนของสเต็ปมอเตอรห มนุ จังหวะละ 90 องศา รูปที่ 10.11 การกำหนดมุมสำหรับการหมุนของสเตป็ มอเตอร ตอ 1 จังหวะในโปรแกรม Proteus ทมี่ า: ผูเ ขยี น สำหรับการใชบ อรด Arduino เพ่ือควบคุมสเตป็ มอเตอรส ามารถทำได 3 วธิ ี ดังน้ี 2.1 การควบคุมสเตป็ มอเตอรแบบ 1 เฟส การควบคมุ สเต็ปมอเตอรแบบ 1 เฟสคือการควบคุมท่ีงายทส่ี ดุ โดยใชว ิธีการควบคุมขดลวดที ละ 1 ขดตอ การหมุน 1 จังหวะโดยเร่มิ จากควบคุมขดลวดขดที่ 1 โดยการสง สัญญาณสถานะ “HIGH” ไปที่ตำแหนงขดลวดที่ 1 และสงสัญญาณสถานะ “LOW” ไปยังขดลวดอืน่ ๆ ทั้งหมด ในจังหวะถัดไป จะเปลี่ยนมาควบคุมขดลวดที่ 2 โดยสงสถานะ “HIGH” ไปตำแหนงขดลวดที่ 2 และสงสัญญาณ สถานะ “LOW” ไปยงั ขดลวดอ่ืนๆ และจังหวะถดั ไปเปนการควบคมุ ขดลวดที่ 3 และ 4 ตามลำดบั ดงั ตารางที่ 10.1 และหลังจากควบคมุ ขดลวดที่ 4 แลวหากมีการหมนุ จังหวะถัดไปเกิดข้นึ จะยอนกลับมา ควบคุมขดลวดที่ 1 ในทางกลับกันหากตองการใหสเต็ปมอเตอรหมุน ยอนกลับสามารถทำไดโดย เปลย่ี นทศิ ทางการควบคมุ เชน เรม่ิ จากขดลวดที่ 4 จังหวะถัดไปคือขดลวดท่ี 3, 2 และ 1 ตามลำดับ

252 ตารางที่ 10.1 การควบคมุ จงั หวะการหมุนของสเตป็ มอเตอรแบบ 1 เฟส จงั หวะท่ี ขดลวดท่ี 4 ขดลวดท่ี 3 ขดลวดท่ี 2 ขดลวดท่ี 1 1 0 0 0 1 2 0 0 1 0 3 0 1 0 0 4 1 0 0 0 2.2 การควบคุมสเต็ปมอเตอรแบบ 2 เฟส การควบคุมสเต็ปมอเตอรแบบ 2 เฟส จะแตกตางจากแบบ 1 เฟสเพียงเล็กนอยคือแตละ จังหวะของการหมุนจะตองควบคุมขดลวดทีละ 2 ขดที่อยูติดกัน และการควบคุมจังหวะถัดไปคือ ควบคมุ ขดลวดตำแหนง ที่ 2 ที่ถูกควบคุมในจังหวะกอนหนา และขดลวดตำแหนง ที่ติดกันกับตำแหนง ดังกลาว เชนหากจังหวะที่ 1 เกิดจากการควบคุมขดลวดที่ 1 และ 2 ตอการหมุน 1 จังหวะ จังหวะ ถัดไปคือการควบคุมขดลวดที่ 2 และ 3 และตามดวยขดลวดที่ 3 และ 4 และ ขดลวดที่ 4 และ 1 (ยอ นกลบั ไปขดลวดท่ี 1 ในทางกลบั กันหากตองการควบคมุ ทศิ ทางยอนกลับสามารถทำไดโ ดยเปลี่ยน ทิศทางการควบคุม ดังตารางที่ 10.2 เพียงการควบคุมในแตละจังหวะยังคงใชขดลวดที่อยูติดกัน 2 ขดลวดเชนเดมิ ตารางท่ี 10.2 การควบคมุ จังหวะการหมุนของสเต็ปมอเตอรแบบ 2 เฟส จังหวะที่ ขดลวดที่ 4 ขดลวดท่ี 3 ขดลวดท่ี 2 ขดลวดที่ 1 1 0 0 1 1 2 0 1 1 0 3 1 1 0 0 4 1 0 0 1 ขอดีของการกำหนดควบคุมสเต็ปมอเตอรแบบ 2 เฟสคือสามารถเพิ่มแรงบิตไดสูงมากข้ึน เนื่องจากขดลวดถกู ควบคุมมากถึง 2 ขดสำหรับแตละจังหวะ แตอยางไรก็ตามขอเสยี ของการควบคมุ ในลักษณะดงั กลาวคือจำเปนตอ งใชก ำลงั ไฟฟา ที่สูงมากขน้ึ ตามไปดว ย

253 2.3 การควบคุมสเตป็ มอเตอรแบบครึง่ จงั หวะ การควบคมุ สเต็ปมอเตอรแบบคร่ึงจังหวะ เกดิ จากการขับสเต็ปมอเตอรแบบผสมระหวางการ ควบคุมสเตป็ มอเตอรแบบ 1 เฟส และการควบคุมสเต็ปมอเตอรแบบ 2 เฟส โดยจังหวะที่ 1 ของการ ควบคุมจังหวะการหมุนของสเต็ปมอเตอรคือการควบคุมขดลวดขดที่ 1 เพียงตัวเดียว (แบบ 1 เฟส ในจังหวะถัดไปคือการควบคุมขดลวด 2 ตัวคือขดลวดที่ 1 และ 2 (แบบ 2 เฟส และจังหวะที่ 3 จะ กลับมาควบคุมแบบ 1 เฟสคือควบคุมขดลวดตัวลาสุดในจังหวะกอนหนา (ขดลวดที่ 2) โดยการ ควบคุมจังหวะการหมุนจะเกิดจากการสลบั ระหวางแบบ 1 เฟส และ แบบ 2 เฟสโดยควบคุมขดลวด ในตำแหนงที่ติดกันในลักษณะเชนนี้ไปจนกระทั่งถึงการควบคุมขดลวดที่ 4 แบบ 1 เฟส ดังนั้นการ ควบคุมจงั หวะถดั ไปซึ่งเปนแบบ 2 เฟสคือการควบคุมขดลวดที่ 4 และยอนกลับไปควบคุมขดลวดท่ี 1 ในทางกลับกันหากตองการควบคุมทิศทางยอนกลับสามารถทำไดโดยเปลี่ยนทิศทางการควบคุม ดัง ตารางที่ 10.3 ขอดีของการควบคุมควบคุมจังหวะการหมุนของสเต็ปมอเตอรแบบครึ่งจังหวะคือสามารถ หมุนไดในมุมที่เล็กลง (มีความถี่สูงขึ้นตอการหมุน 1 รอบ อยางไรก็ตามหากเปรียบเทียบกับการ ควบคมุ จังหวะการหมุนของสเต็ปมอเตอรแบบ 1 เฟส และแบบ 2 เฟส จำเปน ตอ งหมนุ สเต็ปมอเตอร แบบครึ่งสเต็ปเพิ่มเปน 2 จังหวะจึงจะเทียบเทากับการหมุนแบบ 1 เฟสและแบบ 2 เฟสเพียง 1 จังหวะ ตารางท่ี 10.3 การควบคมุ จังหวะการหมุนของสเตป็ มอเตอรแบบครงึ่ สเต็ป จังหวะที่ ขดลวดที่ 4 ขดลวดท่ี 3 ขดลวดท่ี 2 ขดลวดท่ี 1 1 0 0 0 1 2 0 0 1 1 3 0 0 1 0 4 0 1 1 0 5 0 1 0 0 6 1 1 0 0 7 1 0 0 0 8 1 0 0 1

254 ตัวอยา งท่ี 10.3 การควบคุมการทำงานของสเต็ปมอเตอรแบบ 1 เฟสใหหมนุ ทศิ ทวนเข็มนาิกา การทำงาน: มอเตอรหมุนในทิศทวนเข็มนาิกาจังหวะละ 18 องศา วธิ ที ำ 1. สวนวงจรทดลอง. รปู ท่ี 10.12 วงจรทดลองการควบคุมการทำงานของสเต็ปมอเตอร ใหหมุนในทศิ ทวนเข็มนาิกา ที่มา: ผูเขยี น คำอธิบาย: ตอขาท้งั 4 ขาของสเต็ปมอเตอรกับบอรด Arduino ผา นไอซเี บอร ULN2003A ซง่ึ ชว ยให กระแสคงที่ และปอ งกนั การไหลยอนกลบั ของกระแสไฟจากมอเตอร โดยการตอเปนดังน้ี ตำแหนง ท่ี 4 เชอื่ มตอกบั ตำแหนงขาที่ 0 ของบอรด Arduino ตำแหนง ท่ี 3 เช่อื มตอ กบั ตำแหนงขาที่ 1 ของบอรด Arduino ตำแหนง ที่ 2 เช่ือมตอ กบั ตำแหนงขาท่ี 2 ของบอรด Arduino ตำแหนง ที่ 1 เชื่อมตอกับตำแหนง ขาท่ี 3 ของบอรด Arduino เชอื่ มตอแรงดนั 12 โวลตกบั ตำแหนง ขากลางทัง้ 2 ขา ง และกำหนดใหสเต็ปมอเตอรหมุนจังหวะละ 18 องศาโดยกดที่ตัวสเต็ปมอเตอรและเลือกที่ Step angle ใหมีคาเทา กบั 18 ดังรปู ตอ ไปน้ี

255 รปู ที่ 10.13 การเลือกจังหวะการหมุนของสเต็ปมอเตอร ทีม่ า: ผเู ขียน 2. สวนโปรแกรม int count = 0; int num[] = {0x01, 0x02, 0x04, 0x08}; void setup() { DDRD = 0xFF; } void loop() { PORTD = num[count]; count++; if(count > 3){ count = 0; } delay(500); } คำอธิบาย: กำหนดตัวแปรอารเรย num เก็บคาจังหวะของสเต็ปมอรเตอรแบบ 1 เฟส และตัวแปร count ถกู กำหนดใหเปนคา ตำแหนง ของ num โดยมคี าเริม่ ตน เปน 0 ฟง กช ัน Setup(): กำหนดใหพ อรต D เปนเอาตพ ุตทกุ ชองทาง (แตการใชง านจริงคือ 4 ชอง แรกท่มี ีตำแหนง นยั สำคญั ต่ำทส่ี ดุ เทา นน้ั ฟงกชัน loop(): กำหนดใหสเต็ปมอเตอรมีการหมุนในทิศทวนเข็มเปนจังหวะตามคาของ num โดยแตล ะจงั หวะจะมกี ารหนว งเวลาที่ 500 มิลลิวินาที

256 หมายเหตุ: หากตองการใหสเต็ปมอเตอรหมุนในทิศตามเข็มนาิกาสามารถทำไดโดยใชจังหวะ ยอ นกลับ ซ่งึ จากตวั อยา งคือการกำหนดใหตำแหนงของ num ลดลงในแตล ะรอบ ตัวอยา งท่ี 10.4 การควบคุมการทำงานของสเต็ปมอเตอรใหหมนุ ทิศทวนเข็มนาิกา 1 รอบ การทำงาน: มอเตอรหมุนในทศิ ทวนเข็มนาิกาจังหวะละ 18 องศาจำนวน 1 รอบ วธิ ที ำ 1. สว นวงจรทดลอง.: เชื่อมตอ อุปกรณภายนอกเขากับบอรด Arduino ดังตวั อยา งท่ี 10.3 2. สวนโปรแกรม int count = 0; int count2 = 1; int num[] = {0x01, 0x02, 0x04, 0x08}; void setup() { DDRD = 0xFF; } void loop() { PORTD = num[count]; count++; if(count > 3){ count = 0; } delay(500); count2++; if(count2 == 20) while(1); } คำอธิบาย: ในสวนของโปรแกรมนี้ จะมีความคลายคลึงกับโปรแกรมในตัวอยางที่ 3 เปนอยางมาก เพียงในภายในโปรแกรมนี้ มีการเพิ่มตัวแปร count2 ซึ่งใชสำหรับการนับจำนวนรอบการทำงาน ภายในฟง กช ัน loop() เนอ่ื งจากการหมนุ ของสเต็ปมอเตอรจะหมนุ จังหวะละ 18 องศา ดังน้ันจะตอง วนรอบท้ังส้ิน 20 รอบเพ่ือใหการหมุนของมอเตอรครบ 1 รอบ หรอื 360 องศา

257 3. เซอรโ วมอเตอร เซอรโวมอเตอร (Server Motor คือมอเตอรอีกประเภทหนึ่งที่มีแรงบิตที่สูงมากหากถูก นำไปเปรยี บเทยี บกบั มอเตอรดซี ี หรือ สเต็ปมอเตอร โดยสามารถนำเซอรเ วอรมอเตอรสำหรับควบคุม ไดทัง้ ความเร็ว แรงบิต และตำแหนง ทศิ ทางการหมุน โดยผลลพั ธทไ่ี ดม ีความแมนยำสูงมาก รูปท่ี 10.14 เซอรโวมอเตอร ทม่ี า: ประจนิ พลังสันตกิ ุล, 2549 รปู ท่ี 10.14 แสดงตวั อยางเซอรโ วมอเตอร รปู ท่ี 10.15 เซอรโ วมอเตอรใ นโปรแกรม Proteus ที่มา: ผเู ขยี น รปู ที่ 10.15 แสดงตวั อยา งของเซอรโวมอเตอรในโปรแกรม Proteus ซง่ึ สามารถเลือกใชงาน ไดโ ดยใชคำคน “motor-PWMServo” สำหรับการควบคุมตำแหนง และทิศทางการหมุนของเซอรโวมอเตอรสามารถดำเนินการได โดยใชสัญญาณนาิกาที่มีความถ่ีที่แตกตางกัน ยกตัวอยา งเชนหากตองการใหเซอรโวมอเตอรหมุนไป ในตำแหนงซา ยมอื สดุ จะตอ งกำหนดสญั ญาณนาิกาขนาด 1 มิลลวิ นิ าที

258 รูปที่ 10.16 ตัวอยา งการควบคมุ ทศิ ทางการหมุนเซอรโ ว มอเตอรไปตำแหนงซา ยสุด ทีม่ า: ประจิน พลังสันตกิ ลุ , 2549 ในทางกลับกันหากตองการใหเซอรโวหมุนไปในตำแหนงขวามือสุดจะตองกำหนดสัญญาณ นากิ าขนาด 2 มลิ ลิวนิ าที รปู ท่ี 10.17 ตัวอยา งการควบคมุ ทศิ ทางการหมุนเซอรโ ว มอเตอรไ ปตำแหนง ขวาสดุ ที่มา: ประจนิ พลงั สันติกลุ , 2549 อยางไรก็ตามในโปรแกรม Arduino IDE มีไลบรารีชื่อ “Servo” ซึ่งเปนไลบรารีสำหรับ ควบคุมการทำงานเซอรโวโดยไมจำเปนตองควบคุมตำแหนง และทิศทางการหมุนผานความกวางของ สัญญาณนาิกาจึงชวยใหการควบคุมการทำงานของเซอรโวมอเตอรงายมากยิ่งขึ้น โดยการเรียกใช งานฟง กชนั จะถกู เรียกผา นอ็อบเจค็ Servo สำหรับฟง กชันทีส่ ำคญั ในไลบรารี Servo มดี ังนี้ 3.1 ฟง กช ัน attach() เปนฟง กชนั ทใ่ี ชส ำหรับกำหนดตำแหนงขาของบอรด Arduino ทีจ่ ะถกู ใชเชื่อมตอกับเซอรโว มอเตอร

259 รูปแบบ ชอ่ื ออบเจค็ .attach(pin) หรือ ชือ่ ออบเจ็ค.attach(pin, min, max) พารามเิ ตอร 1. pin คอื ตำแหนงขาของบอรด Arduino 2. min คือความกวา งท่ี 0 องศาของเซอรโวมีหนว ยเปน ไมโครวนิ าที โดยหากไมก ำหนดคาจะ มีคาเริ่มเตนอยทู ่ี 544 ไมโครวนิ าที 3. max คอื ความกวางท่ี 180 องศาของเซอรโ วมหี นว ยเปนไมโครวนิ าทีโดยหากไมกำหนดคา จะมีคา เริม่ เตนอยูท ่ี 2400 ไมโครวนิ าที 3.2 ฟง กชนั write() เปน ฟงกช ันท่ีใชสำหรบั กำหนดตำแหนงและทศิ ทางการหมนุ ของเซอรโวมอเตอร รปู แบบ ชอ่ื ออบเจ็ค.write(angle) พารามิเตอร 1. angle คือ ขนานมุมของเซอรโวมอเตอรที่กำหนดใหหมุน โดยสามารถกำหนดคาได ระหวาง 0 – 180 องศา อยางไรก็ตามกรณีที่เซอรโมมอเตอรเปนแบบหมุนเต็ม (Full Rotation) คา angle คอื คาความเรว็ และทิศทางการหมุน ดงั นี้ angle = 90 คอื การสั่งใหเซอรโ วมอเตอรหยุดหมนุ angle = 0 คอื การสั่งใหเซอรม อเตอรห มนุ ดวยความเร็วสูงสุดในทิศทางหนงึ่ angle = 180 คือการสั่งใหเซอรมอเตอรหมุนดวยความเร็วสูงสุดในทิศทางตรงกัน ขามกับกรณที ี่ angle = 0

260 3.3 ฟงกชนั writeMicroseconds() เปน ฟงกชนั ทใ่ี ชส ำหรบั ควบคุมทิศทางการหมุนของเซอรโวมอเตอรโ ดยใชสญั ญาณนาิกาที่มี ความถแ่ี ตกตางกนั ออกไปในหนว ยไมโครวนิ าที โดยการใชง านฟงกช นั น้สี ามารถกำหนดไดอยางอิสระ อยา งไรกต็ ามมขี อท่ีพึงระวงั คือไมควรใหหมนุ เกนิ ตำแหนง 0 องศาหรอื 180 องศาเพราะอาจสงผลให เซอรโ วมอเตอรห มดอายุการใชงานเรว็ กวา กำหนด รปู แบบ ชื่อออบเจ็ค.writeMicroseconds(time) พารามเิ ตอร 1. time คอื เวลาในหนว ยไมโครวนิ าที 3.4 ฟงกชัน read() เปนฟงกชันที่ใชสำหรับอานคาองศาที่ถูกอานดวยฟงกชัน write โดยผลลัพธจะอยูในชวง ระหวา ง 0 – 180 องศา รูปแบบ ชือ่ ออบเจค็ .read() 3.5 ฟงกชนั attached() เปน ฟงกช นั ที่ใชสำหรับตรวจสอบวา เซอรโ วถกู เช่ือมตออยกู บั บอรด Arduino หรอื ไม รูปแบบ ช่อื ออบเจ็ค.attached() 3.6 ฟงกช นั detach() เปนฟงกชันที่ใชสำหรับคืนสถานะของตำแหนงขาที่ถูกเชื่อมตอกับเซอรโวมอเตอรเพื่อให กลับมาใชง านตามปกติ

261 รูปแบบ ชื่อออบเจ็ค.detach() ตวั อยา งที่ 10.5 การทดสอบการทำงานของเซอรโวมอเตอร การทำงาน: ทศิ ทางการหมนุ ของเซอรโ วมอเตอรถูกควบคุมผานการกดปุม ดังนี้ กดปมุ sw1 (ขา 12): เซอรโ วหมุน 90 องศา กดปมุ sw2 (ขา 11): เซอรโวหมุน 180 องศา วิธีทำ 1. สวนวงจรทดลอง รูปท่ี 10.18 วงจรทดลองการทดสอบการทำงานของเซอรโวมอเตอร ที่มา: ผเู ขยี น คำอธิบาย: เชื่อมตอปุม 2 ปุมกับตำแหนงขาที่ 11 และ 12 ของบอรด Arduino และขาของเซอรโว มอเตอรกับตำแหนงขาที่ 10 ของบอรดโดยเชื่อมตอขาอีก 2 ขางของเซอรกับไฟเลี้ยงและกราวด ตามลำดับ 2. สวนโปรแกรม #include <Servo.h> Servo myservo; int sw1 = 12; int sw2 = 11;

262 int servo = 10; void setup() { pinMode(sw1, INPUT); pinMode(sw2, INPUT); myservo.attach(servo); } void loop() { if(digitalRead(sw1) == LOW){ myservo.write(90); } if(digitalRead(sw2) == LOW){ myservo.write(180); } } คำอธิบาย: ภายนอกฟงกชันมีการกำหนดตัวแปร sw1 และ sw2 ไวสำหรับควบคุมทิศทางการหมุน ของเซอรโ วมอเตอร และตัวแปร servo ใชสำหรบั อา งองิ ตำแหนงการเชอ่ื มตอระหวา งเซอรโ วมอเตอร และบอรด Arduino ฟงกชัน Setup(): กำหนดใหตำแหนงขาที่ 11 และ 12 ของบอรด Arduino ทำหนาที่รับ สัญญาณจากอุปกรณภายนอกเปน เอาตพ ตุ ฟงกชัน loop(): กำหนดใหเซอรโวมอเตอรมีการหมุนดวยมุม 90 องศากรณีที่ sw1 มี สถานะเปน “LOW” (มีการกดปุม ท่เี ชือ่ มตอกับตำแหนงขาท่ี 12 ของบอรด Arduino) หรือ หมุนดวย มุม 180 องศากรณีที่ sw2 มีสถานะเปน “LOW” (มีการกดปุมที่เชื่อมตอกับตำแหนงขาที่ 11 ของ บอรด Arduino) ตัวอยา งที่ 10.6 การทดสอบการทำงานของเซอรโวมอเตอรแบบท่ี 2 การทำงาน: ทศิ ทางการหมนุ ของเซอรโวมอเตอรถูกควบคุมผานการกดปุม ดงั นี้ กดปุม sw1 (ขา 12): จังหวะการหมุนของเซอรโ วมอเตอรล ดลง 10 องศา กดปมุ sw2 (ขา 11): จังหวะการหมนุ ของเซอรโ วมอเตอรเ พิ่มขน้ึ 10 องศา วิธีทำ 1. สวนวงจรทดลอง: เชื่อมตออปุ กรณภ ายนอกเขากับบอรด Arduino ดงั ตัวอยางท่ี 10.5

263 2. สว นโปรแกรม #include <Servo.h> Servo myservo; int sw1 = 12; int sw2 = 11; int servo = 10; int count = 0; void setup() { pinMode(sw1, INPUT); pinMode(sw2, INPUT); myservo.attach(servo); myservo.write(0); } void loop() { if(digitalRead(sw1) == LOW){ if(count > 0){ count = count - 10; } else{ count = 0; } myservo.write(count); while(digitalRead(sw1) == LOW); } if(digitalRead(sw2) == LOW){ if(count < 180){ count = count + 10; } else{ count = 180; } myservo.write(count); while(digitalRead(sw2) == LOW); } }

264 คำอธิบาย: ภายนอกฟงกชันมีการกำหนดตัวแปร sw1, sw2 ไวสำหรับควบคุมทิศทางการหมุนของ เซอรโวมอเตอร ตัวแปร servo ใชสำหรับอางอิงตำแหนงการเชื่อมตอระหวางเซอรโวมอเตอรและ บอรด Arduino และตัวแปร count ใชสำหรบั ควบคมุ การเพิม่ -ลดองศาการหมุนของเซอรโ วมอเตอร ฟงกชัน Setup(): กำหนดใหตำแหนงขาที่ 11 และ 12 ของบอรด Arduino ทำหนาที่รับ สัญญาณจากอุปกรณภายนอกเปนเอาตพุต และกำหนดใหตำแหนงมุมเริ่มตนของเซอรโวมอเตอรคือ 0 องศา ฟงกชัน loop(): กำหนดใหเซอรโวมอเตอรมีการหมุนดวยมุมที่ลดลงจังหวะละ 10 องศา กรณีที่ sw1 มีสถานะเปน “LOW” (มีการกดปุมที่เชื่อมตอกับตำแหนงขาท่ี 12 ของบอรด Arduino) หรือ หมุนดวยมุมที่เพิ่มขึ้นจังหวะละ 10 องศากรณีที่ sw2 มีสถานะเปน “LOW” (มีการกดปุมที่ เชื่อมตอ กับตำแหนงขาที่ 11 ของบอรด โดยองศาการหมุนจะอยใู นชว ง 0 – 180 เทา นั้น 4. บทสรุป มอเตอร คืออุปกรณไฟฟาชนิดหนึ่งที่ใชสำหรับเปลี่ยนพลังงานไฟฟาเปนพลังงานกล ซ่ึง แบงเปน 2 ชนดิ คือมอเตอรกระแสตรง และมอเตอรกระแสสลบั เน่อื งจากมอเตอรคืออุปกรณไฟฟาท่ี กินกระแสสูงมาก ดังนนั้ จึงจำเปนตองใชอุปกรณขับเพื่อใชส ำหรับจายแรงดัน และกระแสที่สูงได โดย การสรางอุปกรณข ับมีหลากหลายวิธี เชน ใชว งจรทรานซิสเตอร หรือ ใชไอซสี ำเร็จรูป เปน ตน สำหรับ บทนี้เลือกไอซีเบอร ULN2003A ซึ่งเปนไอซีสำเร็จรูปสำหรับเพิ่มแรงดัน และกระแสแกมอเตอร นอกเหนือจากนั้นมอเตอรยังถูกแบงออกเปนอีก 3 ประเภทซึ่งแตละประเภทจะมีคุณลักษณะการ ทำงานที่แตกตา งกันดังน้ี มอเตอรดีซีคือมอเตอรกระแสตรงที่ใชแรงดันอยางนอย 12 โวลตเพื่อขับเคลื่อนการทำงาน ซึ่งมีขาสำหรับตอใชงานทั้งหมด 2 ขา โดยวิธีการควบคุมใหมอเตอรหมุนคือจายไฟฟากระแสตรง เขาขาขางหนึ่ง สวนขาอีกขางจะถูกตอกราวดเพื่อใหเกิดความตา งศักยระหวางขัว้ มอเตอรจ ึงสง ผลให เกิดการหมุนของมอเตอรขึ้น ในทางกลับกันหากสลับตำแหนงการเชื่อมตอที่ขาของมอเตอรคือจาย ไฟฟากระแสตรงที่ขาอีกขาง (ขาที่ตอกราวด และสลับขาที่ถูกตอกับไฟฟากระแสตรงมาตอกราวด สงผลใหมอเตอรหมุนในทิศทางตรงกันขาม สเต็ปมอเตอร คือมอเตอรที่สามารถควบคุมจังหวะ และทิศทางการหมุนได โดยผูใชงาน สามารถควบคุมมุมองศาของการหมุนได เนื่องจากสเต็ปมอเตอรจ ะหมุนเปนจังหวะ แตอยางไรก็ตาม มุมที่หมุนตอการหมุน 1 จังหวะจะขึ้นอยูกับโครงสรางของสเต็ปมอเตอรแตละชนิดซึ่งมีจังหวะการ หมนุ ท่ีแตกตา งกนั

265 เซอรโวมอเตอร คือมอเตอรอีกประเภทหนึ่งที่มีแรงบติ ที่สูงมากหากถูกนำไปเปรียบเทียบกบั มอเตอรดีซี หรือ สเต็ปมอเตอร โดยสามารถนำเซอรเวอรมอเตอรสำหรับควบคุมไดทั้งความเร็ว แรง บิต และตำแหนง ทศิ ทางการหมุน โดยผลลัพธที่ไดม ีความแมนยำสงู มาก

266 แบบฝกหดั ทา ยบท บทท่ี 10 1. ไอซีเบอร uln2003A มีประโยชนอ ยา งไร 2. ประโยชนของรีเลยท่นี ำมาประยกุ ตใชงานรวมกับมอเตอรค อื อะไร 3. หากตอ งการใหดีซีมอเตอรหมนุ ในทิศตรงกันขามกับทิศเดิมตอ งทำอยางไร 4. สเตป็ มอเตอรคืออะไรและมีประโยชนอ ยา งไร 5. ประโยชนของสเตป็ มอเตอรแ บบคร่ึงจังหวะคอื อะไร 6. เซอรโวมอเตอรคืออะไร 7. ไลบรารสี ำหรบั ควบคมุ แอลซดี โี หมด 4 บติ มชี ือ่ วาอะไร 8. จากวงจรดังตัวอยางที่ 10.3 กำหนดใหสเต็ปมอเตอรหมุนจังหวะละ 40 องศา จงเขียน โปรแกรมควบคุมการทำงานของสเต็ปมอเตอรแบบ 1 เฟสใหหมุนทศิ ทวนเขม็ นากิ าจำนวน 2 รอบ

267 เอกสารอา งองิ ดอนสนั ปงผาบ. (2560). ภาษาซีและ Arduino อานงา ย เขาใจงาย. กรุงเทพฯ: ซีเอด็ ยเู คช่ัน. ทีมงานสมารทเลิรนนิ่ง. (2554). Advanced PIC Microcontroller in C : การประยุกตใชงาน PIC ขั้นสงู ดวยภาษา C. กรงุ เทพฯ: สมารท เลริ นนง่ิ . ประจิน พลังสันติกุล. (2549). การเขียนโปรแกรมควบคุมไมโครคอนโทรลเลอร AVR ดวยภาษาซี กับ WinAVR (C Compiler) กรุงเทพฯ: บรษิ ัทแอพซอฟตเ ทค จำกดั . ประภาส พุมพวง. (2561). การเขียนและการประยุกตใชงานโปรแกรม Arduino. กรุงเทพฯ: ซีเอ็ด ยูเคช่ัน. John, D. W., Josh, A. and Harald, M. (2011). Arduino Robotics. New York: Apress Open. Omar, J., Shahnawaz, K. and Zainulabideen. (2012). PC BASED WIRELESS STEPPERMOTOR CONTROL. Degree of Bachelor of Science in Electrical Engineering, Department of Electrical Engineering, Blekinge Institute of Technology, Karlskrona, Sweden.

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

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

บทท่ี 11 การรบั ขอ มลู จากเซ็นเซอร การเขียนโปรแกรมรับคาจากอุปกรณภายนอกสูบอรด Arduino เชน สวิตซ หรือ ปุม คา สัญญาณที่ถูกสงออกจากอุปกรณดังกลาวคือสัญญาณแบบดิจิทัลซึ่งเปนสัญญาณที่เปนลักษณะไม ตอ เน่ือง สำหรบั สญั ญาณดิจทิ ัลท่ีถูกนำมาใชงานรวมกบั บอรด Arduino นี้โดยทั่วไปมีเพียง 2 สถานะ คือ “HIGH” และ “LOW” ในบทนี้แนะนำวิธีการรับขอมูลจากเซ็นเซอรซึ่งโดยสวนใหญจำเปนตองมี การจัดการสัญญาณที่ถูกปอนสูบอรด Arduino กอนที่จะนำผลลัพธไปใชงานตอไปเนื่องสัญญาณท่ี สงออกจากเซ็นเซอรเปนสัญญาณแบบอนาล็อก (เดชฤทธิ์ มณีธรรม, 2559) ซึ่งจะแตกตางจาก สญั ญาณแบบดจิ ทิ ัล 1. เซ็นเซอร เซ็นเซอรคือ อุปกรณทางอิเล็กทรอนกิ สที่ถกู นำมาใชสำหรับการตรวจจับสัญญาณในรูปแบบ ตางๆ เชน สัญญาณแสง สัญญาณเสียง หรือคาสี เปน ตน เพ่อื นำไปใชประโยชนไดในหลากหลายดาน เชนงานดานเกษตร อุตสาหกรรม ทางการแพทย โดยเฉพาะอยางยิ่งระบบงานทีม่ ีลักษณะการทำงาน แบบอตั โนมตั ิ เปน ตน (Tero, Kimmo & Ville, 2014) รูปท่ี 11.1 ตวั ตานทานแบบปรับคาได ท่ีมา: ผูเขยี น รูปที่ 11.1 แสดงตัวตานทานแบบปรับคาได ซึ่งสงสัญญาณแบบอนาล็อก ดังนั้นลักษณะการ ทำงานของอุปกรณดังกลาวนี้จึงมีความคลายคลึงกับเซ็นเซอรทั่วไปเปนอยางมาก โดยสำหรับการ ทดสอบการใชงานเซ็นเซอรบนโปรแกรม Proteus ผเู ขยี นเลอื กใชงานตัวตานทานแบบปรับคาไดนี้ทำ หนาทเี่ ปนเซ็นเซอรสำหรบั การเขยี นโปรแกรมเพ่อื ทดสอบการใชง าน

272 รูปที่ 11.2 ตวั ตา นทานแบบปรบั คา ไดในโปรแกรม Proteus ทีม่ า: ผูเขียน รูปที่ 11.2 แสดงตัวอยางตัวตานทานแบบปรับคาไดในโปรแกรม Proteus ซึ่งเปนอุปกรณที่ ถกู นำมาใชแทนเซ็นเซอรเ พ่อื สง สญั ญาณอนาล็อกสบู อรด Arduino โดยใชโ ปรแกรมจำลองการทำงาน อยา งไรก็ตามเซน็ เซอรช นิดอ่ืนๆ ผเู ขยี นจะแสดงตัวอยา งผานการทดลองจรงิ เนื่องจากสัญญาณที่ถูกสงจากเซ็นเซอรโดยทั่วไปจะเปนแบบอนาล็อก ซึ่งเปนสัญญาณที่มี ความตอเนื่อง ดังนั้นการเขียนโปรแกรมควบคุมบอรด Arduino โดยรับคาจากเซ็นเซอรจะมีความ แตกตางจากการรับคาจากสวิตซ เนื่องจากกรณีที่สัญญาณเปนแบบอนาลอ็ กจำเปนตองถูกแปลงเปน สัญญาณดิจิทัลกอนท่ีจะนำไปใชงาน อยางไรก็ตามการสงสัญญาณดังกลาวไปยังบอรด Arduino จำเปนตองถกู สงไปยงั ตำแหนงขาทีส่ ามารถรองรบั สญั ญาณแบบอนาลอ็ กไดเ ทา นัน้ โดยทั่วไปบอรด Arduino จะมีขาที่ใชสำหรับรับสัญญาณอนาลอ็ กใหแลว โดยที่ประเภทของ บอรด ที่แตกตางกันจะมีจำนวนขาท่ีใชรบั สัญญาณอนาล็อกท่ีแตกตางกันดว ยเชนกัน โดยตำแหนงขาที่ สามารถรองรบั สญั ญาณดังกลา วไดม กั จะขนึ้ ตน ดวยตวั อักษร “A” รูปท่ี 11.3 ตำแหนง ขาวงจรทดลอง Arduino Uno ทรี่ องรบั สญั ญาณอนาลอ็ ก ทมี่ า: ผูเขียน

273 อยางไรก็ตามสำหรับบอรด Arduino Uno R3 มีขาที่สามารถรองรับสัญญาณอนาล็อกได ทั้งหมด 6 ขาคือ A0 – A5 โดยรูปที่ 11.4 แสดงตำแหนงขาที่รองรับสญั ญาณอนาล็อกซึ่งอยูตำแหนง มุมลางซา ย รูปท่ี 11.4 ตำแหนง ขาวงจรทดลอง Arduino Uno R3 ทร่ี องรบั สญั ญาณอนาลอ็ กในโปรแกรม Proteus ที่มา: ผูเขียน รูปที่ 11.4 แสดงตัวอยางตำแหนงขาที่รองรับสัญญาณอนาล็อกในโปรแกรม Proteus ซึ่งมี จำนวนทั้งหมด 6 ขาคือ A0 – A5 โดยอยูตำแหนงมุมลางซา ย 2. ฟงกช ันใน Arduino IDE เกี่ยวกบั สำหรบั สัญญาณอนาลอ็ ก โปรแกรม Arduino IDE มีฟงกชันที่สำคัญที่เกี่ยวกับการจัดการสัญญาณอนาล็อกที่ถูกสงมา จากเซน็ เซอรช นิดตางๆ ดงั น้ี 2.1 ฟงกช ัน analogRead() เปนฟงกชันที่ใชสำหรับรับคาสัญญาณอนาล็อกจากเซ็นเซอรสูบอรด Arduino โดยตำแหนง ขาของบอรด จะตองสามารถรับสัญญาณอนาล็อกได (ประภาส พมุ พวง, 2561) โดยในบอรด Arduino Uno R3 สามารถรบั สัญญาณอนาล็อกไดทข่ี า A0 – A5 รปู แบบ analogRead(pin)

274 การคืนคา จำนวนเตม็ พารามิเตอร 1. pin คือ ตำแหนง ขาของบอรด Arduino ทร่ี องรบั สัญญาณอนาลอ็ กทเี่ ชื่อมกับของเซ็นเซอร 2.2 ฟงกช ัน map() เปนฟงกชันที่ใชสำหรับปรับชวงคาของสัญญาณอนาล็อกใหมใหอยูในชวงตามที่ผูใชงาน ตองการ รปู แบบ map(value, fromLow, fromHigh, toLow, toHigh) การคืนคา จำนวนเต็ม พารามิเตอร 1. value คือ คาสัญญาณอนาลอ็ กทีถ่ กู สงโดยเซ็นเซอร 2. fromLow คอื คาต่ำสดุ ที่เปนไปไดข องสญั ญาณตน ฉบบั 3. fromHigh คอื คา สงู สดุ ทเี่ ปนไปไดข องสญั ญาณตน ฉบบั 4. toLow คอื คา ต่ำสดุ ทเี่ ปนไปไดของสัญญาณทถ่ี ูกปรบั ชว งใหม 5. toHigh คอื คา สูงสดุ ที่เปน ไปไดข องสญั ญาณท่ถี ูกปรับชว งใหม โดยท่มี าของผลลัพธทค่ี ืนคาจากฟง กช ัน map() ซ่ึงเปน จำนวนเตม็ เปน ดังน้ี result = (value – fromLow)*(toHigh – toLow)/(fromHigh – fromLow) + toLow เมื่อ result คือผลลัพธทเี่ กดิ จากการปรับชวงของสัญญาณ