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 workrinpho, 2020-07-20 20:24:48

Description: หนังสือเรียนรายวิชา ความรู้พื้นฐานด้านหุ่นยนต์ ม.ปลาย

Search

Read the Text Version

รูปท่ี 9.5 แสดงลกั ษณะการเชอื่ มต่อโมดูล GP2D120 เข้ากับหุน่ ยนต์ IPST-BOT 146

 การทดลองที่ 9.2 ตรวจจับและวดั ค่าระยะทางจากโมดลู GP2D120 การทดลองน้ีเปน็ การความสามารถของหุ่นยนต์ IPST-BOT จากเคลื่อนท่ีหลบหลีกสิ่งกีดขวางด้วยการ ชน มาถึงการทดลองนี้ท่ีใช้โมดูล GP2D120 เข้ามาช่วยในการตรวจจับและหลบหลีกสิ่งกีดขวางแบบไม่ สมั ผสั โดยมเี งอ่ื นไขดงั น้ี - กรณไี ม่พบสงิ่ กีดขวางในระยะ 4 – 14 เซนติเมตร ห่นุ ยนต์จะเคลอ่ื นที่ไปข้างหน้า - กรณีพบส่งิ กีดขวางในระยะตั้งแต่ 15 เซนติเมตรขึ้นไป หุ่นยนต์จะเคลอื่ นที่ถอยหลังแล้วหมุนตวั ไป ทางซา้ ยเพือ่ เปลี่ยนทศิ ทางเคลื่อนท่ี ขั้นตอนการทดลอง 1. สร้างไฟล์โปรเจคท์ช่ือ robo_ranger และพิมพ์โปรแกรม 9.2 2. คอมไพลแ์ ละดาวนโ์ หลดโปรแกรมเพือ่ ทดสอบผลลัพธ์การทางาน 3. รนั โปรแกรม โมดลู LCD ของหนุ่ ยนต์แสดงขอ้ ความ Press SW1 แจ้งให้กดสวิตช์ SW1 ท่ีบอร์ด Display-MOTOR ของหุ่นยนต์ IPST-BOT เพ่ือส่ังให้หุ่นยนต์ เคล่ือนท่ี 4. กดสวิตช์ SW1 ที่บอร์ด Disalpay-MOTOR ของหุ่นยนต์ IPST-BOT แล้วสังเกตการเคลื่อนที่ของ หนุ่ ยนต์ แล้วทดลองใช้มอื หรือวางวัตถุเพ่ือกีดขวางการเคล่ือนท่ีของหุ่นยนต์ หนุ่ ยนตจ์ ะเคล่ือนทีไ่ ปข้างหน้าอย่างต่อเน่ือง จนกระทัง่ ตรวจพบส่ิงกีดขวาง หุ่นยนจะถอยหลังแล้ว หมนุ ตัวไปทางซ้าย จากนน้ั เคล่ือนที่ไปข้างหน้าเพื่อให้สามารถหลบหลีกสิ่งกีดขวางไปได้ แต่ถ้าหากหมุนแล้ว ยังพบสง่ิ กีดขวางจะห่นุ ยนตจ์ ะถอยหลงั และหมนุ ตวั ไปทางซา้ ยอีกคร้ัง จนกระทงั่ พน้ ส่ิงกดี ขวาง โปรแกรม 9.1 #include <sleep.h> #include <lcd.h> #include <gp2d120_lib.h> #include <motor.h> #include <in_out.h> #define POW 70 147

รูปที่ 9.6 แสดงวธิ กี ารทางานของโปรแกรมการทดลองที่ 9.2 148

void forward(unsigned int delay) { motor(1,POW); motor(2,POW); sleep(delay); } void backward(unsigned int delay) { motor(1,-POW); motor(2,-POW); sleep(delay); } void turn_left(unsigned int delay) { motor(1,-POW); motor(2,POW); sleep(delay); } void main () { unsigned int dist; lcd(“Press SW1”); sw1_press(); while (1) { dist = getdist (4); if (dist > 4 && dist < 15) { backward(1000); turn_left(1500); } 149

else forward(10); } } คาอธิบายโปรแกรม โปรแกรมแสดงข้อความ Press SW1 ท่ีโมดูล LCD เพื่อรอการกดสวิตช์ SW1 เม่ือพบการกดสวิตช์ SW1 โปรแกรมจึงเริ่มทางานคาส่ังภายในลูป while(1) เพ่ือวนอ่านค่าระยะทางจากโมดูล GD2D120 ที่ต่อ เข้ากบั ขาพอร์ต PA4 มาเก็บทต่ี ัวแปร dist จากน้นั โปรแกรมจะนาค่าของตัวแปรไปตรวจสอบ ดงั นี้ กรณีที่ if(dist >= 4 && dist < 15) ตรวจสอบว่าพบส่ิงกีดขวางในช่วง 4 – 14 เซนติเมตรหรือไม่ ถ้าเป็นจริง (มีส่ิงกีดขวาง) จะตอบสนองโดยขับเคลื่อยหุ่นยนต์ IPST-BOT ถอยหลัง 0.5 วินาที แล้วเลี้ยว ซา้ ยเพ่อื หลบสิง่ กีดขวาง กรณีที่ else เป็นกรณีท่ีหุ่นยนต์ไม่พบส่ิงกีดขวาง คือ คาส่ังตอบสนองเม่ือระนะท่ีตรวจจับได้เกิน 14 (15 เซนติเมตรข้ึนไป) โดยตอบสนองให้หุ่นยนต์เคลื่อนท่ีตรงไปข้างหน้าด้วยระยะเวลาส้ันๆ (ผพู้ ฒั นาโปรแกรมสามารถปรับแกค้ า่ ระยะทางในการตรวจจับสิง่ กีดขวางได้ตามความเหมาะสม) 150

บทท่ี 10 ภาระกจิ ตรวจจับเสน้ หนึ่งภาระกิจการเรียนรู้เพื่อควบคุมหุ่นยนต์อตั โนมัติขนาดเลก็ คือ การตรวจจับเส้นและการเคล่ือนที่ ตามเส้นสาหรับหุ่นยนต์ IPST-BOT ก็สามารถปฏิบัติภาระกิจนี้ได้ ในบทน้ีจะกล่าวถึงการทางานของตัว ตรวจจบั แสงสะท้อนอินฟราเรดซึ่งนามาประยุกกต์ใชเ้ ป็นตัวตรวจจับเสน้ การเตรียมสนามทดสอบ ตวั อย่าง การปรับแต่งค่าของตวั ตรวจจับเพื่อให้สามารถตรวจจบั เสน้ ได้อย่างมีประสทิ ธิภาพ 1.1 คณุ สมบตั ขิ องแผงวงจรตรวจจบั แสงสะทอ้ นอนิ ฟราเรด เป็นแผงวงจรท่ีใช้ในการตรวจสอบการสะท้อนของแสงอินฟราเรด ซ่ึงรวมตัวส่งและตัวรับไว้ในแผงวงจร เดยี วกนั โดยตัวตรวจจับแสงสะท้อนอนิ ฟราเรดทนี่ ามาใช้คือ TCRT5000 รปู ท่ี 10.1 แสดงการทางานของแผงวงจรตรวจจบั แสงสะท้อนอินฟราเรด TCRT5000 เม่ือจ่ายไฟเลี้ยง LED อินฟราเรดภายในตัวโมดูล TCRT5000 จะสว่างตลอดเวลา สว่ นตัวรับซึ่งเป็นโฟโต้ ทรานซิสเตอร์จะได้รับแสงอินฟราเรดจากการสะท้อนกลับ โดยปริมาณของแสงท่ีได้รับจะมากหรือน้อยข้ึนอยู่ กับว่า มีวัตถุมากีดขวางหรือไม่ และวัตถุน้ันมีความสามารถในการสะท้อนแสงอินฟราเรดได้ดีเพียงไร ซ่ึงข้ึนอยู่ กับลักษณะพื้นผิวและสีของวัตถุ โดยวัตถุสีขาวเรียบจะสะท้อนแสงอินฟราเรดได้ดี ทาให้ตัวรับแสง อินฟราเรดได้รับแสงสะท้อนมาก ส่งผลให้แรงดันเอาท์พุตของวงจรสูงตามไปด้วย ในขณะท่ีวัตถุสีดาสะท้อน แสงอินฟราเรดได้น้อย ทาให้ตัวรับอินฟราเรดส่งแรงดันเอาท์พุตออกมาต่า ด้วยคุณสมบัติดังกล่าว จึงนิยมนา โมดูล TCRT5000 มาใชใ้ นการตรวจจับพ้ืนหรือเสน้ โดยต้องตดิ ตงั้ ไว้ดา้ นล่างของโครงห่นุ ยนต์ 151

