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