1.2 การเตรียมอุปกรณส์ าหรับภาระกจิ ตรวจจับเส้น 1.2.1 เตรยี มอปุ กรณส์ าหรับสรา้ งสนามทดสอบ ในการพัฒนาโปรแกรมเพ่ือควบคุมหุ่นยนต์เคลื่อนที่ตามเส้นโดยใช้ตัวตรวจจับแสงสะท้อน อินฟราเรดในการวิเคราะหเ์ ส้นและพ้ืนสนามน้ัน ต้องอาศยั การกาหนดเงื่อนไขเพ่ือเปรียบเทียบกับค่าอ้างอิง ค่า หนึ่งท่ีได้จากกการทดสอบอ่านค่าของสภาวะแสงที่ได้จากเส้นและพ้ืนสนามที่ใช้งานจริง โดยอาศัยความ แตกต่างของการสะท้อนแสงอินฟราเรดของแต่ละพื้นผิวท่ีมีสีต่างกัน เช่น พ้ืนผิวสีขาวสามารถสะท้อนแสง อินฟราเรดได้ดี ส่วนพ้ืนผิวสีดาสามารถสะท้อนแสงอินฟราเรดได้น้อย เน่ืองจากสีดามีความสามารถในการ ดูดกลืนแสงอินฟราเรดได้มาก การเรียนรู้ในบทนี้เลือกใช้สนามทดสอบอ้างอิงที่มีพ้ืนสนามเป็นสีขาวและเส้น เปน็ สดี า ดังน้นั ขอแนะนาใหผ้ ู้พัฒนาสร้างสนามทดสอบขึน้ มาก่อน สาหรบั สนามทดสอบ มอี ุปกรณ์และเครื่องมอื ท่ใี ชด้ ังน้ี 1. แผ่นพลาสติกลูกฟูกหรือฟิวเจอร์บอร์ด สีขาวขนาด 90x60 เซนติเมตร 1 แผ่น หรือตาม ความต้องการ แตต่ อ้ งเพยี งพอสาหรับการเคลอื่ นที่ของหุ่นยนต์ IPST-BOT 2. เทปพันสายไฟสีดาขนาด 1 น้ิว 2 ม้วน (แนะนายี่ห้อ 3M เนื่องจากมีความยืดหยุ่นสูง สามารถติดเปน็ เส้นโค้งได้ดี 3. กรรไหรสาหรับตดั เทปพันสายไฟ 1.2.2 ติดตั้งแผงวงจรตรวจจับแสงอินฟราเรดแก่หุ่นยนต์ IPST-BOT จุดประสงค์ของการใช้งานแผงวงจรตรวจจับแสงสะท้อนอินฟราเรดในหุ่นยนต์ IPST-BOT คือ นามาตรวจจับพื้นและเส้น ดังนนั้ จึงตอ้ งติดตั้งแผงวงจรตรวจจับนี้ไวท้ ่ีใต้ฐานหนุ่ ยนต์ มขี ้นั ตอนดังนี้ 1. ยึดแผงวงจรตรวจจับแสงสะท้อนอินฟราเรดเข้ากับแท่งต่อ 5 รู เจาะด้วยสกรู 3x10 มม. และนอต 3 มม. โดยระหวา่ งแผงวงจรกับแทง่ ต่อให้นาเสารองพลาสติก 3 มม. ค่ันเอาไว้ ทาเหมอื นกัน 3 ชุด 152

2. ปิดสวิตช์จ่ายไฟเลี้ยงของหุ่นยนต์ IPST-BOT จากนั้นถอดแผงวงจรหลักของหุ่นยนต์ IPST- BOT ออก นาแผงวงจรตรวจจับแสงสะท้อนอินฟราเรดที่ยึดกับแท่งต่อจากขั้นตอนที่ 1 ท้ัง 3 ชุด ยึดเข้ากับ ด้านหน้าของหุ่นยนต์ โดยใช้แท่งต่อ 12 รู รองและยึดด้วยสกรู 3x15 มม. และนอต 3 มม. ที่ตาแหน่งดังแสดง ในรูป จากนั้นเสียบสายสัญญาณของแผงวงจรตรวจจับแสงสะท้อนด้านซ้าย กลาง และขวาเข้าท่ี จุดต่า PA0 PA1 และ PA2 ของหุ่นยนต์ IPST-BOT ตามลาดับ จะได้หุ่นยนต์ท่ีสามารถตรวจจับพ้ืนและเส้น สาหรับการทดลอง 1.2.3 กาหนดค่าอ้างอิงเพื่อแยกความแตกตา่ งระหวา่ งเสน้ และพื้นสนาม ในการกาหนดค่าอ้างอิงเพื่อใช้ในการเปรียบเทียบเพ่ือให้หุ่นยนต์ทราบว่าตัวตรวจจับเส้นหรือ พื้นสนามน้ัน โดยท่ัวไปจะใช้การเขียนโปรแกรมอ่านค่าอนาล็อกจากแผงวงจรตรวจจับแสงสะท้อนอินฟราเรด แตล่ ะตวั ข้ึนมาแสดงผลเพ่ือสังเกตค่าที่ไดจ้ ากเสน้ และพ้ืนสนามว่ามีค่าแตกต่างกันมากน้อยเพียงไร แต่ในการเขียนโปรแกรมภาษา C เพื่ออ่านค่าจากแผงวงจรตรวจจับแสงสะท้อนอินฟราเรดใน ตัวหุ่นยนต์ IPST-BOT จะใช้ฟังกัน analog จากไฟล์ไลบรารี analog.h ซึ่งให้ค่าผลลัพธ์ 0 ถึง 1023 เมื่อ แผงวงจรตรวจจับแสงสะท้อนอินฟราเรดไปอยู่บริเวณตาแหน่งของเส้นสีดาจะให้ค่าต่ามีแนวโน้มไปทางค่า 0 และถ้าอยู่ในบริเวณสนามสีขาวจะให้ค่าสูงทีมีแนวโน้มไปทางค่า 1023 ซึ่งช่วยให้ผู้พัฒนาโปรแกรมสามารถ กาหนดค่าอา้ งอิงสาหรับเปรียบเทยี บเพื่อแยกแยะเส้นและพน้ื สนามได้ 153

 การทดลองท่ี 10.1 กาหนดค่าอา้ งองิ สาหรับการตรวจจับเสน้ การทดลองน้ีเป็นการทดสอบหาค่าอ้างอิงสาหรับใช้ในการตรวจจับเส้นของหุ่นยนต์ IPST-BOT ด้วย การเขียนโปรแกรมภาษา C อ่านค่าของสนามทดสอบด้วยแผงวงจรตรวจจับแสงสะท้อนอินฟราเรด โดยท่ี หุ่นยนต์ IPST-BOT ได้ติดตัง้ แผงวงจรตรวจจับแสงสะท้อนอินฟราเรดไว้ใต้ฐานหุ่นยนต์ทางด้านหน้าจานวน 3 ตัว สรา้ งสนามทดสอบ สนามทดสอบในการทดลองน้ีมีพน้ื สนามเปน็ สีขาว แล้วใชเ้ ทปพนั สายไฟติดเป็นรูปส่ีเหล่ยี มมุมโค้งตาม รูป ขนาดของสนามสามารปรับแต่งได้ตามความเหมาะสม ในที่นี้จะใช้แผ่นพลาสติกลูกฟูกสีขาวชนาด 90x60 เซนติเมตร นามาตดิ เทปเพ่ือสร้างกรอบสเี่ หลย่ี มมุมโคง้ ขนาด 70x40 เซนติเมตร การเชอื่ มต่ออุปกรณ์ - ตอ่ สายจากพอรต์ PA0 เขา้ กบั แผงวงจรตรวจจับแสงสะท้อนอินฟราเรดใตฐ้ านด้านหนา้ มมุ ซ้าย - ตอ่ สายจากพอรต์ PA1 เข้ากบั แผงวงจรตรวจจบั แสงสะทอ้ นอินฟราเรดใตฐ้ านดา้ นหนา้ ตรงกลาง - ตอ่ สายจากพอร์ต PA2 เขา้ กบั แผงวงจรตรวจจับแสงสะท้อนอินฟราเรดใตฐ้ านด้านหน้ามุมขวา ข้ันตอนการทดลอง 1. สรา้ งไฟล์โปรเจคท์ชอื่ reflect_test และพิมพ์โปรแกรม 10.1 2. คอมไพล์และดาวน์โหลดโปรแกรมเพ่อื ทดสอบผลลัพธก์ ารทางาน 3. รันโปรแกรม 154

โมดลู LCD ของหุน่ ยนตแ์ สดงขอ้ ความ L xxx M yyy R zzz โดยท่ี xxx, yyy และ zzz คือ ค่าช้อมูลดิจิตอลท่ีได้จากการอ่านค่าจากแผงวงจรตรวจจับแสง สะท้อนอินฟราเรดที่ติดต้ังอยู่ใต้ฐานหุ่นยนต์ด้านซ้าย กลาง และขวา ตามลาดับ ซึ่งผ่านกระบวนการแปลง สญั ญาณอนาล็อกเปน็ ดิจิตอลแลว้ 4. นาหนุ่ ยนต์ไปวางไวบ้ นพ้นื สนามสขี าว อา่ นและบนั ทกึ ค่าที่วัดได้ซ่ึงแสดงบนโมดูล LCD แผงวงจรตรวจจับท้ัง 3 ชุดควรอ่านค่าได้ใกลเ้ คียงกัน ให้ทาการเฉล่ียค่าท่ีได้ของแผงวงจรตรวจจับ แสงสะทอ้ นอินฟราเรดท้ัง 3 ชุด 155

5. วางหุ่นยนต์ให้แผงวงจรตรวจจับทั้ง 3 ชุดอยู่เหนือเส้นสีดา อ่านและบันทึกค่าที่วัดได้ซ่ึงแสดงบน โมดูล LCD แผงวงจรตรวจจับทง้ั 3 ชุดควรอ่านคา่ ไดใ้ กล้เคยี งกัน 6. คานวนหาค่าอ้างองิ ทีใ่ ช้ในการแยกแยะพืน้ สนามสีขาวกับเสน้ สีดาของสนาม ดงั น้ี ค่าอา้ งอิง = (คา่ การสะทอ้ นแสงที่ได้จากพน้ื สนามสขี าว + ค่าสะทอ้ นแสงทีไ่ ดจ้ ากเส้นสดี า) /2 ในการใช้งานจรงิ สามารถกาหนดค่าให้กวา้ งกว่าน้ีได้ แตค่ วรอยู่ในชว่ ง 250 ถึง 950 แต่ไมค่ วรเลือก ใกล้กบั ค่า 250 และ 950 มากเกนิ ไป สาหรบั ตวั อย่างตอ่ จากน้ีไปจะยึดค่าอ้างอิงไว้ที่ (950 + 250) /2 = 600 โปรแกรม 10.1 #include <sleep.h> #include <lcd.h> #include <analog.h> void main( ) { while (1) { lcd(“L %d M %d #nR %d”,analog(0), analog(1), analog(2)) sleep(10); } } 156

คาอธบิ ายโปรแกรม โปรแกรมจะทางานภายในลูป while (1) เพ่ืออ่านค่าจากแผงวงจรตรวจจับแสงสะท้อนอินฟราเรดที่ พอร์ต PA0, PA1 และ PA2 แล้วแปลงสัญญาณจากอนาลอ็ กเปน็ สญั ญาณดิจิตอลเพือ่ นามาแสดงผลทีโ่ มดูล LCD ของห่นุ ยนต์ IPST-BOT  การทดลองที่ 10.2 หุ่นยนตเ์ คลื่อนทภ่ี ายในกรอบเส้นสดี า การทดลองน้ีเป็นการเขียนโปรแกรมควบคุมหุ่นยนต์ IPST-BOT ให้เคล่ือนที่ภายในกรอบสี่เหลี่ยมมุม โคง้ ทีม่ เี ส้นสดี าล้อมรอบ โดยในการทดลองนีจ้ ะใชง้ านแผงวงจรตรวจจบั แสงสะท้อนอนิ ฟราเรดเพียง 2 ตวั ท่ี ติดตั้งใตฐ้ านหุ่นยนต์ คือ ด้านหนา้ มมุ ซา้ ยและขวา การเชือ่ มต่ออุปกรณ์ - ตอ่ สายจากพอรต์ PA0 เข้ากับแผงวงจรตรวจจับแสงสะท้อนอินฟราเรดใต้ฐานด้านหน้ามมุ ซ้าย - ตอ่ สายจากพอรต์ PA2 เขา้ กับแผงวงจรตรวจจับแสงสะท้อนอนิ ฟราเรดใตฐ้ านดา้ นหน้ามุมขวา ข้ันตอนการทดลอง 1. สรา้ งไฟล์โปรเจคท์ชือ่ robo_inner และพิมพโ์ ปรแกรม 10.2 2. คอมไพล์และดาวน์โหลดโปรแกรมเพ่ือทดสอบผลลพั ธก์ ารทางาน 157

3. รนั โปรแกรม โมดูล LCD ของหุ่นยนตแ์ สดงขอ้ ความ Press SW1 แจ้งให้กดสวิตช์ SW1 ที่บอร์ด Display-MOTOR ของหุ่นยนต์ IPST-BOT เพ่ือส่ังให้หุ่นยนต์ เคลอื่ นที่ 4. กดสวิตช์ SW1 ท่ีบอร์ด Disalpay-MOTOR ของหุ่นยนต์ IPST-BOT แล้วสังเกตการเคลื่อนท่ีของ หุ่นยนต์ หุ่นยนต์จะเคล่ือนท่ีอยู่ภายในกรอบเส้นสีดา โดยเมื่อแผงวงจรจับแสงสะท้อนพบเส้นสีดา ไมโครคอนโทรลเลอร์จะควบคุมให้หุ่นยนต์ถอยหลังแล้วเปลี่ยนทิศทางการเคลื่อนที่ จะมีลักษณะคล้ายกับ การหลบหลีกวตถุแบบสัมผัส แต่เปลี่ยนจากการตรวจจับการชนมาเป็นการตรวจจับเส้นสีดาและพ้ีนสีขาว แทน โปรแกรม 10.2 #include <sleep.h> #include <lcd.h> #include <analog.h> #include <motor.h> #include <in_out.h> #define POW 70 #define REF 600 void forward(unsigned int delay) { motor(1,POW); motor(2,POW); sleep(delay); } void backward(unsigned int delay) { motor(1,-POW); motor(2,-POW); sleep(delay); 158

} void turn_left(unsigned int delay) { motor(1,-POW); motor(2,POW); sleep(delay); } void turn_right(unsigned int delay) { motor(1,POW); motor(2,-POW); sleep(delay); } void main( ) { unsigned int left, right; lcd(“Press SW1”); sw1_press(); while (1) { left = analog(0); right = analog(2); if(left > REF && right > REF) forward(10); else if(left < REF && right > REF) { backward(1000); turn_right(1500); } else if(left > REF && right < REF) { backward(1000); turn_left(1500); } 159

else { backward(1000); turn_left(1500); } } } คาอธิบายโปรแกรม โปรแกรมแสดงข้อความ Press SW1 ท่ีโมดูล LCD เพ่ือรอการกดสวิตช์ SW1 เม่ือพบการกดสวิตช์ SW1 โปรแกรมจึงเร่ิมทางานคาส่ังภายในลูป while(1) เพื่อวนอ่านค่าจากแผงวงจรตรวจจับแสงสะท้อน อินฟราเรดที่ต่อเข้ากับใต้ฐานหุ่นยนต์ด้านหน้ามุมซ้าย (พอร์ต PA0) และด้านหน้ามุมขวา (พอร์ต PA2) มา เกบ็ ทต่ี ัวแปร left และ right ตามลาดับ แล้วนาค่าท้ังสองไปเปรยี บเทียบกับค่าอา้ งอิงท่ีกาหนดไว้ในตัวแปร REF ซง่ึ มคี า่ เทา่ กับ 600 ได้ 4 กรณดี ังน้ี กรณี 1 : if(left > REF && right > REF) เป็นการตรวจสอบว่า ตัวตรวจจับไม่พบเส้นสีดาใช่ หรอื ไม่ ถ้าเปน็ จรงิ (ไมพ่ บเสน้ สีดา) จะตอบสนองใหห้ ุน่ ยนตเ์ คล่ือนท่ตี รงไปขา้ งหน้า กรณี 2 : else if(left < REF && right > REF) เป็นการตรวจสอบวา่ ตวั ตรวจจบั ด้านซ้ายพบเส้นสี ดาเพียงตัวเดียวใช่หรือไม่ ถ้าเป็นจริง (พบเส้นสีดา) จะตอบสนองให้หุ่นยนต์เคลื่อนท่ีถอยหลังแล้วขวาเพื่อ เปล่ียนทศิ ทางการเคล่อื นที่ กรณี 3 : else if(left > REF && right < REF) เป็นการตรวจสอบว่า ตัวตรวจจับด้านขวาพบเส้นสี ดาเพียงตัวเดียวใช่หรือไม่ ถ้าเป็นจริง (พบเส้นสีดา) จะตอบสนองให้หุ่นยนต์เคลื่อนที่ถอยหลังแล้วซ้ายเพื่อ เปลีย่ นทศิ ทางการเคล่ือนที่ กรณี 4 : else เปน็ การตรวจสอบว่า ตัวตรวจจับทั้งสองดา้ นพบเสน้ สีดาใช่หรือไม่ ถ้าเป็นจริง (พบเส้น สดี า) จะตอบสนองใหห้ ุ่นยนต์เคล่อื นท่ีถอยหลงั แลว้ ซ้ายเพ่ือเปลย่ี นทศิ ทางการเคล่ือนท่ี จากหลักการในการตรวจจับเส้นดังกล่าว ผู้พัฒนาสามารถนาไปพัฒนาโปรแกรมควบคุมหุ่นยนต์ให้ เคลอ่ื นท่ภี ายในกรอบเส้นส่เี หล่ียมโดยใช้แผงวงจรตรวจจบั แสงสะทอ้ นอินฟราเรดเพียง 1 ตวั กไ็ ด หมายเหตุ ค่าอ้างอิง REF ท่ีใช้ในการเปรียบเทียบเส้นและพ้ืนสนามในการทดลองน้ี คือ 600 ซึ่งได้มา จากการทดลองที่ 10.1 ผู้พัฒนาอาจได้ค่าท่ีแตกต่างออกไป ทั้งน้ีขึน้ อยกู่ ับปัจจัยภายนอกอน่ื ๆ เช่น ปริมาณ แสงอินฟราเรดโดยรอบสนามทดสอบ ซ่ึงมาจากดวงอาทิตย์ หลอดไฟแบบไส้ หรือแหล่งกาเนิดแสง อินฟราเรดอ่นื ๆ รวมถึงระยะห่างจากตวั ตรวจจบั ถึงพ้นื สนาม เป็นตน้ 160

 การทดลองที่ 10.3 ห่นุ ยนต์ตรวจจับเส้นเคลื่อนทีแ่ บบสลบั ฟันปลา การทดลองนี้เป็นการเขียนโปรแกรมค้นหาและตรวจจับเส้นของหุ่นยนต์ IPST-BOT โดยกาหนดให้มี เสน้ สดี า 2 เส้นทขี่ นานกัน จากน้นั ปล่อยใหห้ นุ่ ยนตเ์ คลือ่ นที่โดยเอยี งทามมุ ประมาณ 45 องศากบั เส้นสีดา สร้างสนามทดสอบ ใช้แผ่นพลาสติกลูกฟูกขนาด 90x60 เซนติเมตร แล้วติดเทปพันสายไฟสีดา 2 เส้นให้ขนานกัน โดยมี ระยะห่างอยา่ งน้อย 30 เซนตเิ มตร เพื่อให้หุน่ ยนตม์ ีพืน้ ที่เพียงพอในการเคลื่อนที่ การเช่อื มต่ออปุ กรณ์ - ตอ่ สายจากพอรต์ PA0 เข้ากับแผงวงจรตรวจจบั แสงสะทอ้ นอินฟราเรดใตฐ้ านด้านหนา้ มมุ ซ้าย - ต่อสายจากพอร์ต PA2 เขา้ กบั แผงวงจรตรวจจับแสงสะทอ้ นอินฟราเรดใตฐ้ านด้านหนา้ มมุ ขวา ข้ันตอนการทดลอง 1. สรา้ งไฟล์โปรเจคท์ชื่อ robo_pingpong และพมิ พโ์ ปรแกรม 10.3 2. คอมไพลแ์ ละดาวนโ์ หลดโปรแกรมเพือ่ ทดสอบผลลพั ธ์การทางาน 3. วางหุน่ ยนตท์ ่ีจุดปล่อยตัว โดยเอยี งทามมุ กับเสน้ สดี าประมาณ 45 องศา 4. รันโปรแกรม โมดูล LCD ของหุน่ ยนต์แสดงขอ้ ความ Press SW1 แจ้งให้กดสวิตช์ SW1 ที่บอร์ด Display-MOTOR ของหุ่นยนต์ IPST-BOT เพื่อสั่งให้หุ่นยนต์ เคล่อื นที่ 161

5. กดสวิตช์ SW1 ที่บอร์ด Disalpay-MOTOR ของหุ่นยนต์ IPST-BOT แล้วสังเกตการเคลื่อนท่ีของ ห่นุ ยนต์ หุ่นยนต์จะเคลื่อนที่ไปข้างหน้าอย่างต่อเน่ืองจนพบเส้นสีดา ก็จะหมุนตัวเล้ียวทามุมประมาณ 90 องศา จากนั้นเคล่ือนที่ไปข้างหน้าอีกคร้ังจนพบเส้นสีดาอีกคร้ังหน่ึงก็จะหมุนตัวเล้ียวทามุมประมาณ 90 องศาในลักษณะซิกแซก (Zig-Zag) ไปมา โดยหุ่นยนต์จะเคล่ือนท่ีอยู่ระหว่างเส้นสีดาทั้ง 2 ฝัง ให้ ผู้พัฒนาโปรแกรมสังเกตการเคลื่อนที่และมุมในการเล้ียวเพื่อเปลี่ยนทิศทางของหุ่นยนต์ว่าเหมาะสมแล้ว หรือไม่ ถ้ายังไม่สมบรู ณืเพียงพอผพู้ ัฒนาโปรแกรมสามารถปรบั ค่าหน่วงเวลาสาหรบั การเล้ียวภายในโปรแร กมได้ตามความเหมาะสม แล้วกลับไปทาตามข้ันตอนท่ี 2 อีกคร้ัง จะกระท่ังการทางานของหุ่นยนต์เป็นไป ตามท่ีตอ้ งการ โปรแกรม 10.3 #include <sleep.h> #include <lcd.h> #include <analog.h> #include <motor.h> #include <in_out.h> #define POW 70 #define REF 600 void forward(unsigned int delay) { motor(1,POW); motor(2,POW); sleep(delay); } void backward(unsigned int delay) { motor(1,-POW); motor(2,-POW); sleep(delay); } 162

void turn_left(unsigned int delay) { motor(1,-POW); motor(2,POW); sleep(delay); } void turn_right(unsigned int delay) { motor(1,POW); motor(2,-POW); sleep(delay); } void main( ) { unsigned int left, right; lcd(“Press SW1”); sw1_press(); while (1) { left = analog(0); right = analog(2); if(left > REF && right > REF) forward(10); else if(left < REF && right > REF) turn_right(1500); else if(left > REF && right < REF) turn_left(1500); else backward(10); } } 163

คาอธบิ ายโปรแกรม โปรแกรมแสดงข้อความ Press SW1 ที่โมดูล LCD เพื่อรอการกดสวิตช์ SW1 เมื่อพบการกดสวิตช์ SW1 โปรแกรมจึงเริ่มทางานคาสั่งภายในลูป while(1) เพ่ือวนอ่านค่าจากแผงวงจรตรวจจับแสงสะท้อน อินฟราเรดที่ต่อเข้ากับใต้ฐานหุ่นยนต์ด้านหน้ามุมซ้าย (พอร์ต PA0) และด้านหน้ามุมขวา (พอร์ต PA2) มา เกบ็ ทต่ี ัวแปร left และ right ตามลาดับ แล้วนาค่าทั้งสองไปเปรียบเทียบกับค่าอ้างอิงที่กาหนดไว้ในตัวแปร REF ซ่ึงมคี า่ เทา่ กบั 600 ได้ 4 กรณีดงั น้ี กรณี 1 : if(left > REF && right > REF) เป็นการตรวจสอบว่า ตัวตรวจจับไม่พบเส้นสีดาใช่ หรือไม่ ถ้าเปน็ จริง (ไม่พบเสน้ สดี า) จะตอบสนองให้หุน่ ยนตเ์ คลอื่ นท่ตี รงไปขา้ งหน้า กรณี 2 : else if(left < REF && right > REF) เปน็ การตรวจสอบวา่ ตัวตรวจจบั ดา้ นซ้ายพบเส้นสี ดาเพียงตัวเดียวใช่หรือไม่ ถ้าเป็นจริง (พบเส้นสีดา) จะตอบสนองให้หุ่นยนต์เคล่ือนที่ถอยหลังแล้วขวาเพ่ือ เปล่ยี นทศิ ทางการเคล่ือนที่ กรณี 3 : else if(left > REF && right < REF) เป็นการตรวจสอบว่า ตัวตรวจจับด้านขวาพบเส้นสี ดาเพียงตัวเดียวใช่หรือไม่ ถ้าเป็นจริง (พบเส้นสีดา) จะตอบสนองให้หุ่นยนต์เคล่ือนที่ถอยหลังแล้วซ้ายเพื่อ เปลย่ี นทิศทางการเคลอ่ื นที่ กรณี 4 : else เป็นการตรวจสอบว่า ตวั ตรวจจับทั้งสองด้านพบเส้นสีดาใช่หรอื ไม่ ถา้ เป็นจรงิ (พบเส้น สีดา) จะตอบสนองให้หุน่ ยนตเ์ คล่อื นที่ถอยหลังเป็นชว่ งเวลาสัน้ ๆ เพือ่ เลย่ี งออกจากเส้น นอกจากนีผ้ ู้พฒั นาโปรแกรมสามารถเพ่มิ เติมคาส่ังให้หุ่นยนต์สามารถเล้ียวดว้ ยคา่ มุมที่แตกต่างออกไป เพ่ือให้ได้รูปแบบการเคล่ือนที่แบบ Zig-Zag ที่สมบูรณ์ รวมถึงการปรับแต่งตาแหน่งและระยะห่างของตัว อปุ กรณ์เพ้อื ใหก้ ารเคล่อื นที่ของหุ่นยนตเ์ ปน็ ไปตามท่ตี ้องการ 164

 การทดลองที่ 10.4 หุ่นยนตเ์ คลอ่ื นท่ตี ามเสน้ โดยใช้ตัวตรวจจบั เส้น 2 ตัว การทดลองนี้เป็นการเขียนโปรแกรมควบคุมหุ่นยนต์ให้เคล่ือนท่ีตามเส้นสีดาและมีเส้นตัด 2 จุดที่ ก่ึงกลางของสี่เหล่ียมตามแบบสนามทดสอบ โดยใช้แผงวงจรตรวจจับแสงสะท้อนอินฟราเรด 2 ตัวท่ีติดต้ัง ใต้ฐานหุ่นยนต์ด้านหน้ามุมซ้ายและขวา สาหรับตัวตรวจจับท่ีอยู่ตรงกลางจะถอดหรือไม่ก็ได้ โดยมีเงื่อนไข การทดลองดังน้ี - หุ่นยนต์ตอ้ งเคล่อื นทตี่ ามเสน้ สดี าที่กาหนด - เมื่อห่นุ ยนตพ์ บเส้นตดั จะต้องหยดุ รอท่จี ุดตัดเปน็ เวลา 3 วนิ าที แลว้ จงึ เคลอื่ นทตี่ ่อ หลักการพื้นฐานของการเคลอ่ื นท่ีตามเส้นแบบใชต้ ัวตรวจจบั เส้น 2 ตัว หลักของการเคล่ือนท่ีตามเส้น คือ ควบคุมให้หุ่นยนต์เคล่ือนที่โดยท่ีตัวตรวจจับเส้นทั้งสองตัวอยู่ใน ตาแหน่งที่คร่อมเส้น ดังนั้นจะเกิดเหตุการณ์ท้ังหมด 4 กรณี ซึ่งสามารถนามาใช้กาหนดเงื่อนไขของการ ทางานดังนี้ กรณที ่ี 1 หุน่ ยนต์อยใู่ นแนวเสน้ ของสนามหรอื คร่อมเส้น ตาแหนง่ ของตัวตรวจจบั เสน้ ด้านซา้ ย อย่บู ริเวณพื้นสีขาว (มคี า่ มากกวา่ ค่าอ้างอิง) ตาแหนง่ ของตวั ตรวจจบั เสน้ ดา้ นขวา อย่บู รเิ วณพ้นื สีขาว (มคี ่ามากกวา่ คา่ อา้ งองิ ) การควบคุมหุ่นยนต์ ตอบสนองใหห้ ุน่ ยนต์เคลอื่ นทไี่ ปข้างหน้าแลว้ หน่วงเวลาในการเคลื่อนที่ช่วงส้นั ๆ กรณที ี่ 2 ห่นุ ยนต์เคลอ่ื นท่พี ้นจากเส้นไปทางขวา ตาแหนง่ ของตัวตรวจจับเสน้ ด้านซา้ ย อยบู่ นเสน้ สีดา (มีคา่ นอ้ ยกว่าคา่ อา้ งองิ ) ตาแหนง่ ของตวั ตรวจจับเส้นด้านขวา อยู่บรเิ วณพื้นสีขาว (มีค่ามากกวา่ ค่าอ้างอิง) 165

การควบคุมหุ่นยนต์ ตอบสนองให้หุ่นยนต์เคล่ือนท่ีเล้ียวซ้ายแล้วหน่วงเวลาในการเคล่ือนท่ีช่วงส้ันๆ เพื่อให้ห่นุ ยนตเ์ คลอ่ื นทีก่ ลบั ไปครอ่ มเสน้ สีดา กรณีที่ 3 หุน่ ยนตเ์ คลือ่ นทพี่ น้ จากเสน้ ไปทางซา้ ย ตาแหน่งของตัวตรวจจับเส้นด้านซ้าย อยู่บริเวณพืน้ สขี าว (มีค่ามากกว่าคา่ อ้างอิง) ตาแหนง่ ของตัวตรวจจบั เส้นดา้ นขวา อยู่บนเส้นสดี า (มคี า่ นอ้ ยกว่าคา่ อา้ งองิ ) การควบคุมหุ่นยนต์ ตอบสนองให้หุ่นยนต์เคลื่อนท่ีเลี้ยวขวาแล้วหน่วงเวลาในการเคลื่อนท่ีช่วงสั้นๆ เพอื่ ใหห้ นุ่ ยนต์เคล่อื นทีก่ ลับไปครอ่ มเสน้ สีดา 166

กรณีท่ี 4 หุ่นยนตพ์ บเสน้ ตดั หรืออาจเปน็ ทางแยก ตาแหน่งของตัวตรวจจับเสน้ ด้านซา้ ย อยู่บนเสน้ สดี า (มคี า่ น้อยกวา่ ค่าอา้ งอิง) ตาแหนง่ ของตวั ตรวจจบั เสน้ ด้านขวา อยู่บนเสน้ สดี า (มคี ่านอ้ ยกว่าคา่ อ้างอิง) การควบคุมหุ่นยนต์ ผู้พัฒนาอาจเลือกให้หุ่นยนต์เครืองที่ไปข้างหน้า เลี้ยวซ้าย เล้ียวขวา หยุด หรือ ถอยหลงั ไดต้ ามเปา้ หมายของภาระกิจ สร้างสนามทดสอบ ใช้แผ่นพลาสติกลกู ฟูกขนาด 90x60 เซนติเมตร แล้วติดเทปพันสายไฟสีดาเป็นรปู ส่ีเหล่ียมมุมโค้งและ สรา้ งจุดตัด 2 จดุ ตามรปู 167

การเช่ือมต่ออปุ กรณ์ - ตอ่ สายจากพอร์ต PA0 เขา้ กบั แผงวงจรตรวจจับแสงสะทอ้ นอินฟราเรดใต้ฐานด้านหนา้ มุมซา้ ย - ตอ่ สายจากพอร์ต PA2 เข้ากบั แผงวงจรตรวจจับแสงสะทอ้ นอนิ ฟราเรดใต้ฐานดา้ นหน้ามุมขวา ข้นั ตอนการทดลอง 1. สรา้ งไฟลโ์ ปรเจคท์ชือ่ robo_line1 และพิมพโ์ ปรแกรม 10.4 2. คอมไพล์และดาวนโ์ หลดโปรแกรมเพ่อื ทดสอบผลลัพธก์ ารทางาน 3. วางหนุ่ ยนต์คร่อมเสน้ สีดาในตาแหน่งทไี่ ม่ใชจ่ ุดตัด 4. รนั โปรแกรม โมดลู LCD ของหุน่ ยนตแ์ สดงขอ้ ความ Press SW1 แจ้งให้กดสวิตช์ SW1 ท่ีบอร์ด Display-MOTOR ของหุ่นยนต์ IPST-BOT เพื่อส่ังให้หุ่นยนต์ เคล่อื นท่ี 5. กดสวิตช์ SW1 ที่บอร์ด Disalpay-MOTOR ของหุ่นยนต์ IPST-BOT แล้วสังเกตการเคล่ือนท่ีของ หุ่นยนต์ หุ่นยนต์จะเคล่ือนท่ีไปตามเส้นสีดา เมื่อพบเส้นตัดหุ่นยนต์จะหยุดน่ิงประมาณ 3 วินาที หลังจาก นนั้ จึงเคล่อื นท่ีตามเส้นต่อไป โปรแกรม 10.4 #include <sleep.h> #include <lcd.h> #include <analog.h> #include <motor.h> #include <in_out.h> #define POW 70 #define REF 600 void forward(unsigned int delay) { motor(1,POW); motor(2,POW); sleep(delay); } 168

void backward(unsigned int delay) { motor(1,-POW); motor(2,-POW); sleep(delay); } void turn_left(unsigned int delay) { motor(1,-POW); motor(2,POW); sleep(delay); } void turn_right(unsigned int delay) { motor(1,POW); motor(2,-POW); sleep(delay); } void pause( ) { motor_stop(1); motor_stop(2); } void main( ) { unsigned int left, right; lcd(“Press SW1”); sw1_press(); while (1) { left = analog(0); right = analog(2); 169

if(left > REF && right > REF) forward(10); else if(left < REF && right > REF) turn_left(10); else if(left > REF && right < REF) turn_right(10); else { puase(); sleep(3000); forward(500); } } } คาอธบิ ายโปรแกรม โปรแกรมแสดงข้อความ Press SW1 ท่ีโมดูล LCD เพ่ือรอการกดสวิตช์ SW1 เมื่อพบการกดสวิตช์ SW1 โปรแกรมจึงเร่ิมทางานคาสั่งภายในลูป while(1) เพื่อวนอ่านค่าจากแผงวงจรตรวจจับแสงสะท้อน อินฟราเรดที่ต่อเข้ากับใต้ฐานหุ่นยนต์ด้านหน้ามุมซ้าย (พอร์ต PA0) และด้านหน้ามุมขวา (พอร์ต PA2) มา เก็บทตี่ ัวแปร left และ right ตามลาดับ แล้วนาค่าทั้งสองไปเปรยี บเทียบกับค่าอา้ งอิงท่ีกาหนดไว้ในตัวแปร REF ซงึ่ มีคา่ เทา่ กบั 600 ได้ 4 กรณีดงั น้ี กรณี 1 : if(left > REF && right > REF) เป็นการตรวจสอบว่า ตัวตรวจจับไม่พบเส้นสีดาหรือไม่ ถ้าเป็นจริง (ไม่พบเส้นสีดา) หมายความว่า หุ่นยนต์เคลื่อนท่ีคร่อมเส้นสีดาอยู่ และตอบสนองให้หุ่นยนต์ เคลอื่ นทต่ี รงไปขา้ งหน้า กรณี 2 : else if(left < REF && right > REF) เป็นการตรวจสอบว่า ตัวตรวจจับด้านซ้ายพบเส้น สีดาเพียงตัวเดียวหรือไม่ ถ้าเป็นจริง (พบเส้นสีดา) หมายความว่า หุ่นยนต์กาลังเคล่ือนท่ีพ้นจากเส้นไป ทางขวา และตอบสนองให้หุ่นยนต์เคล่ือนเปลี่ยนทิศทางโดยหมุนเล้ียวซ้ายเป็นเวลาส้ันๆ เพื่อควบคุมให้ หุ่นยนต์เคลอื่ นท่คี ร่อมเสน้ อกี คร้ัง กรณี 3 : else if(left > REF && right < REF) เป็นการตรวจสอบว่า ตัวตรวจจับด้านขวาพบเส้น สีดาเพียงตัวเดียวหรือไม่ ถ้าเป็นจริง (พบเส้นสีดา) หมายความว่า หุ่นยนต์กาลังเคล่ือนท่ีพ้นจากเส้นไป ทางซ้าย และตอบสนองให้หุ่นยนต์เคลื่อนเปล่ียนทิศทางโดยหมุนเลี้ยวขวาเป็นเวลาสั้นๆ เพื่อควบคุมให้ หุ่นยนต์เคลือ่ นที่ครอ่ มเส้นอกี ครงั้ 170

กรณี 4 : else เป็นการตรวจสอบว่า ตัวตรวจจับทั้งสองด้านพบเส้นสีดาหรือไม่ ถ้าเป็นจริง (พบเส้น สดี า) หมายความว่า หุ่นยนต์เคล่ือนที่พบจดุ ตัดหรอื ทางแยก จึงตอบสนองให้หุ่นยนต์หยุดอยู่ที่ตาแหน่งน้ัน เปน็ เวลา 3 วนิ าที จากนนั้ เคล่ือนตรงเปน็ เวลา 0.5 วินาที เพือ่ ขา้ มเสน้ ตัด สาหรับการกาหนดค่าของเวลาในแต่ละช่วงของการเคลื่อนที่นั้นผู้พัฒนาสามารถปรับแก้ไขเพ่ือให้ เหมาะสมกบั สถานการณ์และสภาพแวดล้อมของสนามในขณะนนั้  การทดลองที่ 10.5 ห่นุ ยนต์เคล่ือนท่ตี ามเสน้ โดยใชต้ ัวตรวจจับเส้น 3 ตัว การทดลองน้ีเป็นการต่อยอดจากการทดลองที่ 10.4 โดยเพ่ิมแผงวงจรตรวจจบั แสงสะทอ้ นอินฟราเรด เพื่อใช้งานเป็นตัวตรวจจับเส้นตวั ท่ี 3 โดยติตต้ังที่ตาแหน่งกลางของหุ่นยนต์ ทง้ั น้ีเพ่ือช่วยให้หุ่นยนต์ IPST- BOT สามารถตรวจจับเส้นในลักษณะของเส้นตัดหรือทางแยกได้ดีมากยิ่งข้ึน โดยสนามทดสอบใช้แบบ เดียวกบั การทดลองท่ี 10.4 โดยมเี งื่อนไขการทดลองดงั นี้ - หุ่นยนต์ต้องเคล่อื นทีต่ ามเสน้ สีดาที่กาหนด - เม่ือหุ่นยนต์พบเสน้ ตัดจะตอ้ งหยดุ รอที่จุดตดั เปน็ เวลา 3 วินาที แลว้ จึงเคลื่อนท่ตี อ่ หลักการพ้ืนฐานของการเคลอื่ นท่ีตามเส้นแบบใช้ตวั ตรวจจับเส้น 3 ตัว หลักของการเคล่ือนท่ีตามเส้น คือ ควบคุมให้หุ่นยนต์เคลื่อนที่โดยท่ีตัวตรวจจับเส้น 2 ตัวอยู่ใน ตาแหน่งท่ีครอ่ มเส้น สว่ นตวั ตรวจจับเส้นตรงกลางจะอยู่บนเส้นสีดา ดังน้ันจะเกิดเหตกุ ารณ์ทั้งหมด 6 กรณี ซงึ่ สามารถนามาใช้กาหนดเงื่อนไขของการทางานดงั นี้ กรณที ่ี 1 หุ่นยนตอ์ ยู่ในแนวเสน้ ของสนามหรือครอ่ มเส้น ตาแหนง่ ของตัวตรวจจบั เสน้ ด้านซ้าย อยู่บรเิ วณพน้ื สีขาว (มคี ่ามากกว่าคา่ อ้างอิง) ตาแหน่งของตัวตรวจจับเส้นตรงกลาง อยบู่ นเส้นสีดา (มคี ่านอ้ ยกว่าค่าอ้างอิง) ตาแหนง่ ของตัวตรวจจับเส้นด้านขวา อยบู่ รเิ วณพืน้ สขี าว (มีคา่ มากกว่าคา่ อ้างอิง) 171

การควบคุมหุน่ ยนต์ ตอบสนองใหห้ ุน่ ยนตเ์ คล่ือนท่ีไปขา้ งหน้าแลว้ หนว่ งเวลาในการเคลอ่ื นท่ชี ่วงส้นั ๆ กรณีที่ 2 หุ่นยนตเ์ คลอ่ื นที่พน้ จากเสน้ ไปทางขวา ตาแหนง่ ของตัวตรวจจับเสน้ ด้านซ้าย อยบู่ นเสน้ สีดา (มคี า่ นอ้ ยกวา่ ค่าอา้ งอิง) ตาแหน่งของตวั ตรวจจบั เส้นตรงกลาง อยูบ่ ริเวณพนื้ สีขาว (มีค่ามากกวา่ ค่าอ้างองิ ) ตาแหนง่ ของตวั ตรวจจับเสน้ ด้านขวา อยู่บริเวณพน้ื สีขาว (มคี า่ มากกว่าคา่ อ้างองิ ) การควบคุมหุ่นยนต์ ตอบสนองให้หุ่นยนต์เคล่ือนที่เลี้ยวซ้ายแล้วหน่วงเวลาในการเคลื่อนท่ีช่วงสั้นๆ เพื่อให้หนุ่ ยนต์เคลือ่ นทก่ี ลบั ไปคร่อมเส้นสดี า กรณที ี่ 3 หนุ่ ยนต์เคลอื่ นทพี่ ้นจากเสน้ ไปทางซา้ ย ตาแหน่งของตวั ตรวจจบั เส้นด้านซา้ ย อยบู่ ริเวณพ้นื สขี าว (มคี ่ามากกวา่ คา่ อา้ งองิ ) ตาแหน่งของตวั ตรวจจับเส้นตรงกลาง อย่บู รเิ วณพ้นื สขี าว (มีค่ามากกวา่ ค่าอ้างองิ ) ตาแหนง่ ของตัวตรวจจบั เสน้ ดา้ นขวา อย่บู นเส้นสดี า (มีคา่ น้อยกวา่ คา่ อ้างอิง) การควบคุมหุ่นยนต์ ตอบสนองให้หุ่นยนต์เคลื่อนท่ีเลี้ยวขวาแล้วหน่วงเวลาในการเคล่ือนที่ช่วงสั้นๆ เพือ่ ใหห้ ่นุ ยนตเ์ คลอื่ นทก่ี ลบั ไปคร่อมเส้นสดี า 172

กรณที ่ี 4 หุ่นยนต์พบทางแยกด้านซา้ ย อยบู่ นเส้นสีดา (มคี า่ น้อยกว่าค่าอา้ งองิ ) ตาแหนง่ ของตัวตรวจจับเสน้ ดา้ นซ้าย อยู่บนเสน้ สดี า (มีค่านอ้ ยกวา่ คา่ อ้างองิ ) ตาแหนง่ ของตัวตรวจจับเสน้ ตรงกลาง อยู่บรเิ วณพนื้ สขี าว (มีค่ามากกว่าคา่ อ้างองิ ) ตาแหน่งของตัวตรวจจับเสน้ ด้านขวา การควบคุมหุ่นยนต์ ผู้พัฒนาอาจเลือกให้หุ่นยนต์เครืองที่ไปข้างหน้า เล้ียวซ้าย เลี้ยวขวา หยุด หรือ ถอยหลังได้ตามเปา้ หมายของภาระกจิ กรณที ่ี 5 หุ่นยนต์พบทางแยกดา้ นขวา อยู่บรเิ วณพน้ื สขี าว (มีค่ามากกวา่ ค่าอ้างองิ ) ตาแหน่งของตวั ตรวจจบั เส้นดา้ นซา้ ย อย่บู นเส้นสีดา (มีคา่ น้อยกวา่ ค่าอา้ งอิง) ตาแหนง่ ของตัวตรวจจับเส้นตรงกลาง อยู่บนเส้นสดี า (มีค่านอ้ ยกว่าค่าอ้างอิง) ตาแหน่งของตัวตรวจจับเส้นดา้ นขวา การควบคุมหุ่นยนต์ ผู้พัฒนาอาจเลือกให้หุ่นยนต์เครืองท่ีไปข้างหน้า เลี้ยวซ้าย เล้ียวขวา หยุด หรือ ถอยหลังไดต้ ามเป้าหมายของภาระกิจ 173

กรณที ่ี 6 หนุ่ ยนต์พบเสน้ ตัดหรอื อาจเป็นทางแยก ตาแหน่งของตวั ตรวจจบั เสน้ ดา้ นซ้าย อยู่บนเสน้ สดี า (มคี ่านอ้ ยกวา่ ค่าอา้ งอิง) ตาแหนง่ ของตัวตรวจจับเสน้ ตรงกลาง อย่บู นเส้นสดี า (มีค่านอ้ ยกว่าคา่ อ้างอิง) ตาแหน่งของตวั ตรวจจบั เส้นด้านขวา อยูบ่ นเสน้ สีดา (มีคา่ น้อยกว่าค่าอา้ งองิ ) การควบคุมหุ่นยนต์ ผู้พัฒนาอาจเลือกให้หุ่นยนต์เครืองที่ไปข้างหน้า เลี้ยวซ้าย เลี้ยวขวา หยุด หรือ ถอยหลงั ได้ตามเป้าหมายของภาระกิจ สร้างสนามทดสอบ ใช้แผ่นพลาสติกลกู ฟูกขนาด 90x60 เซนติเมตร แล้วติดเทปพันสายไฟสีดาเป็นรปู ส่ีเหล่ียมมุมโค้งและ สร้างจุดตดั 2 จดุ ตามรูป 174

การเช่ือมต่ออุปกรณ์ - ต่อสายจากพอร์ต PA0 เข้ากบั แผงวงจรตรวจจบั แสงสะทอ้ นอินฟราเรดใต้ฐานด้านหน้ามมุ ซ้าย - ต่อสายจากพอรต์ PA1 เข้ากับแผงวงจรตรวจจบั แสงสะท้อนอินฟราเรดใตฐ้ านดา้ นหนา้ ตรงกลาง - ตอ่ สายจากพอรต์ PA2 เข้ากับแผงวงจรตรวจจับแสงสะท้อนอนิ ฟราเรดใตฐ้ านดา้ นหนา้ มุมขวา ขน้ั ตอนการทดลอง 1. สรา้ งไฟลโ์ ปรเจคท์ช่ือ robo_line2 และพมิ พ์โปรแกรม 10.5 2. คอมไพลแ์ ละดาวน์โหลดโปรแกรมเพอื่ ทดสอบผลลัพธ์การทางาน 3. วางหุ่นยนต์ครอ่ มเส้นสดี าในตาแหน่งที่ไมใ่ ช่จุดตัด 4. รันโปรแกรม โมดูล LCD ของหุ่นยนต์แสดงข้อความ Press SW1 แจ้งให้กดสวิตช์ SW1 ท่ีบอร์ด Display-MOTOR ของหุ่นยนต์ IPST-BOT เพื่อส่ังให้หุ่นยนต์ เคลือ่ นท่ี 5. กดสวิตช์ SW1 ท่ีบอร์ด Disalpay-MOTOR ของหุ่นยนต์ IPST-BOT แล้วสังเกตการเคลื่อนที่ของ หุ่นยนต์ หุ่นยนต์จะเคลื่อนที่ไปตามเส้นสีดา เม่ือพบเส้นตัดหุ่นยนต์จะหยุดน่ิงประมาณ 3 วินาที หลังจาก นัน้ จึงเคลื่อนที่ตามเส้นตอ่ ไป โปรแกรม 10.5 #include <sleep.h> #include <lcd.h> #include <analog.h> #include <motor.h> #include <in_out.h> #define POW 70 #define REF 600 void forward(unsigned int delay) { motor(1,POW); motor(2,POW); sleep(delay); } 175

void backward(unsigned int delay) { motor(1,-POW); motor(2,-POW); sleep(delay); } void turn_left(unsigned int delay) { motor(1,-POW); motor(2,POW); sleep(delay); } void turn_right(unsigned int delay) { motor(1,POW); motor(2,-POW); sleep(delay); } void pause( ) { motor_stop(1); motor_stop(2); } void main( ) { unsigned int left, mid, right; lcd(“Press SW1”); sw1_press(); while (1) { left = analog(0); mid = analog(1); right = analog(2); 176

if(left > REF && mid < REF && right > REF) forward(10); else if(left < REF && mid > REF && right > REF) turn_left(10); else if(left > REF && mid > REF && right < REF) turn_right(10); else { puase(); sleep(3000); forward(500); } } } คาอธบิ ายโปรแกรม โปรแกรมแสดงข้อความ Press SW1 ท่ีโมดูล LCD เพ่ือรอการกดสวิตช์ SW1 เม่ือพบการกดสวิตช์ SW1 โปรแกรมจึงเร่ิมทางานคาส่ังภายในลูป while(1) เพ่ือวนอ่านค่าจากแผงวงจรตรวจจับแสงสะท้อน อินฟราเรดที่ต่อเข้ากับใต้ฐานหุ่นยนต์ด้านหน้ามุมซ้าย (พอร์ต PA0) ด้านหน้าตรงกลาง (พอร์ต PA1) และ ด้านหน้ามุมขวา (พอร์ต PA2) มาเก็บที่ตัวแปร left mid และ right ตามลาดับ แล้วนาค่าทั้ง 3 ไป เปรียบเทยี บกบั คา่ อ้างอิงท่กี าหนดไวใ้ นตัวแปร REF ซ่งึ มคี า่ เท่ากับ 600 ได้ 4 กรณดี ังนี้ กรณี 1 : if(left > REF && mid < REF && right > REF) เป็นการตรวจสอบว่า ตัวตรวจจับไม่ พบเส้นสีดาหรือไม่ ถ้าเป็นจริง หมายความว่า หุ่นยนต์เคล่ือนที่คร่อมเส้นสีดาอยู่ และตอบสนองให้หุ่นยนต์ เคลือ่ นที่ตรงไปขา้ งหน้า กรณี 2 : else if(left < REF && mid > REF && right > REF) เป็นการตรวจสอบว่า ตัว ตรวจจับด้านซ้ายพบเส้นสีดาเพียงตัวเดียวหรือไม่ ถ้าเป็นจริง (พบเส้นสีดา) หมายความว่า หุ่นยนต์กาลัง เคลื่อนที่พ้นจากเส้นไปทางขวา และตอบสนองให้หุ่นยนต์เคล่ือนเปล่ียนทิศทางโดยหมุนเล้ียวซ้ายเป็นเวลา ส้ันๆ เพื่อควบคุมให้ห่นุ ยนตเ์ คลอื่ นท่คี รอ่ มเส้นอีกครั้ง กรณี 3 : else if(left > REF && mid > REF && right < REF) เป็นการตรวจสอบว่า ตัว ตรวจจับด้านขวาพบเส้นสีดาเพียงตัวเดียวหรือไม่ ถ้าเป็นจริง (พบเส้นสีดา) หมายความว่า หุ่นยนต์กาลัง เคลื่อนท่ีพ้นจากเส้นไปทางซ้าย และตอบสนองให้หุ่นยนต์เคลื่อนเปลี่ยนทิศทางโดยหมุนเลี้ยวขวาเป็นเวลา ส้ันๆ เพ่ือควบคุมให้หนุ่ ยนตเ์ คลื่อนทค่ี รอ่ มเส้นอีกคร้ัง 177

กรณี 4 : else เป็นการตรวจสอบวา่ ตัวตรวจจบั ท้ัง 3 ตวั พบเสน้ สีดาหรือไม่ ถ้าเป็นจรงิ (พบเสน้ สีดา) หมายความว่า หุ่นยนต์เคล่ือนท่ีพบจุดตัดหรือทางแยก จึงตอบสนองให้หุ่นยนต์หยุดอยู่ที่ตาแหน่งนั้นเป็น เวลา 3 วินาที จากนั้นเคล่อื นตรงเป็นเวลา 0.5 วินาที เพอ่ื ข้ามเส้นตัด สาหรับการกาหนดค่าของเวลาในแต่ละช่วงของการเคลื่อนที่นั้นผู้พัฒนาสามารถปรับแก้ไขเพ่ือให้ เหมาะสมกับสถานการณ์และสภาพแวดลอ้ มของสนามในขณะนนั้  การทดลองที่ 10.6 หุ่นยนต์ตรวจจับทางแยกและเสน้ ตัด การทดลองนี้เป็นการต่อยอดจากการทดลองที่ 10.5 โดยเพ่ิมความซับซ้อนของสนามทดสอบและ เงอื่ นไขในการเคล่อื นทตี่ ามเสน้ มากยง่ิ ขน้ึ โดยมเี ง่ือนไขการทดลองดงั นี้ - หุ่นยนต์ต้องถกู ปลอ่ ยตัวจากจุดเริ่มตน้ - หนุ่ ยนตต์ อ้ งเคล่อื นทผี่ ่านทางแยกซ้ายและขวาในระหว่างที่ไปทางแยกเสน้ ตัด - เมือ่ ถงึ ทางแยกเสน้ ตัดตอ้ งเลย้ี วซ้ายและเคลอ่ื นทีต่ ามเส้นของสนามในทิศวนตามเข็มนาฬิกา สรา้ งสนามทดสอบ ใช้แผ่นพลาสติกลูกฟกู ขนาด 90x60 เซนตเิ มตร แล้วติดเทปพันสายไฟสดี าตามรูป การเชอ่ื มต่ออปุ กรณ์ - ตอ่ สายจากพอร์ต PA0 เขา้ กับแผงวงจรตรวจจับแสงสะทอ้ นอนิ ฟราเรดใต้ฐานดา้ นหนา้ มุมซ้าย - ต่อสายจากพอรต์ PA1 เข้ากบั แผงวงจรตรวจจบั แสงสะทอ้ นอินฟราเรดใต้ฐานดา้ นหน้าตรงกลาง - ตอ่ สายจากพอรต์ PA2 เข้ากบั แผงวงจรตรวจจับแสงสะทอ้ นอนิ ฟราเรดใตฐ้ านดา้ นหน้ามมุ ขวา ขน้ั ตอนการทดลอง 1. สร้างไฟล์โปรเจคท์ช่อื servo_robo_line3 และพิมพ์โปรแกรม 10.6 2. คอมไพลแ์ ละดาวนโ์ หลดโปรแกรมเพอื่ ทดสอบผลลพั ธ์การทางาน 178

3. วางหนุ่ ยนตค์ รอ่ มเสน้ สีดาในตาแหนง่ จดุ เริ่มต้น 4. รนั โปรแกรม โมดูล LCD ของห่นุ ยนตแ์ สดงขอ้ ความ Press SW1 แจ้งให้กดสวิตช์ SW1 ที่บอร์ด Display-MOTOR ของหุ่นยนต์ IPST-BOT เพ่ือส่ังให้หุ่นยนต์ เคลือ่ นที่ 5. กดสวิตช์ SW1 ที่บอร์ด Disalpay-MOTOR ของหุ่นยนต์ IPST-BOT แล้วสังเกตการเคล่ือนท่ีของ ห่นุ ยนต์ หุ่นยนต์จะเคลื่อนที่ไปตามเส้นสีดาโดยไม่เล้ียวเม่ือพบทางเยกซ้ายและขวา เมื่อพบทางแยกเส้นตัด หนุ่ ยนต์จะเลีย้ วซา้ ยและเคล่ือนท่ตี ามเสน้ โค้งในทิศวนตามเขม็ นาฬกิ าอย่างต่อเนื่อง โปรแกรม 10.6 #include <sleep.h> #include <lcd.h> #include <analog.h> #include <motor.h> #include <in_out.h> #define POW 70 #define REF 600 void forward(unsigned int delay) { motor(1,POW); motor(2,POW); sleep(delay); } 179

void backward(unsigned int delay) { motor(1,-POW); motor(2,-POW); sleep(delay); } void turn_left(unsigned int delay) { motor(1,-POW); motor(2,POW); sleep(delay); } void turn_right(unsigned int delay) { motor(1,POW); motor(2,-POW); sleep(delay); } void main( ) { unsigned int left, mid, right; lcd(“Press SW1”); sw1_press(); while (1) { left = analog(0); mid = analog(1); right = analog(2); if(left > REF && mid < REF && right > REF) forward(10); else if(left < REF && mid > REF && right > REF) turn_left(10); else if(left > REF && mid > REF && right < REF) 180

turn_right(10); else if(left < REF && mid < REF && right > REF) forward(10); else if(left > REF && mid < REF && right < REF) forward(10); else { forward(100); turn_left(100); } } } คาอธบิ ายโปรแกรม โปรแกรมแสดงข้อความ Press SW1 ที่โมดูล LCD เพ่ือรอการกดสวิตช์ SW1 เมื่อพบการกดสวิตช์ SW1 โปรแกรมจึงเริ่มทางานคาสั่งภายในลูป while(1) เพ่ือวนอ่านค่าจากแผงวงจรตรวจจับแสงสะท้อน อินฟราเรดท่ีต่อเข้ากับใต้ฐานหุ่นยนต์ด้านหน้ามุมซ้าย (พอร์ต PA0) ด้านหน้าตรงกลาง (พอร์ต PA1) และ ด้านหน้ามุมขวา (พอร์ต PA2) มาเก็บที่ตัวแปร left mid และ right ตามลาดับ แล้วนาค่าทั้ง 3 ไป เปรียบเทยี บกบั คา่ อ้างองิ ท่กี าหนดไวใ้ นตวั แปร REF ซงึ่ มคี ่าเท่ากับ 600 ได้ 6 กรณีดังน้ี กรณี 1 : if(left > REF && mid < REF && right > REF) เป็นการตรวจสอบว่า ตัวตรวจจับไม่ พบเส้นสีดาหรือไม่ ถ้าเป็นจรงิ หมายความว่า หุ่นยนต์เคล่ือนท่ีคร่อมเส้นสีดาอยู่ และตอบสนองให้หุ่นยนต์ เคล่อื นทต่ี รงไปขา้ งหนา้ กรณี 2 : else if(left < REF && mid > REF && right > REF) เป็นการตรวจสอบว่า ตัว ตรวจจับด้านซ้ายพบเส้นสีดาเพียงตัวเดียวหรือไม่ ถ้าเป็นจริง (พบเส้นสีดา) หมายความว่า หุ่นยนต์กาลัง เคลื่อนท่ีพ้นจากเส้นไปทางขวา และตอบสนองให้หุ่นยนต์เคล่ือนเปลี่ยนทิศทางโดยหมุนเล้ียวซ้ายเป็นเวลา สัน้ ๆ เพอื่ ควบคมุ ใหห้ นุ่ ยนตเ์ คล่ือนท่ีคร่อมเส้นอีกคร้ัง กรณี 3 : else if(left > REF && mid > REF && right < REF) เป็นการตรวจสอบว่า ตัว ตรวจจับด้านขวาพบเส้นสีดาเพียงตัวเดียวหรือไม่ ถ้าเป็นจริง (พบเส้นสีดา) หมายความว่า หุ่นยนต์กาลัง เคล่ือนท่ีพ้นจากเส้นไปทางซ้าย และตอบสนองให้หุ่นยนต์เคลื่อนเปล่ียนทิศทางโดยหมุนเล้ียวขวาเป็นเวลา สน้ั ๆ เพอื่ ควบคมุ ให้ห่นุ ยนต์เคลือ่ นท่ีครอ่ มเสน้ อีกครง้ั กรณี 4 : else if(left < REF && mid < REF && right > REF) เป็นการตรวจสอบว่า ตัว ตรวจจับพบทางแยกซ้ายหรือไม่ ถ้าเป็นจริง หมายความว่า หุ่นยนต์กาลังเคลื่อนที่ผ่านทางแยกซ้าย และ ตอบสนองใหห้ ่นุ ยนต์เคลอ่ื นไปขา้ งหน้าเพอื่ ผ่านทางแยกซา้ ย 181

กรณี 5 : else if(left > REF && mid < REF && right < REF) เป็นการตรวจสอบว่า ตัว ตรวจจับพบทางแยกขวาหรือไม่ ถ้าเป็นจริง หมายความว่า หุ่นยนต์กาลังเคลื่อนท่ีผ่านทางแยกขวา และ ตอบสนองใหห้ ่นุ ยนตเ์ คลอื่ นไปข้างหน้าเพอ่ื ผ่านทางแยกขวา กรณี 6 : else เป็นการตรวจสอบว่า ตัวตรวจจับทัง้ 3 ตัวพบเส้นสดี าหรอื ไม่ ถ้าเป็นจริง (พบเส้นสีดา) หมายความว่า หุ่นยนต์เคล่ือนท่ีพบจุดตัดหรือทางแยก จึงตอบสนองให้หุ่นยนต์เคล่ือนท่ีไปข้างหน้า 0.1 วินาที แล้วเลีย้ วซา้ ย 0.3 วินาที จากน้ันเข้าสู่กระบวนการตรวจสอบเงื่อนไขของการเคล่ือนท่ีตามเสน้ สาหรับการกาหนดค่าของเวลาในแต่ละช่วงของการเคล่ือนท่ีน้ันผู้พัฒนาสามารถปรับแก้ไขเพ่ือให้ เหมาะสมกับสถานการณ์และสภาพแวดลอ้ มของสนามในขณะน้นั 182

บรรณานกุ รม เดชฤทธ์ิ มณีธรรม, คัมภีร์หุ่นยนต์ (ROBOT). พิมพ์ครั้งท่ี 4, กรุงเทพฯ : เพชรเกษม พร้ินต้ิง กรปุ๊ จากัด, 2553. ทีมงานสมารท์ เลิรน์ นง่ิ , 35 in 1 Robot Leaning By Doing. กรงุ เทพฯ : สมารเ์ ลริ ์นนง่ิ , 2550. การสร้างและทดลองเขียนโปรแกรมควบคุมหุ่นยนต์อัตโนมัติ IPST-BOT. กรุงเทพฯ : อินโนเวตีฟ เอ็กเพอรเิ มนต์, 2521. 183