Pop bot xt th

Page 1

  XT  1

  

ArduinoPOP-BOT XT

Arduino compatible robot kit activity manual


  XT 2  

       XT

สงวนลิขสิทธิ์ตาม พ.ร.บ. ลิขสิทธิ์ พ.ศ. 2537 หามการลอกเลียนไมวาสวนหนึงส ่ วนใดของหนังสือเลมนี้ นอกจากจะไดรับอนุญาต

ใครควรใชหนังสือเลมนี้ 1. นักเรียน นิสิต นักศึกษา และบุคคลทัวไปที ่ มี่ ความสนใจในการนําไมโครคอนโทรลเลอรไปประยุกตใชในการทดลอง เกียวกั ่ บการทํางานของระบบอัตโนมัติ หรือสนใจในการเรียนรูและทดลองไมโครคอนโทรลเลอร  ในแนวทางใหมทีใช ่ กิจกรรมหุนยนต  อัตโนมัติเปนสือ่ 2. สถาบันการศึกษา โรงเรียน วิทยาลัย มหาวิทยาลัย ทีมี่ การเปดการเรียนการสอนวิชาอิเล็กทรอนิกสหรือภาควิชา วิศวกรรมอิเล็กทรอนิกสและคอมพิวเตอร 3. คณาจารยทีมี่ ความตองการศึกษา และเตรียมการเรียนการสอนวิชาไมโครคอนโทรลเลอร รวมถึงวิทยาศาสตร ประยุกตทีต่ องการบูรณาการความรูทางอิเล็กทรอนิกส-ไมโครคอนโทรลเลอร-การเขียนโปรแกรมคอมพิวเตอรการทดลองทางวิทยาศาสตร ในระดับมัธยมศึกษา อาชีวศึกษา และปริญญาตรี

ดําเนินการจัดพิมพและจําหนายโดย บริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด 108 ซ.สุขุมวิท 101/2 ถ.สุขุมวิท แขวงบางนา เขตบางนา กรุงเทพฯ 10260 โทรศัพท 0-2747-7001-4 โทรสาร 0-2747-7005

รายละเอียดทีปรากฏในหนั ่ งสือเลมนี้ไดผานการตรวจทานอยางละเอียดและถวนถี่ เพือให ่ มีความสมบูรณและ ถูกตองมากทีสุ่ ดภายใตเงือนไขและเวลาที ่ พึ่ งมีกอนการจัดพิมพเผยแพร ความเสียหายอันอาจเกิดจากการนําขอมูล ในหนังสือเลมนีไปใช ้ ทางบริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด มิไดมีภาระในการรับผิดชอบแตประการใด ความผิดพลาดคลาดเคลือนที ่ อาจมี ่ และไดรับการจัดพิมพเผยแพรออกไปนัน้ ทางบริษัทฯ จะพยายามชีแจงและแก ้ ไข ในการจัดพิมพครังต ้ อไป


  XT  3

XT

       ชุดหุนยนต  POP-BOT XT เปนโครงการทีนํ่ าเสนอทางเลือกในการเรียนรูไมโครคอนโทรลเลอร  อยางงายดวยซอฟตแวร Arduino เพื่อนําเสนอแนวทางและกิจกรรมในการประยุกตใชไมโคร คอนโทรลเลอรและซอฟตแวรโปรแกรมภาษา C/C++ ระบบเปดหรือโอเพนซอรส มาสรางเปนหุนยนต  อัตโนมัติขนาดเล็กหรือ Programmable Mobile Robot โดยหุนยนต  ทีใช ่ ในโครงการนีเป ้ นชุดหุนยนต  อัตโนมัติทีขั่ บเคลือนด ่ วยมอเตอรไฟตรงทีมี่ เฟองทดในตัว วัตถุประสงคในการดําเนินการโครงการนี้คือ 1.เพื่อใหนําเสนอแนวทางในการนําแผงวงจรไมโครคอนโทรลเลอร POP-XT ไปใชใน กิจกรรมทีมี่ ความหลากหลาย โดยเฉพาะอยางยิงกั ่ บการจัดกิจกรรมเกียวกั ่ บการควบคุมหุนยนต  อัตโนมัติ 2.เพื่อเปนตัวอยางหรือทางเลือกในการขยายโอกาส สําหรับการพัฒนาสื่อการเรียน การสอนวิทยาศาสตรและเทคโนโลยีทีใช ่ หุนยนต  เปนสื่อสําหรับครู-อาจารย 3. เพื่อเตรียมการสําหรับการฝกอบรมเพื่อการประลองความรูความสามารถในการ เขียนโปรแกรมควบคุมหุนยนตอัตโนมัติ สําหรับการจัดสือหรื ่ อคูมื อประกอบในการเรียนรูและดํ  าเนินกิจกรรมนัน้ ไดจัดทําหนังสือสราง และพัฒนาโปรแกรมควบคุมหุนยนต  อัตโนมัติดวยโปรแกรมภาษา C/C++ กับ Arduino และ POP-BOT XT เพือใช ่ ประกอบในการเรียนรูและทดลอง  พรอมกันนีสามารถใช ้ หนังสือเรียนรูระบบควบคุ  มอยาง งายดวยโปรแกรมภาษา C กับ Arduino และบอรดไมโครคอนโทรลเลอร POP-XT ประกอบในการเรียน รูและทํ  าความเขาใจรวมดวยได ่ ยนรูทางเลือกสําหรับครู-อาจารย, ชุด POP-BOT XT robot kit และ POP-BOT XT Lite robot kit เปนสือการเรี นักเรียนและนักพัฒนาระบบสมองกลฝงตัวอิสระทีมี่ ความประสงคในการตอยอดหรือประยุกตใชไมโครคอนโทรลเลอร และซอฟตแวร Arduino ในกิจกรรมดานหุนยนต  อัตโนมัติทีควบคุ ่ มดวยโปรแกรมภาษา C/C++ ดําเนินการโดย บริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด การจัดหาสือการเรี ่ ยนรูนี เป ้ นไปในรูปแบบสมัครใจ การบริการเกียวกั ่ บการจัดหา และซอมแซมอุปกรณอยูภายใต  ความรับผิดชอบของบริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด


  XT 4  

  การนําเสนอขอมูลเกียวกั ่ บขอมูลทางเทคนิคและเทคโนโลยีในหนังสือเลมนี้ เกิดจากความตอง การทีจะอธิ ่ บายกระบวนการและหลักการทํางาน ของอุปกรณในภาพรวมดวยถอยคําทีง่ ายเพือสร ่ าง ความเขาใจแกผูอ าน ดังนันการแปลคํ ้ าศัพททางเทคนิคหลายๆ คําอาจไมตรงตามขอบัญญัติของราช บัณฑิตยสถาน และมีหลายๆ คําทียั่ งไมมีการบัญญัติอยางเปนทางการ คณะผูเขี  ยนจึงขออนุญาต บัญญัติศัพทขึนมาใช ้ ในการอธิบาย โดยมีขอจํากัดเพืออ ่ างอิงในหนังสือเลมนีเท ้ านัน้ ทังนี ้ สาเหตุ ้ หลักของขอชีแจงนี ้ มาจาก ้ การรวบรวมขอมูลของอุปกรณในระบบสมองกลฝงตัว และเทคโนโลยีหุนยนต  สําหรับการศึกษาเพือนํ ่ ามาเรียบเรียงเปนภาษาไทยนันทํ ้ าไดไมงายนัก ทางคณะ ผูเขี ยนตองทําการรวบรวมและทดลองเพือให ่ แนใจวา ความเขาใจในกระบวนการทํางานตางๆ นันมี ้ ความ คลาดเคลือนน ่ อยทีสุ่ ด เมือต ่ องทําการเรียบเรียงออกมาเปนภาษาไทย ศัพททางเทคนิคหลายคํามีความหมายทีทั่ บซอน กันมาก การบัญญัติศัพทจึงเกิดจากการปฏิบัติจริงรวมกับความหมายทางภาษาศาสตร ดังนันหากมี ้ ความ คลาดเคลือนหรื ่ อผิดพลาดเกิดขึน้ ทางคณะผูเขี  ยนขอนอมรับและหากไดรับคําอธิบายหรือชีแนะจากท ้ าน ผูรู จะได  ทําการชีแจงและปรั ้ บปรุงขอผิดพลาดทีอาจมี ่ เหลานันโดยเร็ ้ วทีสุ่ ด ทังนี ้ ้เพือให ่ การพัฒนาสื่อทางวิชาการ โดยเฉพาะอยางยิงกั ่ บความรูของเทคโนโลยีสมัยใหม สามารถดําเนินไปไดอยางตอเนือง ่ ภายใตการมีสวนรวมของผูรู ในทุ  กภาคสวน


  XT  5

 บทที่ 1

...........................................................7

» ¡ Ã³ì · ҧΠÒÃì´ á ÇÃì¢ Í § POP-BOT XT á ¹ йíÒÍØ

บทที่ 2 ลงมือสรางหุนยนต  POP-BOT XT..............................................................................19 บทที่ 3 แนะนําโปรแกรม Arduino 1.0..................................................................................27 บทที่ 4 โครงสรางโปรแกรมของ Arduino..................................................................................47 บทที่ 5 การพัฒนาโปรแกรมสําหรับหุนยนต  POP-BOT XT ดวย Arduino 1.0.....................75 บทที่ 6 ทดสอบการควบคุมฮารดแวรของ POP-XT แผงวงจรควบคุมของหุนยนต POP-BOT XT.............................................................................................................. 83 บทที่ 7 ไลบรารีสําหรับการพัฒนาโปรแกรมของหุนยนต  POP-BOT XT..........................101 บทที่ 8 ขับเคลือนหุ ่ นยนต  POP-BOT XT................................................................................131 บทที่ 9 หุนยนต  POP-BOT XT กับสวิตชและการตรวจจับการชน ....................................145 บทที่ 10 หุนยนต  POP-BOT XT กับภารกิจตรวจจับเสน....................................................153 บทที่ 11 หุนยนต  POP-BOT XT กับการตรวจจับวัตถุแบบไมสัมผัส...................................175 บทที่ 12 หุนยนต  POP-BOT XT กับการขับเซอรโวมอเตอร................................................183


  XT 6  


  XT 7



XT ่ มหุนยนตอัตโนมัติขนาดเล็กที่ POP-BOT XT เปนชุดอุปกรณสําหรับสรางและพัฒนาโปรแกรมเพือควบคุ ขับเคลือนด ่ วยมอเตอรไฟตรงและชุดเฟองขับ มีดวยกัน 2 รุนคือ ่ ไมโครคอนโทรลเลอร 1. POP-BOT X T Lite kit ในชุ ดนี้ประกอบดวย แผงวงจรควบคุมหลักซึงมี ATmega32U4 เปนอุปกรณหลักและโมดูลแสดงผลกราฟก LCD สีในตัว, แผงวงจรอุปกรณตรวจจับสัญญาณหรือ เซนเซอร (sensor) พื้นฐาน, มอเตอรไฟตรงพรอมชุดเฟองขับหรือ DC motor gearbox และชินส ้ วนทางกลทีจํ่ าเปน ทําใหนําชุด POP-BOT XT Lite นีไปใช ้ ในการเรียนรูและเขียนโปรแกรมเพื่อควบคุมหุนยนตอัตโนมัติดวยภาษา C/ C++ ในเบื้องตนไดภายใตงบประมาณที่เหมาะสม 2. POP-BOT XT Standard kit ในชุดประกอบดวยอุปกรณหลักเหมือนกับชุด POP-BOT XT Lite มีการ เพิ่มตัวตรวจจับระยะทางดวยแสงอินฟราเรด, ตัวตรวจจับแสงสะทอนอินฟราเรดอีก 2 ตัว (รวมเปน 4 ตัว), เซอร ้ ในการเรียนรู, ทดลองและพัฒนา โวมอเตอร และชิ้นตอพลาสติกเพิ่มเติม เพื่อใหนําหุนยนต POP-BOT XT นีมาใช หุนยนตอัตโนมัติแบบโปรแกรมได ทั้งยังรองรับกิจกรรมการแขงขันไดเปนอยางดี

1.1 รายการอุปกรณที่ใชในหุนยนต  POP-BOT XT 1. แผงวงจรควบคุมหุนยนต POP-XT ที่ติดตั้งกะบะถาน AA แบบ 4 กอน 2. แผงวงจรสวิตช 2 ชุด 3. แผงวงจร LED 2 ชุด 4. แผงวงจรตรวจจับแสงสะทอนอินฟราเรด ZX-03 จํานวน 2 ชุด (สําหรับรุน Lite) หรือ 4 ชุด (สําหรับรุน มาตรฐานหรือ Standard) 5. มอเตอรไฟตรงพรอมชุดเฟองขับรุน BO2 อัตราทด 48:1 พรอมสายเชื่อมตอแบบ IDC จํานวน 2 ตัว 6. ลอพลาสติกกลมสําหรับชุดเฟองขับมอเตอรและยาง จํานวน 2 ชุด 7. แผนกริดขนาด 80x60 เซนติเมตรและ 80x80 เซนติเมตร จํานวน 2 ชุด 8. แผนฐานกลมพรอมลออิสระ 1 แผน 9. ชิ้นตอ/แทงตอพลาสติก * 10. ชุดฉากโลหะ * 11. ชุดนอตและสกรู 12. แผนทดสอบการเคลือนที ่ ตามเส ่ นของหุนยนต 13. สายเชื่อมตอ USB-miniB สําหรับดาวนโหลดโปรแกรมและสื่อสารขอมูล 14. ซีดีรอมบรรจุซอฟตแวรและตัวอยางโปรแกรมการทดลอง


  XT 8

15. หนังสือการสรางและทดลองเขียนโปรแกรมควบคุมหุนยนตอัตโนมัติดวยภาษา C (เลมนี)้ 16. โมดูลตรวจจับและวัดระยะทางแบบอินฟราเรด GP2D120** 17. เซอรโวมอเตอร** * จัดใหมีจํานวนเพิมขึ ่ ้นในชุด POP-BOT XT Standard kit ** เปนอุปกรณที่มีเพิ่มเติมในชุด POP-BOT XT Standard kit

1.2 คุณสมบัติของชุดอุปกรณในสวนไมโครคอนโทรลเลอรหลัก 1.2.1 แผงวงจรควบคุมหลัก POP-XT POP-XT เป นแผงวงจรไมโครคอนโทรลเลอร สที่ ใช ไมโครคอนโทรลเลอร ตระกูล AVR เบอร ATmega32U4 ของ Atmel (www.atmel.com) มีสวนเชื่อมตอพอรต USB เพื่อใชในการสื่อสารขอมูลและดาวน โหลดโปรแกรมไดในตัว โดยไมตองใชสายสัญญาณหรืออุปกรณแปลงสัญญาณใดๆ เพิ่มเติม จึงทําใหการใชงาน งายและสะดวกมาก รวมถึง POP-XT ไดเลือกใชฮารดแวรทีเข ่ ากันไดกับฮารดแวรของโครงการไมโครคอนโทรลเลอร ระบบเปด (โอเพนซอรส : open source) ทีชื่ อ่ Arduino (www.arduino.cc/en) ในรุน Arduino Leonardo จึงทําให สามารถนําชุดพัฒนาของ Arduino1.0 มาใชงานได ภายในชุดพัฒนาของ Arduino1.0 มีไลบรารีฟงกชันภาษาซีสําหรับ ติดตอกับฮารดแวรจํานวนมากไวให ทําใหเขียนโปรแกรมสังงานอุ ่ ปกรณตางๆ ไดงาย โดยไมจําเปนตองศึกษาลงไป ในรายละเอียดของไมโครคอนโทรลเลอรมากนัก แตถาหากมีความตองการพัฒนาในระดับทีสู่ งขึนก็ ้ สามารถนํา POPXT ไปใชรวมกับเครืองมื ่ อพัฒนาโปรแกรมรวมถึงคอมไพเลอรอืนๆ ่ ไดเชนกัน สวนประกอบทั้งหมดของแผงวงจร POP-XT แสดงในรูปที่ 1-1 มีคุณสมบัติโดยสรุปดังนี้  ใชไมโครคอนโทรลเลอรขนาด 8 บิตเบอร ATmega32U4 ของ Atmel ภายในมีโมดูลแปลงสัญญาณ อะนาลอกเปนดิจิตอลความละเอียด 10 บิต 12 ชอง มีหนวยความจําโปรแกรมแบบแฟลช 32 กิโลไบต โปรแกรม ใหมได 10,000 ครั้ง มีหนวยความจําขอมูลอีอีพรอม 1024 ไบต หนวยความจําขอมูลแรม 2.5 กิโลไบต หรือ 2560 ไบต ใชสัญญาณนาฬิกา 16MHz จากเซรามิกเรโวเนเตอร  จุดตอพอรตใชงาน 25 จุด และจัดสรรเปนจุดตอแบบ JST 3 ขา จํานวน 12 จุดสําหรับตออุปกรณ ตรวจจับและอุปกรณตอพวงภายนอกตางๆ ้ ต  มีไฟแสดงสถานะไฟเลียงและไฟทดสอบพอร  มีสวิตช RESET  มีจุดตอพอรต USB สําหรับดาวนโหลดโปรแกรมและสื่อสารขอมูลกับคอมพิวเตอร  มีจุดตอไฟเลียง ้ (DC INPUT) ผานทางจุดตอสายแบบขันสกรู สามารถรับไฟเลี้ยงไดตังแต ้ 4.8 ถึง 7.2V โดยมีสวิตชเปด-ปดเพื่อตัดตอไฟเลียงแก ้ แผงวงจร ้ +5V แบบสวิตชิงสํ ่ าหรับรักษาระดับไฟเลียงให ้ แกไมโครคอนโทรลเลอร  มีวงจรควบคุมไฟเลียง  จุดตอพอรตอินพุตเอาตพุตดิจิตอลหรืออะนาลอก 8 ชอง คือ A0 ถึง A7 (ตรงกับขา Di18 ถึง Di23, Di4 และ Di6)


  XT 9

รูปที่ 1-1 แสดงสวนประกอบของแผงวงจรควบคุม POP-XT จุดตอพอรตดิจิตอลรองรับระบบบัส I2C 1 ชุด คือ จุดตอ Di2 (SDA) และ Di3 (SCL)  มีจุดตอพอรตสื่อสารขอมูลอนุกรม UART 1 ชุดคือ จุดตอ Di0 (RxD) และ Di1 (TxD)  มีวงจรขับมอเตอรไฟตรง 2 ชอง พรอมไฟแสดงผล  มีจุดตอขาพอรตของไมโครคอนโทรลเลอรสําหรับขับเซอรโวมอเตอร 3 ชองคือ Di30, Di12 และ Di13 (เรียงตามลําดับ SV1, SV2 และ SV3)  มีลําโพงเปยโซสําหรับขับเสียง โดยตอกับขาพอรต Di11  มีจุดตอ ISP สําหรับอัปเกรดหรือกูเฟ  รมแวร โดยใชชุดโปรแกรมแบบ ISP เพิ่มเติม (แนะนําเครื่อง โปรแกรม PX-400 หรือ PX-4000 ของ inex)  มีโมดูลแสดงผลแบบกราฟกสี ความละเอียด 128 x 160 จุด แสดงภาพกราฟกลายเสน และพื้นสี (ไมรองรับไฟลรูปภาพใดๆ) พรอมไฟสองหลัง แสดงผลเปนตัวอักษรขนาดปกติ (5x7 จุด) ได 21 ตัวอักษร 16 บรรทัด (21x16)  มี สวิตช กดติดปล อยดับพรอมใชงาน (สวิตช OK) 1 จุด โดยตอร วมกับตัวตานทานปรับคาได (KNOB) ซึงเชื ่ ่อมตอไปยังขาพอรต 8 ทําใหอานคาสัญญาณดิจิตอลและอะนาลอกไดในขาพอรตเดียวกัน วงจรสมบูรณของแผงวงจร POP-XT แสดงในรูปที่ 1-2 


  XT 10

PF1 A4 22

PF5 A2 20

+Vm

PF7 A0 18

SWITCH ON

+5V

K3 BATT 4.8-7.2V 3

PF0 A5 23

PF4 A3 21

+

PF6 A1 19

L1 10 H 1

C6 100F 10V

C5 0.1F

44 43 42 41 40 39 38 37 36 35 34 1 33 32 2 31 3 4

UGnd 5 UCap

VBus PB0

C1 1F

IC1 ATMega32U4 (TQFP44)

6 7

8 17 PB1 9 15 PB2 10 16 PB3 11 14

30 29 28 27 26

Pxx

C12 0.1F

4 G

GND RST +

R5 4k7

R6 4k7

0 1 4

23 22 21

30 12 6

20 19 18

8

PB4

+Vm SW2 RESET

RST

11

+Vm PWMA AIN2 AIN1 Vcc STB GND BIN1 BIN2 PWMB +Vm +Vm

A8

R3 4k7 ISP

CR1 16MHz

+Vm

24 23 22 21 20 19 18 17 16 15 14 13

IC2 TB6612FNG

+5V

SP1 PIEZO Speaker

+Vm

A1 A1 PG PG A2 A2 B2 B2 PG PG B1 B1

1 2 3 4 5 6 7 8 9 10 11 12 GND +Vm

PC6 3

SCL PD0

0

RXD PD2

6

A7 PD7

ADIR

R8 1k

R7 1k

5

PE6 7

APWM 9

1

TXD PD3

4

-+ SDA PD1

A

B

+3.3V IC5 LM1117-3.3V

C14 10F 16V

25-character 16-line

C16 10F 16V

C15 0.1F

R11 4.7k PB0 R13 4.7k

31

SV1

30

DC. MOTOR OUTPUT

A6 PD4

GLCD 160x128 pixel

16

SV2

12

GND +Vm

+5V

R12 4.7k

PB1

R15 4.7k

R14 4.7k

+5V R11 1k

1 2 3 4 5 6 7 8 9 10 11 12 13 14

PB2

R17 4.7k

N/C GND CS Vcc Vcc CLK MISO D/C /RST GND LEDA LEDK GND N/C

15

GND +Vm

PB6

-+

2

BDIR

10 BPWM

PB5

17

SV3

13

C3 10F 16V

8

R16 4.7k

+3.3V

VR1 KNOB

SW5 OK

PE2 +3.3V

R18 4.7k +3.3V

R10 4.7k RST C17 0.1F

รูปที่ 1-2 วงจรสมบูรณของแผงวงจรควบคุม POP-XT

D1 1N4148

C18 0.1F

PB4

R9 4.7

SW3 RESET

R11 1k

PE2

+5V C9 0.1F

C2 0.01 F

+ 7 GND REF

31 13 5

C8 0.1 F

Q2 KRC102

17 15 16 14 3 2

+5V

+5V Q1 KRC102

   

GND

31

8

C13 220 F 10V

11 10 9

PB7 RST Vcc GND XTAL2 XTAL1 PD0 PD1 PD2 PD3 PD5

25 24 23 12 13 14 15 16 17 18 19 20 21 22

PE2 PC7 PC6 PB6 PB5 PB4 PD7 PD6 PD4 AVcc GND

5

1,2,3

SPI Ext.

PE6 UVcc DD+

R1 R2 27 27

VUSB DD+ ID GND

AVcc GND AREF PF0 PF1 PF4 PF5 PF6 PF7 GND Vcc

C4 +5V 0.1F

+USB

R4 4k7 LED1 BLUE

4

2

IC4 NCP1450 - 5.0

 

xx C7 0.1F

1

5,6,7,8 C11 470 F 16V Q3 FDS6680A

3

4

+5V

K1 mini B-USB USB port

IC3 2 KIA278R05

C10 470 F 16V

+5V

+5V D1 MBRS340


  XT 11

1.2 คุณสมบัติของอุปกรณเอาตพุต 1.2.1 มอเตอรไฟตรงพรอมชุดเฟองขับ เปนชุดมอเตอรพรอมเฟองขับรุน BO-2 อัตราทด 48:1 มีสายตอ 2 เสน คุณสมบัติทางเทคนิคทีสํ่ าคัญมีดังนี้ ้ าน +3 ถึง +9Vdc  ตองการไฟเลียงในย  กินกระแสไฟฟา 130mA (ที่ไฟเลียง ้ +6V และไมมีโหลด)  ความเร็วเฉลีย ่ 170 ถึง 250 รอบตอนาที (ที่ไฟเลียง ้ +6V และไมมีโหลด) ้ ก 30 กรัม  นําหนั  แรงบิดตําสุ ่ ด 0.5 กิโลกรัม-เซนติเมตร  ติดตั้งเขากับตัวยึดพลาสติกแบบมีพุกทองเหลืองสําหรับยึดในตัว  ขนาด (กวาง x ยาว x สูง) 42 x 45 x 22.7 มิลลิเมตร

1.2.2 แผงวงจรไฟแสดงผล : ZX-LED ใช LED ขนาด 8 มิลลิเมตร ตองการลอจิก “1” ในการขับใหสวาง มีวงจรแสดงในรูปที่ 1-3

LED1 R1 (Default = 510)

S

+

รูปที่ 1-3 รูปรางและวงจรของแผงวงจรไฟแสดงผล ZX-LED

Q1 KRC102 (DTC114)


  XT 12

1.2.3 เซอรโวมอเตอรแบบมาตรฐาน (เปนอุปกรณเสริม มีในชุด POP-BOT XT Standard kit) มีสายตอใชงาน 3 เสนคือ สายสัญญาณ (S) สายไฟเลียง ้ (+V) และกราวด (G) ภายในเซอรโวมอเตอรมี วงจรควบคุมการหมุนติดตังอยู ้  ดังแสดงในรูปที่ 1-10 คุณสมบัติทางเทคนิคที่สําคัญมีดังนี้  ตองการไฟเลียงในย ้ าน +4.8 ถึง +6Vdc ่ 60 รอบตอนาที (ที่ไฟเลียง ้ +5V และไมมีโหลด)  ความเร็วเฉลีย ้ ก 45 กรัม  นําหนั  แรงบิด 3.40 กิโลกรัม-เซนติเมตร หรือ 47 ออนซ-นิ้ว ้  ขนาด (กวาง x ยาว x สูง) 40.5 x 20 x 38 มิลลิเมตร หรือ 1.60 x 0.79 x 1.50 นิว

1.3 คุณสมบัติของชุดอุปกรณตรวจจับสัญญาณ 1.3.1 แผงวงจรสวิตช : ZX-01 มีวงจรและรูปรางแสดงในรูปที่ 1-4 ประกอบดวยสวิตชพรอมไฟแสดงผล ถากดสวิตชจะสงลอจิก “0” ไฟ สี แดงติด

LED1

Indicator

+V

R2 10k R1 510

R3 220

DATA

Signal output S1 GND Switch

รูปที่ 1-4 รูปรางและวงจรของแผงวงจรสวิตชทีใช ่ ในชุดหุนยนต  POP-BOT XT


  XT 13

จุดตอสัญญาณ +V TCRT5000

OUT GND

10k

510

ตัวตรวจจับแสงสะทอนอินฟราเรด

่ หนาตาและวงจรของแผงวงจรตรวจจับแสงสะทอนอินฟราเรดทีใช ่ ในชุดหุนยนต  POP-BOT XT รูปที1-5

1.3.2 แผงวงจรตรวจจับแสงสะทอนอินฟราเรด : ZX-03 มีวงจรและหนาตาของแผงวงจรแสดงในรูปที่ 1-5 เปนแผงวงจรทีใช ่ ในการตรวจสอบการสะทอนของแสง อินฟราเรดของตัวตรวจจับแสงสะทอนอินฟราเรดซึงรวมตั ่ วสงและตัวรับไวในตัวถังเดียวกัน โดยตัวตรวจจับแสง สะทอนอินฟราเรดทีนํ่ ามาใชคือ TCRT5000 เมือจ ่ ายไฟเลียง ้ LED อินฟราเรดภายในตัวโมดูล TCRT5000 จะเปลงแสงออกมาตลอดเวลา สวนตัวรับซึง่ เปนโฟโตทรานซิสเตอรจะไดรับแสงอินฟราเรดจากการสะทอนกลับ โดยปริมาณของแสงที่ไดรับจะมากหรือนอย ขึนอยู ้ กั บวา มีวัตถุมากีดขวางหรือไม และวัตถุนันมี ้ ความสามารถในการสะทอนแสงอินฟราเรดไดดีเพียงไร ซึงขึ ่ นกั ้ บ ลักษณะพืนผิ ้ วและสีของวัตถุ โดยวัตถุสีขาวผิวเรียบจะสะทอนแสงอินฟราเรดไดดี ทําใหตัวรับแสงอินฟราเรดไดรับ แสงสะทอนมาก สงผลใหแรงดันทีเอาต ่ พุตของวงจรสูงตามไปดวย ในขณะทีวั่ ตถุสีดําสะทอนแสงอินฟราเรดไดนอย ทําใหตัวรั บอิ นฟราเรดสงแรงดันออกมาตํา่ ดวยคุณสมบั ติดังกลาวจึงนิยมนําแผงวงจรตรวจจับแสงสะทอน อินฟราเรดนีมาใช ้ ในการตรวจจับพื้นหรือเสน โดยตองติดตังไว ้ ดานลางของโครงหุนยนต  เนืองจากแผงวงจรตรวจจั ่ บแสงสะทอนอินฟราเรด ZX-03 ใหผลการทํางานเปนแรงดันไฟตรง ดังนันในการ ้ ใชงานกับ POP-BOT XT จึงตองตอเขากับชองอินพุตอะนาลอกของแผงวงจรหลัก จากนันใช ้ ความรูจากการอ  านคา สัญญาณอะนาลอก เพืออ ่ านคาจากแผงวงจรตรวจจับแสงสะทอนอินฟราเรดนําไปสูการตรวจจั  บเสนตอไป


  XT 14

1.3.3 GP2D120 โมดูลตรวจจับระยะทางแบบอินฟราเรด (เปนอุปกรณเสริม มีในชุด POP-BOT XT Standard kit) GP2D120 เปนโมดูลตรวจจับระยะทางแบบอินฟราเรดมีขาตอใชงาน 3 ขาคือ ขาตอไฟเลียง ้ (Vcc), ขา กราวด (GND) และขาแรงดันเอาตพุต (Vout) การอานคาแรงดันจาก GP2D120 จะตองรอใหพนชวงเตรียมความ พรอมของโมดูลกอน ซึงใช ่ เวลาประมาณ 32.7 ถึง 52.9 มิลลิวินาที (โดย 1 มิลลิวินาทีเทากับ 0.001 วินาที) ดังนัน้ ในการอานคาแรงดันจึงควรรอใหพนชวงเวลาดังกลาวไปกอน ดังแสดงขอมูลเบื้องตนในรูปที่ 1-6 คาแรงดันเอาตพุตของ GP2D120 ที่ระยะทาง 30 เซนติเมตรที่ไฟเลียง ้ +5V อยูในชวง 0.25 ถึง 0.55V โดย คากลางคือ 0.4V ชวงของการเปลี่ยนแปลงแรงดันเอาตพุตทีระยะทาง ่ 4 เซนติเมตรคือ 2.25V 0.3V LED อินฟราเรดตัวสง

กราฟแสดงการทํางานของ GP2D120

ตัวรับแสงอินฟราเรด

แรงดันเอาตพุต (V) 2.8

GP2D12 GP2D120

2.4 Vout

GND

2.0

Vcc

1.6

หลักการทํางานของโมดูลวัดระยะทางดวยแสงอินฟราเรด โมดูลวัดระยะทางสงแสงอินฟราเรดไปกระทบวัตถุผานเลนส นูนเพือโฟกั ่ สแสงใหไปยังจุดใดจุดหนึ่ง เมื่อแสงกระทบวัตถุจะเกิด การสะท อนกลับมายังภาครับที่ มีเลนสภาครับทําหนาที่รวมแสงและ กําหนดจุดตกกระทบ แสงจะถูกสงไปยังโฟโตทรานซิสเตอรจํานวนมาก ทีต่ อเรียงตัวกันเปนสวนรับแสงหรืออะเรยรับแสง ตําแหนงทีแสงตก ่ กระทบนีนํ้ ามาคํานวณหาระยะทาง (L) จากภาคสงไปยังวัตถุได โดยใช สูตรหาสามเหลียมคล ่ ายดังนี้ L F  A X

ดังนันค ้ า L จะมีคาเทากับ

L

FA X

1.2 0.8 0.4 0

0

4

8

12

16

20

24

28

32

ระยะหางจากวัตถุที่ตรวจจับ (cm)

วัตถุ

L A

คาที่ไดจากโฟโตทรานซิสเตอรจะถูกเปลี่ยนเปนระดับแรงดัน ซึ่งใหผลการเปลี่ยนแปลงตามระยะทางที่ตรวจวัดได

F สวนรับแสง

LED อินฟราเรด ตัวสง GP2D120

รูปที่ 1-6 แสดงรูปราง การจัดขา และกราฟแสดงการทํางานของ GP2D120

X


  XT 15

 POP-BOT XT 1.4 ขอมูลของสายสัญญาณที่ใชในชุดหุนยนต 1.4.1 สาย JST3AA-8 : สายเชื่อมตอระหวางแผงวงจร สาย JST3AA-8 ใชเชื่อมตอระหวางแผงวงจรควบคุม POP-XT กับแผงวงจรตรวจจับและแผงวงจรอุปกรณ ตางๆ เปนสายแพ 3 เสน ยาว 8 นิว้ ปลายสายทังสองด ้ านติดตังคอนเน็ ้ กเตอรแบบ JST 3 ขา ตัวเมีย ระยะหางระหวาง ขา 2 มิลลิเมตร มีการจัดขาดังนี้ ระยะหางระหวางขา 2 มม.

ระยะหางระหวางขา 2 มม.

GND S +5V

1.4.2 สาย USB-miniB เปนสายสัญญาณสําหรับเชื่อมตอระหวางพอรต USB ของคอมพิวเตอรกับแผงวงจร POP-XT


  XT 16

 POP-BOT XT 1.5 ขอมูลของอุปกรณทางกลที่ใชในชุดหุนยนต 1.5.1 ลอพลาสติกสําหรับชุดเฟองขับมอตอรและยาง เปนลอกลม มีเสนผานศูนยกลาง 65 มิลลิเมตร สามารถสวมเขากับแกนของชุดเฟองขับมอเตอรไดทันที โดยไมตองดัดแปลงเพิมเติ ่ ม ขันยึดดวยสกรูเกลียวปลอย 2 มิลลิเมตร สวนยางขอบลอทีใช ่ รวมดวยผลิตจากยางพารา ผิวมีดอกยางเพื่อชวยเพิ่มสมรรถนะในการเกาะพื้นผิว

1.5.2 แผนกริด เปนแผนพลาสติกที่ผลิตจากวัสดุ ABS ขนาด 80x60 มิลลิเมตร และ 80x80 มิลลิเมตร อยางละ 1 แผน ใน แตละมีรูขนาด 3 มิลลิเมตรที่มีระยะหางกัน 5 มิลลิเมตร

1.5.3 แผนฐานกลม เปนแผนพลาสติกทีผลิ ่ ตจากวัสดุ ABS ขนาดเสนผานศูนยกลาง มิลลิเมตร เปนแผนฐานสําหรับยึดอุปกรณ ตางๆ มีรูปรางเปนกลม ประกอบดวยลอกลมกึงอิ ่ สระทั้งดานหนาและหลัง ชวยเสริมความคลองตัวใหกับหุนยนต ไดเปนอยางดี ที่แผนฐานมีรูขนาด 3 มิลลิเมตรสําหรับติดตั้งอุปกรณหรือโครงสรางกลไกเพิ่มเติม


  XT 17

้ อพลาสติก 1.5.4 ชินต เปนชินส ้ วนพลาสติกแข็งเหนียว มี 3 แบบคือ ชิ้นตอแนวตรง, ชิ้นตอมุมฉาก และชิ้นตอมุมปาน สามารถ เสียบตอกันได ใชตอกันเปนโครงสรางหรือตกแตง บรรจุ 3 แบบ รวม 30 ชิ้นตอชุด (60 ชิ้นตอชุด สําหรับ POPBOT XT Standard kit)

1.5.5 แทงตอพลาสติก เปนชินส ้ วนพลาสติกแข็งเหนียวในแตละชินจะมี ้ รูขนาด 3 มิลลิเมตรสําหรับรอยสกรูเพือติ ่ ดตังหรื ้ อตอกับ ชิ้นสวนโครงสรางอื่นๆ ที่ปลายของแทงตอสามารถเสียบเขากับชิ้นตอพลาสติกได ในชุดมี 3 ขนาด คือ 3, 5 และ 12 รู แตละขนาดมี 4 ชิ้น

1.5.6 กลองรองกะบะถาน เปนถาดสําหรับรองรับกะบะถานของแผงวงจร RBX-168 เพื่อยึดกับแผนฐานแบบตางๆ ไดสะดวกขึ้น ทําจากพลาสติกเหนียว ตัดเจาะได มีรูสําหรับติดตั้งเขากับแผนฐานหรือโครงสรางหลักอืนๆ ่ ได


  XT 18

1.5.7 ฉากโลหะ เปนชินส ้ วนโลหะกวาง 7.5 มิลลิเมตรที่ดัดเปนมุมฉาก ในแตชิ้นจะมีรูขนาด 3 มิลลิเมตรสําหรับรอยสกรู เพื่อติดตั้งหรือตอกับชิ้นสวนโครงสรางอื่นๆ ในชุดมี 3 ขนาด คือ 1x2 รู, 2x2 รู และ 2x5 รู แตละขนาดมี 4 ชิ้น

1.5.8 สกรูและนอต เปนอุปกรณสําหรับยึดชินส ้ วนตางๆ เขาดวยกัน ประกอบดวยสกรูเกลียวปลอย 2 มิลลิเมตร (2 ตัว), 3x8 มิลลิเมตร (4 ตัว), 3x10 มิลลิเมตร (30 ตัว), 3x15 มิลลิเมตร (4 ตัว), 3x40 มิลลิเมตร (4 ตัว), สกรูหัวตัด 3x8 มิลลิเมตร (10 ตัว) และนอต 3 มิลลิเมตร (30 ตัว)

1.5.9 เสารองโลหะ เปนอุปกรณชวยยึดชินส ้ วนตางๆ และรองรับแผงวงจร, แผนกริดและแผนฐาน ทําจากโลหะชุบนิเกิลกันสนิม มีลักษณะเปนแทงทรงกระบอกยาว 32 มิลลิเมตร ภายในมีรูเกลียวตลอดตัวสําหรับขันสกรู 3 มิลลิเมตร ในชุดมี 4 ตัว

1.6.10 เสารองพลาสติก เปนอุปกรณชวยยึดชินส ้ วนตางๆ และประคองรองรับแผงวงจร, แผนกริดและแผนฐาน ทําจากพลาสติก ABS เหนียว สามารถตัดได มีลักษณะเปนแทงทรงกระบอก ภายในมีรูตลอดตัวสําหรับรอยสกรู 3 มิลลิเมตร ในชุดประกอบ ดวย เสารองขนาด 3 มิลลิเมตร (4 ตัว), 10 มิลลิเมตร (4 ตัว), 15 มิลลิเมตร (4 ตัว) และ 25 มิลลิเมตร (4 ตัว)


   XT  19

 

 XT หุนยนต POP-BOT X T เปนหุนยนตอัตโนมัติขนาดเล็กที่ควบคุมดวยไมโครคอนโทรลเลอร AVR เบอร ATmega32U4 สรางขึนจากอุ ้ ปกรณและชินส ้ วนจํานวนไมมาก แตรองรับความตองการในการเรียนรูได  อยางครบถวนรอบ ดาน ไมวาจะเปนการควบคุมมอเตอรไฟตรงเพือขั ่ บเคลือนหุ ่ นยนต  ในลักษณะตางๆ ทางเคลือนที ่ ตรง ่ ถอยหลัง หมุนตัว เลียวซ ้ ายและขวา การอานคาจากตัวตรวจจับชนิดตางๆ ทังแบบดิ ้ จิตอลและอะนาลอกเพือนํ ่ ามาใชประกอบการตัดสินใจ ในการทํางานภายใตภาวะเงือนไขต ่ างๆ การติดตอกับอุปกรณแสดงผลอยางโมดูลกราฟก LCD ้ นหลักในการ ในบทนีนํ้ าเสนอการประกอบตัวหุนยนต  POP-BOT XT แบบมาตรฐาน และจะใชโครงสรางนีเป เขียนโปรแกรมเพือควบคุ ่ มการทํางาน อยางไรก็ตาม ผูสร  างสามารถดัดแปลงใหแตกตางออกไปได หากแตเมือนํ ่ ามาเขียน โปรแกรมจะตองคํานึงถึงผลของการดัดแปลงทางโครงสรางทีมี่ ตอการทํางานของตัวตรวจจับและโปรแกรมดวย

POP-BOT XT Arduino Leonardo compatible robot ่ วยมอเตอรไฟตรงพรอมชุดเฟองขับและลอกลม ขับเคลือนด  ควบคุมดวยไมโครคอนโทรลเลอร ATmega32U4 ้ บแสงสะทอน  สามารถติดตังแผงวงจรตรวจจั อินฟราเรดเพือตรวจจั ่ บเสน, แผงวงจรสวิตช ตรวจจับการชน,โมดูลวัดระยะทางแบบอินฟราเรดเพือ่ วัดระยะทางและหลบหลีกสิงกี ่ ดขวางแบบไมสัมผัส, แผงวงจรเชือมต ่ อจอยสติ๊กของเครืองเล ่ นเกมส เพือควบคุ ่ มแบบใชสาย, แผงวงจรรับแสงอินฟราเรด เพือควบคุ ่ มจากระยะไกล, โมดูลสือสารข ่ อมูลผานระบบ บลูทูธเพือควบคุ ่ มแบบไรสาย  มีโมดูลกราฟก LCD สีสําหรับแสดงผลการทํางาน  ขับ RC เซอรโวมอเตอรได 3 ชอง จึงสามารถ ติดตังกลไกเคลื ้ อนไหวเพิ ่ มเติ ่ มได ้ ่ AA แบบอัลคาไลนหรือแบบประจุได จํานวน 4 กอน  ใชไฟเลียงจากแบตเตอรี  ดาวนโหลดโปรแกรมผานทางพอรต USB ของคอมพิวเตอร 


   XT 20  



แผนฐานพลาสติกกลม x 1

ลอพลาสติกพรอมยาง x 2

ชุดแทงตอ 3 รู , 5 รู และ 12 รู

บอรด POP-XT x1

ชุดเฟองขับมอเตอร x 2

แผงวงจรตรวจจับแสง สะทอนอินฟราเรด ZX-03 x 2

ถาดรองกะบะถาน x 1

เสารองโลหะ 33 มม. x 4

แผงวงจรสวิตช x 2

สกรูเกลียวปลอย 2 มม. x 2 ชุดชิ้นตอพลาสติก

ชุ ดเสารองพลาสติก

ฉากโลหะ 2x2 x 2

ชุดสกรูและนอต


   XT  21

 (1) นําชุดเฟองขับมอเตอรยึดเขากับถาดรองกะบะถาน โดยใชสกรูหัวตัดขนาด 3 x 8 มม. ขันยึดในตําแหนงดังรูป

สกรูหัวตัด 3x8 (2) นําเสารองโลหะขนาด 32 มม. ยึดเขากับถาดรองกะบะถาน แลวใชสกรูหัวตัดขนาด 3 x 8 มม. ขันยึด ในตําแหนง ดังรูป เสารองโลหะ 32 มม.

เสารองโลหะ 32 มม. (3) นําลอพลาสติกพรอมยางเสียบเขากับแกนมอเตอรสีชมพู แลวใชสกรูเกลียวปลอย 2 มม. ขันยึด สกรูเกลียวปลอย 2 มม.


   XT 22  

(4) นําชุดมอเตอรยึดเขากับฐานพลาสติกของหุนยนต แลวใชสกรูขนาด 3 x 6 มม.ขันยึด ในตําแหนงดังรูป จะสังเกต ไดวาการวางมอเตอรทั้งสองดานไมสมมาตรกันแตลอพลาสติกจะอยูตรงกลางพอดี

(5) นําแผงวงจรตรวจจับแสงสะทอนอินฟราเรด ZX-03 รอยดวยสกรู 3 x 15 มม. ยึดเขากับแทงตอ 5 รู ทําเหมือนกัน 2 ชุด สําหรับดานซายและขวาของหุนยนต  แทงตอ 5 รู

(6) ยึดแผงวงจรตรวจจับแสงสะทอนอินฟราเรดจากขั้นตอนที่ (5) เขาที่ดานหนาของหุนยนตทั้งทางซายและขวา โดยใชสกรูขนาด 3x10 มม. ขันยึด

ZX-03

ZX-03


   XT  23

(7) นําแทงตอ 5 รูอีกสองอันมายึดเขาทีด่ านหนาของฐานหุนยนต  ดังรูป โดยใชสกรู 3x10 มม.ขันยึด ติดตังทั ้ งสองข ้ าง ของหุนยนต  ดังรูป

้ อมุมฉาก โดยใชสกรู 3x10 มม.และนอต 3 มม.ขันยึด จากนันนํ ้ าชินต ้ อ (8) นําแผงวงจรสวิตช ยึดเขากับยึดเขากับชินต มุมปาน เสียบเขากับปลายอีกดานหนึงของชิ ่ นต ้ อมุมฉาก ทําเหมือนกัน 2 ชุด

นอต 3 มม. ชินต ้ อมุมฉาก สกรู 3x10 มม.

ชินต ้ อมุมปาน


   XT 24  

(9) นําชุดแผงวงจรสวิตช ติดตังเข ้ ากับฐานของหุนยนต  โดยเสียบเขาไปทีแท ่ งตอดังรูป

 ดังรูป (10) นําแผงวงจร POP-XT วางลงบนกลองรองกะบะถาน โดยหันดานจุดตอตัวตรวจจับไวดานหนาของหุนยนต

ดานจุดตอตัวตรวจจับ


   XT  25

(11) นําสายมอเตอรตอเขากับจุดตอมอเตอร โดยใหตรวจสอบขัวของมอเตอร ้ จากการหมุนลอ เมือต ่ อสายแลว หมุนลอ ไปดานหนา LED แสดงสถานะของมอเตอรควรติดเปนสีเขียว หมุนลอกลับไปทางดานหลังในทิศตรงขาม LED ควรติด เปนสีแดง ถาไมใชใหสลับขัวต ้ อสายมอเตอร จนกระทัง่ LED แสดงสีทีถู่ กตองทังสองล ้ อ

สายตอของมอเตอร B ดานขวา

สายตอของมอเตอร A ดานซาย

้ อสายของแผงวงจรตรวจจับแสงสะทอน ZX-03 ดานซายเขาที่จุดตอ A1/19 และตอ ZX-03 ทางดานขวา (12) จากนันต เขาทีจุ่ ดตอ A0/18 ตอสายจากแผงวงจรสวิตชดานซายเขากับจุดตอ A5/23 และตอสายจากแผงวงจรสวิตชดานขวาเขา กับจุดตอ A4/22 ZX-03 ซายตอที่ A1/19 ZX-03 ขวาตอที่ A0/18

ZX-01 ซายตอที่ A5/23 ZX-01 ขวาตอที่ A4/22

มอเตอร B ตอกับลอดานขวา

มอเตอร A ตอกับลอดานซาย


   XT 26  

(13) จะไดหุนยนต  POP-BOT XT ทีพร ่ อมสําหรับการเขียนโปรแกรมตอไป


  XT 27



  ในบทนีจะอธิ ้ บายสวนประกอบและรายละเอียดของโปรแกรม Arduino1.0 ที่ใชในการเขียนโปรแกรม คอมไพลโปรแกรม และอัปโหลดโปรแกรมไปยังหุนยนต POP-BOT XT โดยซอฟตแวร Arduino1.0 สามารถรัน บนระบบปฏิบัติการไดทุกแบบ ไมวาจะเปน วินโดวสที่รองรับตังแต ้ วินโดวส XP ขึนไป, ้ MAC OS และ Linux

้ แวร Arduino 3.1 การติดตังซอฟต ในชุดซอฟตแวรที่มาพรอมกับชุดหุนยนต POP-BOT XT ประกอบดวย ซอฟตแวร Arduino 1.0 ที่บรรจุ ไดรเวอรและขอมูลสําหรับติดตอกับแผงวงจร POP-XT ของหุนยนต  POP-BOT XT ซึงเข ่ ากันไดกับฮารดแวร Arduino Leomardo, ไฟลไลบรารีของหุนยนต POP-BOT XT ที่ชื่อ popxt.h และโปรแกรมตัวอยาง มีขันตอนการติ ้ ดตั้งดังนี้ (ภาพประกอบที่เปนหนาตางตางๆ ของโปรแกรมอางอิงกับระบบปฏิบัติการวินโดวส 7) (3.1.1) นําแผนซีดีรอมที่มากับชุดหุนยนต  POP-BOT XT ใสเขาไปในซีดีรอมไดรฟของคอมพิวเตอร คนหา และดับเบิ้ลคลิกที่ไฟล Arduino1.0 POP-BOT XT Setup.exe จะปรากฎหนาตางตอนรับสูการติดตั้งใหคลิก Next หนาตางติดตั้งจะสอบถามตําแหนงการติดตั้งโปรแกรมใหกด Next ขามขั้นตอนนี้ไป


  XT 28

(3.1.2) หนาตางติดตั้งจะสอบถามชื่อที่จะใชสรางที่ Start Menu ใหคลิก Next ตอไป หนาตางติดตั้งจะ แสดงขอสรุปมาให ใหกด Install เพื่อเริ่มขั้นตอนการติดตั้ง โปรแกรมติดตั้งจะใชเวลาสักครูก็จะติดตั้งเรียบรอย


  XT 29

(3.1.3) หลังจากนันจะเข ้ าสูหน  าตางของการติดตั้งไดรเวอร USB ขันต ้ นของแผงวงจร POP-XT อันเปนแผง วงจรควบคุมการทํางานของหุนยนต  POP-BOT XT ดังรูป คลิกปุม Next

(3.1.4) ระบบจะแจงวา วินโดวสไมเคยทดสอบไดรเวอรตัวนี้ และสอบถามวาตองการใหยกเลิกการติดตั้ง หรือดําเนินการติดตั้งตอไป คลิกเลือกที่ Install this driver software anyway อันเปนการเลือกใหทําการติดตั้ง ไดรเวอรตอไป


  XT 30

(3.1.5) จากนั้นการติดตั้งไดรเวอรขันต ้ นจะเกิดขึ้น รอจนกระทั่งติดตั้งเสร็จ จะปรากฏหนาตางแจงการติด ตั้งไดรเวอรเสร็จสมบูรณและแสดงชื่อของไดรเวอรที่ติดตั้งลงไป ในที่นีคื้ อ Arduino LLC คลิกปุม Finish ตอบ รับการติดตั้งเสร็จสิน้

(3.1.6) โปรแกรมจะสรางชื่อ Arduino1.0 ไวที่ Start Menu ทําการทดสอบวา โปรแกรมติดตั้งเรียบรอย หรือไม ดวยการใหเขาไปที่ Start Menu และเลือกเปดโปรแกรม Arduino ขึนมา ้

หนาตางของโปรแกรม Arduino 1.0 จะเปดขึ้นมา เปนการยืนยันวา การติดตั้งโปรแกรมเปนไปอยาง ถูกตอง


  XT 31

 POP-BOT XTสําหรับวินโดวส 7 3.2 ติดตั้งไดรเวอรใหกับหุนยนต ้ เพื่อใหคอมพิวเตอรรูจักอุปกรณนี้เสีย ในการใชงานหุนยนต POP-BOT XT จะตองมีการติดตังไดรเวอร กอน โดยมีขันตอนดั ้ งนี้ (ภาพประกอบของการติดตั้งไดรเวอรอางถึงระบบปฏิบัติการวินโดวส 7 รุน 64 บิต) (3.2.1) เตรียมความพรอมใหกับหุนยนต โดยนําแผงวงจร POP-XT ออกมาจากหุนยนต เปดฝาของกะบะ ถานเพื่อบรรจุแบตเตอรี่ AA จํานวน 4 กอน ขอแนะนําใหใชแบตเตอรี่ชนิดอัลคาไลนหรือแบบประจุไดที่มีความ จุ 1800mAH เปนอยางนอย จากนันนํ ้ าแผงวงจร POP-XT ใสลงในหุนยนต  POP-BOT XT ในตําแหนงเดิม

(3.2.2) เปดสวิตชจายไฟใหแกหุนยนต  POP-BOT XT รอสักครูหนึ  ง่ (ประมาณ 10 วินาที) จากนันจึ ้ งตอสาย USB-miniB เขาทีหุ่ นยนต  ในตําแหนงดังรูป สวนปลายอีกดานของสาย USB ตอเขากับพอรต USB ของคอมพิวเตอร ขันตอนนี ้ ้สําคัญมาก จะตองเปดสวิตชจายไฟกอน แลวรอสักครูหนึ่ง จึงคอยตอสาย

เขากับพอรต USB ของคอมพิวเตอร มิเชนนันการติ ้ ดตั้งไดรเวอรอาจมีขอผิดพลาดได


  XT 32

(3.2.3) เมื่อตอแผงวงจร POP-XT เขากับพอรต USB ระบบจะตรวจสอบฮารดแวรครูหนึง่ จากนั้นทําการ ตรวจสอบการเชื่อมตอโดยไปที่ My Computer คลิกเมาสปุมขวาเลือกหัวขอ Properties

(3.2.4) จะเขาสูหนาตาง Control panel จากนันเลื ้ อกรายการ Device Manager

(3.2.5) ดูที่หัวขอ Ports จะพบรายการ Unicon@POP-XT (COMxx) โดยหมายเลขของ COM อาจเปลียน ่ ไปไดในคอมพิวเตอรแตละเครื่อง ใหจําหมายเลขพอรต COM นีไว ้ เพื่อใชเลือกพอรตในการติดตอกับแผงวงจร POP-XT ในซอฟตแวร Arduino1.0


  XT 33

(3.2.6) ในกรณีที่ผูใชงานตอสาย USB-miniB จากคอมพิวเตอรเขากับแผงวงจร POP-XT กอนเปดสวิตช หรือเปดสวิตชแลว แตไมรอใหการเตรียมความพรอมของแผงวงจรเสร็จสิน้ (ประมาณ 7 ถึง 10 วินาที) มีโอกาสที่ ระบบจะตรวจพบวา มีอุปกรณที่ไมมีไดรเวอรติดตั้งอยู หรือติดตั้งไดรเวอรไมสมบูรณ ดังรูป

ไมตองตกใจ ใหคลิกตอบไปที่ Click here for details ระบบจะแจงใหทราบถึงอุปกรณที่ไมมีไดรเวอรรอง รับหรือไดรเวอรไมสมบูรณ ซึงก็ ่ คือ อุปกรณที่ชื่อวา POP-XT Bootloader ซึงไม ่ สําคัญ เพราะไดรเวอรที่ถูกตอง และใชงานจริงคือ Unicon Board & POP-XT (COMxx) หากที่รายการนี้มีขอความแจงสถานะตอทายวา Ready to us ถือวา ใชได ใหกลับไปตรวจสอบตําแหนงพอรต COM อีกครั้งที่ Device Manager ตามขันตอนที ้ ่ (3.2.3) ถึง (3.2.5)


  XT 34

 POP-BOT XTสําหรับวินโดวส 7 ในกรณีที่ไม 3.3 ติดตั้งไดรเวอรใหกับหุนยนต สามารถติดตังตามขั ้ ้นตอนในหัวขอ 3.2 ได สําหรับผูใชงานที่ใชระบบปฏิบัติการวินโดวส 7 รุน 64 บิต มีโอกาสที่การติดตั้งไดรเวอรจากขั้นตอนใน หัวขอ 3.2 ไมสามารถดําเนินการไดอยางสมบูรณ ขอใหดําเนินการติดตั้งไดรเวอรในอีกวิธีหนึง่ ดังนี้ (3.3.1) เปดสวิตชจายไฟใหแกหุนยนต POP-BOT XT รอสักครูหนึง่ (ประมาณ 10 วินาที) จากนั้นจึงตอ สาย USB-miniB เขาที่หุนยนตกับพอรต USB ของคอมพิวเตอร ขันตอนนี ้ สํ้ าคัญมาก จะตองเปดสวิตชจายไฟกอน แลวรอสักครูหนึ  ง่ เพือให ่ แผงวงจร

เตรียมความพรอมในการทํางานเสร็จสินเสี ้ ยกอน นีคื่ อคุณสมบัติปกติของอุปกรณ USB ทีจะ ่ ตองเตรียมความพรอมของฮารดแวรใหเรียบรอยกอนติดตอกับคอมพิวเตอร ใชเวลาประ มาณ 7 ถึง 10 วินาที จากนั้นจึงคอยตอสายเขากับพอรต USB ของคอมพิวเตอร มิเชนนัน้ การติดตั้งไดรเวอรอาจมีขอผิดพลาดได (3.3.2)ทีมุ่ มขวาลางของคอมพิวเตอรจะแจงวา ตรวจพบฮารดแวรตัวใหมและพยายามติดตังไดรเวอร ้ ลงใน เครื่องคอมพิวเตอร โดยในขันต ้ นจะแจงวาการติดตั้งไดรเวอรไมสมบูรณดังรูป

(3.3.4) เพื่อติดตั้งไดรเวอรใหสมบูรณ ทําการคลิกเมาสปุมขวาที่หนาตาง My Computer > Properties เลือกหัวขอ Device Manager ดังแสดงตําแหนงตามรูป


  XT 35

(3.3.5) ที่หนาตาง Device Manager จะพบอุปกรณ Arduino Leonardo ที่มีเครื่องหมาย ! ปรากฎอยู ซึ่งหมายถึง การติดไดรเวอรของอุปกรณตัวนี้ยังไมสมบูรณ ใหคลิกเมาสปุมขวาที่อุปกรณตัวนี้ แลวเลือก Update Driver Software..

(3.3.6) จะปรากฎหนาตางตัวเลือกคนหาไดรเวอรแบบอัตโนมัติหรือหาดวยตนเองภายในคอมพิวเตอร ให เลือก Browse my computer for driver software อันเปนการเลือกตคนหาไดรเวอรดวยตนเอง


  XT 36

(3.3.7) ระบุตําแหนงของไดรเวอรไปที่ C:\Arduino\Drivers จากนันกด ้ Next

(3.3.8) โปรแกรมจะแจงเตือนเรืองความปลอดภั ่ ยของไดรเวอรทีเราติ ่ ดตังลงไป ้ ใหเลือกหัวขอ Install this driver software anyway เพื่อยืนยันการติดตั้ง


  XT 37

(3.3.9) ระบบจะใชเวลาสักครูเพื  ่อติดตั้งไดรเวอร จากนันที ้ หน ่ าตาง Device Manager จะแสดงชืออุ ่ ปกรณ Unicon Board & POP-XT (COMxx) โดยหมายเลขของ COM นันขึ ้ ้นอยูกับการลงทะเบียนของคอมพิวเตอรแต ละเครื่อง ซึงอาจแตกต ่ างกัน โดยปกติจะมีหมายเลขตําแหนงตังแต ้ COM2 ขึนไป ้

(3.3.10) ขันตอนสุ ้ ดทายจะตองจดจํากําหนดตําแหนงพอรต COM ที่เกิดขึ้นจากการติดตั้งไดรเวอรในขอ (3.2.8) เพื่อนําไปใชในซอฟตแวร Arduino1.0 เพื่อเลือกชองทางการติดตอกับฮารดแวรไดถูกตอง (จากตัวอยาง ตําแหนงพอรตทีใช ่ งานคือ COM2) การติดตังไดรเวอร ้ อาจมีขันตอนพอสมควร ้ ดังนันจึ ้ งขอใหผูใชงานปฏิบัติตาม เพื่อลดความผิดพลาดที่อาจ เกิดขึ้นได เมื่ อติดตั้งไดรเวอรไดเรียบรอย หุนยนต POP-BOT X T ก็พร อมสําหรับการอัปโหลดโปรแกรมจาก คอมพิ วเตอร เพื่ อทําการทดสอบและเริ่ มตนการเรี ยนรูเพื่อพัฒนาโปรแกรมควบคุมหุนยนตอัตโนมัติขนาด เล็กในลําดับตอไป


  XT 38

 POP-BOT XTสําหรับวินโดวส XP 3.4 ติดตั้งไดรเวอรใหกับหุนยนต ้ าตางของการติดตั้งไดรเวอรที่แตกตางไปจากวินโดวส 7 ดังนี้ สําหรับวินโดวส XP จะมีขันตอนและหน (3.4.1) บรรจุแบตเตอรี่ AA จํานวน 4 กอน ลงในแผงวงจร POP-XT จากนั้นนําแผงวงจร POP-XT ใสลง ในหุนยนต POP-BOT XT ในตําแหนงเดิม (3.4.2) เปดสวิตชจายไฟใหแกหุนยนต  POP-BOT XT รอสักครูหนึ  ง่ (ประมาณ 10 วินาที) จากนันจึ ้ งตอสาย USB-miniB เขาทีจุ่ ดตอพอรต USB ของหุนยนต  สวนปลายอีกดานของสาย USB ตอเขากับพอรต USB ของคอมพิวเตอร ขันตอนนี ้ ้สําคัญมาก จะตองเปดสวิตชจายไฟกอน แลวรอสักครูหนึ่ง จึงคอยตอสายเขา

กับพอรต USB ของคอมพิวเตอร มิเชนนันการติ ้ ดตั้งไดรเวอรอาจมีขอผิดพลาดได

100 F

ATMega32U4

220 F

100 TB6612

(3.4.3)หลังจากตอสาย ทีมุ่ มขวาลางของคอมพิวเตอรจะแจงวา ตรวจพบฮารดแวรตัวใหมเปนอุปกรณ USB คอมโพสิต และสอบถามถึงตําแหนงของไฟลไดรเวอรที่ตองการติดตั้ง ใหคลิกเลือกที่ชอง Install from a list or specific location (Advanced) จากนันคลิ ้ กที่ปุม Next เพื่อผานขันตอนนี ้ ้ไป


  XT 39

(3.4.4) เลือกตําแหนงของไดรเวอรไปที่ C:\Arduino\Drivers ตามรูป แลวคลิกปุม Next

(3.4.5) จากนั้นกระบวนการติดตั้งไดรเวอรจะเริ่มขึ้น รอจนกระทั่งเสร็จ คลิกปุม Finish เพื่อจบการติดตั้ง


  XT 40

(3.4.10) ตรวจสอบตําแหนงของพรอตอนุกรมของบอรด POP-XT ที่เกิดขึนได ้ ที่ Control Panel > System > Hardware > Device Manager แลวดูทีรายการ ่ Ports จะพบชือ่ Unicon Board & POP-XT (COM xx) จากตัวอยาง คือ COM104

เปนการยืนยันวา การติดตังไดรเวอร ้ ของแผงวงจร POP-XT เสร็จสมบูรณ เมื่อติดตั้งไดรเวอรไดเรียบรอย หุนยนต POP-BOT XT ก็พรอมสําหรับการอัปโหลดโปรแกรมจากคอมพิวเตอรเพื่อทดสอบและเริ่มตนการเรียนรู เพื่อพัฒนาโปรแกรมควบคุมหุนยนตอัตโนมัติขนาดเล็กในลําดับตอไป


  XT 41

้ แวร Arduino1.0 บนคอมพิวเตอร Macintosh ที่ใชระบบ 3.5 การติดตังซอฟต ปฏิบัติการ OSX 10.6 ขึ้นไป การติดตังซอฟต ้ แวร Arduino1.0 บนคอมพิวเตอร Macintosh มีขันตอนที ้ ไม ่ ซับซอน เนืองจากไฟล ่ ทังหมด ้ ไดรับการบรรจุรวมอยูในไฟล .ZIP เพียงไฟลเดียว มีขันตอนดั ้ งนี้ (3.5.1) คัดลอกไฟล Arduino1.0.zip จากแผนซีดีรอม หรือจากการดาวนโหลดมาจาก www.inex.co.th หรือ www.uniconboard.com ไปไวที่หนา Desktop (3.5.2) ทําการแตกไฟล โดยเลือกคําสั่ง Open With > Archive Utility หรือใชซอฟตแวรที่ทําหนาที่ใน การแตกไฟล .zip

(3.5.3) จากการแตกไฟล จะไดเปนไฟล Arduino มีไอคอนดังรูป

(3.5.4) เปดหนาตาง Finder ลากไอคอน Arduino ไปไวรวมใน Applications


  XT 42

(3.5.5) ดับเบิ้ลคลิกเพื่อเปดซอฟตแวร Arduino จากนั้นไปที่เมนู Tools เลือก Board เปนรุน POP-XT

(3.5.6) เปดสวิตชจายไฟแกแผงวงจร POP-XT รอสักครูเพื  อให ่ แผงวงจรเตรียมความพรอม ใชเวลาประมาณ 10 วินาที จากนันจึ ้ งเสียบสาย USB จากแผงวงจร POP-XT เขาที่พอรต USB ของคอมพิวเตอร Macintosh (3.5.7) ไปที่เมนู Tools เลือก Serial Port จะพบอุปกรณที่ชื่อ /dev/tty.usbmodemxxxx โดย xxxx ที่ตาม มาขางหลังอาจจะมีชื่อใด ๆ อยูก็ได ใหเลือกใชการสื่อสารอนุกรมจากอุปรณตัวนี้

หากไดตามนีแสดงว ้ า การติดตังไดรเวอร ้ ของแผงวงจร POP-XT เสร็จสมบูรณ พรอมสําหรับการนําไป ใชงานจริงกับหุนยนต POP-BOT XT


  XT 43

3.6 สวนประกอบของหนาจอโปรแกรม Arduino1.0 เมื่อเรียกใหโปรแกรมทํางาน จะมีหนาตาดังรูปที่ 3-1 ตัวโปรแกรมประกอบดวยสวนตางๆ ดังนี้  เมนู (Menu) ใชเลือกคําสั่งตางๆ ในการใชงานโปรแกรม  แถบเครื่ องมือ (Toolbar) เป นการนําคําสั่งที่ใชงานบอยๆ มาสรางเปนปุมเพื  ่อใหเรียกใชคําสั่งได รวดเร็วขึ้น  แถบเลือกโปรแกรม (Tabs) เปนแถบทีใช ่ เลือกไฟลโปรแกรมแตละตัว (กรณีทีเขี ่ ยนโปรแกรมขนาด ใหญประกอบดวยไฟลหลายตัว)  พื้นที่เขียนโปรแกรม (Text editor) เปนพื้นทีสํ ่ าหรับเขียนโปรแกรมภาษา C/C++ ่ แจงสถานะการทํางานของ  พื้ นที่ แสดงสถานะการทํางาน (Message area) เปนพื้นทีโปรแกรมใช โปรแกรม เชน ผลการคอมไพลโปรแกรม

เมนู (Menu) แถบเครืองมื ่ อ (Tools bar) แถบเลือกโปรแกรม (Tab)

พืนที ้ ่สําหรับเขียนโปรแกรม (Text Editor)

พืนที ้ ่แสดงสถานะการทํางาน (Message area)

รูปที่ 3-1 แสดงสวนประกอบของโปรแกรม Arduino1.0

Serial Monitor ่ ดหนาตาง คลิกเพือเป สําหรับรับและสงขอมูล อนุกรมระหวางฮารดแวร Arduino กับคอมพิวเตอร


  XT 44

พื้นที่แสดงขอมูล (Text area) ใชแจงวาโปรแกรมที่ผานการคอมไพลแลวมีขนาดกีไบต ่  ปุมสํ าหรับเปดหนาตาง Serial Monitor ปุมนีจะอยู ้ ทางมุมบนดานขวามือ คลิกปุมนีเมื ้ ่อตองการ เปดหนาตางสื่อสารและแสดงขอมูลอนุกรม โดยตองมีการตอฮารดแวร Arduino และเลือกพอรตการเชื่อมตอให ถูกตองกอน 

หนาตาง Serial Monitor มีบทบาทคอนขางมากในการใชแสดงผลการทํางานของโปรแกรมแทน การใชอุปกรณแสดงผลอื่นๆ เนืองจาก ่ Arduino ไดเตรียมคําสั่งสําหรับใชแสดงคาของตัวแปรที่ตองการดูผลการ ทํางานไวแลว นันคื ่ อ Serial.print สวนการสงขอมูลจากคอมพิวเตอรไปยังฮารดแวร Arduino หรือแผงวงจรควบ คุมใหพิมพขอความและคลิกปุม Send ในการรับสงขอมูลตองกําหนดอัตราเร็วในการถายทอดขอมูลหรือบอดเรต (baud rate) ใหกับโปรแกรมในคําสั่ง Serial.begin กรณีที่ใชงานกับคอมพิวเตอร Mcintosh หรือคอมพิวเตอรที่ติด ตังระบบปฏิ ้ บัติการ Linux ตัวฮารดแวรของ Arduino จะรีเซ็ตเมื่อเริ่มเปดใชงาน Serial monitor

3.6.1 เมนูบาร เปนสวนที่แสดงรายการ (เมนู) ของคําสั่งตางๆ ของโปรแกรม ประกอบดวย

3.6.1.1 เมนู File ้ า สเก็ตช (Sketch) และในโปรแกรมของผูใช  งานอาจมีไฟล ใน Arduino จะเรียกโปรแกรมที่พัฒนาขึนว โปรแกรมหลายตัว จึงเรียกรวมวาเปน สเก็ตชบุก (Sketchbook) ในเมนูนีจะเกี ้ ยวข ่ องกับการเปด-บันทึก-ปดไฟลดงนี ั ้  New : ใชสรางไฟลสเก็ตชตัวใหม เพื่อเริ่มเขียนโปรแกรมใหม  Open ใชเปดสเก็ตชที่บันทึกไวกอนหนานี้  Sketchbook : ใชเปดไฟลสเก็ตชลาสุดทีเป ่ ดใชงานเสมอ  Example : ใชในการเลือกเปดไฟลสเก็ตชตัวอยางทีบรรจุ ่ และรวบรวมไวในโฟลเดอรของโปรแกรม Arduino1.0


  XT 45

Save : ใชในการบันทึกไฟลสเก็ตชปจจุบัน  Save as : ใชบันทึกไฟลสเก็ตชโดยเปลียนชื ่ ่อไฟล  Upload to I/O board : ใชอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT ในหุนยนต POP-BOT XT หรือฮารดแวรของ Arduino Leonardo  Page setup : ตังค ้ าหนากระดาษของไฟลสเก็ตชปจจุบัน  Print : สังพิ ่ มพโคดของไฟลสเก็ตชปจจุบันออกทางเครื่องพิมพ  Preference : ใชกําหนดคาการทํางานของโปรแกรม  Quit : ใชจบการทํางานและออกจากโปรแกรม 

3.6.1.2 เมนู Edit ในขณะทีพิ่ มพโปรแกรม สามารถใชคําสังในเมนู ่ นีในการสั ้ งยกเลิ ่ กคําสังที ่ แล ่ ว ทําซํา้ ฯลฯ มีเมนูตางๆ ดังนี้  Undo : ยกเลิกคําสั่งหรือการพิมพครั้งสุดทาย  Redo : ทําซํ้าคําสั่งหรือการพิมพครั้งสุดทาย  Cut : ตัดขอความที่เลือกไวไปเก็บในคลิปบอรดของโปรแกรม  Copy : คัดลอกขอความที่เลือกไวมาเก็บในคลิปบอรด  Paste : นําขอความที่อยูในคลิปบอรดมาแปะลงในตําแหนงที่เคอรเซอรชี้อยู  Select All : เลือกขอความทั้งหมด  Comment/Uncomment : ใชเติมเครื่องหมาย // เพื่อสรางหมายเหตุหรือคําอธิบายลงในโปรแกรม หรือยกเลิกหมายเหตุดวยการนําเครืองหมาย // ออก  Find : คนหาขอความ  Find Next : คนหาขอความถัดไป

3.6.1.3 เมนู Sketch เปนเมนูที่บรรจุคําสั่งที่ใชในการคอมไพลโปรแกรม เพิ่มไฟลไลบรารี ฯลฯ โดยมีเมนูยอยดังนี้  Verify/Compile : ใชคอมไพลแปลโปรแกรมภาษาซีใหเปนภาษาเครื่อง  Stop : หยุดการคอมไพลโปรแกรม ้ Arduino จะทําการคัดลอก  Add file : เพิ่มไฟลใหกับสเก็ตชบุกปจจุบัน เมื่อใชคําสั่งนีโปรแกรม ไฟลที่เลือกไวมาเก็บไวในโฟลเดอรเดียวกันกับโปรแกรมที่กําลังพัฒนา ่ ยกใชไลบรารีเพิมเติ ่ ม เมือคลิ ่ กเลือกคําสังนี ่ แล ้ ว โปรแกรม Arduino IDE  Import Library : เปนคําสังเรี จะแสดงไลบรารีใหเลือก เมือเลื ่ อกแลว โปรแกรมจะแทรกบรรทัดคําสัง่ #include ลงในสวนตนของไฟล  Show Sketch folder : สังเป ่ ดโฟลเดอรทีเก็ ่ บโปรแกรมของผูใช 


  XT 46

3.6.1.4 เมนู Tools ใชจัดรูปแบบของโคดโปรแกรม, เลือกรุนของฮาร  ดแวรไมโครคอนโทรลเลอร Arduino, เลือกพอรตอนุกรม เมนูที่ใชงานในหุนยนต POP-BOT XT มีดังนี้  Auto Format : จัดรูปแบบของโคดโปรแกรมใหสวยงาม เชน กันหน ้ าเยืองขวา ้ จัดตําแหนงของวง เล็บปกกาปดใหตรงกับปกกาเปด ถาเปนคําสังที ่ อยู ่ ภายในวงเล็  บปกกาเปดและปดจะถูกกันหน ้ าเยืองไปทางขวามากขึ ้ น้  Archive Sketch : สั่ งบี บอัดไฟลโปรแกรมทั้ งโฟลเดอรหลักและโฟลเดอรย อยของสเก็ตชบุก ปจจุบัน ไฟลทีสร ่ างใหมจะมีชือเดี ่ ยวกับสเก็ตชบุกป  จจุบันตอทายดวย -510123.zip  Export Folder : สังเป ่ ดโฟลเดอรที่เก็บสเก็ตชบุกปจจุบัน  POP Board : เลือกฮารดแวรของบอรไมโครคอนโทรลเลอร Arduino สําหรับ POP-XT หรือหุนยนต ่ POP-XT เปนหนึ่งในอนุกรมของบอรด Unicon ที่พัฒนา BOT XT ใหเลือก POP-XT หรือ Unicon Board เนืองจาก ขึนโดยบริ ้ ษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด หรือ inex ซึงเข ่ ากันไดกับฮารดแวร Arduini Leomardo  Serial Port : เลือกหมายเลขพอรตอนุกรมของคอมพิวเตอรที่ใชติดตอกับฮารดแวร Arduino รวม ทั้งแผงวงจร POP-XT และ Unicon Board

3.6.1.5 เมนู Help เมือต ่ องการความชวยเหลือหรือตองการขอมูลเกียวกั ่ บโปรแกรมใหเลือกเมนูนี้ เมือเลื ่ อกเมนูยอย ตัวโปรแกรม จะเปดไฟลเว็บเพจ (ไฟลนามสกุล .html) ทีเกี ่ ยวข ่ องกับหัวขอนันๆ ้ ซึงอยู ่ ภายในโฟลเดอร  ทีเก็ ่ บ Arduino IDE

3.6.2 แถบเครื่องมือ (ทูลบาร : Tools bar)  ่องมือ เพื่อให สําหรับคําสั่งที่มีการใชบอยๆ ตัวโปรแกรม Arduino1.0 จะนํามาสรางเปนปุมบนแถบเครื สามารถคลิกเลือกไดทันที ปุมตางๆ บนแถบเครื่องมือมีดังนี้ ่ า มีถูกตองตามหลักไวยกรณหรือ Verfy/Compile ใชตรวจสอบการเขียนคําสังในโปรแกรมว ไม และคอมไพลโปรแกรม Upload to I/O Board ใชอัปโหลดโปรแกรมที่เขียนขึนไปยั ้ งบอรดหรือฮารดแวร Arduino กอนจะอัปโหลดไฟล ตองแนใจวาไดบันทึกไฟลและคอมไพลไฟลสเก็ตชเรียบรอยแลว New ใชสรางสเก็ตไฟล (ไฟลโปรแกรม) ตัวใหม Open ใชแทนเมนู File  Sketchbook เพื่อเปดสเก็ตชบุก (ไฟลโปรแกรม) ที่มีในเครื่อง Save ใชบันทึกไฟลสเก็ตชบุกที่เขียนขึน้


  XT 47



 ในการเขียนโปรแกรมสําหรับแผงวงจร POP-XT และหุนยนต POP-BOT XT จะตองเขียนโปรแกรมโดยใช ภาษา C/C++ ของ Arduino (Arduino programming language) เวอรชัน 1.0 ขึนไป ้ ซึงตั ่ วภาษาของ Arduino เองก็นํา เอาโอเพนซอรสโปรเจ็กตชือ่ wiring มาพัฒนาตอ ภาษาของ Arduino แบงไดเปน 2 สวนหลักคือ 1. โครงสรางภาษา (structure) ตัวแปรและคาคงที่ 2. ฟงกชั่น (function) ภาษาของ Arduino จะอางอิงตามภาษา C/C++ จึงอาจกลาวไดวาการเขียนโปรแกรมสําหรับ Arduino (ซึง่ ก็รวมถึง POP-MCU) ก็คือการเขียนโปรแกรมภาษาซี โดยเรียกใชฟงกชั่นและไลบรารีที่ทาง Arduino ไดเตรียมไว ใหแลว ซึงสะดวก ่ และทําใหผูที่ไมมีความรูดานไมโครคอนโทรลเลอรอยางลึกซึง้ สามารถเขียนโปรแกรมสังงาน ่ ได ในบทนี้จะอธิบายถึงโครงสรางโปรแกรมของ Arduino เปนหลัก สวนฟงกชั่นโปรแกรมภาษา C ของ Arduino ฉบับสมบูรณสามารถอานเพิมเติ ่ มไดจากหนังสือ เรียนรูระบบควบคุ  มอยางงายดวยโปรแกรมภาษา C กับ Arduino ซึงจั ่ ดมาในชุดหุนยนต POP-BOT XT แลว

4.1 โครงสรางโปรแกรมของ Arduino โปรแกรมของ Arduino แบงไดเปนสองสวนคือ void setup()

และ void loop()

างานจะทําคําสังของฟ ่ งกชันนี ่ เพี ้ ยงครังเดี ้ ยว ใชในการกําหนดคาเริม่ โดยฟงกชัน่ setup() เมือโปรแกรมทํ ่ ตนของการทํางาน สวนฟงกชัน่ loop() เปนสวนทํางาน โปรแกรมจะทําคําสังในฟ ่ งกชันนี ่ ต้ อเนืองกั ่ นตลอดเวลา โดย ปกติใชกําหนดโหมดการทํางานของขาตางๆ กําหนดการสื่อสารแบบอนุกรม ฯลฯ สวนของ loop() เปนโคด โปรแกรมทีทํ่ างาน เชน อานคาอินพุต ประมวลผล สังงานเอาต ่ พุต ฯลฯ โดยสวนกําหนดคาเริมต ่ นเชนตัวแปร จะตอง เขียนทีส่ วนหัวของโปรแกรม กอนถึงตัวฟงกชัน่ นอกจากนันยั ้ งตองคํานึงถึงตัวพิมพเล็ก-ใหญของตัวแปรและชือฟ ่ งกชัน่ ใหถูกตอง


  XT 48

4.1.1 สวนของฟงกชัน่ setup() ฟงกชั่นนีจะเขี ้ ยนที่สวนตนของโปรแกรม ทํางานเมือโปรแกรมเริ ่ ่มตนเพียงครั้งเดียว ใชเพื่อกําหนดคา ของตัวแปร โหมดการทํางานของขาตางๆ เริ่มตนเรียกใชไลบรารี่ ฯลฯฯ ตัวอยางที่ 4-1 int buttonPin = 3; void setup() { beginSerial(9600); pinMode(buttonPin, INPUT); } void loop() { if (digitalRead(buttonPin) == HIGH) serialWrite(‘H’); else serialWrite(‘L’); delay(1000); }

่ C คอมไพ ในขณะที่โปรแกรมภาษา C มาตรฐานที่เขียนบน AVR GCC (เปนโปรแกรมภาษา C ทีใช เลอรแบบ GCC สําหรับไมโครคอนโทรลเลอร AVR) จะเขียนไดดังนี้ int main(void) { init(); setup(); for (;;) loop(); return ;

ตรงกับ void

setup()

ตรงกับ void

loop()

}

4.1.2 สวนของฟงกชัน่ loop() หลังจากที่เขียนฟงกชั่น setup()ที่กําหนดคาเริ่มตนของโปรแกรมแลว สวนถัดมาคือฟงกชั่น loop() ่ ภายในฟงกชั่นนี้จะมีโปรแกรมของ ซึ่งมีการทํางานตรงตามชื่อคือ จะทํางานตามฟงกชั่นนี้วนตอเนืองตลอดเวลา ผูใช เพื่อรับคาจากพอรต ประมวล แลวสังเอาต ่ พุตออกขาตางๆ เพื่อควบคุมการทํางานของบอรด ตัวอยางที่ 4-2 int buttonPin = 3; // setup initializes serial and the button pin void setup() { beginSerial(9600); pinMode(buttonPin, INPUT); } // loop checks the button pin each time and will send serial if it is pressed void loop() { if (digitalRead(buttonPin) == HIGH) serialWrite(‘H’); else serialWrite(‘L’); delay(1000); }


  XT 49

่ มการทํางาน 4.2 คําสังควบคุ 4.2.1 คําสั่ง if ่ างานของโปรแกรม เชน ถาอินพุตมีคามากกวาคาที่กําหนดไวจะให ใชทดสอบเพื่อกําหนดเงือนไขการทํ ทําอะไร โดยมีรูปแบบการเขียนดังนี้ if (someVariable > 50) { // do something here }

ตัวโปรแกรม จะทดสอบวาถาตัวแปร someVariable มีคามากกวา 50 หรือไม ถาใชใหทําอะไร ถาไม ใชใหขามการทํางานสวนนี้ การทํางานของคําสั่งนีจะทดสอบเงื ้ ่อนไข ที่เขียนในเครื่องหมายวงเล็บ ถาเงื่อนไขเปนจริง ทําตามคําสั่ง ที่เขียนในวงเล็บปกกา ถาเงื่อนไขเปนเท็จ ขามการทํางานสวนนีไป ้ สวนของการทดสอบเงื่อนไขทีเขี ่ ยนอยูภายในวงเล็บ จะตองใชตัวกระทําเปรียบเทียบตางๆ ดังนี้ x == y (x เทากับ y) x != y (x ไมเทากับ y) x < y (x นอยกวา y) x > y (x มากกวา y) x <= y (x นอยกวาหรือเทากับ y) x >= y (x มากกวาหรือเทากับ y) เทคนิคสําหรับการเขียนโปรแกรม ในการเปรียบเทียบตัวแปรใหใชตัวกระทํา == (เชน if (x==10) ) หามเขียนผิดเปน = (เชน if(x=10) ่ เขี ่ ยนผิดในแบบทีสองนี ่ ้ ทําใหผลการทดสอบเปนจริงเสมอ และเมือผ ่ านคําสังนี ่ แล ้ ว x มีคาเทากับ 10 ทําให ) คําสังที การทํางานของโปรแกรมผิดเพียนไป ้ ไมเปนตามที่กําหนดไว เราสามารถใชคําสั่ง if ในคําสั่งควบคุมการแยกเสนทางของโปรแกรม โดยใชคําสั่ง if....else


  XT 50

4.2.2 คําสั่ง

if...else

ใชทดสอบเพือกํ ่ าหนดเงื่อนไขการทํางานของโปรแกรมไดมากกวาคําสัง่ if ธรรมดา โดยสามารถกําหนด ไดวา ถาเงื่อนไขเปนจริงใหทําอะไร ถาเปนเท็จใหทําอะไร เชน ถาคาอินพุตอะนาลอกทีอ่ านไดนอยกวา 500 ให ทําอะไร ถาคามากกวาหรือเทากับ 500 ใหทําอีกอยาง สามารถเขียนคําสั่งไดดังนี้ ตัวอยางที่ 4-3 if (pinFiveInput < 500) { // do Thing A } else { // do Thing B }

่ น หลังคําสั่ง else สามารถตามดวยคําสัง่ if สําหรั บการทดสอบอื่นๆ ทําใหรูปแบบคําสังกลายเป if....else...if เปนการทดสอบเงื่อนไขตางๆ เมื่อเปนจริงใหทําตามที่ตองการ ดังตัวอยางตอไปนี้ ตัวอยางที่ 4-4 if (pinFiveInput < 500) { // do Thing A } else if (pinFiveInput >= 1000) { // do Thing B } else { // do Thing C }

หลังคําสั่ง else สามารถตามดวยคําสั่ง if ไดไมจํากัดจํานวน (สามารถใชคําสั่ง switch case แทน คําสั่ง if...else...if สําหรับการทดสอบเงื่อนไขจํานวนมากๆ ได) ่ เลย ใหทําอะไร โดย เมือใช ่ คําสั่ง if...else แลว ตองกําหนดดวยวาถาทดสอบไมตรงกับเงือนไขใดๆ ใหกําหนดที่คําสั่ง else ตัวสุดทาย


  XT 51

4.2.3 คําสั่ง

for()

คําสั่งนีใช ้ เพื่อสังให ่ คําสั่งที่อยูภายในวงเล็บปกกาหลัง for มีการทํางานซํากั ้ นตามจํานวนรอบที่ตองการ คําสังนี ่ มี้ ประโยชนมากสําหรับการทํางานใดๆ ทีต่ องทําซํากั ้ นและทราบจํานวนรอบของการทําซําที ้ แน ่ นอน มักใช คูกั บตัวแปรอะเรยในการเก็บสะสมคาที่อานไดจากขาอินพุตอะนาลอกหลายๆ ขาที่มีหมายเลขขาตอเนืองกั ่ น รูปแบบของคําสั่ง for() แบงได 3 สวนดังนี้ for (initialization; condition; increment){ //statement(s); }

่ นของตัวแปรควบคุมการวนรอบ ในการทํางานแตละรอบจะ เริ่มตนดวย initialization ใชกําหนดคาเริมต ทดสอบ condition ถาเงือนไขเป ่ นจริงทําตามคําสังในวงเล็ ่ บปกกา แลวมาเพิมหรื ่ อลดคาตัวแปรตามทีสั่ งใน ่ increment แลวทดสอบเงือนไขอี ่ ก ทําซํ้าจนกวาเงือนไขเป ่ นเท็จ ตัวอยางที่ 4-5 for (int i=1; i <= 8; i++){ // statement using the value i; }

 าคําสัง่ for ของภาษาคอมพิวเตอรอืนๆ ่ โดยสามารถละเวนบางสวนหรือ คําสัง่ for ของภาษาซีจะยืดหยุนกว ทั้ งสามส วนของคําสั่ ง for ได อย างไรก็ ตามยั งคงต องมี เซมิ โคลอน เราสามารถนําคําสั่ งภาษาซีที่ มี ตัวแปรทีไม ่ เกียวข ่ องมาเขียนในสวนของ initialization, condition และ increment ของคําสัง่ for ได

4.2.4 คําสั่ง

switch-case

ใชทดสอบเงือนไขเพื ่ อกํ ่ าหนดการทํางานของโปรแกรม ถาตัวแปรทีทดสอบตรงกั ่ บเงือนไขใดก็ ่ ใหทํางาน ตามที่กําหนดไว พารามิเตอร var ตัวแปรทีต ่ องการทดสอบวาตรงกับเงื่อนไขใด default ถาไมตรงกับเงือนไขใดๆ ่ เลยใหทําคําสังต ่ อทายนี้ break เปนสวนสําคัญมาก ใชเขียนตอทาย case ตางๆ เมื่อพบเงื่อนไขนั้นแลวทําตามคําสั่งตางๆ แลวใหหยุดการทํางานของคําสั่ง switch-case ถาลืมเขียน break เมือพบเงื ่อนไขทําตามเงื่อนไขแลว โปรแกรม ่ จะทํางานตามเงื่อนไขตอไปเรือยๆ ่ จนกวาจะพบคําสั่ง break ตัวอยางที่ 4-6 switch (var) { case 1: //do something when var == 1 break; case 2: //do something when var == 2 break; default: // if nothing else matches, do the default }


  XT 52

4.2.5 คําสั่ง while เปนคําสั่งวนรอบ โดยจะทําคําสังที ่ ่เขียนในวงเล็บปกกาอยางตอเนือง ่ จนกวาเงื่อนไขทีเขี ่ ยนในวงเล็บของ คําสั่ง while() จะเปนเท็จ คําสั่งที่ใหทําซํ้าจะตองมีการเปลียนแปลงค ่ าตัวแปรที่ใชทดสอบ เชน มีการเพิ่มตาตัว แปร หรือมีเงือนไขภายนอกเช ่ นอานคาจากเซ็นเซอรไดเรียบรอยแลวใหหยุดการอานคา มิฉะนันเงื ้ อนไขในวงเล็ ่ บ ของ while() เปนจริงตลอดเวลา ทําใหคําสั่ง while ทํางานวนรอบไปเรื่อยๆ ไมรูจบ รูปแบบคําสัง่ while(expression){ // statement(s) }

พารามิเตอร expression

เปนคําสั่งทดสอบเงื่อนไข (ถูกหรือผิด)

ตัวอยางที่ 4-7 var = 0; while(var < 200){ // do something repetitive 200 times var++; }


  XT 53

4.3 ตัวกระทําทางคณิตศาสตร ประกอบดวยตัวกระทํา 5 ตัวคือ + (บวก),- (ลบ), * (คูณ), / (หาร) และ % (หารเอาเศษ)

4.4.1 ตัวกระทําทางคณิตศาสตร บวก ลบ คูณ และหาร ใชหาคาผลรวม ผลตาง ผลคูณ และผลหารคาของตัวถูกกระทําสองตัว โดยใหคําตอบมีประเภทตรงกับตัว ถูกกระทําทั้งสองตัว เชน 9/4 ใหคําตอบเทากับ 2 เนืองจากทั ่ ้ง 9 และ 4 เปนตัวแปรเลขจํานวนเต็ม (int) นอกจากนีตั้ วกระทําทางคณิตศาสตรอาจทําใหเกิดโอเวอรโฟลว (overflow) ถาผลลัพธทีได ่ มีขนาดใหญเกิน กวาจะสามารถเก็บในตัวแปรประเภทนัน้ ถาตัวทีถู่ กกระทําตางประเภทกันผลลัพธไดเปนจะมีขนาดใหญขึนเท ้ ากับ ประเภทของตัวแปรทีใหญ ่ ทีสุ่ ด (เชน 9/4 = 2 หรือ 9/4.0 = 2.25) รูปแบบคําสัง่ result = value1 + value2; result = value1 - value2; result = value1 * value2; result = value1 / value2;

พารามิเตอร value1 : เปนคาของตัวแปรหรือคาคงที่ใดๆ value2: เปนคาของตัวแปรหรือคาคงที่ใดๆ ตัวอยางที่ 4-8 y = y + 3; x = x - 7; i = j * 6; r = r / 5;

เทคนิคสําหรับการเขียนโปรแกรม  เลือกขนาดของตัวแปรใหใหญพอสําหรับเก็บคาผลลัพธที่มากที่สุดของการคํานวณ  ตองทราบวาที่คาใดตัวแปรที่เก็บจะมีการวนซําค ้ ากลับ และวนกลับอยางไร ตัวอยางเชน (0 ไป 1) หรือ (0 ไป -32768)  สําหรับการคําณวณที่ตองการเศษสวนใหใชตัวแปรประเภท float แตใหระวังผลลบ เชน ตัวแปรมีขนาด ใหญ คํานวณไดชา ่ วแปรชั่วคราวขณะที่โปรแกรม  ใชตัวกระทํา cast เชน (int)myfloat ในการเปลียนประเภทของตั ทํางาน


  XT 54

4.4.2 ตัวกระทํา % หารเอาเศษ ใชหาคาเศษที่ไดของการหารเลขจํานวนเต็ม 2 ตัว ตัวกระทําหารเอาเศษไมสามารถใชงานกับตัวแปรเลข ทศนิยม (float) รูปแบบคําสัง่ result = value1 % value2;

พารามิเตอร - เปนตัวแปรประเภท byte,char,int หรือ long value2 - เปนตัวแปรประเภท byte,char,int หรือ long ผลที่ได เศษจากการหารคาเลขจํานวนเต็ม เปนขอมูลชนิดเลขจํานวนเต็ม ตัวอยางที่ 4-9 value1

x = 7 % 5; x = 9 % 5;

// x now contains 2 // x now contains 4

x = 5 % 5;

// x now contains 0

x = 4 % 5;

// x now contains 4

ตัวกระทําหารเอาเศษ นีใช ้ ประโยชนมากในงานที่ตองการใหเหตุการณเกิดขึ้นดวยชวงเวลาทีสมํ ่ ่าเสมอ หรือใชทําใหหนวยความทีเก็ ่ บตัวแปรอะเรยเกิดการลนคากลับ (roll over) ตัวอยางที่ 4-10 // check a sensor every 10 times through a loop void loop() { i++; if ((i % 10) == 0) { x = analogRead(sensPin); // read sensor every ten times through loop } / ... } // setup a buffer that averages the last five samples of a sensor int senVal[5]; // create an array for sensor data // counter variables int i, j; long average; // variable to store average ... void loop() { // input sensor data into oldest memory slot sensVal[(i++) % 5] = analogRead(sensPin); average = 0; for (j=0; j<5; j++) { average += sensVal[j]; // add samples } average = average / 5; // divide by total


  XT 55

4.4 ตัวกระทําเปรียบเทียบ ่อนไขหรือเปรียบเทียบคาตัวแปรตาง โดยจะเขียนเปนนิพจนอยู ใชประกอบกับคําสัง่ if() เพือทดสอบเงื ่ ภายในเครื่องหมาย () x == y (x เทากับ y) x != y (x ไมเทากับ y) x < y (x นอยกวา y) x > y (x มากกวา y) x <= y (x นอยกวาหรือเทากับ y) x >= y (x มากกวาหรือเทากับ y)

4.5 ตัวกระทําทางตรรกะ ใชในการเปรียบเทียบของคําสั่ง if() มี 3 ตัวคือ &&, || และ !

4.5.1 && (ตรรกะ และ) ใหคาเปนจริงเมื่อผลการเปรียบเทียบทั้งสองขางเปนจริงทั้งคู ตัวอยางที่ 4-11 if (x > 0 && x < 5) { // ... }

ใหคาเปนจริงเมื่อ x มากกวา 0 และนอยกวา 5 (มีคา 1 ถึง 4)

4.5.2 && (ตรรกะ หรือ) ใหคาเปนจริง เมื่อผลการเปรียบเทียบพบวา มีตัวแปรใดเปนจริงหรือเปนจริงทั้งคู ตัวอยางที่ 4-12 if (x > 0 || y > 0) { // ... }

ใหผลเปนจริงเมื่อ x หรือ y มีคามากกวา 0

4.5.3 ! (ใชกลับผลเปนตรงกันขาม) ใหคาเปนจริง เมื่อผลการเปรียบเทียบเปนเท็จ ตัวอยางที่ 4-13 if (!x) { // ... }

ใหผลเปนจริงถา x เปนเท็จ (เชน ถา x = 0 ใหผลเปนจริง)


  XT 56

4.5.4 ขอควรระวัง ระวังเรื่องการเขียนโปรแกรม ถาตองการใชตัวกระทําตรรกะและ ตองเขียนเครื่องหมาย && ถาลืมเขียน เปน & จะเปนตัวกระทําและระดับบิตกับตัวแปร ซึงให ่ ผลที่แตกตาง เชนกันในการใชตรรกะหรือใหเขียนเปน || (ขีดตั้งสองตัวติดกัน) ถาเขียนเปน | (ขีดตังตั ้ วเดียว) จะหมาย ถึงตัวกระทําหรือระดับบิตกับตัวแปร ตัวกระทํา NOT ระดับบิต (~) จะแตกตางจากตัวกลับผลใหเปนตรงขาม (!) ใหเลือกใชใหถูกตอง ตัวอยางที่ 4-14 if (a >= 10 && a <= 20){} // true if a is between 10 and 20

4.6 ตัวกระทําระดับบิต ตัวกระทําระดับจะนําบิตของตัวแปรมาประมวลผล ใชประโยชนในการแกปญหาดานการเขียนโปรแกรม ไดหลากหลาย ตัวกระทําระดับของภาษาซี (ซึ่งรวมถึง Arduino) มี 6 ตัวไดแก & (bitwise AND), | (OR), ^ (Exclusive OR), ~ (NOT), << (เลือนบิ ่ ตไปทางขวา) และ >> (เลือนบิ ่ ตไปทางซาย)

4.6.1 ตัวกระทําระดับบิต AND (&) คําสั่ง AND ในระดับบิตของภาษาซีเขียนไดโดยใช & หนึงตั ่ ว โดยตองเขียนระหวางนิพจนหรือตัวแปร ทีเป ่ นเลขจํานวนเต็ม การทํางานจะนําขอมูลแตละบิตของตัวแปรทังสองตั ้ วมากระทําทางตรรกะและ โดยมีกฎดังนี้ ถาอินพุตทังสองตั ้ วเปน “1” ทั้งคูเอาต  พุตเปน “1” กรณีอื่นๆ เอาตพุตเปน “0” ดังตัวอยางตอไปนี้ ในการ ดูใหคูของตั  วกระทําตามแนวตัง้ 0 0

0 1

1 0

1 1

Operand1 Operand2

—————————— 0

0

0

1

Returned result

้ อใช ่ ตัวกระทําระดับบิต AND จะมีการกระทํา ใน Arduino ตัวแปรประเภท int จะมีขนาด 16 บิต ดังนันเมื ตรรกะและพรอมกันกับขอมูลทั้ง 16 บิต ดังตัวอยางในสวนของโปรแกรมตอไปนี้ ตัวอยางที่ 4-15 int a =

92;

// in binary: 0000000001011100

int b = 101;

// in binary: 0000000001100101

int c = a & b; // result:

0000000001000100 or 68 in decimal.

่ ในตัวอยางนี้จะนําขอมูลทัง้ 16 บิตของตัวแปร a และ b มากระทําทางตรรกะและ แลวนําผลลัพธทีได ทัง้ 16 บิตไปเก็บที่ตัวแปร c ซึงได ่ คาเปน 01000100 ในเลขฐานสองหรือเทากับ 68 ฐานสิบ นิยมใชตัวกระทําระดับบิต AND เพื่อใชเลือกขอมูลบิตทีต่ องการ (อาจเปนหนึ่งบิตหรือหลายบิต) จากตัว แปร int ซึงการเลื ่ อกเพียงบางบิตนี้จะเรียกวา masking


  XT 57

4.6.2 ตัวกระทําระดับบิต OR (|) |หนึงตั คําสังระดั ่ ว โดยตองเขียนระหวางนิพจนหรือตัวแปร ่ บบิต OR ของภาษาซีเขียนไดโดยใชเครืองหมาย ่ ทีเป ่ นเลขจํานวนเต็ม การทํางานจะนําขอมูลแตละบิตของตัวแปรทังสองตั ้ วมากระทําทางตรรกะหรือ โดยมีกฎดังนี้ ถาอินพุตตัวใดตัวหนึงหรื ่ อทังสองตั ้ วเปน “1” เอาตพุตเปน “1” กรณีทีอิ่ นพุตเปน “0” ทังคู ้ เอาต  พุตจึงจะเปน “0” ดังตัวอยางตอไปนี้ 0

0

1

Operand1

0 1 0 1 ——————————

Operand2

0

Returned result

1

1

1

1

ตัวอยางที่ 4-16 สวนของโปรแกรมแสดงการใชตัวกระทําระดับบิต OR int a =

92;

// in binary: 0000000001011100

int b = 101; // in binary: 0000000001100101 int c = a | b; // result: 0000000001111101 or 125 in decimal.

ตัวอยางที่ 4-17 โปรแกรมแสดงการใชตัวกระทําระดับบิต AND และ OR ตัวอยางงานที่ใชตัวกระทําระดับบิต AND และ OR เปนงานที่โปรแกรมเมอรเรียกวา Read-Modify-Write on a port สําหรับไมโครคอนโทรลเลอร 8 บิต คาทีอ่ านหรือเขียนไปยังพอรตมีขนาด 8 บิต ซึงแสดงค ่ าอินพุตที่ขา ทัง้ 8 ขา การเขียนคาไปยังพอรตจะเขียนคาครั้งเดียวไดทัง้ 8 บิต ่ แทนสถานะของขาดิจิตอลหมายเลข 0,1,2,3,4,5,6,7 ถาบิตใดมีคาเปน 1 ตัวแปรชือ่ PORTD เปนคาทีใช ทําใหขานันมี ้ คาลอจิกเปน HIGH (อยาลืมกําหนดใหขาพอรตนั้นๆ ทํางานเปนเอาตพุตดวยคําสั่ง pinMode() กอน) ดังนั้นถากําหนดคาให PORTD = B00110001; ก็คือตองการใหขา 2,3 และ 7 เปน HIGH ในกรณีนีไม ้ ตองเปลียนค ่ าสถานะของขา 0 และ 1 ซึงปกติ ่ แลวฮารดแวรของ Arduino ใชในการสือสารแบบอนุ ่ กรม ถาไปเปลียน ่ คาแลวจะกระทบตอการสื่อสารแบบอนุกรม อัลกอริธึมสําหรับโปรแกรมเปนดังนี้  อานคาจาก PORTD แลวลางคาเฉพาะบิตที่ตองการควบคุม (ใชตัวกระทําแบบบิต AND) ่ ไขจากขางตนมารวมกับคาบิตที่ตองการควบคุม (ใชตัวกระทําแบบบิต OR)  นําคา PORTD ทีแก ซึ่งเขียนเปนโปรแกรมไดดังนี้


  XT 58 int i;

// counter variable

int j; void setup() { DDRD = DDRD | B11111100; // set direction bits for pins 2 to 7, // leave 0 and 1 untouched (xx | 00 == xx) // same as pinMode(pin,OUTPUT) for pins 2 to 7 Serial.begin(9600); } void loop() { for (i=0; i<64; i++) { PORTD = PORTD & B00000011; // clear out bits 2 - 7, leave pins 0 // and 1 untouched (xx & 11 == xx) j = (i << 2); // shift variable up to pins 2 - 7 to avoid pins 0 and 1 PORTD = PORTD | j; // combine the port information with the new information for LED pins Serial.println(PORTD, BIN); delay(100);

// debug to show masking

} }

4.6.3 คําสั่งระดับบิต Exclusive OR (^) เปนโอเปอรเตอรพิเศษที่ไมคอยไดใชในภาษา C/C++ ตัวกระทําระดับบิต exclusive OR (หรือ XOR) จะเขียนโดยใชสัญลักษณเครื่องหมาย ^ ตัวกระทํานีมี้ การทํางานใกลเคียงกับตัวกระทําระดับบิต OR แตตางกัน เมื่ออินพุตเปน “1” ทั้งคูจะให  เอาตพุตเปน “0” แสดงการทํางานไดดังนี้ 0

0

1

1

Operand1

0

1

0

1

Operand2

—————————— 0 1 1 0

Returned result

หรือกลาวไดอีกอยางวา ตัวกระทําระดับบิต XOR จะใหเอาตพุตเปน “0” เมื่ออินพุตทังสองตั ้ วมีคาเหมือ นกัน และใหเอาตพุตเปน “1” เมื่ออินพุตทังสองมี ้ คาตางกัน ตัวอยางที่ 4-18 int x = 12; int y = 10;

// binary: 1100 // binary: 1010

int z = x ^ y;

// binary: 0110, or decimal 6


  XT 59

ตัวกระทําระดับบิต XOR จะใชมากในการสลับคาบางบิตของตัวตัวแปร int เชน กลับจาก “0” เปน “1” หรือกลับจาก “1” เปน “0” เมื่อใชตัวกระทําระดับบิต XOR ถาบิตของ mask เปน “1” ทําใหบิตนั้นถูกสลับคา ถา mask มีคาเปน “1” บิตนั้นมีคาคงเดิม ตัวอยางตอไปนีเป ้ นโปรแกรมแสดงการสั่งใหขาดิจิตอล 5 (Di 5) มีการกลับลอจิกตลอดเวลา ตัวอยางที่ 4-19 // Blink_Pin_5 // demo for Exclusive OR void setup() { DDRD = DDRD | B00100000; Serial.begin(9600);

// set digital pin five as OUTPUT

} void loop() { PORTD = PORTD ^ B00100000;

// invert bit 5 (digital pin 5), // leave others untouched

delay(100); }

4.6.4 ตัวกระทําระดับบิต NOT (~) ้ งานกับตัวถูกกระทํา ตัวกระทําระดับบิต NOT จะเขียนโดยใชสัญลักษณเครื่องหมาย ~ ตัวกระทํานีจะใช เพียงตัวเดียวที่อยูขวามือ โดยทําการสลับบิตทุกบิตใหมีคาตรงกันขามคือ จาก “0” เปน “1” และจาก “1” เปน “0” ดังตัวอยาง 0

1

————— 1 0

Operand1 ~ operand1

int a = 103;

// binary: 0000000001100111

int b = ~a;

// binary: 1111111110011000

เมื่อกระทําแลว ทําใหตัวแปร b มีคา -104 (ฐานสิบ) ซึงคํ ่ าตอบที่ไดติดลบเนื่องจากบิตทีมี่ ความสําคัญสูง สุด (บิตซายมือสุด) ของตัวแปร int อันเปนบิตแจงวาตัวเลขเปนบวกหรือลบ มีคาเปน “1” แสดงวา คาที่ไดนีติ้ ดลบ โดยในคอมพิวเตอรจะเก็บคาตัวเลขทั้งบวกและลบตามระบบทูคอมพลีเมนต (2’s complement) การประกาศตัวแปร int ซึงมี ่ ความหมายเหมือนกับการประกาศตัวแปรเปน signed int ตองระวังคาของ ตัวแปรจะติดลบได


  XT 60

่ ตไปทางซาย (<<) และเลือนบิ ่ ตไปทางขวา (>>) 4.6.5 คําสั่งเลือนบิ ในภาษา C/C++ มีตัวกระทําเลือนบิ ่ ตไปทางซาย << และเลือนบิ ่ ตไปทางขวา >> ตัวกระทํานีจะสั ้ งเลื ่ อนบิ ่ ต ของตัวถูกกระทําทีเขี ่ ยนดานซายมือไปทางซายหรือไปทางขวาตามจํานวนบิตทีระบุ ่ ไวในดานขวามือของตัวกระทํา รูปแบบคําสัง่ variable << number_of_bits variable >> number_of_bits

พารามิเตอร variable

เปนตัวแปรเลขจํานวนเต็มที่มีจํานวนบิตนอยกวาหรือเทากับ 32 บิต (หรือตัวแปรประ

เภท byte, int หรือ long) ตัวอยางที่ 4-20 int a = 5;

// binary: 0000000000000101

int b = a << 3;

// binary: 0000000000101000 or 40 in decimal

int c = b >> 3;

// binary: 0000000000000101 or back to 5

ตัวอยางที่ 4-21 เมื่อสั่งเลื่อนคาตัวแปร x ไปทางซายจํานวน y บิต (x ตัวจะหายไป เนื่องจากถูกเลื่อนหายไปทางซายมือ

<< y

) บิตขอมูลทีอยู ่ ด านซายสุดของ x จํานวน y

// binary: 0000000000000101 int a = 5; int b = a << 14; // binary: 0100000000000000

การเลือนบิ ่ ตไปทางซาย จะทําใหคาของตัวแปรดานซายมือของตัวกระทําจะถูกคูณดวยคาสองยกกําลังบิต ที่เลือนไปทางซ ่ ายมือ ดังนี้ 1 <<

0

==

1

1 <<

1

==

2

1 << 1 <<

2 3

== ==

4 8

... 1 <<

8

==

256

1 <<

9

==

512

1 << 10 ...

== 1024

เมื่อสังเลื ่ ่อนตัวแปร x ไปทางขวามือจํานวน y บิต (x >> y) จะมีผลแตกตางกันขึ้นกับประเภทของตัว แปร ถา x เปนตัวแปรประเภท int คาที่เก็บไดมีทั้งคาบวกและลบ โดยบิตซายมือสุดจะเปน sign bit ถาเปนคาลบ คาบิตซายมือสุดจะมีคาเปน 1 กรณีนีเมื ้ ่อสังเลื ่ ่อนบิตไปทางขวามือแลวโปรแกรมจะนําคา sign bit นีมาเติ ้ มใหกับ บิตทางซายมือสุดไปเรื่อยๆ ปรากฏการณนีเรี ้ ยกวา sign eXTension มีตัวอยางดังนี้ ตัวอยางที่ 4-22 int x = -16; int y = x >> 3;

// binary: 1111111111110000 // binary: 1111111111111110


  XT 61

ถาตองการเลือนบิ ่ ตไปทางขวามือแลวใหคา 0 มาเติมยังบิตซายมือสุด (ซึงเกิ ่ ดกับกรณีทีตั่ วแปรเปนประเภท unsigned int) เราสามารถทําไดโดยใชการเปลียนประเภทตั ่ วแปรชั่วคราว (typecast) เพือเปลี ่ ยนให ่ ตัวแปร x เปน unsigned int ชัวคราวดั ่ งตัวอยางตอไปนี้ int x = -16; int y = unsigned(x) >> 3;

// binary: 1111111111110000 // binary: 0001111111111110

ถาคุณระมัดระวังเรื่อง sign eXTension แลว คุณสามารถใชตัวกระทําเลื่อนบิตไปทางขวามือสําหรับการ หารคาตัวแปรดวย 2 ยกกําลังตางๆ ไดดังตัวอยาง int x = 1000; int y = x >> 3;

// integer division of 1000 by 8, causing y = 125.

4.7 ไวยากรณภาษาของ Arduino 4.7.1

;

(เซมิโคลอน - semicolon)

ใชเขียนแจงวา จบคําสั่ง ตัวอยางที่ 4-23 int a = 13;

่ ลื่ มเขียนปดทายดวยเซมิโคลอน จะทําใหแปลโปรแกรมไมผาน โดยตัวแปรภาษาอาจจะแจง บรรทัดคําสังที ใหทราบวา ไมพบเครื่องหมายเซมิโคลอน หรือแจงเปนการผิดพลาดอืนๆ ่ บางกรณีที่ตรวจสอบบรรทัดทีแจ ่ งวา เกิดการผิดพลาดแลวไมพบที่ผิด ใหตรวจสอบบรรทัดกอนหนานัน้

4.7.2 {

}

(วงเล็บปกกา - curly brace)

เครื่องหมายวงเล็บปกกา เปนสวนสําคัญของภาษาซี โดยมีการใชงานตางตําแหนง สรางความสับสนให กับผูที่เริ่มตน วงเล็บปกกาเปด { จะตองเขียนตามดวยวงเล็บปกกาปด } ดวยเสมอ หรือที่เรียกวาวงเล็บตองครบคู ใน ซอฟตแวร Arduino IDE ที่ใชเขียนโปรแกรมจะมีความสามารถในการตรวจสอบการครบคูของเครื่องหมายวงเล็บ ผูใชงานเพียงแคคลิกที่วงเล็บ มันจะแสดงวงเล็บที่เหลือซึงเป ่ นคูของมัน สําหรับโปรแกรมเมอรมือใหม และโปรแกรมเมอรที่ยายจากภาษา BASIC มาเปนภาษา C มักจะสับสน กับการใช เครื่องหมายวงเล็บ แทที่จริงแลวเครื่องหมายปกกาปดนี้เทียบไดกับคําสั่ง RETURN ของ subroutine (function) หรือแทนคําสั่ง ENDIF ในการเปรียบเทียบ และแทนคําสั่ง NEXT ของคําสั่งวนรอบ FOR เนืองจากมี ่ การใชวงเล็บปกกาไดหลากหลาย ดังนันเมื ้ อต ่ องการเขียนคําสังที ่ ต่ องใชเครืองหมายวงเล็ ่ บ เมือเขี ่ ยน วงเล็บเปดแลวใหเขียนเครืองหมายวงเล็ ่ บปดทันที ถัดมาจึงคอยเคาะปุม Enter ในระหวางเครืองหมายวงเล็ ่ บเพือขึ ่ น้ บรรทัดใหม แลวเขียนคําสังที ่ ต่ องการ ถาทําไดตามนีวงเล็ ้ บจะครบคูแน  นอน สําหรับวงเล็บที่ไมครบคู ทําใหเกิดการผิดพลาดตอนคอมไพลโปรแกรม ถาเปนโปรแกรมขนาดใหญจะ หาที่ผิดไดยาก ตําแหนงที่อยูของเครื่องหมายวงเล็บแตละตัวจะมีผลอยางมากตอไวยากรณของภาษาคอมพิวเตอร การยายตําแหนงวงเล็บไปเพียงหนึงหรื ่ อสองบรรทัด ทําใหตัวโปรแกรมทํางานผิดไป


  XT 62

ตําแหนงที่ใชวงเล็บปกกา ฟงกชั่น (Function) void myfunction(datatype argument){ statements(s) }

คําสั่งวนรอบ (Loops) while (boolean expression) { statement(s) } do { statement(s) } while (boolean expression); for (initialisation; termination condition; incrementing expr) { statement(s) }

คําสั่งทดสอบเงือนไข ่ (condition) if (boolean expression) { statement(s) } else if (boolean expression) { statement(s) } else { statement(s) }

4.7.3 // และ /*...* หมายเหตุบรรทัดเดียวและหลายบรรทัด เปนสวนของโปรแกรมที่ผูใชเขียนเพิ่มเติมวาโปรแกรมทํางานอยางไร โดยสวนที่เปนหมายเหตุจะไมถูก คอมไพล ไมนําไปประมวลผล มีประโยชนมากสําหรับการตรวจสอบโปรแกรมภายหลังหรือใชแจงใหเพื่อนรวม งานหรือบุคคลอืนทราบว ่ าบรรทัดนี้ใชทําอะไร ตัวหมายเหตุภาษาซีมี 2 ประเภทคือ (1) หมายเหตุบรรรทัดเดียว เขียนเครื่องสเลช // 2 ตัวหนาบรรทัด (2) หมายเหตุหลายบรรทัด เขียนเครื่องหมายสเลช / คูกับดอกจัน * ครอมขอความที่เปนหมายเหตุ เชน /* blabla */


  XT 63

4.7.4 #define เป นคําสั่งที่ใชงานมาก ในการกําหนดคาคงที่ใหกับโปรแกรม ในการกําหนดคาคงที่ไมไดเปลืองพื้นที่ หนวยความจําของไมโครคอนโทรลเลอรแตอยางไร เมื่อถึงขันตอนแปลภาษาคอมไพเลอร ้ จะแทนที่ตัวอักษรขอ ความดวยคาที่กําหนดไว ใน Arduino จะใช คําสั่ง #define ตรงกับภาษาซี รูปแบบ #define constantName value

อยาลืมเครืองหมาย ่ # ตัวอยางที่ 4-24 #define ledPin 3

เปนการกําหนดใหตัวแปร ledPin เทากับคาคงที่ 3 เทคนิคสําหรับการเขียนโปรแกรม ทายคําสัง่ #define ไมตองมีเครื่องหมายเซมิโคลอน ถาใสเกินแลวเวลาคอมไพลโปรแกรมจะแจงวาเกิด การผิดพลาดในบรรทัดถัดไป

4.7.5 #include ใชสังให ่ รวมไฟลอื่นๆ เขากับไฟลโปรแกรมของเรากอน แลวจึงทําการคอมไพลโปรแกรม รูปแบบคําสัง่ #include <file> #include “file”

ตัวอยางที่ 4-25 #include <stdio.h> #include “popxt.h”

บรรทัดแรกจะสั่งใหเรียกไฟล stdio.h มารวมกับไฟลโปรแกรมของเรา โดยคนหาไฟลจากตําแหนงที่เก็บ ไฟลระบบของ Arduino โดยปกติเปนไฟลมาตรฐานที่มาพรอมกับ Arduino บรรทัดที่ 2 สั่งใหรวมไฟล popxt.h มารวมกับไฟลโปรแกรมของเรา โดยหาไฟลจากตําแหนงที่อยูของ  ไฟลภาษาซีของเรากอน ปกติเปนไฟลทีผู่ ใชสรางขึ้นเอง


  XT 64

4.8 ตัวแปร ตัวแปรเปนตัวอักษรหลายตัวๆ ที่กําหนดขึ้นในโปรแกรมเพื่อใชในการเก็บคาขอมูลตางๆ เชน คาที่อาน ไดจากตัวตรวจจับที่ตออยูกับขาพอรตอะนาลอกของ Arduino ตัวแปรมีหลายประเภทดังนี้

4.8.1 char : ตัวแปรประเภทตัวอักขระ เปนตัวแปรที่มีขนาด 1 ไบต (8 บิต) มีไวเพื่อเก็บคาตัวอักษร ตัวอักษรในภาษา C จะเขียนอยูในเครื่อง หมายคําพูดขีดเดียว เชน ‘A’ (สําหรับขอความ ที่ประกอบจากตัวอักษรหลายตัวเขียนตอกันจะเขียนอยูในเครื่อง หมายคําพูดปกติ เชน “ABC”) คุณสามารถสั่งกระทําทางคณิตศาสตรกับตัวอักษรได ในกรณีจะนําคารหัส ASCII ของตัวอักษรมาใช เชน ‘A’ +1 มีคาเทากับ 66 เนืองจากค ่ ารหัส ASCII ของตัวอักษร A เทากับ 65 รูปแบบคําสัง่ char sign = ‘ ’;

พารามิเตอร char var = ‘x’;

คือชือของตั ่ วแปรประเภท char ทีต่ องการ ่ องการกําหนดใหกับตัวแปร ในทีนี่ เป ้ นตัวอักษรหนึงตั ่ ว x คือคาทีต var

4.8.2 byte : ตัวแปรประเภทตัวเลบ 8 บิตหรือ 1 ไบต ตัวแปร byte ใชเก็บคาตัวเลขขนาด 8 บิต มีคาไดจาก 0 - 255 ตัวอยางที่ 4-26 byte b = B10010;

// “B” is the binary formatter (18 decimal)

4.8.3 int : ตัวแปรประเภทตัวเลขจํานวนเต็ม ยอจาก interger ซึงแปลว ่ าเลขจํานวนเต็ม int เปนตัวแปรพื้นฐานสําหรับเก็บตัวเลข ตัวแปรหนึงตั ่ วมีขนาด 2 ไบต เก็บคาไดจาก -32,768 ถึง 32,767 (คาตําสุ ่ ดจาก -215 คาสูงสุดจาก (215- 1) ในการเก็บคาตัวเลขติดลบ จะใชเทคนิคที่เรียกวา ทูคอมพลีเมนต (2’s complement) บิตสูงสุดบางทีจะเรียก วาเปนบิตเครื่องหมายหรือ sign bit ถามีคาเปน “1” แสดงวาคาติดลบ ใน Arduino จะจัดการกับตัวเลขคาติดลบใหเอง ทําใหนําคาตัวแปรไปคํานวณไดอยางถูกตอง อยางไรก็ ตามเมื่อนําตัวเลขคาติดลบนี้ไปเลือนบิ ่ ตไปทางขวา (>>) จะมีปญหาเรื่องคาของตัวเลขที่ผิดพลาด รูปแบบคําสัง่ int var = val;

พารามิเตอร var คือชือของตั ่ วแปรประเภท int ทีต่ องการ val คือคาทีต ่ องการกําหนดใหกับตัวแปร


  XT 65

ตัวอยางที่ 4-27 int ledPin = 13;

เทคนิคสําหรับการเขียนโปรแกรม เมื่อตัวแปรมีคามากกวาคาสูงสุดที่เก็บได จะเกิดการ “ลนกลับ” (roll over) ไปยังคาตํ่าสุดที่เก็บได และ เมื่อมีคานอยกวาคาตํ่าสุดที่เก็บไดจะลนกลับไปยังคาสูงสุด ดังตัวอยางตอไปนี้ ตัวอยางที่ 4-28 int x = x = x = x =

x -32,768; x - 1; // x now contains 32,767 - rolls over in neg. direction 32,767; x + 1; // x now contains -32,768 - rolls over

4.8.4 unsigned int : ตัวแปรประเภทเลขจํานวนเต็มไมคิดเครื่องหมาย ตัวแปรประเภทนีคล ้ ายกับตัวแปร int ตรงทีใช ่ หนวยความจํา 2 ไบต แตจะเก็บเลขจํานวนเต็มบวกเทานัน้ โดย เก็บคา 0 ถึง 65,535 (216 -1) รูปแบบคําสัง่ unsigned int var = val;

พารามิเตอร var คือชือของตั ่ วแปร int ทีต่ องการ val คือคาทีต ่ องการกําหนดใหกับตัวแปร ตัวอยางที่ 4-29 unsigned int ledPin = 13;

เทคนิคสําหรับการเขียนโปรแกรม ่ ด และเมือมี ่ คานอยกวาคาตํ่าสุดจะลนกลับเปนคา เมือตั ่ วแปรมีคามากกวาคาสูงสุดจะลนกลับไปคาตําสุ สูงสุด ดังตัวอยาง ตัวอยางที่ 4-30 unsigned int x x = 0; x = x - 1; // x now contains 65535 - rolls over in neg direction x = x + 1; // x now contains 0 - rolls over


  XT 66

4.8.5 long : ตัวแปรประเภทเลขจํานวนเต็ม 32 บิต เปนตัวแปรเก็บคาเลขจํานวนเต็มทีขยายความจุ ่ เพิมจากตั ่ วแปร int โดยตัวแปร long หนึงตั ่ วกินพืนที ้ หน ่ วย ความจํา 32 บิต (4 ไบต) เก็บคาไดจาก -2,147,483,648 ถึง 2,147,483,647 รูปแบบคําสัง่ long var = val;

พารามิเตอร ่ วแปร long ที่ตองการ var คือชือของตั ่ องการกําหนดใหกับตัวแปร val คือคาทีต ตัวอยางที่ 4-31 long time; void setup(){ Serial.begin(9600); } void loop(){ Serial.print(“Time: “); time = millis(); //prints time since program started Serial.println(time); // wait a second so as not to send // massive amounts of data delay(1000); }

4.8.6 unsigned long : ตัวแปรประเภทเลขจํานวนเต็ม 32 บิต แบบไมคิดเครื่องหมาย ่ วกินพืนที ้ หน ่ วยความจํา 32 บิต (4 ไบต) เก็บคาไดจาก 0 เปนตัวแปรเก็บคาเลขจํานวนเต็มบวก ตัวแปรหนึงตั ถึง 4,294,967,295 หรือ 232 -1 รูปแบบคําสัง่ unsigned long var = val;

พารามิเตอร var คือชือของตั ่ วแปร unsigned long ทีต่ องการ val คือคาทีต ่ องการกําหนดใหกับตัวแปร ตัวอยางที่ 4-32 long time; void setup(){ Serial.begin(9600); } void loop(){ Serial.print(“Time: “); time = millis(); //prints time since program started Serial.println(time); // wait a second so as not to send // massive amounts of data delay(1000); }


  XT 67

4.8.7 float : ตัวแปรประเภทเลขทศนิยม เปนตัวแปรสําหรับเก็บคาเลขเลขทศนิยม ซึ่งนิยมใชในการเก็บคาสัญญาณอะนาล็อกหรือคาที่ตอเนือง ่ เนืองจากสามารถเก็ ่ บคาไดละเอียดกวาตัวแปร int ตัวแปร float เก็บคาไดจาก 4.4028235 x 1038 ถึง -4.4028235 x 1038 โดยหนึงตั ่ วจะกินพื้นทีหน ่ วยความจํา 32 บิต (4 ไบต) ในการคํานวณคณิตศาสตรกับตัวแปร float จะชากวาการคํานวณของตัวแปร int ดังนันพยายามหลี ้ กเลียง ่ การคํานวณกับตัวแปร float เชน ในคําสั่งวนรอบที่ทํางานดวยความเร็วสูงสุดสําหรับฟงกชั่นทางเวลาที่ตองแมน ยําอยางมาก โปรแกรมเมอรบางคนจะทําการแปลงตัวเลขทศนิยมใหเปนเลขจํานวนเต็มกอนแลวจึงคํานวณเพื่อให ทํางานไดเร็วขึน้ จะเห็นไดวาการคํานวณคณิตศาสตรของเลข floating point จะมีการใชงานมากสําหรับการคํานวณคาขอมูล ที่รับจากภายนอกซึงเป ่ นตัวเลขทศนิยม ซึงทางผู ่ ศึกษาระบบไมโครคอนโทรลเลอรมักจะมองขามไป รูปแบบคําสัง่ float var = val;

พารามิเตอร ่ วแปร float ทีต่ องการ var คือชือของตั ่ องการกําหนดใหกับตัวแปร val คือคาทีต ตัวอยางที่ 4-33 float myfloat; float sensorCalbrate = 1.117;

ตัวอยางที่ 4-34 int x; int y; float z; x = 1; y = x / 2;

// y now contains 0, integers can’t hold fractions

z = (float)x / 2.0;

// z now contains .5 (you have to use 2.0, not 2)


  XT 68

4.8.8 double : ตัวแปรประเภทเลขทศนิยมความละเอียดสองเทา เปนตัวแปรทศนิยมความละเอียดสองเทา มีขนาด 8 ไบต คาสูงสุดทีเก็ ่ บไดคือ 1.7976931348623157 x 10308 ใน Arduino มีหนวยความจําจํากัด จึงไมนิยมใชตัวแปรประเภทนี้

4.8.9 string : ตัวแปรประเภทขอความ ่ จะนิยามเปนอะเรยของตัวแปรประเภท char เปนตัวแปรเก็บขอความ ซึงในภาษาซี ตัวอยางที่ 4-35 ตัวอยางการประกาศตัวแปรสตริง char Str1[15]; char Str2[8] = {‘a’,‘r’,‘d’,‘u’,‘i’,‘n’,‘o’}; char Str3[8] = {‘a’,‘r’,‘d’,‘u’,‘i’,‘n’, ‘o’,’\0'}; char Str4[ ] = “arduino”; char Str5[8] = “arduino”; char Str6[15] = “arduino”;

่ น เปนการประกาศตัวแปรสตริงโดยไมไดกําหนดคาเริมต  Str2 ประกาศตัวแปรสตริงพรอมกําหนดคาใหกับขอความทีละตัวอักษร จากตัวอยาง คอมไพเลอร จะเพิ่ม null character ใหเอง  Str3 ประกาศตัวแปรสตริงพรอมกําหนดคาใหกับขอความทีละตัวอักษร จากตัวอยาง เพิ่มคา null string เอง  Str4 ประกาศตัวแปรสตริงคพรอมกําหนคคาตัวแปรในเครื่องหมายคําพูด จากตัวอยาง ไมไดกําหนด ขนาดตัวแปร คอมไพเลอรจะกําหนดขนาดใหเองตามจํานวนตัวอักษร + 1 สําหรับ null string  Str5 ประกาศตัวแปรสตริงพรอมกําหนคคาตัวแปรในเครื่องหมายคําพูด จากตัวอยาง กําหนดขนาด ตัวแปรเอง  Str6 ประกาศตัวแปรสตริง โดยกําหนดขนาดเผื่อไวสําหรับขอความอื่นที่ยาวมากกวานี้  Str1

4.8.9.1 การเพิมตั ่ วอักษรแจงวาจบขอความ (null termination) ในตัวแปรสตริงของภาษา C กําหนดใหตัวอักษรสุดทายเปนตัวแจงการจบขอความ (null string) ซึงก็ ่ คือ ตัวอักษร \0 ในการกําหนดขนาดของตัวแปร (คาในวงเล็บเหลี่ยม) จะตองกําหนดใหเทากับจํานวนตัวอักษร + 1 ดังในตัวแปร Str2 และ Str3 ในตัวอยางที่ 4-35 ที่ขอความ Arduino มีตัวอักษร 7 ตัว ในการประกาศตัวแปร ตองระบุเปน [8] ในการประกาศตัวแปรสตริง ตองเผือพื ่ นที ้ สํ่ าหรับเก็บตัวอักษรแจงวาจบขอความ มิฉะนันคอมไพเลอร ้ จะแจง เตือนวาเกิดการผิดพลาด ในตัวอยางที่ 4-35 ตัวแปร Str1 และ Str6 เก็บขอความไดสูงสุด 14 ตัวอักษร

4.8.9.2 เครื่องหมายคําพูดขีดเดียวและสองขีด ่ าพูด เชน “Abc” สําหรับตัวแปรตัวอักษร (char) ปกติแลวจะกําหนดคาตัวแปรสตริงภายในเครืองหมายคํ จะกําหนดคาภายในเครืองหมายคํ ่ าพูดขีดเดียว ‘A’


  XT 69

4.8.10 ตัวแปรอะเรย (array) ตัวแปรอะเรยเปนตัวแปรหลายตัว ที่ถูกเก็บรวมอยูในตัวแปรชื่อเดียวกัน โดยอางถึงตัวแปรแตละตัวดวย หมายเลขดัชนีที่เขียนอยูในวงเล็บสี่เหลี่ยม ตัวแปรอะเรยของ Arduino จะอางอิงตามภาษา C ตัวแปรอะเรยอาจจะ ดูซับซอน แตถาใชเพียงตัวแปรอะเรยอยางงายจะตรงไปตรงมา และงายตอการทําความขาใจมากกวา ตัวอยางการประกาศตัวแปรอะเรย int myInts[6]; int myPins[] = {2, 4, 8, 3, 6}; int mySensVals[6] = {2, 4, -8, 3, 2}; char message[6] = “hello”;

เราสามารถประกาศตัวแปรอะเรยไดโดยยังไมกําหนดคาดังตัวแปร myInts ในตัวแปร myPins จะประกาศตัวแปรอะเรยโดยไมระบุขนาด ซึงทํ ่ าไดเมื่อประกาศตัวแปรแลวกําหนด คาทันที เพื่อใหคอมไพเลอรนับวา ตัวแปรมีสมาชิกกีตั่ วและกําหนดคาไดถูกตอง ทายทีสุ่ ดคุณสามารถประกาศตัวแปรและกําหนดขนาดของตัวแปรอะเรยดังตัวแปร mySensVals ในการ ประกาศอะเรยของตัวแปร char จะตองเผื่อที่สําหรับเก็บคาตัวอักษรแจงวาจบขอความดวย

4.8.10.1 การใชงานตัวแปรอะเรย การใชงานตัวแปรอะเรยทําไดโดยการพิมพชื่อตัวแปรพรอมกับระบุคาดัชนีภายในเครื่องหมายวงเล็บสี่ เหลี่ยม คาดัชนีของตัวแปรอะเรยเริ่มตนดวยคา 0 ดังนันค ้ าของตัวแปร mySensVals มีคาดังนี้ mySensVals[0] == 2, mySensVals[1] == 4 , ฯลฯ การกําหนดคาใหกับตัวแปรอะเรย mySensVals[0] = 10;

การเรียกคาสมาชิกของตัวแปรอะเรย x = mySensVals[4];

4.8.10.2 อะเรยและคําสั่งวนรอบ for งานตัวแปรอะเรยภายในคําสั่ง for โดยใชคาตัวแปรนับรอบของคําสัง่ for เปน โดยทัวไปเราจะพบการใช ่ คาดัชนีของตัวแปรอะเรย ดังตัวอยาง การพิมพคาสมาชิกแตละตัวของตัวแปรอะเรยผานพอรตอนุกรม ใหเขียน โปรแกรมดังนี้ int i; for (i = 0; i < 5; i = i + 1) { Serial.println(myPins[i]); }

ตัวอย างโปรแกรมสาธิตการใชงานตัวแปรอะเรยที่สมบูรณ ดูไดในตัวอยาง KnightRider ในหัวขอ Tutorials ในเวบไซต www.arduino.cc


  XT 70

4.9 ขอบเขตของตัวแปร ่ ใน Arduino จะมีคุณสมบัติที่เรียกวา “ขอบเขตของตัวแปร” (scope) ซึงแตกต ่ างจาก ตัวแปรในภาษาซีทีใช ภาษา BASIC ซึงตั ่ วแปรทุกตัวมีสถานะเทาเทียมกันหมดคือ เปนแบบ global

4.9.1 ตัวแปรโลคอลและโกลบอล ่ จัก โดยตองประกาศตัวแป ตัวแปรแบบโกลบอล (global variable) เปนตัวแปรทีทุ่ กฟงกชันในโปรแกรมรู รนอกฟ งกชั่น สําหรับตัวแปรแบบโลคอลหรือตัวแปรทองถิน่ เปนตัวแปรที่ ประกาศตัวแปรอยูภายในเครื่ อง หมายวงเล็บปกกาของฟงกชั่น และรูจักเฉพาะแคภายในฟงกชั่นนั้น เมื่อโปรแกรมเริ่มมีขนาดใหญและซับซอนมากขึน้ การใชตัวแปรโลคอลจะมีประโยชนมาก เนืองจากแน ่ ใจไดวามีแคฟงกชั่นนั้นเทานันที ้ สามารถใช ่ งานตัวแปร ชวยปองกันการเกิดการผิดพลาดเมือฟ ่ งกชั่นทําการแกไข คาตัวแปรที่ใชงานโดยฟงกชั่นอืน่ ตัวอยางที่ 4-36 int gPWMval; void setup(){

// any function will see this variable // ...

} void loop(){ int i; float f; }

// “i” is only “visible” inside of “loop” // “f” is only “visible” inside of “loop”

4.9.2 ตัวแปรสแตติก (static) ่ ตอนประกาศตัวแปรทีมี่ ขอบเขตใชงานแคภายในฟงกชันเท ่ านัน้ โดยตางจาก เปนคําสงวน (keyword) ทีใช ตัวแปรโลคอลตรงทีตั่ วแปรแบบโลคอลจะถูกสรางและลบทิงทุ ้ กครังที ้ เรี่ ยกใชฟงกชัน่ สําหรับตัวแปรสแตติกเมือจบ ่ การทํางานของฟงกชันค ่ าตัวแปรจะยังคงอยู (ไมถูกลบทิง) ้ เปนการรักษาคาตัวแปรไวระหวางการเรียกใชงานฟงกชัน่ ตัวแปรที่ประกาศเปน static จะถูกสรางและกําหนดคาในครั้งแรกที่เรียกใชฟงกชั่น

4.10 คาคงที่ (constants) ่ น กลุมตั  วอักษรหรือขอความทีได ่ กําหนดคาไวลวงหนาแลว ตัวคอมไพเลอรของ Arduino จะรูจั ก คาคงทีเป กับคาคงที่เหลานีแล ้ ว ไมจําเปนตองประกาศหรือกําหนดคาคงที่

4.10.1 HIGH, LOW : ใชกําหนดคาทางตรรกะ ในการอานหรือเขียนคาใหกับขาที่เปนดิจิตอล คาที่เปนไดแคมี 2 คาคือ HIGH หรือ LOW เทานัน้ HIGH เปนการกําหนดคาใหขาดิจิตอลนันมี ้ แรงดันเทากับ +5V ในการอานคา ถาอานได +3V หรือมากกวา ไมโครคอนโทรลเลอรจะอานคาไดเปน HIGH คาคงทีของ ่ HIGH ก็คือ “1” หรือเทียบเปนตรรกะคือ จริง (TRUE) LOW เปนการกําหนดคาใหขาดิจิตอลนันมี ้ แรงดันเทากับ 0V ในการอานคา ถาอานได +2V หรือนอยกวา ไมโครคอนโทรลเลอรจะอานคาไดเปน LOW คาคงที่ของ LOW ก็คือ “0” หรือเทียบเปนตรรกะคือ เท็จ (FALSE)


  XT 71

4.10.2 INPUT, OUTPUT : กําหนดทิศทางของขาพอรตดิจิตอล ขาพอรตดิจิตอลทําหนาทีได ่ 2 อยางคือ เปนอินพุตและเอาตพุต เมื่อกําหนดเปน INPUT หมายถึง กําหนดใหขาพอรตนั้นๆ เปนขาอินพุต เมื่อกําหนดเปน OUTPUT หมายถึง กําหนดใหขาพอรตนั้นๆ เปนขาเอาตพุต

POP-Note การกําหนดคาคงที่เลขจํานวนเต็มเปนเลขฐานตางๆ ของ Arduino คาคงที่เลขจํานวนเต็มก็คือตัวเลขที่คุณเขียนในโปรแกรมของ Arduino โดยตรงเชน 123 โดยปกติแลวตัวเลขเหลานี้ จะเปนเลขฐานสิบ (decimal) ถาตองการกําหนดเปนเลขฐานอืนจะต ่ องใชเครื่องหมายพิเศษระบ ุเชน ฐาน ตัวอยาง 10 (decimal) 123 2 (binary) B1111011 8 (octal) 0173 16 (hexadecimal) 0x7B Decimal ก็คือเลขฐานสิบ ซึ่งเราใชในชีวิตประจําวัน ตัวอยาง 101 == 101 decimal ((1 * 2^2) + (0 * 2^1) + 1) Binary เปนเลขฐานสอง ตัวเลขแตละหลักเปนไดแค 0 หรือ 1 ตัวอยาง B101 == 5 decimal ((1 * 2^2) + (0 * 2^1) + 1) เลขฐานสองจะใชงานไดไมเกิน 8 บิต (ไมเกิน 1 ไบต) มีคาจาก 0 (B0) ถึง 255 (B11111111) ถาตองการปอนเลข ฐานสองขนาด 16 บิต (ตัวแปรประเภท int) จะตองปอนคาสองขั้นตอนดังนี้ myInt = (B11001100 * 256) + B10101010; // B11001100 is the high byte

Octal เปนเลขฐานแปด ตัวเลขแตละหลักมีคาจาก 0 ถึง 7 เทานัน้ ตัวอยาง 0101 == 65 decimal ((1 * 8^2) + (0 * 8^1) + 1) ขอควรระวังในการกําหนดคาคงที่ อยาเผลอใสเลข 0 นําหนา มิฉะนั้นตัวคอมไพเลอรจะแปลความหมายผิดไปวา คาตัวเลขเปนเลขฐาน 8 Hexadecimal (hex) เปนเลขฐานสิบหก ตัวเลขแตละหลักมีคาจาก 0 ถึง 9 และตัวอักษร A คือ 10, B คือ 11 ไปจนถึง F ซึ่งเทากับ 15 ตัวอยาง 0x101 == 257 decimal ((1 * 16^2) + (0 * 16^1) + 1)


  XT 72

4.11 ตัวกระทําอื่นๆ ที่เกี่ยวของกับตัวแปร ่ วแปรชัวคราว ่ 4.11.1 cast : การเปลียนประเภทตั ่ สังให ่ เปลียนประเภทของตั ่ วแปรไปเปนประเภทอืน่ และบังคับใหคํานวณคาตัวแปร cast เปนตัวกระทําทีใช เปนประเภทใหม รูปแบบคําสัง่ (type)variable

เมื่อ

เปนประเภทของตัวแปรใดๆ (เชน int, float, long) Variable เปนตัวแปรหรือคาคงที่ใดๆ ตัวอยางที่ 4-37 Type

int i; float f; f = 4.6; i = (int) f; // now i is 3

่ วแปรจาก float เปน int คาทีได ่ จะถูกตัดเศษออก ดังนั้น (int)4.2 และ (int)4.7 ในการเปลียนประเภทตั มีคาเทากันคือ 3

4.11.2 sizeof : แจงขนาดของตัวแปร ่ นทังตั ้ วแปรปกติและตัวแปรอาเรย ใชแจงบอกจํานวนไบตของตัวแปรที่ตองการทราบคา ซึงเป รูปแบบคําสัง่ เขียนไดทังสองแบบดั ้ งนี้ sizeof(variable) sizeof variable

เมื่อ Variable คือตัวแปรปกติหรือตัวแปรอะเรย (int, float, long) ทีต่ องการทราบขนาด ตัวอยางที่ 4-38 ตัวกระทํา sizeof มีประโยชนอยางมากในการจัดการกับตัวแปรอาเรย (รวมถึงตัวแปรสตริงค) ตัวอยาง ตอไปนีจะพิ ้ มพขอความออกทางพอรตอนุกรมครั้งละหนึงตั ่ วอักษร ใหทดลองเปลี่ยนขอความ char myStr[] = “this is a test”; int i; void setup(){ Serial.begin(9600); } void loop() { for (i = 0; i < sizeof(myStr) - 1; i++){ Serial.print(i, DEC); Serial.print(“ = “); Serial.println(myStr[i], BYTE); }


  XT 73

4.12 คําสงวนของ Arduino ่ กําหนดไวเปนสวนหนึงของภาษา ่ C ของ Arduino หามนํา คําสงวนคือ คาคงที่ ตัวแปร และฟงกชั่นทีได คําเหลานีไปตั ้ งชื ้ ่อตัวแปร สามารถแสดงไดดังนี้ # Constants

# Datatypes

HIGH LOW INPUT OUTPUT SERIAL DISPLAY PI HALF_PI TWO_PI LSBFIRST MSBFIRST CHANGE FALLING RISING false true

boolean byte char class default do double int long private protected public return short signed static switch throw try unsigned void

null # Port Constants DDRB PINB PORTB DDRC PINC PORTC DDRD PIND PORTD

# Other abs acos += + [] asin = atan atan2 & &= | |= boolean byte case ceil char char class ,

// ?: constrain cos {} — default delay delayMicroseconds / /** . else == exp false float float floor for < <= HALF_PI if ++ != int << < <= log && ! || ^ ^= loop max millis min % /* * new null ()

PII return >> ; Serial Setup sin sq sqrt = switch tan this true TWO_PI void while Serial begin read print write println available digitalWrite digitalRead pinMode analogRead analogWrite attachInterrupts detachInterrupts beginSerial serialWrite serialRead serialAvailable printString printInteger printByte printHex printOctal printBinary printNewline pulseIn shiftOut


  XT 74


  XT 75



 XT ชุดหุนยนต  POP-BOT XT ไดรับการออกแบบใหรองรับกับการเรียนรูด านเทคโนโลยีและฝกกระบวนการ คิดผานทางการเขียนโปรแกรมควบคุมดวยภาษา C เปนหลัก ในบทนีเป ้ นการนําเสนอถึงองคประกอบทั้งหมดโดย สรุ ปของสื่อการเรี ยนรูชุดนี้พรอมกับแนะนําตัวอยางการใชงานเครื่องมือสําหรับพัฒนาโปรแกรมและตัวอยาง ของการทดสอบการทํางานทางฮารดแวรในขันต ้ น เพื่อใชเปนแนวทางในการพัฒนาโปรแกรมสําหรับควบคุมสื่อ หุนยนตเพื่อการศึกษาตัวนี้

5.1 องคประกอบหลักทางฮารดแวรที่ใชสรางหุนยนต  POP-BOT XT 5.1.1 แผงวงจรควบคุมหลัก POP-XT เปนแผงวงจรหลักที่ใชในการประมวลผลและควบคุมการทํางานที่ มีจอแสดงผลแบบกราฟก LCD สี สําหรับแสดงผลการทํางานของหุนยนต 5.1.2 ชุดเฟองขับมอเตอรไฟตรง จํานวน 2 ตัว ทําหนาที่เปนอุปกรณขับเคลือนของหุ ่ นยนต 5.1.3 ตัวตรวจจับชนิดตางๆ ทั้งแบบดิจิตอลและอะนาลอก 5.1.4 ชุดโครงสรางหุนยนตและอุปกรณทางกล

5.2 องคประกอบหลักทางซอฟตแวรที่ใชในการพัฒนาโปรแกรมควบคุมหุนยนต ประกอบดวยชุดซอฟตแวรพัฒนาโปรแกรมภาษา C/C++ สําหรับไมโครคอนโทรลเลอร AVR แบบโอเพน ซอรส (open source) ที่สามารถนํามาใชไดโดยไมตองเสียคาใชจาย มีขอมูลโดยสรุปดังนี้ Arduino1.0 เปนซอฟตแวรพัฒนาโปรแรมดวยภาษา C/C++ ในแบบโอเพนซอรสที่ไดรับความนิยมสูง ในชุดซอฟตแวรที่ใชเขียนโปรแกรมมีความสมบูรณพรอม ไมวาจะเปนไลบรารีที่บรรจุฟงกชั่นสําหรับติดตอกับ ฮารดแวรไดหลากหลาย สนับสนุนการพัฒนาโปรแกรมดวยหนาตางการทํางานเพียงหนาตางเดียว ตั้งแตเขียน โปรแกรม คอมไพล จนถึงการดาวนโหลดโปรแกรม (ใน Arduino เรียกวา การอัปโหลดโปรแกรม) ทําใหงายตอ การทําความเขาใจและใชงาน ผูใช Arduino ไมจําเปนตองมีความรูดานฮารดแวรมากนักก็สามารถเขียนโปรแกรม ควบคุมอุปกรณฮารดแวรตางๆ ได นอกจากนียั้ งมีนักพัฒนาจากทั่วโลกรวมพัฒนาไลบรารีไฟลเพิ่มเติม ทําให Arduino มีความสามารถเพิ่มมากขึ้น ขอมูลเพิ่มเติมดูไดที่ www.arduino.cc สําหรับใน POP-BOT XT เลือกใช ซอฟตแวร Arduino1.0 นีในการพั ้ ฒนาโปรแกรม

5.3 ขั้นตอนการพัฒนาโปรแกรมภาษา C เพื่อควบคุมหุนยนต POP-BOT XT ขันตอนการพั ้ ฒนาโปรแกรมสําหรับชุดหุนยนต  POP-BOT XT สามารถสรุปเปนแผนภาพไดดังรูปที่ 5-1


  XT 76

ติดตั้งซอฟตแวร - Arduino1.0 ซอฟตแวรพัฒนาโปรแกรมภาษา C/C++ มีทั้งสวน ของเท็กซเอดิเตอรสําหรับเขียนโปรแกรม, คอมไพเลอร และ ซอฟตแวรสาํ หรับโปรแกรมไมโครคอนโทรลเลอร - ไดรเวอรของแผงวงจร POP-XT ซึง่ เปนหนึ่งในอนุกรมของบอรด Unicon ที่เขากันไดกบั Arduino Leonardo

สรางไฟลสเก็ตช เขียนโปรแกรมภาษา C บน Arduino IDE คอมไพล อัปโหลดโปรแกรม พอรต USB

อัปโหลดโปรแกรมผานพอรต USB 1. ตอสาย USB-miniB เขากับพอรต USB และหุนยนต POP-BOT XT 2. ตรวจสอบตําแหนง USB Serial port (COMx) ที่เกิดขึน้ 3. เลือกฮารดแวรเปน Unicon Board เนื่องจาก แผงวงจร POP-XT ในหุนยนต POP-BOT XT เปนหนึ่งในอนุกรมของแผงวงจร Unicon ซึ่งเขากันไดกับฮารดแวร Arduino Leonardo 4. ทําการโปรแกรม

รันโปรแกรม หลังจากอัปโหลดโปรแกรมเสร็จสมบูรณแลว กดสวิตช RESET บนแผงวงจรควบคุมของหุนยนต POP-BOT XT จากนั้นหุนยนตจะเริ่มทํางานทันที

รูปที่ 5-1 แสดงผังงานของการพัฒนาโปรแกรมเพือควบคุ ่ มหุนยนต  POP-BOT XT ดวยภาษา C โดยใช Arduino1.0


  XT 77

 POP-BOT XT 5.4 ทดสอบการทํางานของแผงวงจรควบคุมของหุนยนต ้ ของ POP-XT อันเปนแผงวงจรควบคุมการทํางานของหุนยนต  POPหลังจากทีติ่ ดตังโปรแกรมและไดรเวอร BOT XT เรียบรอยแลวตังแต ้ บทที่ 3 ในหัวขอนีเป ้ นการทดสอบการทํางานในเบืองต ้ น ดวยการนําโปรแกรมตัวอยาง มาคอมไพลและอัปโหลดโปรแกรมไปยังหุนยนต POP-BOT XT เรียกโปรแกรม Arduino1.0 ขึ้นมาใชงาน โดยคลิกปุม Start > Arduino1.0 > Arduino เมื่อ Arduino ทํางานในครั้งแรกจะมีหนาจอดังรูป


  XT 78

่ กับหุนยนต POP-BOT XT 5.4.1 กําหนดคาทางฮารดแวรเพือใช ในการใชงานโปรแกรม Arduino ครังแรกจะต ้ องกําหนดคาของฮารดแวรทีใช ่ งานรวมดวย ซึงประกอบด ่ วย การเลือกแผงวงจรไมโครคอนโทรลเลอรทีใช ่ และเลือกพอรตอนุกรมของคอมพิวเตอรทีต่ องการเชือมต ่ อ เมือกํ ่ าหนด คาแลว ครังต ้ อไปทีเป ่ ดโปรแกรมจะนําคาทีกํ่ าหนดไวมาใชงานทันที

5.4.1.1 เลือกเบอรของไมโครคอนโทรลเลอร เลือกเมนู Tools  Board  POP-XT หรือ Unicon Board (ใชไดทั้งสองรุน) ดังรูป

5.4.1.2 กําหนดพอรตอนุกรมที่ใชในการติดตอกับโมดูล ่ อง การอัปโหลดโปรแกรมจาก Arduino ไปยังหุนยนต POP-BOT XT จะกระทําผานพอรตอนุกรม ซึงจะต กําหนดหมายเลขพอรตทีใช ่ ดังนี้ เลือกเมนู Tools  Serial Port โปรแกรมจะแสดงพอรตอนุกรมทีมี่ ในคอมพิวเตอร ใหผูใช  เลือนเคอร ่ เซอรของเมาสไปยังพอรตอนุกรมทีต่ องการ ดังรูป

่ ดจากการ พอรตอนุกรมที่ใชกับหุนยนต POP-BOT XT เปนพอรตอนุกรมเสมือน (virtual COM port) ทีเกิ ติดตั้งไดรเวอร ปกติคือพอรต COM ที่มีหมายเลขมากกวา 2 ขึนไป ้ ในตัวอยางเลือกพอรต COM104


  XT 79

5.4.2 ทดลองสรางไฟลสเก็ตชตัวอยาง Arduino จะเรียกโปรแกรมทีเขี ่ ยนขึนว ้ า สเก็ตชบุก (Sketchbook) เริมต ่ นการสรางไฟลสเก็ตชดวยคําสัง่ New (1) คลิกเลือกเมนู File > New จากนั้นพิมพโคดตัวอยางดังตอไปนี้ #include <popxt.h> void setup() { glcd(1,0,"Hello World"); } void loop() { }

//Include POP-XT library

//Show message on GLCD

(2) บันทึกเปนไฟลชื่อ HelloWorld.ino

(3) จากนั้นทําการคอมไพลโปรแกรม เลือกเมนู Sketch  Verify/Compile ดังรูปหรือกดที่ปุม


  XT 80

(4) เมื่อคอมไพลโปรแกรมแลว ที่แถบแสดงสถานะและหนาตางแสดงผลการคอมไพล ซึงเป ่ นหนาตาง สีดําอยูด านลางของโปรแกรม ทีแถบแสดงสถานะจะปรากฏข ่ อความ Done compiling และหนาตางแสดงผลแสดง ขอความวา Binary sketch size: 11006 bytes (of a 30720 byte maximum) ดังรูป แสดงวาโปรแกรมภาษาเครื่องที่ ไดจากการคอมไพลมีขนาด 11,006 ไบต จากขนาดของหนวยความจําแฟลชของไมโครคอนโทรลเลอรทั้งหมดที่ ใชงานได 30,720 ไบต

5.4.3 อัปโหลดโปรแกรมไปยังหุนยนต  POP-BOT XT หลังจากทีคอมไพล ่ โปรแกรมเสร็จสมบูรณแลว ขันตอนต ้ อมาเปนการอัปโหลดโปรแกรมภาษาเครืองไปยั ่ ง หุนยนต POP-BOT XT ในซอฟตแวร Arduino เรียกกระบวนการการสงขอมูลของโปรแกรมภาษา C ทีคอมไพล ่ ่ างจากการพัฒนาโปรแกรมของไมโครคอนโทรลเลอร แลวไปยังหุนยนต  POP-BOTXTวา อัปโหลด (upload) ซึงแตกต อืนๆ ่ ซึงเรี ่ ยกวา การดาวนโหลด (download) มีขันตอนโดยสรุ ้ ปดังนี้  พรอมทํางานประมาณ 10 วินาที จากนั้นตอสาย (1) เปดสวิตชของหุนยนต POP-BOT XT รอใหตัวหุนยนต USB เขากับคอมพิวเตอร ตอกับพอรต USB ของคอมพิวเตอร

สาย USB-miniB

คอมพิวเตอร F 0 2 2 F 0 0 1

0 0 1 AT Mega32U 4

TB6612

หุนยนต POP-BOT XT


  XT 81

(2) อัปโหลดโปรแกรมไปยังหุนยนต POP-BOT XT โดยคลิกที่ปุม

หรือเลือกที่เมนู File > Upload

(3) รอจนการอัปโหลดเสร็จสิน้ โปรแกรมจะเริ่มทํางานทันที หรือกดสวิตช RESET อีกครั้ง โปรแกรม HelloWorld เปนการสงขอความ Hello World ออกไปที่บรรทัด 1 คอลัมน 0 ของจอแสดง ผลกราฟก LCD ของหุนยนต POP-BOT XT

ทั้งหมดนีคื้ อ การเตรียมการและตัวอยางการพัฒนาโปรแกรมภาษา C ดวย Arduino สําหรับหุนยนต POP้ ขันตอนในการพั ้ ฒนา ้ น ในการพัฒนาโปรแกรมควบคุมหุนยนตของกิจกรรมถัดไปนับจากนีจะใช BOT XT ขันต โปรแกรมและอัปโหลดหรือดาวนโหลดโปรแกรมในลักษณะเดียวกัน จะเห็นไดวา การพัฒนาโปรแกรมภาษา C สําหรับไมโครคอนโทรลเลอรหรือหุนยนตอัตโนมัติดวย Arduino มีความสะดวกและสามารถดําเนินการขันตอน ้ ทั้งหมดภายในหนาตางการทํางานหลักเพียงหนาตางเดียว


  XT 82


  XT 83



    XT

้ ฒนาโปรแกรมภาษา C/C++ ดวย Arduino1.0 ไปแลวในบทที่ หลังจากการแนะนําขันตอนแนวทางการพั 5 เพือให ่ การเรียนรูเปนไปอยางตอเนือง ่ ในบทนีจึ้ งนําเสนอคตัวอยางการทดสอบการทํางานในสวนตางๆ ทีสํ่ าคัญ ของแผงวงจร POP-XT อันเปนแผงวงจรควบคุมการทํางานทังหมดของหุ ้ นยนต POP-BOT XT เพื่อเปนแนวทางใน การตอยอดสูการพั  ฒนาโปรแกรมเพื่อควบคุมหุนยนตอยางเต็มรูปแบบตอไป หัวขอกิจกรรมสําหรับทดสอบการทํางานของแผงวงจร POP-XT มีทั้งสิ้น 4 กิจกรรม ประกอบดวย กิจกรรมที่ 1 แสดงผลขอความที่หนาจอภาพกราฟก LCD (มีกิจกรรมยอย 3 กิจกรรม) กิจกรรมที่ 2 ขับเสียงออกลําโพงเปยโซ กิจกรรมที่ 3 อานคาจากปุม KNOB และสวิตช OK บนแผงวงจร POP-XT กิจกรรมที่ 4 ขับอุปกรณเอาตพุตอยางงาย ขันตอนการพั ้ ฒนาโปรแกรมในแตละกิจกรรมจะเหมือนกัน นันคื ่ อ เปดโปรแกรม Arduino1.0 ทําการเขียน โปรแกรม คอมไพล และอัปโหลดลงบนแผงวงจร POP-XT ของหุนยนต POP-BOT XT จากนั้นทดสอบการทํางาน

ทุกครั้งทีเป ่ ดสวิตชจายไฟแกแผงวงจร POP-XT หรือหุนยนต  ่ เวลาประมาณ 10 วินาทีหลัง POP-BOT XT ตองรอใหตัวควบคุมพรอมทํางานเสียกอน ซึงใช ่ POP-XT จะพร จากเปดไฟเลียงหรื ้ อหลังจากการกดสวิตช RESET หากมีการอัปโหลดกอนทีแผงวงจร สิงสํ ่ าคัญทีต่ องเนนยํ้าคือ

อมทํางาน อาจทําใหเกิดความผิดพลาดในการเชื่อมตอ หรือโคดทีอั่ ปโหลดลงไปไมทํางานตามที่ควบจะเปน แต จะไมสงผลจนทําใหแผงวงจรเกิดความเสียหาย สิงที ่ เกิ ่ ดขึนมี ้ เพียงแผงวงจรไมทํางานหรือทํางานไมถูกตองเทานัน้


  XT 84

   (A1.1.1) เปดโปรแกรม Arduino1.0 พิมพโปรแกรมที่ A1-1 แลวบันทึกไฟล (A1.1.2) เปดสวิตชจายไฟแกแผงวงจร POP-XT แลว เชื่อมตอสาย USB เขากับคอมพิวเตอร

ตอกับพอรต USB ของคอมพิวเตอร

สาย USB-miniB

คอมพิวเตอร F 0 2 2 F 0 0 1

0 0 1 AT Mega32U 4

TB6612

หุนยนต POP-BOT XT

(A1.1.3) เลือกชนิดหรือรุนของฮาร  ดแวรใหถูกตอง โดยเลือกทีเมนู ่ Tools > Board > POP-XT หรือ Unicon Board (ใชไดทังสองรุ ้ น) ดังรูป


  XT 85

// ผนวกไลบรารีหลัก #include <popxt.h> void setup() { glcd(1,0,"Hello World"); // แสดงขอความบนจอแสดงผล } void loop() { } คําอธิบายโปรแกรม โปรแกรมนีจะทํ ้ างานโดยสงขอความ Hello World ออกไปแสดงผลทีบรรทั ่ ด 1 คอลัมน 0 ของจอ แสดงผล จะทํางานเพียงครั้งเดียว จึงเขียนโปรแกรมไวทีตํ่ าแหนงของ void setup() เทานัน้

โปรแกรมที่ A1-1 ไฟล HelloWorld.ino สําหรับทดสอบการแสดงผลของแผงวงจร POP-XT  POP-BOT XT โดยเลือกที่เมนู Tools (A1.1.4) เลือกพอรตอนุกรมสําหรับติดตอกับแผงวงจร POP-XT หรือหุนยนต > Serial Port ดังรูป (ตําแหนงของพอรตที่ใชเชื่อมตออาจแตกตางกันในคอมพิวเตอรแตละเครื่อง)

(A1.1.5) คอมไพลและอัปโหลดไปยังแผงวงจร POP-XT โดยคลิกที่ปุม

หรือเลือกที่เมนู File > Upload

ทีหน ่ าจอแสดงผลกราฟก LCD ของแผงวงจร POP-XT แสดงขอความ Hello World Hello

100 F

World

ATMega32U4

220 F

100 TB6612


  XT 86

  จอแสดงผลของแผงวงจร POP-XT มีขนาด 128 x 160 พิกเซล แสดงตัวอักษรความละเอียด 5 x 7 จุด จํานวน 21 ตัวอักษร 16 บรรทัด ผูใชงานสามารถระบุตําแหนงบรรทัดและตําแหนงคอลัมนทีต่ องการแสดงผลได โดยกําหนดผานคําสั่ง glcd ซึงมี ่ อยูในไฟล  ไลบรารี popxt.h นอกจากนันคํ ้ าสั่ง glcd ยังมีอักขระพิเศษเพื่อระบุตําแหนงแทนการใชคาตัวเลข ดังแสดงในโปรแกรมที่ A1-2 (A1.2.1) เปดโปรแกรม Arduino1.0 พิมพโปรแกรมที่ A1-2 แลวบันทึกไฟล #include <popxt.h> int i,j; void setup() { glcdFillScreen(GLCD_WHITE); setTextColor(GLCD_BLACK); setTextBackgroundColor(GLCD_WHITE); for (i=0;i<16;i++) {glcd(i,0," Row %d ",i); } } void loop() {}

// ผนวกไฟลไลบรารี่หลัก

// กําหนดใหสีของพืนหลั ้ งของจอแสดงผลเปนสีขาว // กําหนดสีตัวอักษรเปนสีดํา // กําหนดสีพืนหลั ้ งของตัวอักษรเปนสีขาว // วนลูป 16 รอบเพือแสดงข ่ อความ // แสดงขอความที่จอแสดงผล

คําอธิบายโปรแกรม ในโปรแกรมนีเพิ ้ ่มเติมคําสังสํ ่ าหรับการใชงานจอแสดงผลอีก 3 คําสังคื ่ อ 1. glcdFillScreen เปนคําสังกํ ่ าหนดสีพื้นหลังของจอแสดงผล 2. setTextColor สําหรับกําหนดสีใหแกตัวอักษร 3. setTextBackground สําหรับกําหนดสีพื้นหลังของตัวอักษร เมื่อตังค ้ าของจอแสดงผลแลว จึงทําการสงขอความ Row ตามดวยหมายเลขบรรทัดซึงมาจากการ ่ เพิมค ่ าของตัวแปร i และมีการเลือนตํ ่ าแหนงตามคาของ i ดวย ดังนันที ้ บรรทั ่ ดแรก ขอความ Row0 ถูกแสดง ทีคอลั ่ มน 0 ทีบรรทั ่ ด 2 แสดงขอความ Row 1 ทีคอลั ่ มน 1 ไลไปตามลําดับจนถึงบรรทัด 15 (บรรทัดที่ 16) จะแสดงเปน Row 15 ที่คอลัมน 15

โปรแกรมที่ A1-2 ไฟล MultipleTextline.ino สําหรับทดสอบการแสดงผลของแผงวงจร POP-XT


  XT 87

(A1.2.2) เปดสวิตชจายไฟแกแผงวงจร POP-XT แลว เชื่อมตอสาย USB เขากับคอมพิวเตอร (A1.2.3) คอมไพลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT โดยคลิกทีปุ่ ม

่ File > Upload หรือเลือกทีเมนู

ทีหน ่ าจอแสดงผลกราฟก LCD ของแผงวงจร POP-XT แสดงขอความ Row 0 ถึง Row 15 เรียงไปบรรทัด ละขอความ 100 F

ATMega32U4

Row00 Row01 RRRow02 RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07 RRRRRRRRRow08 RRRRRRRRRRow09 RRRRRRRRRRRow010 RRRRRRRRRRRRow011 RRRRRRRRRRRRRow012 RRRRRRRRRRRRRRow013 RRRRRRRRRRRRRRRow014 RRRRRRRRRRRRRRRRow015

100

220 F

TB6612


  XT 88

    ่ POP-XT เมื่อเริมต ่ นทํางานเปนขนาดเล็กสุด ใช ขนาดตัวอักษรปกติทีแสดงบนจอแสดงผลของแผงวงจร จํานวนจุดตอตัวอักษรคือ 6 x 10 จุด (อักษรจริงมีขนาด 5 x 7 จุด) ถาตองการปรับขนาดตัวอักษรใหใหญขึ้น จะมีคําสั่ง setTextSize ไวสําหรับปรับขนาด โดยคาทีกํ่ าหนดจะเปนจํานวนเทาของตัวอักษรปกติ เชน setTextSize(2) หมายถึงขนาดตัวอักษรใหญขึ้นเปน 2 เทา ใช 12 x 20 พิกเซลตอ 1 ตัวอักษร setTextSize(3) หมายถึงขนาดตัวอักษรใหญขึ้นเปน 3 เทา ใช 18 x 30 พิกเซลตอ 1 ตัวอักษร เมื่อปรับขนาดตัวอักษรมีขนาดใหญขึ้น จํานวนตัวอักษรตอบรรทัดก็ตองลดลง จากเดิม 21 ตัวอักษร 16 บรรทัด เมื่อขนาดของตัวอักษรเพิ่มขึ้นเปนสองเทา ก็จะทําใหแสดงได 10 ตัวอักษร 8 บรรทัดแทน ดังนั้นเมื่อเขียน โปรแกรมจะตองคํานึงถึงคาเหลานีด้ วย นอกจากขนาดตัวอักษรแลว ยังกําหนดทิศทางการแสดงผลของจองแสดงผลได โดยใชคําสัง่ glcdMode() โดยมีคาตั้งตนคือ โหมด 0 (glcdMode(0) นันคื ่ อ แสดงผลในแนวตั้ง สําหรับอีก 3 โหมดคือ โหมด 1, 2 และ 3 ใชปรับใหการแสดงผลหมถนไปโหมดละ 90 องศา นันคื ่ อ โหมด 1 หมุนไป 90 องศา, โหมด 2 หมุนไป 180 องศา และโหมด 3 หมุนไป 270 องศา (A1.3.1) เปดโปรแกรม Arduino1.0 พิมพโปรแกรมที่ A1-3 แลวบันทึกไฟล #include <popxt.h> int x,m; void setup() { setTextColor(GLCD_RED); } void loop() { for (x=1;x<6;x++) { setTextSize(x); for(m=0;m<4;m++) { glcdClear(); glcdMode(m); glcd(0,0,”%dX”,x); glcd(1,0,”M=%d”,m); sleep(500); } } }

// กําหนดสีตัวอักษรเปนสีแดง

// กําหนดขนาดตัวอักษร // เคลียรหนาจอ // กําหนดทิศทาง // แสดงขนาดตัวอักษร // แสดงโหมดทิศทาง

โปรแกรมที่ A1-3 ไฟล SetText_FlipDisplay.ino สําหรับทดสอบการเพิมขนาดตั ่ วอักษรในการแสดงผล และการเปลียนทิ ่ ศทางของการแสดงผลของแผงวงจร POP-XT


  XT 89

(A1.3.2) เปดสวิตชจายไฟแกแผงวงจร POP-XT แลว เชื่อมตอสาย USB เขากับคอมพิวเตอร (A1.3.3) คอมไพลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT โดยคลิกทีปุ่ ม

่ File > Upload หรือเลือกทีเมนู

ทีหน ่ าจอแสดงผลกราฟก LCD ของแผงวงจร POP-XT แสดงขอความแจงขนาดของตัวอักษรและโหมด ของการแสดงผลในทิศทางทีต่ างกัน เริมจากมุ ่ มบนซาย, มุมบนขวา, มุมลางขวา และมุมลางซาย โดยรอบการ แสดงผลจะเริ่มจากขนาด 1X, 2X, 3X , 4X และ 5X แตละรอบจะมีการแสดงผล 4 ทิศทาง โดยดูจากคา M M = 0 จอแสดงขอความแนวตั้ง ตัวอักษรขนาด 3 เทา

M = 1 หมุนการแสดงผลไป 90 องศาทางขวา ตัวอักษรขนาด 4 เทา

M = 2 หมุนการการแสดงผลไป 180 องศา จะไดภาพทีกลั ่ บหัวเมื่อเทียบกับ M = 0 ตัวอักษรขนาด 4 เทา

M = 3 หมุนการแสดงผลไป 270 องศา ตัวอักษรขนาด 5 เทา


  XT 90

   ่ กในการติดตอกับจอแสดงผลกราฟก LCD นอกจากมีคําสั่งแสดงขอความ ฟงกชัน่ glcd เปนฟงกชันหลั แลว ยังมีคําสั่งในการวาดลายเสนกราฟกอีกหลายคําสั่ง ประกอบดวย glcdRect(int x1,int y1,int width,int height,uint color) เปนคําสั่งสรางรูปสี่ เหลี่ยม ่ าง glcdFillRect(int x1,int y1,int width,int height,uint color) เปนคําสังสร พื้นสี่เหลี่ยม glcdLine(int x1, int y1, int x2, int y2,uint color) เปนคําสั่งลากเสน glcdCircle(int x, int y, int radius,uint color) เปนคําสั่งวาดเสนวงกลม ่ างพืนที ้ วงกลม ่ glcdFillCircle(int x, int y, int radius,uint color) เปนคําสังสร glcdClear(uint color) เปนการเคลียรหนาจอแสดงผล โดยทดสอบเขียนโปรแกรมไดดังโปรแกรมที่ A1-4 แลวอัปโหลดเพือทดสอบการทํ ่ างานไปยังแผงวงจร POPXT จะไดผลดังรูป


  XT 91

#include <popxt.h> int i,j; void setup() {} void loop() { glcdClear; sleep(300); for (i=0;i<160;i+=4) { glcdLine(0,0,128,i,GLCD_WHITE); } for (i=0;i<128;i+=4) { glcdLine(0,0,i,160,GLCD_RED); } sleep(2000); glcdRect(32,40,64,80,GLCD_BLUE); sleep(300); glcdFillCircle(32,40,31,GLCD_GREEN); glcdFillCircle(96,40,31,GLCD_YELLOW); glcdFillCircle(32,120,31,GLCD_MAGENTA); glcdFillCircle(96,120,31,GLCD_SKY); sleep(1000); glcdCircle(64,40,31,GLCD_GREEN); glcdCircle(32,80,31,GLCD_BLUE); glcdCircle(64,120,31,GLCD_YELLOW); glcdCircle(96,80,31,GLCD_SKY); sleep(1000); glcdFillRect(0,0,128,160,GLCD_YELLOW); sleep(1000); }

// ผนวกไฟลไลบรารีหลัก

// เคลียรหนาจอและพืนหลั ้ งเปนสีดํา

// วาดเสนสีขาวจากพิกัด 0,0 ไปยังจุดที่กําหนด

// วาดเสนสีแดงจากพิกัด 0,0 ไปยังจุดที่กําหนด // วาดเสนกรอบสี่เหลี่ยมสีนํ้าเงิน // สรางวงกลมพื้นสีเขียว // สรางวงกลมพื้นสีเหลือง // สรางวงกลมพื้นสีบานเย็น // สรางวงกลมพื้นสีฟา // วาดเสนรอบวงกลมสีเขียว // วาดเสนรอบวงกลมสีนํ้าเงิน // วาดเสนรอบวงกลมสีเหลือง // วาดเสนรอบวงกลมเสนสีฟา // สรางรูปสีเหลี ่ ่ยมสีเหลือง

โปรแกรมที่ A1-4 ไฟล Simplegraphic.ino สําหรับทดสอบการแสดงผลของแผงวงจร POP-XT


  XT 92

   นอกจากวงกลมและสี่เหลี่ยมแลว เสนโคงก็เปนสวนประกอบสําคัญในการสรางภาพกราฟก ในชุดคําสั่ง เกียวกั ่ บการแสดงผลจอภาพแบบกราฟกสีของแผงวงจร POP-XT ยังมีคําสั่ง glcdArc() สําหรับสรางเสนโคง โดย มีพารามิเตอรหรือตัวแปรทีต่ องกําหนดอยูพอสมควร  ดูรายละเอียดเพิมเติ ่ มในบทที่ 7 เกียวกั ่ บไฟลไลบรารี popxt.h ซึ่งบรรจุคําสั่งพิเศษเหลานีไว ้ (A1.5.1) เปดโปรแกรม Arduino1.0 พิมพโปรแกรมที่ A1-5 แลวบันทึกไฟล (A1.5.2) เปดสวิตชจายไฟแกแผงวงจร POP-XT แลว เชื่อมตอสาย USB เขากับคอมพิวเตอร (A1.5.3) คอมไพลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT โดยคลิกทีปุ่ ม

่ File > Upload หรือเลือกทีเมนู

#include <popxt.h> int i; // ฟงกชันสร ่ างรูปหนายิ้ม void face() { glcdFillCircle(64,70,50,GLCD_WHITE); glcdArc(48,60,16,30,150,GLCD_RED); glcdCircle(48,55,5,GLCD_BLUE); glcdCircle(80,55,5,GLCD_BLUE); glcdArc(80,60,16,30,150,GLCD_RED); glcdFillCircle(64,70,7,GLCD_YELLOW); glcdArc(64,80,30,220,320,GLCD_RED); glcdArc(64,80,29,220,320,GLCD_RED); } void setup() {} void loop() { for(i=0;i<4;i++) { glcdClear(); glcdMode(i); // สังหมุ ่ นการแสดงผล face(); sleep(1000); } }

โปรแกรมที่ A1-5 ไฟล SmileFace_ArcTest.ino สําหรับทดสอบการวาดเสนโคงของแผงวงจร POP-XT


  XT 93

(A1.5.4) รันโปรแกรม ดูผลการทํางานที่จอแสดงผลของแผงวงจร POP-XT ทีจอแสดงผลแสดงเป ่ นรูปการตูนหนายิมนาน ้ 1 วินาที แลวหมุนไปครั้งละ 90 องศา แลววนกลับมาที่ หนาเริมต ่ น จะวนแสดงผลไปตลอดเวลา


  XT 94

  บนแผงวงจร POP-XT มีสวนขับเสียงโดยใชลําโพงเปยโซ โดยตัวลําโพงเปยโซขนาดเล็กนีตอบสนองความ ้ ถีเสี ่ ยงในชวงความถี่ประมาณ 300 ถึง 3,000Hz สําหรับไฟลไลบรารี popxt.h มีคําสั่งสําหรับขับเสียงออกลําโพง เปยโซ 2 คําสั่งคือ beep() และ sound()

ในโปรแกรมที่ A2-1 เปนตัวอยางการใชคําสั่ง beep() เพื่อขับเสียง “ติ้ด” ความถี่เดียวออกทางลําโพงทุกๆ 1 วินาที สวนในโปรแกรมที่ A2-2 เปนตัวอยางการใชคําสั่ง sound() เพื่อขับเสียงที่มีความถี่ตามที่กําหนดออกทาง ลําโพงเปยโซ ตามเวลาที่กําหนดในโปรแกรม การทดสอบโปรแกรมทั้ งสองให ดําเนินการเหมือนกับในกิจกรรมที่ผานมา นั่นคือ เปดโปรแกรม Arduino1.0 แลวสรางไฟลสเก็ตชขึนใหม ้ จากนันพิ ้ มพโปรแกรมที่ A2-1 หรือ A2-2 ตามตองการ แลวบันทึกไฟล จากนันทํ ้ าการคอมไพลและอัปโหลดไปยังแผงวงจร POP-XT ตองไมลืมวา หลังจากเปดสวิตชจายไฟใหม หรือกดสวิตช RESET ตองรอประมาณ 10 วินาทีเพื่อใหแผง วงจร POP-XT พรอมทํางานกอนทําการอัปโหลดโปรแกรมใหม #include <popxt.h> void setup() {} void loop() { beep(); sleep(1000); }

// ผนวกไฟลไลบรารี่หลัก

// ขับเสียง “ติ้ด” ออกลําโพง

โปรแกรมที่ A2-1 ไฟล BeepTest.ino สําหรับทดสอบการขับเสียงออกลําโพงของแผงวงจร POP-XT


  XT 95

#include <popxt.h> void setup() {} void loop() { sound(500,500); sound(2500,500); }

// ผนวกไฟลไลบรารี่หลัก

// ขับเสียงทีมี่ ความถี่ 500Hz นาน 0.5 วินาที // ขับเสียงทีมี่ ความถี่ 2500Hz นาน 0.5 วินาที

โปรแกรมที่ A2-2 ไฟล SoundTest.ino สําหรับทดสอบการขับเสียงออกลําโพงของแผงวงจร POP-XT แบบกําหนดความถีและเวลาได ่


  XT 96

    ้ า มีเมนู มีสวิตชในการสั่งงานตางๆ บนแผงวงจร POP-XT ในระบบควบคุมพื้นฐานจะตองมีการปรับตังค ก็มีสวนติดตตอกับผูใชงานดวยเชนกัน ประกอบดวยปุม KNOB สําหรับปรับเลือกรายการ และสวิตช OK สําหรับ ยืนยันการเขาสูรายการทางเลือกนั้นๆ 100 F

ATMega32U4

220 F

100 TB6612

เขียนโปรแกรมที่ A3-1 แลวบันทึกไฟลชื่อ KnobSwitchTest.ino จากนั้นทําการคอมไพลและอัปโหลดไป ยังแผงวงจร POP-XT แลวรันโปรแกรมทดสอบการทํางาน เมื่อโปรแกรมเริ่มทํางาน ที่หนาจอแสดงผลของแผงวงจร POP-XT แสดงขอความ Press OK (ขนาดตัวอักษรใหญเปนขนาด 2x) ใหทําการกดสวิตช OK เพื่อเริ่มการทํางาน จะไดยินเสียง “ติ้ด” 1 ครั้ง จากนั้นจอแสดงผลจะแสดงขอความ Knob value (ขนาดตัวอักษรใหญเปนขนาด 2x)

XXXX (ขนาดตัวอักษรใหญขึ้นเปนขนาด 3x) โดยที่ xxxx มีคาไดตังแต ้ 80 ถึง 1023 ทดลองปรับปุม KNOB บนแผงวงจร POP-XT คาของ Knob ที่จอแสดงผลจะตองเปลี่ยนแปลงตามการปรับที่ปุม KNOB จากนั้นทําการกดสวิตช OK จะไดยินเสียงของความถี่ 500Hz ดังนาน 0.5 วินาที และแผงวงจร POP-XT จะขับเสียงความถี่นีทุ้ ก ครั้งที่มีการกดสวิตช OK


  XT 97

#include <popxt.h> void setup() { glcdClear; setTextSize(2); glcd(1,1,"Press OK"); sw_ok_press(); beep(); glcdClear; } void loop() { if (sw_ok()) { sound(500,500); } glcd(1,0,"Knob value"); setTextSize(3); glcd(2,2,"%d ",knob()); setTextSize(2); }

// ผนวกไฟลไลบรารีหลัก // เคลียรหนาจอแสดงผล กําหนดพื้นหลังเปนสีดํา // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ // แสดงขอความออกหนาจอแสดงผล // วนรอจนกระทังกดสวิ ่ ตช OK // ขับเสียง “ติ้ด” ออกลําโพง // เคลียรหนาจอแสดงผล กําหนดพื้นหลังเปนสีดํา // ตรวจสอบการกดสวิตช OK // หากมีการกดสวิตช ขับเสียงความถี่ 500 Hz นาน 0.5 วินาที // แสดงขอความที่จอแสดงผล // เลือกขนาดตัวอักษรใหญเปน 3 เทาจากขนาดปกติ // แสดงคาที่อานไดจากการปรับปุม KNOB ทีหน ่ าจอแสดงผล // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ

โปรแกรมที่ A3-1 ไฟล KnobSwitchTest.ino สําหรับทดสอบอานคาจากปุม KNOB และสวิตช OK


  XT 98

  ในไฟลไลบรารี popxt.h มีคําสั่ง out(int num,int _dat) ซึงช ่ วยใหสามารถสงลอจิก “0” หรือ “1” ออกไปยังขาพอรต ที่ตองการได ทําใหนําแผงวงจร POP-XT และหุนยนต POP-BOT XT ไปใชขับอุปกรณเอาตพุต พื้นฐานไดงายขึน้ ยกตัวอยางงายที่สุดคือ ไดโอดเปลงแสงหรือ LED ในกิจกรรมนีจึ้ งนําแผงวงจร ZX-LED อันเปนแผงวงจร LED แสดงผลแบบเดี่ยวที่จะติดสวางเมื่อไดรับ ลอจิก “1” และดับลงเมื่อไดรับลอจิก “0” มาตอกับแผงวงจร POP-XT เพื่อทดลองใชงาน (A4.1) นํา ZX-LED ชุดที่ 1 ตอเขากับจุดตอพอรต 6 /A7 และชุดที่ 2 ตอกับจุดตอพอรต 4/A6

แผงวงจร ZX-LED

(A4.2) เขียนโปรแกรมที่ A4-1 บันทึกไฟลชื่อ LEDTest.ino (A4.3) เปดสวิตชจายไฟแกแผงวงจร POP-XT รอประมาณ 10 วินาที เพื่อใหแผงวงจรพรอมทํางาน จากนั้นตอสาย USB เขากับคอมพิวเตอร (A4.4) คอมไลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT บนหุนยนต POP-BOT XT (A4.5) รันโปรแกรม สังเกตการทํางานของ ZX-LED เมื่อรันโปรแกรม ที่หนาจอแสดงผลของแผงวงจร POP-XT แสดงขอความ Press OK

ใหกดสวิตช OK เพื่อเริ่มการทํางาน จะเห็น LED บนแผงวงจร ZX-LED ทั้งสองชุดติดและดับสลับกันไป อยางตอเนือง ่


  XT 99

#include <popxt.h> void setup() { setTextSize(2); glcd(1,1,"Press OK"); sw_ok_press(); } void loop() { out(4,1); out(6,0); sleep(400); out(4,0); out(6,1); sleep(400); }

// ผนวกไฟลไลบรารี่หลัก // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ // แสดงขอความออกหนาจอ GLCD // วนรอการกดสวิตช OK

// ทําให LED ที่ตออยูกับพอรต 4 (Di 4) ติดสวาง // ทําให LED ทีต่ ออยูกับพอรต 6 (Di 6) ดับ // ทําให LED ที่ตออยูกับพอรต 4 (Di 4) ดับ // ทําให LED ทีต่ ออยูกับพอรต 6 (Di 6) ติดสวาง

โปรแกรมที่ A4-1 ไฟล LEDTest.ino สําหรับทดสอบการขับอุปกรณเอาตพุตอยางงาย



  XT 101



 XT การพัฒนาโปรแกรมภาษา C/C++ ดวย Arduino สําหรับหุ นยนต POP-BOT XT ดําเนินการภายใตการ สนับสนุนของไฟลไลบรารี popxt.h ทั้งนีเพื ้ ่ อชวยลดขั้นตอนและความซับซอนในการเขียนโปรแกรมควบคุม สวนตางๆ ของฮารดแวรลง เนืองจากต ่ องการใหความสําคัญของการพัฒนาโปรแกรมควบคุมหุนยนต POP-BOT XT ไปอยูที่การเขียนโปรแกรมสําหรับรองรับการเรียนรูและกิจกรรมการแขงขัน โครงสรางของไฟลไลบรารี popxt.h แสดงดังรูป

                                                               


  XT 102

7.1 ไลบรารียอยภายในไฟลไลบรารี popxt.h บรรจุฟงกชั่นและคําสั่งสําหรับแสดงผลขอความ, ตัวเลข และสรางภาพกราฟกสีที่จอแสดงผล แบบกราฟก LCD สีของ POP-BOT XT (ยังไมรองรับการทํางานกับไฟลรูปภาพ)  sleep บรรจุฟงกชั่นและคําสั่งสําหรับการหนวงเวลา  in_out บรรจุ ฟ งกชั่ นและคําสั่งสําหรับอานคาอินพุตดิจิตอลและสงคาออกทางขาพอร ตเอาตพุต ดิจิตอล  analog บรรจุฟงกชั่นและคําสั่งสําหรับอานคาจากอินพุตอะนาลอกทีต ่ อกับตัวตรวจจับ  sound บรรจุฟงกชั่นและคําสั่งสําหรับสรางเสียงเพื่อขับออกลําโพง  motor บรรจุฟงกชั่นและคําสั่งสําหรับขับมอเตอรไฟตรง  servo บรรจุฟงกชั่นและคําสั่งสําหรับขับเซอรโวมอเตอร  serial บรรจุฟงกชั่นและคําสังสํ ่ าหรับสื่อสารขอมูลอนุกรมผานทางพอรต USB และผานทางขา พอรต TxD และ RxD ของแผงวงจร POP-XT ในการเรียกใชงานชุดคําสังย ่ อยตางๆ เพือการพั ่ ฒนาโปรแกรมควบคุมหุนยนต POP-BOT XT ผูพั ฒนาตอง ผนวกไฟลไลบรารีหลัก popbot.h ไวในตอนตนของโปรแกรมดวยคําสั่ง  glcd

#include <popxt.h>

ใหตัวแปลภาษาหรือคอมไพเลอรรูจักชุดคําสังย ่ อยตางๆ ที่กําลังจะถูกเรียกใชงานจากไฟล เพือประกาศให ่ ไลบรารี popxt.h


  XT 103

่ กในไฟลไลบรารี popxt.h 7.2 รายละเอียดของฟงกชั่นหรือคําสังหลั 7.2.1 ฟงกชันเกี ่ ่ยวกับการแสดงผลจอภาพแบบกราฟก LCD สี 7.2.1.1 glcd เปนฟงกชันแสดงข ่ อความทีหน ่ าจอแสดงผลกราฟก LCD สี โดยแสดงตัวอักษรขนาดปกติได 21 ตัวอักษร 16 บรรทัด รูปแบบ

void glcd(unsigned char x, unsigned char y ,char *p,...) พารามิเตอร x คือตําแหนงบรรทัดมีคาตั้งแต 0 ถึง 15 y คือตําแหนงตัวอักษรมีคาตั้งแต 0 ถึง 20 *p คือขอความที่ตองการนํามาแสดงรวมถึงรหัสทีใช ่ กําหนดรูปแบบพิเศษเพือร ่ วมแสดงผลขอมูลตัวเลขใน รูปแบบอืนๆ ่ ประกอบดวย %c หรือ %C - รับคาแสดงผลตัวอักษร 1 ตัวอักษร %d หรือ %D - รับคาแสดงผลตัวเลขจํานวนเต็มในชวง -32,768 ถึง 32,767 %l หรือ %L - รับคาแสดงผลตัวเลขจํานวนเต็มในชวง -2,147,483,648 ถึง 2,147,483,647 %f หรือ %F - รับคาเพือแสดงผลตั ่ วเลขจํานวนจริง (แสดงทศนิยม 3 หลัก) ตัวอยางที่ 7-1 glcd(2,0,“Hello World“); // แสดงขอความ Hello World ทีตํ่ าแหนงซายสุดของบรรทัด 2 (บรรทัดที่ 3) 100 F HelloRWorld RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07

ตัวอยางที่ 7-2 int x=20; glcd(1,2,”Value = %d”,x);

Row00 RRValueR=R20 RRRow02 RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07

// แสดงตัวอักษรและตัวเลขบนบรรทัดเดียวกัน // เริ่มตนที่คอลัมน 2 ของบรรทัด 1 (บรรทัดที่ 2) 100 F


  XT 104

7.2.1.2 colorRGB เปนฟงกชั่นเปลียนค ่ าสีในรูปแบบ RGB (แดง เขียว นําเงิ ้ น) ใหอยูในรูปของตัวเลข 16 บิต โดยแบงเปน คาของสีแดง 5 บิต ตอดวยสีเขียว 6 บิต และปดทายดวยคาของสีนําเงิ ้ น 5 บิต รูปแบบ

unsigned int colorRGB(uint red,uint green,uint blue) พารามิเตอร red - เปนคาของสีแดง มีคาระหวาง 0 ถึง 31 ถาคาที่ปอนมากกวา 31 จะปรับลดใหเทากับ 31 green - คาของสีเขียว มีคาระหวาง 0 ถึง 63 ถาคาที่ปอนมากกวา 63 จะถูกปรับลดใหเทากับ 63 blue - คาของสีนํ้าเงิน มีคาระหวาง0 ถึง 31 ถาคาที่ปอนมากกวา 31 จะปรับลดใหเทากับ 31 ตัวอยางที่ 7-3 #include <popxt.h> int colors; void setup() { int colors; colors=colorRGB(31,0,0); // สงคาสี 16 บิตของสีแดงใหตัวแปร colors glcdFillScreen(colors); // นําคาไปแสดงเปนสีพืนของจอแสดงผล ้ } void loop() {}

100 F

ATMega32U4

Row00 RRValueR=R20 RRRow02 RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07 RRRRRRRRRow08 RRRRRRRRRRow09 RRRRRRRRRRRow010 RRRRRRRRRRRRow011 RRRRRRRRRRRRRow012 RRRRRRRRRRRRRRow013 RRRRRRRRRRRRRRRow014 RRRRRRRRRRRRRRRRow015

100

220 F

TB6612


  XT 105

7.2.1.3 color[ ] เปนตัวแปรอะเรยที่ใชกําหนดสีจํานวน 8 สีที่เปนสีพื้นฐาน ผูพัฒนาโปรแกรมสามารถเรียกใชตัวแปร color[] หรือเรียกใชชื่อสีตรงๆ ก็ได รูปแบบ

unsigned int color[]= { GLCD_RED, GLCD_GREEN, GLCD_BLUE, GLCD_YELLOW, GLCD_BLACK, GLCD_WHITE, GLCD_SKY, GLCD_MAGENTA}; พารามิเตอร GLCD_RED - ใชกําหนดสีแดง GLCD_GREEN - ใชกําหนดสีเขียว GLCD_BLUE - ใชกําหนดสีนํ้าเงิน GLCD_YELLOW - ใชกําหนดสีเหลือง GLCD_BLACK - ใชกําหนดสีดํา GLCD_WHITE - ใชกําหนดสีขาว GLCD_SKY - ใชกําหนดสีฟา GLCD_MAGENTA - ใชกําหนดสีบานเย็น ตัวอยาง 7-4 glcdFillScreen(color[5]) // กําหนดใหพืนหลั ้ งเปนสีขาว ตัวอยาง 7-5 ้ งเปนสีนํ้าเงิน glcdFillScreen(GLCD_BLUE) // กําหนดใหพืนหลั


  XT 106

7.2.1.4 setTextColor เปนการกําหนดคาสีของตัวอักษรที่แสดงดวยฟงกชั่น glcd() โดยคาตังต ้ นกําหนดเปนสีขาว รูปแบบ

void setTextColor(unsigned int newColor) พารามิเตอร newColor คือสีทีต่ องการ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรทีกํ่ าหนดคาไวแลวจากตัวแปร color[] ตัวอยางที่ 7-6 // กําหนดใหสีของตัวอักษรเปนสีเหลือง setTextColor(GLCD_YELLOW);

7.2.1.5 setTextBackgroundColor เปนฟงกชันกํ ่ าหนดสีของพืนหลั ้ งตัวอักษร โดยคาตังต ้ นเปนสีดํา สีของพื้นหลังตัวอักษรจะเปนคนละสวน กับสีของพื้นจอภาพ (screen background) ซึงต ่ องกําหนดคาผานฟงกชั่น glcdFillScreen รูปแบบ

void setTextBackgroundColor(unsigned int newColor) พารามิเตอร newColor คือสีทีต่ องการ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรทีกํ่ าหนดคาไวแลวจากตัวแปร color[] ตัวอยางที่ 7-7 ้ งตัวอักษรเปนสีเขียว setTextBackgroundColor(GLCD_GREEN); // กําหนดใหสีพืนหลั

100 F

ATMega32U4

Hello World RRValueR=R20 RRRow02 RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRR Row07 RRRRRRRRRow08 RRRRRRRRR Row09 RRRRRRRRRR Row010 RRRRRRRRRRR Row011 RRRRRRRRRRRR Row012 RRRRRRRRRRRRR Row013 RRRRRRRRRRRRRR Row014 RRRRRRRRRRRRRRR Row015

100

220 F

TB6612


  XT 107

7.2.1.6 glcdClear เปนการเคลียรหนาจอแสดงผล โดยสีของพืนหลั ้ งจะเปนสีพืนหลั ้ งของตัวอักษรลาสุด โดยถาไมไดกําหนด ดวยคําสั่ง setTextBackGroundColor() มากอนหนานีหลั ้ งจากทําคําสั่ง glcdClear() แลวพื้นหลังจะเปนสีดํา รูปแบบ

void glcdClear() ตัวอยางที่ 7-8 glcdClear();

// เคลียรหนาจอแสดงผล

7.2.1.7 glcdFillScreen ่ พื้นหลังของจอแสดงผลดวยสีที่ระบุ เปนการเคลียรหนาจอแสดงผล แลวเปลียนสี รูปแบบ

void glcdFillScreen(unsigned int color) พารามิเตอร color คือสีทีต่ องการ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรทีกํ่ าหนดคาไวแลวจากตัวแปร color[] ตัวอยางที่ 7-9 glcdFillScreen(GLCD_BLUE); // กําหนดสีพืนหลั ้ งของจอภาพเปนสีนํ้าเงิน


  XT 108

7.2.1.8 glcdMode เป นการกําหนดทิศทางแสดงผลใหขอความหรือภาพหนาจอหมุนจอภาพใหแสดงภาพตังฉากตรงหน ้ า (โหมด 0), หมุนขวา 90 ศา (โหมด 1), หมุน 180 องศาหรือกลับหัว (โหมด 2) และหมุน 270 องศา (โหมด 3) รูปแบบ

glcdMode(unsigned int modeset) พารามิเตอร modeset คือคาทิศทางของการหมุนมีคา 0 ถึง 3 โดยใชแทนทิศทาง 0 องศา 90 องศา 180 องศา หรือ 270 องศา โดยเมื่อเริมต ่ นคาทิศทางคือ 0 องศา ทํางานอยูในแนวตั้ง

ตัวอยางที่ 7-10 #include <popxt.h> void setup() { setTextSize(2); } void loop() { glcdClear(); glcdMode(0); glcd(0,0,”POP-BOTXT”); sw_ok_press(); glcdClear(); glcdMode(1); glcd(0,0,”POP-BOTXT”); sw_ok_press(); glcdClear(); glcdMode(2); glcd(0,0,”POP-BOTXT”); sw_ok_press(); glcdClear(); glcdMode(3); glcd(0,0,”POP-BOTXT”); sw_ok_press(); }

// ขนาดตัวอักษร 2 เทา // เคลียรหนาจอ // โหมด 0 องศา // แสดงขอความ // รอกดสวิตชเขาโหมดตอไป


  XT 109

7.2.1.9 setTextSize เป นการกําหนดขนาดตัวอักษรโดยระบุเปนจํานวนเทาของขนาดปกติ คาตังต ้ นเมื่อเริ่มทํางานทุกครั้งคือ ขนาดตัวอักษรปกติ ใชพื้นทีรวมระยะช ่ องไฟคือ 6x10 พิกเซลตอ 1 ตัวอักษร จึงแสดงได 21 ตัวอักษร 16 บรรทัด ในแนวตั้ง รูปแบบ

setTextSize(unsigned int newSize) พารามิเตอร newSize คือคาขนาดจํานวนเทาของขนาดปกติ มีคา 1 ถึง 16 เพือให ่ ตัวอักษรทีแสดงไม ่ ลนหนาจอ ตัวอยางที่ 7-11 #include <popxt.h> void setup() { setTextSize(1); // กําหนดขนาดขอความ 1 เทา setTextColor(GLCD_GREEN); // สีตัวอักษรเปนสีเขียว glcd(0,0,”Size1”); // แสดงขอความ setTextSize(2); glcd(1,0,”Size2”); // กําหนดขนาดขอความ 2 เทา setTextSize(3); glcd(2,0,”Size3”); // กําหนดขนาดขอความ 3 เทา setTextSize(4); glcd(3,0,”Size4”); // กําหนดขนาดขอความ 4 เทา } void loop() {}


  XT 110

7.2.1.10 getTextColor เปนคําสั่งคืนคาสีปจจุบันของตัวอักษร รูปแบบ

unsigned int getTextColor() การคืนคา textColor เปนคาสีแสดงอยูในรูปของตัวเลข 16 บิต ดูรูปแบบไดจากฟงกชั่น colorRGB() ตัวอยางที่ 7-12 unsigned int color; color=getTextColor(); // นําคาสีของตัวอักษรเก็บไวทีตั่ วแปร color

7.2.1.11 getTextBackgroundColor คืนคาสีพื้นหลังของตัวอักษร รูปแบบ

unsigned int getTextBackgroundColor() การคืนคา textBackgroundColor เปนคาสีแสดงอยูในรูปของตัวเลข 16 บิต ดูรูปแบบไดจากฟงกชัน่ colorRGB() ตัวอยางที่ 7-13 unsigned int color; color=getTextBackgroundColor(); // นําคาสีพืนหลั ้ งของตัวอักษรเก็บในตัวแปร color

7.2.1.12 getTextSize คืนคาขนาดของตัวอักษรออกมาเปนจํานวนเทาของคาปกติ รูปแบบ

unsigned int getTextSize() การคืนคา textSize เปนคาจํานวนเทาของขนาดตัวอักษร ตัวอยางที่ 7-14 unsigned int textSize; textSize=getTextSize(); // นําคาจํานวนเทาของขนาดของตัวอักษรเก็บในตัวแปร textSize


  XT 111

7.2.1.13 glcdGetMode คืนคาของโหมดทิศทางการแสดงผล รูปแบบ

unsigned int glcdGetMode() การคืนคา mode เปนคาของโหมดทิศทางการแสดงผล เปนตัวเลข 0 ถึง 3 เพือแสดงผลในทิ ่ ศทาง 0 องศา, หมุน 90 องศา, หมุน 180 องศา และหมุน 270 องศาตามลําดับ ตัวอยางที่ 7-15 unsigned int Mode; Mode=glcdGetMode(); // คืนคาทิศทางการแสดงผลของหนาจอ GLCD

7.2.1.14 glcdPixel เปนการพล็อตจุดบนจอภาพตามพิกัดทีกํ่ าหนด โดยอางอิงจอภาพขนาด 128 x 160 พิกเซล รูปแบบ

void glcdPixel(unsigned int x,unsigned int y,unsigned int color) พารามิเตอร x คือคาพิกัดในแนวนอนหรือแกน x มีคาระหวาง 0 ถึง 127 y คือคาพิกัดในแนวตั้งหรือแกน y มีคาระหวาง 0 ถึง 159 color คือคาของสีทีต่ องการ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรทีกํ่ าหนดคาไวแลวจากตัวแปร color[] ตัวอยางที่ 7-16 #include <popxt.h> int i; void setup() { for (i=0;i<128;i+=4) { glcdPixel(i,80,GLCD_RED); // พล็อตจุดทุกๆ 4 พิกเซลในแนวแกน x กลางจอ } for (i=0;i<160;i+=4) { glcdPixel(64,i,GLCD_RED); // พล็อตจุดทุกๆ 4 พิกเซลในแนวแกน y กลางจอ } } void loop() {}


  XT 112

7.2.1.18 glcdRect เปนฟงกชั่นลากเสนจากพิกัดทีกํ่ าหนดมายังพิกัดปลายทาง รูปแบบ

void glcdRect(unsigned int x1,unsigned int y1,unsigned int width,unsigned int height,unsigned int color) พารามิเตอร x1 คือ คาตําแหนงเริ่มตนของรูปสีเหลี ่ ่ยมในแกน x มีคาระหวาง 0 ถึง 127 y1 คือ คาตําแหนงเริ่มตนของรูปสีเหลี ่ ่ยมในแกน y มีคาระหวาง 0 ถึง 159 width คือ คาความกวางของรูปสีเหลี ่ ่ยม (แนวนอน) มีคาระหวาง 1 ถึง 128 height คือ คาความสูงของรูปสีเหลี ่ ่ยม (แนวตัง)้ มีคาระหวาง 1 ถึง 158 color คือ สีของเสน เปนคาตัวเลข 16 บิต หรือเปนคาตัวแปรทีกํ่ าหนดคาไวแลวจากตัวแปร color[] ก็ได ตัวอยางที่ 7-17 #include <popxt.h> void setup() { glcdRect(32,40,64,80,GLCD_RED); // วาดรูปสีเหลี ่ ่ยมเสนสีแดง ขนาด 64 x 80 พิกเซล } void loop() {}


  XT 113

7.2.1.19 glcdFillRect เปนการระบายสีพื้นของรูปสี่เหลี่ยม โดยกําหนดจุดเริมต ่ นและความกวางยาวของรูปสี่เหลี่ยมที่ตองการ ฟงกชั่นนี้เปนการสรางรูปสี่เหลี่ยมที่มีสีพื้นแตไมมีเสนกรอบ ในขณะที่ฟงกชั่น glcdRect เปนการวาดรูปกรอบสี่ เหลี่ยมที่กําหนดสีของเสนกรอบได แตภายในกรอบไมมีสี รูปแบบ

void glcdFillRect(unsigned int x1, unsigned int y1, unsigned int width, unsigned int height,unsigned int color) พารามิเตอร x1 คือ คาตําแหนงเริ่มตนของรูปสีเหลี ่ ่ยมในแกน x มีคาระหวาง 0 ถึง 127 y1 คือ คาตําแหนงเริ่มตนของรูปสีเหลี ่ ่ยมในแกน y มีคาระหวาง 0 ถึง 159 width คือ คาความกวางของรูปสีเหลี ่ ่ยม (แนวนอน) มีคาระหวาง 1 ถึง 128 height คือ คาความสูงของรูปสีเหลี ่ ่ยม (แนวตัง)้ มีคาระหวาง 1 ถึง 158 color คือ สีของเสน เปนคาตัวเลข 16 บิต หรือเปนคาตัวแปรทีกํ่ าหนดคาไวแลวจากตัวแปร color[] ก็ได ตัวอยางที่ 7-18 #include <popxt.h> void setup() { glcdFillRect(32,40,64,80,GLCD_RED); // สรางภาพสีเหลี ่ ่ยมพื้นสีแดง ขนาด 64 x 80 พิกเซล } void loop() {}


  XT 114

7.2.1.20 glcdLine เปนฟงกชั่นหนวงเวลาโดยประมาณภายในโปรแกรมในหนวยมิลลิวินาที รูปแบบ

void glcdLine(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2,unsigned int color) พารามิเตอร x1 คือคาตําแหนงเริ่มตนของเสนบนแกน x มีคาระหวาง 0 ถึง 127 y1 คือคาตําแหนงเริ่มตนของเสนบนแกน y มีคาระหวาง 0 ถึง 159 x2 คือคาตําแหนงสิ้นสุดของเสนบนแกน x มีคาระหวาง 0 ถึง 127 y2 คือคาตําแหนงสิ้นสุดของเสนบนแกน y มีคาระหวาง 0 ถึง 159 color คือ คาสีของเสน เปนตัวเลข 16 บิต หรือเปนคาตัวแปรทีกํ่ าหนดคาไวแลวจากตัวแปร color[] ก็ได ตัวอยางที่ 7-19 #include <popxt.h> void setup() { glcdLine(0,0,127,159,GLCD_RED); // ลากเสนสีแดงทแยงมุมจากดานบนซายลงมาดานลางขวา } void loop() {}


  XT 115

7.2.1.21 glcdCircle เปนฟงกชั่นวาดเสนรูปวงกลมจากการกําหนดจุดกึงกลางของวงกลมและความยาวของรั ่ ศมี รูปแบบ

void glcdCircle(unsgined int x, unsgined int y, unsgined int radius,unsgined int color) พารามิเตอร x คือ พิกัดจุดศูนยกลางของวงกลมบนแกน x มีคาระหวาง 0 ถึง 127 y คือ พิกัดจุดศูนยกลางของวงกลมบนแกน y มีคาระหวาง 0 ถึง 159 radius คือ คารัศมีของวงกลม color คือ คาสีของเสน เปนตัวเลข 16 บิต หรือเปนคาตัวแปรทีกํ่ าหนดคาไวแลวจากตัวแปร color[] ก็ได ตัวอยางที่ 7-20 #include <popxt.h> void setup() { glcdCircle(32,120,31,GLCD_MAGENTA); // สรางเสนวงกลมสีบานเย็น มีรัศมี 31 พิกเซล } void loop() {}


  XT 116

7.2.1.22 glcdFillCircle เปนฟงกชันวาดรู ่ ปวงกลมทีมี่ สีพืนจากการกํ ้ าหนดจุดศูนยกลางของวงกลมและความยาวของรัศมี ฟงกชัน่ นีเป ้ นการสรางรูปวงกลมที่มีสีพื้นแตไมมีเสนกรอบ ในขณะที่ฟงกชั่น glcdCircle เปนการวาดรูปวงกลมที่กําหนด สีของเสนรอบวงได แตภายในวงกลมไมมีสี รูปแบบ

void glcdFillCircle(unsigned int x, unsigned int y, unsigned int radius,unsigned int color) พารามิเตอร x คือ พิกัดจุดศูนยกลางของวงกลมบนแกน x มีคาระหวาง 0 ถึง 127 y คือ พิกัดจุดศูนยกลางของวงกลมบนแกน y มีคาระหวาง 0 ถึง 159 radius คือ คารัศมีของวงกลม color คือ คาสีของพืนวงกลม ้ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรทีกํ่ าหนดคาไวแลวจากตัวแปร color[] ตัวอยางที่ 7-21 #include <popxt.h> void setup() { glcdFillCircle(32,120,31,GLCD_MAGENTA); // สรางรูปวงกลมพื้นสีบานเย็น รัศมี 31 พิกเซล } void loop() {}


  XT 117

7.2.1.23 glcdArc เปนฟงกชั่นวาดสวนโคงของวงกลม โดยระบุตําแหนงจุดกึ่งกลาง รัศมี ตําแหนงจุดเริม่ จุดสินสุ ้ ดและสี ของเสน รูปแบบ

void glcdArc(unsigned int x,unsigned int y,unsigned int r,int start_angle,int end_angle,uint color) พารามิเตอร x คือตําแหนงจุดกึ่งกลางในแนวแกน x y คือตําแหนงจุดกึ่งกลางในแนวแกน y r คือรัศมีของเสนโคง start_angle คือตําแหนงมุมของจุดเริ่มตนของวงกลม end_angle คือตําแหนงมุมจุดสิ้นสุดของวงกลม color คือสีของเสนวงกลม ตัวอยางที่ 7-22 #include <popxt.h> void setup() { glcdArc(48,80,16,30,150,GLCD_RED); glcdCircle(48,75,5,GLCD_BLUE); glcdCircle(80,75,5,GLCD_BLUE); glcdArc(80,80,16,30,150,GLCD_RED); glcdFillCircle(64,90,7,GLCD_GREEN); glcdArc(64,100,30,220,320,GLCD_RED); } void loop() {}


  XT 118

่ ่ยวกับเวลา 7.2.2 ฟงกชันเกี 7.2.2.1 sleep และ delay เปนฟงกชั่นหนวงเวลาโดยประมาณภายในโปรแกรมในหนวยมิลลิวินาที รูปแบบ

void sleep(unsigned int ms) void delay(unsigned int ms)

พารามิเตอร ms - กําหนดคาเวลาทีต่ องการหนวงในหนวยมิลลิวินาที มีคา 0 ถึง 65,535 ตัวอยางที่ 7-23 // หนวงเวลาประมาณ 20 มิลลิวินาที sleep(20); delay(1000); // หนวงเวลาประมาณ 1 วินาที

7.2.2.2 delay_us เปนฟงกชั่นหนวงเวลาโดยประมาณภายในโปรแกรมในหนวยไมโครวินาที รูปแบบ

void delay_us(unsigned int us)

พารามิเตอร us - กําหนดคาเวลาทีต่ องการหนวงในหนวยไมโครวินาที มีคา 0 ถึง 65,535 ตัวอยางที่ 7-24 // หนวงเวลาประมาณ 100 ไมโครวินาที delay_us(100);

่ ่ยวกับเสียง 7.2.3 ฟงกชันเกี 7.2.3.1 beep เปนฟงกชันกํ ่ าเนิดเสียง “ติด” ๊ มีความถี่ 500Hz นาน 100 มิลลิวินาที เพือขั ่ บออกลําโพงเปยโซของ POP-BOT XT รูปแบบ

void beep()

ตัวอยางที่ 7-25 beep();

// กําเนิดเสียงความถี่ 500Hz นาน 100 มิลลิวินาที

7.2.3.2 sound เปนฟงกชั่นกําเนิดสัญญาณเสียงที่กําหนดความถี่และระยะเวลาในการกําเนิดสัญญาณได รูปแบบ

void sound(int freq,int time)

พารามิเตอร freq - กําหนดความถี่สัญญาณเสียง มีคา 0 ถึง 32,767 time - กําหนดคาเวลาในการกําเนิดสัญญาณเสียงในหนวย 1 มิลลิวินาที มีคา 0 ถึง 32,767 ตัวอยางที่ 7-26 sound(1200,500); // กําเนิดสัญญาณเสียงความถี่ 1200Hz นาน 500 มิลลิวินาที


  XT 119

่ ่ยวกับพอรตอินพุตเอาตพุต 7.2.4 ฟงกชันเกี 7.2.4.1 in เปนฟ งกชั่นอานคาสถานะลอจิกของพอรตทีกํ่ าหนด เปนหนึ่งในฟงกชั่นการอานและเขียนคากับพอรต อินพุตเอาตพุตของหุนยนต POP-BOT XT รูปแบบ

char in(x) พารามิเตอร x - กําหนดขาพอรตทีต่ องการอานคา การคืนคา เปน 0 หรือ 1 ตัวอยางที่ 7-27 char x; // ประกาศตัวแปร x เพื่อเก็บคาผลลัพธจาการอานคาระดับสัญญาณ x = in(2); // อานคาดิจิตอลจากพอรตดิจิตอล 2 (Di2) มาเก็บไวทีตั่ วแปร x

7.2.4.2 out เปนฟงกชั่นกําหนดระดับสัญญาณหรือขอมูลดิจิตอลไปยังพอรตที่กําหนด รูปแบบ out(char _bit,char _dat) พารามิเตอร _bit - กําหนดขาพอรตทีต่ องการ ตัวอยางที่ 7-28 out(4,1); // กําหนดใหขาพอรต 4/A6 เปนเอาตพุตดิจิตอลและมีคาเปน “1” out(6,0); // กําหนดใหขาพอรต 6/A7 เปนเอาตพุตดิจิตอลและมีคาเปน “0”


  XT 120

่ ่ยวกับการติดตอกับตัวตรวจจับ 7.2.5 ฟงกชันเกี 7.2.5.1 analog เป นฟงกชั่ นอานคาขอมูลดิจิตอลที่ไดจากการแปลงสัญญาณอะนาลอกของไมโครคอนโทรลเลอรที่ขา พอรต A0 ถึง A7 ซึงใช ่ ในการเชื่อมตอกับตัวตรวจจับที่ใหผลการทํางานในรูปแรงดันไฟฟาในยาน 0 ถึง +5V รูปแบบ

unsigned int analog(unsigned char channel) พารามิเตอร channel - กําหนดชองอินพุตอะนาลอกทีต่ องการ มีคา 0 ถึง 7 ซึงตรงกั ่ บขาพอรต A0 ถึง A7 การคืนคา เปนข อมู ลที่ได จากการแปลงสัญญาณของโมดูลแปลงสัญญาณอะนาลอกเปนดิจิตอลภายในไมโคร คอนโทรลเลอรจากชองอินพุตทีกํ่ าหนด โดยขอมูลมีความละเอียด 10 บิต ดังนั้นคาที่เปนไปไดคือ 0 ถึง 1,023

7.2.5.2 knob เปนฟงกชั่นอานคาขอมูลจากตัวตานทานปรับคาได KNOB บนแผงวงจร POP-XT มีการทํางานเหมือนกับ คําสั่ง analog(8) แตคาที่อานไดมีคาในชวง 80 ถึง 1023 เนืองจากตั ่ วตานทานปรับคาไดนีเชื ้ ่อมตอกับสวิตช OK ที่ติดตังบนแผงวงจร ้ POP-XT ดวย รูปแบบ

unsigned int knob() การคืนคา คาทีอ่ านไดจากตัวตานทานปรับคาได KNOB บนแผงวงจร POP-XT มีคาระหวาง 80 ถึง 1023 ตัวอยางที่ 7-29 int val=0; // กําหนดคาตัวแปรสําหรับเก็บคาอะนาลอก val=knob(); // อานคาจากตัวตานทานปรับคาได KNOB บนแผงวงจร POP-XT เก็บในตัวแปร val

7.2.5.3 sw_ok() เปนฟงกชั่นตรวจสอบสถานะสวิตช OK บนแผงวงจร POP-XT โดยใหสถานะ “เปนจริง” เมื่อมีการกด สวิตชและ “เปนเท็จ” เมื่อไมมีการกดสวิตช รูปแบบ

unsigned char sw_ok() การคืนคา 1 (เปนจริง) เมื่อมีการกดสวิตช 0 (เปนเท็จ) เมื่อไมมีการกดสวิตช หมายเหตุ การกดสวิตช OK มีผลทําใหคาทีอ่ านไดจาก Knob เปน 0 ดวย


  XT 121

ตัวอยางที่ 7-30 if(sw_ok()) { beep(); // เมื่อกดสวิตช OK จะมีเสียง “ติ้ด” ดังออกลําโพง }

7.2.5.4 sw_ok_press() เปนฟงกชั่นวนตรวจสอบการกดสวิตช OK บนแผงวงจร POP-XT ตองรอจนกระทั่งสวิตชถูกปลอยหลัง จากการกดสวิตชจึงจะผานฟงกชั่นนี้ไปกระทําคําสั่งอื่นๆ ตัวอยางที่ 7-31 ........ // รอจนกระทังเกิ ้ ดกดสวิตช OK sw_ok_press(); ......

7.2.6 ฟงกชันเกี ่ ่ยวกับการขับมอเตอรไฟตรง 7.2.6.1 motor เปนฟงกชั่นขับเคลือนมอเตอร ่ ไฟตรง รูปแบบ

void motor(char _channel,int _power) พารามิเตอร _channel - กําหนดชองเอาตพุตมอเตอรไฟตรงของหุนยนต  POP-BOT XT มีคา 1 และ 2 _power - กําหนดกําลังขับมอเตอร มีคาในชวง -100 ถึง 100 ถากําหนดคา _power เปนบวก (1 ถึง 100) ทําใหมอเตอรหมุนไปในทิศทางหนึ่ง ถากําหนดคา _power เปนลบ (-1 ถึง -100) มอเตอรจะถูกขับใหหมุนไปในทิศทางตรงขาม ถากําหนดคา _power เปน 0 มอเตอรหยุดหมุน ไมแนะนําใหกําหนดคาเปน 0 หากตองการใหมอเตอร หยุดหมุนควรเรียกใชฟงกชัน่ motor_stop ตัวอยางที่ 7-32 // ขับมอเตอรชอง A ดวยกําลัง 60% ของกําลังสูงสุด motor(1,60); motor(1,-60); // ขับมอเตอรชอง A ดวยกําลัง 60% มีทิศทางการหมุนตรงขามกับคําสังก ่ อนหนา ตัวอยางที่ 7-33 // ขับมอเตอรชอง B ดวยกําลัง 100% อันเปนคากําลังสูงสุด motor(2,100);


  XT 122

7.2.6.2 motor_stop เปนฟงกชั่นหยุดขับมอเตอร รูปแบบ

void motor_stop(char _channel) พารามิเตอร _channel - กําหนดชองเอาตพุตมอเตอรไฟตรง มีคา 1, 2 และ ALL โดย ALLเปนการเลือกใหมอเตอรทัง้ 2 ชองหยุดทํางานพรอมกัน ตัวอยางที่ 7-34 // หยุดขับมอเตอรชอง A motor_stop(1); motor_stop(2); // หยุดขับมอเตอรชอง B ตัวอยางที่ 7-35 motor_stop(ALL); // มอเตอรทัง้ 2 ชองหยุดทํางานพรอมกัน

7.2.6.3 fd มาจากคําวา forward เปนฟงกชั่นกําหนดใหหุนยนต POP-BOT XT เคลือนที ่ ไปข ่ างหนา รูปแบบ

fd(unsigned int speed) พารามิเตอร speed คือเปอรเซ็นตความเร็วของมอเตอรมีคาตั้งแต 0 ถึง 100 ตัวอยางที่ 7-36 ่ หุนยนต  เคลื่อนที่ไปขางหนาดวยความเร็ว 60 เปอรเซ็นต fd(60); // สังให

7.2.6.4 fd2 ่ างหนาแบบกําหนด มาจากคําวา forward2 เปนฟงกชั่นทีกํ่ าหนดใหหุนยนต POP-BOT XT เคลือนที ่ ไปข ความเร็วมอเตอรแยกอิสระ รูปแบบ

fd2(unsigned int speed1 ,unsigned int speed2) พารามิเตอร speed1 คือ คาความเร็วของมอเตอร A มีคาตั้งแต 0 ถึง 100% speed2 คือ คาความเร็วของมอเตอร B มีคาตั้งแต 0 ถึง 100% ตัวอยางที่ 7-37 // ควบคุมใหหุนยนต  เคลือนที ่ เป ่ นวงกลม เนืองจากมอเตอร ่ B หมุนเร็วกวามอเตอร A มาก fd2(30,80);


  XT 123

7.2.6.5 bk มาจากคําวา backward เปนฟงกชันกําหนดใหหุนยนต POP-BOT XT เคลือนที ่ ถอยหลั ่ ง รูปแบบ

bk(unsigned int speed) พารามิเตอร speed คือเปอรเซ็นตความเร็วของมอเตอรมีคาตั้งแต 0 ถึง 100 ตัวอยางที่ 7-38 // กําหนดใหหุนยนต  POP-BOT XT เคลื่อนที่ถอยหลังดวยความเร็ว 90 เปอรเซ็นต bk(90);

7.2.6.6 bk2  POP-BOT XT เคลือนที ่ งแบบกําหนดความ มาจากคําวา backward2 เปนฟงกชั่นกําหนดใหหุนยนต ่ ถอยหลั เร็วมอเตอรอิสระ รูปแบบ

bk2(unsigned int speed1 ,unsigned int speed2) พารามิเตอร speed1 คือเปอรเซ็นตความเร็วของมอเตอร A มีคาตั้งแต 0 ถึง 100 speed2 คือเปอรเซ็นตความเร็วของมอเตอร B มีคาตั้งแต 0 ถึง 100 ตัวอยางที่ 7-39 // เปนคําสังเคลื ่ ่อนถอยหลังตรงดวยความเร็วเทากัน ซึงทํ ่ างานเหมือนกับคําสัง่ bk() bk2(80,80); ทังฟ ้ งกชัน่ fd2() และ bk2() มีไวเพือปรั ่ บแตงการทํางานของมอเตอรไฟตรงทัง้ 2 ตัวของหุนยนต  POP-BOT XT ซึงอาจแตกต างกันดานความเร็วในการหมุน ใหทํางานไดอยางใกลเคียงกันดวยการปรับคา speed1 และ speed2 ่

7.2.6.7 tl และ tr ้ ายและเลียวขวานั ้ นเอง ่ โดยการเลียวของฟ ้ งกชันทั ่ งสองนี ้ จะ ้ มาจากคําวา turn left และ turn right หรือเลียวซ กําหนดใหมอเตอรตัวใดตัวหนึงของหุ ่ นยนต  หยุดอยูกั บที่ จุดหมุนของหุนยนต  จะอยูที ล่ อของมอเตอรทีหยุ ่ ดอยูกั บที่ รูปแบบ

tl(unsigned int speed) และ tr(unsigned int speed) พารามิเตอร speed คือ คาความเร็วของมอเตอร มีคาตั้งแต 0 ถึง 100 เปอรเซ็นต ตัวอยางที่ 7-40 // กําหนดใหหุนยนต  เลี้ยวซายดวยความเร็ว 60 เปอรเซ็นต tl(60); tr(100); // กําหนดใหหุนยนต  เลี้ยวขวาดวยความเร็ว 100 เปอรเซ็นต


  XT 124

7.2.6.8 sl และ sr มาจากคําวา spin left และ spin right หรือหมุนตัวทางซายและทางขวา ในฟงกชั่นนี้จะกําหนดใหมอเตอร ไฟตรงทั้งสองตัวของหุนยนตหมุนในทิศทางตรงกันขาม จุดหมุนของการเลี้ยวจึงอยูที่กึงกลางของหุ ่ นยนต รูปแบบ

sl(unsigned int speed) และ sr(unsigned int speed) พารามิเตอร speed คือ คาความเร็วของมอเตอร มีคา 0 ถึง 100% ตัวอยางที่ 7-41 // กําหนดใหหุนยนต  เลี้ยวซายดวยความเร็ว 70% sl(70); sr(100); // กําหนดใหหุนยนต  เลี้ยวขวาดวยความเร็ว 100%

7.2.6.9 ao มาจากคําวา all motor off เปนฟงกชั่นหยุดการทํางานของมอเตอรทั้งสองตัวพรอมกันเหมือนกับการเรียก ใชฟงกชั่น motor_stop(ALL); รูปแบบ

ao() ตัวอยางที่ 7-42 void setup() { fd(100); sleep(2000); ao(); }

// หุนยนต  เคลื่อนที่ไปขางหนาดวยความเร็วสูงสุด // เปนเวลา 2 วินาที // กําหนดใหมอเตอรหยุดทํางาน หุนยนต  จะหยุดเคลื่อนที่ทันที

7.2.7 ฟงกชันเกี ่ ่ยวกับการขับเซอรโวมอเตอร ในไฟลไลบรารีนีมี้ 1 ฟงกชันคื ่ อ servo เปนฟงกชันกํ ่ าหนดตําแหนงแกนหมุนของเซอรโวมอเตอร ควบคุม ได 3 ตัว รูปแบบ

void servo(unsigned char _ch, int _pos)

พารามิเตอร _ch - ชองเอาตพุตเซอรโวมอเตอร มีคา 8 ถึง 13 _pos - กําหนดตําแหนงแกนหมุนของเซอรโวมอเตอร มีคาในชวง 0 ถึง 180 และ -1 ถากําหนดเปน -1 หมายถึง ไมใชงานเซอรโวมอเตอรทีช่ องนั้นๆ


  XT 125

่ ่ยวกับการสื่อสารขอมูลอนุกรม 7.2.8 ฟงกชันเกี เปนไฟลไลบรารีสนับสนุนชุดคําสั่งเกี่ยวกับการรับสงขอมูลผานโมดูลสือสารข ่ อมูลอนุกรม (UART)

7.2.8.1 การเชื่อมตอทางฮารดแวร เมือต ่ องการใชงานชอง UART0 ใหตอสายจากจุดตอพอรต USB บนแผงวงจร POP-XT (เปนจุดตอเดียวกับที่ใชในการอัปโหลด) เขากับ พอรต USB ของคอมพิวเตอร เมือต ่ องการใชงานชอง UART1 ตอสายสัญญาณเขากับจุดตอ RXD1 (ขาพอรต 2) และ TXD1 (ขาพอรต 3)

7.2.8.2 uart เปนฟงกชั่นสําหรับสงขอมูลสายอักขระออกจากโมดูล UART0 มีอัตราบอดเริ่มตนที่ 4,800 บิตตอวินาที รูปแบบ

void uart(char *p,...) พารามิเตอร p - รับรหัสของกลุมขอความที่ตองการสงออกจากภาคสงของโมดูล UART0 โดยสามารถกําหนดรูปแบบ การแทรกสัญลักษณพิเศษเพือใช ่ รวมในการแสดงผลไดดังนี้ การทํางาน รหัสบังคับ %c หรือ %C แสดงผลตัวอักษร 1 ตัว %d หรือ %D แสดงผลตัวเลขฐานสิบชวงตั้งแต -32,768 ถึง +32,767 %l หรือ %L แสดงผลตัวเลขฐานสิบชวงตั้งแต -2,147,483,648 ถึง +2,147,483,647 %f หรือ %F แสดงผลขอมูลแบบจํานวนจริง(แสดงทศนิยม 3 หลัก) \r กําหนดใหขอความชิดไปทางดานซายของบรรทัด \n กําหนดใหขอความขึ้นบรรทัดใหม

7.2.8.3 uart_set_baud เปนฟงกชั่นกําหนดอัตราบอดในการสื่อสารของโมดูล UART0 กับคอมพิวเตอร รูปแบบ

void uart_set_baud(unsigned int baud) พารามิเตอร baud - อัตราบอดในการสือสารของโมดู ่ ล UART0 กับคอมพิวเตอร มีคา 2400 ถึง 115,200 ตัวอยางที่ 7-43 uart_set_baud(4800); // กําหนดอัตราบอดในการสื่อสารขอมูลเปน 4,800 บิตตอวินาที


  XT 126

7.2.8.4 uart_available เปนฟงกชั่นตรวจสอบการรับขอมูลเขามาของโมดูล UART0 เมื่อติดตอกับคอมพิวเตอร รูปแบบ

unsigned char uart_available(void) การคืนคา - เปน “0” เมื่อยังไมมีขอมูลเขามา - มากกวา 0 เมื่อมีขอมูลเขามา โดยมีคาเทากับจํานวนของอักขระที่ไดรับ ตัวอยางที่ 7-44 char x =uart_available(); // ตรวจสอบวา มีขอมูลเขามาทางภาครับของโมดูล UART0 หรือไม ถา x มีคามากกวา 0 แสดงวา // มีขอมูลเขามายังภาครับแลว ควรอานขอมูลออกดวยฟงกชัน่ uart_getkey ในลําดับถัดไปทันที

7.2.8.5 uart_getkey เปนฟงกชั่นอานขอมูลจากบัฟเฟอรตัวรับของโมดูล UART0 รูปแบบ

char uart_getkey(void) การคืนคา - เปน “0” เมื่อไมมีการรับอักขระใดๆ เขามายังวงจรภาครับของโมดูล UART - เปนคาของอักขระทีรั่ บไดในรูปแบบของรหัสแอสกี้ ตัวอยางที่ 7-45 #include <popxt.h> // เรียกใชฟงกชันพื ่ ้นฐาน void setup() { glcdClear(); // ลางจอภาพ setTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทา glcdMode(1); // เลือกแสดงผลในแนวนอน } void loop() // ลูปการทํางานหลัก { if(uart_available()) // ตรวจสอบวามีขอมูลเขามาหรือไม { if(uart_getkey()==’a’) // ตรวจจับการกดคีย a วา ถูกกดหรือไม { glcd(1,0,“Key a Active!”); // แสดงขอความเพือตอบสนองต ่ อการตรวจพบวามีการคีย a sleep(1000); // หนวงเวลาแสดงขอความประมาณ 1 วินาที } else { glcdClear; // เคลียรขอความที่จอแสดงผล } } }


  XT 127

เมื่อรันโปรแกรมนี้ ตองเปดหนาตาง Serial Monitor ของ Arduino1.0 แลวเลือกการปดทายขอความเปนแบบ No line ending อัตราบอด 115200 และคลิกเพื่อปลดเครื่องหมายใดๆ ทีช่ อง Autoscroll จากนั้นพิมพ a ทีช่ องสง ขอมูล แลวคลิกปุม Send เพือส ่ งขอมูลจากคอมพิวเตอรไปยังแผงวงจรควบคุม POP-XT ผานทางพอรต USB ทีถู่ กกําหนด ใหทํางานเปนพอรตอนุกรมเสมือนหรือ USB Serial port

เมื่อแผงวงจร POP-XT ไดรับตัวอักษร a ก็จะแสดงขอความ Key a Active! บนจอแสดงผล หมายเหตุ เมือเรี ่ ยกใชฟงกชัน่ uart เพือส ่ งขอมูลออกทางโมดูลพอรตอนุกรมหรือ UART และ uart_getkey เพือ่ ตรวจจับอักขระใดๆ นัน้ อัตราบอดจะถูกกําหนดเปน 115,200 บิตตอวินาที ขอมูล 8 บิต และไมมีการตรวจสอบพาริตีโดย ้ อัตโนมัติ และเปนคาตังต ้ น เพือลดความซั ่ บซอนในการเขียนโปรแกรมลง หากตองการเปลียนอั ่ ตราบอดตองใช uart_set_baud อยางไรก็ตาม ตองคํานึงดวยวา เมืออั ่ ตราบอดสูงขึนอาจส ้ งผลกระทบตอความถูกตองในการสือสารข ่ อมูล


  XT 128

7.2.8.6 uart1 ่ งขอมูลสายอักขระออกทางภาคสงของโมดูล UART1 มีอัตราบอดเริมต ่ นที่ 9,600 บิตตอวินาที เปนฟงกชันส รูปแบบ

void uart1(char *p,...) พารามิเตอร p - รับรหัสของกลุมขอความที่ตองการสงออกจากภาคสงของโมดูล UART1 โดยสามารถกําหนดรูปแบบ การแทรกสัญลักษณพิเศษเพือใช ่ รวมในการแสดงผลเหมือนกับฟงกชัน่ uart

7.2.8.7 uart1_set_baud เปนฟงกชั่นกําหนดอัตราบอดในการสื่อสารของโมดูล UART1 กับคอมพิวเตอร รูปแบบ

void uart1_set_baud(unsigned int baud) พารามิเตอร baud - กําหนดคาอัตราบอดในการสื่อสารของโมดูล UART1 มีคา 2400 ถึง 115,200 ตัวอยางที่ 7-46 uart1_set_baud(19200); // กําหนดอัตราบอดในการสื่อสารเปน 19,200 บิตตอวินาที

7.2.8.8 uart1_available เปนฟงกชั่นตรวจสอบการรับขอมูลเขามาของโมดูล UART1 เมื่อติดตอกับคอมพิวเตอร รูปแบบ

unsigned char uart1_available(void) การคืนคา - เปน 0 เมื่อไมมีขอมูลเขามา - มากกวา 0 โดยมีคาเทากับจํานวนของอักขระที่ไดรับ ตัวอยางที่ 7-47 char x =uart1_available(); // ตรวจสอบวามีขอมูลเขามาทางภาครับของโมดูล UART1 หรือไม // ถา x มีคามากกวา 0 แสดงวามีขอมูลเขามาแลว ควรอานออกไปดวยฟงกชัน่ uart1_getkey ทันที

7.2.8.9 uart1_getkey เปนฟงกชั่นอานขอมูลจากบัฟเฟอรตัวรับของโมดูล UART1 รูปแบบ

char uart1_getkey(void) การคืนคา - เปน 0 เมื่อยังไมมีการรับอักขระใดๆ - เปนคาของอักขระทีรั่ บไดในรูปแบบของรหัสแอสกี้


  XT 129

่ มสําหรับใชงาน GP2D120 โมดูลวัดระยะทางดวยแสงอินฟราเรด 7.3 ไลบรารีเพิมเติ ่ นไลบรารีหลักของการเขียนโปรแกรมเพื่อควบคุมการทํางานของ นอกจากไฟลไลบรารี popbot.h ซึงเป หุนยนต POP-BOT XT ยังมีไฟลไลบรารีสําหรับติดตอกับตัวตรวจจับหนาที่พิเศษอื่นๆ ของหุนยนต POP-BOT XT ที่มิไดรวมไวในไฟลไลบรารี popxt.h ดังนันเมื ้ อต ่ องการใชงานจึงตองผนวกเพิ่มเติมไวในตอนตนของโปรแกรม สําหรับตัวตรวจจับแบบพิเศษที่มีในชุดหุนยนต  POP-BOT XT มีอยู 1 ตัวคือ โมดูล GP2D120 อันเปนโม ดูล ตรวจจับและวัดระยะทางดวยแสงอินฟราเรด ไฟลไลบรารีสําหรับใชงาน GP2D120 คือ gp2d120_lib.h ่ บสนุนการทํางานกับ GP2D120 โมดูลตรวจจับและวัดระยะทางดวย ไลบรารี gp2d120_lib.h มีฟงกชันสนั แสงอินฟราเรด กอนเรียกใชงานฟงกชั่นภายในไลบรารีนีจะต ้ องผนวกไฟลไลบรารีไวในตอนตนของโปรแกรม ดวยคําสั่ง #include <gp2d120_lib.h>

ล GP2D120 ใหผลการทํางานเปนแรงดันไฟตรงที่สัมพันธกับระยะทางที่ตรวจวัดได ดังนัน้ เนืองจากโมดู ่ ในการใชงานผูพัฒนาจึงตองตอโมดูลตรวจจับนี้เขากับอินพุตสัญญาณอะนาลอกใดๆ ของ POP-BOT XT นั่นคือ พอรต A0 ถึง A7

7.3.1 getdist เปนฟงกชั่นอานคาระยะทางที่วัดไดจากโมดูลวัดระยะทางดวยแสงอินฟราเรด GP2D120 รูปแบบ

unsigned int getdist(char adc_ch) พารามิเตอร adc_ch ทําหนาที่รับการกําหนดชองอะนาลอกที่ใชงานตั้งแต 0 ถึง 7 การคืนคา ระยะทางในหนวยเซนติเมตร ตัวอยางที่ 7-48 dist = getdist(3); // อานคาระยะทางจาก GP2D120 ทีต่ อกับพอรต A3


  XT 130


  XT 131



 XT ในบทนีนํ้ าเสนอการเขียนโปรแกรมเพื่อขับเคลื่อนหุนยนต  POP-BOT X T โดยหัวใจหลักคือ การเขียน โปรแกรมเพือควบคุ ่ มใหแผงวงจร POP-XT สงสัญญาณไปยังวงจรขับมอเตอรซึงใช ่ ไอซีเบอร TB6612 เพือขั ่ บให มอเตอรหมุนไปในทิศทางและดวยความเร็วตามทีต่ องการ

8.1 ไมโครคอนโทรลเลอรกับการขับมอเตอรไฟตรง การใชงานไมโครคอนโทรลเลอรเพือขั ่ บโหลดกระแสสูงอยางมอเตอร มีวิธีการควบคุมอยางมากมาย ตังแต ้ ควบคุมใหหมุนหรือหยุดหมุน, ควบคุมการล็อกหรือปลอยแกนหมุน, ควบคุมทิศทางการหมุน และควบคุมความเร็ว ในการหมุน ซึงแต ่ ละวิธีจะใชอุปกรณและวิธีการทีแตกต ่ างกัน แตสิงหนึ ่ งที ่ จํ่ าเปนอยางยิงคื ่ อ วงจรขับมอเตอร (motor driver) ทังนี ้ เนื ้ องจากไมโครคอนโทรลเลอร ่ มีความสามารถในการจายกระแสทีจํ่ ากัดและคอนขางตําคื ่ อ 20mA (ใน กรณีใชไมโครคอนโทรลเลอร ATmega32U4) ในขณะทีมอเตอร ่ ตองการกระแสไฟฟามากกวานัน้ ดังนันวงจรขั ้ บ มอเตอรจะเขามาทําหนาทีนั่ น้ โดยรับสัญญาณกระตุน และสัญญาณกําหนดความเร็วในการควบคุมมอเตอรมาจาก ไมโครคอนโทรลเลอร สวนวงจรขับมอเตอรทําหนาทีขั่ บมอเตอรโดยตรง ใหหมุนหรือล็อกแกน หรือหมุนในทิศทางใด และถายทอดพลังงานไปยังมอเตอรเพือให ่ สามารถหมุนไดเร็วตามทีกํ่ าหนดมาจากไมโครคอนโทรลเลอร

8.2 ควบคุมความเร็วของมอเตอร ่ ความเร็วมาก ในการขับมอเตอรโดยปกติจะปอนแรงดันไฟตรงใหโดยตรง มอเตอรจะทํางานเต็มกําลัง ซึงอาจมี เกินไป ดังนันการปรั ้ บความเร็วของมอเตอรจึงใชวิธีลดแรงดันไฟฟาทีป่ อนใหกับมอเตอร วิธีทีนิ่ ยมคือ การปอนพัลส ไปขับมอเตอรแทน แลวปรับความกวางพัลสชวงบวก เพือให ่ ไดคาแรงดันเฉลียตามต ่ องการ วิธีการนีเรี้ ยกวา พัลสวิดธ มอดูเลเตอร (PWM) โดยความกวางพัลสชวงบวกเมือเที ่ ยบกับความกวางพัลสทังหมดเรี ้ ยกวา ดิวตีไซเกิ ้ ล โดยจะคิด คาดิวตีไซเกิ ้ ลเปนเปอรเซ็นตของคาความกวางพัลสทังหมด ้ ตัวอยางจากรูปที่ 8-1 (ข) มีคาดิวตี้ไซเกิล 50% หมายถึง ความกวางของพัลสชวงบวกมีความกวางเปน 50% ของความกวางทั้งหมด ดังนันแรงดั ้ นเฉลียที ่ ่ไดเทากับ (50 x 4.8) /100 = 2.4V สําหรับรูปที่ 8-1 (ค) และ (ง) เปนการ กําหนดคาดิวตี้ไซเกิล 75% และ 25% ตามลําดับ


  XT 132

แรงดัน (V)

แรงดัน (V)

4.8V

4.8V

แรงดันเฉลี่ย

ดิวตี้ไซเกิล 50%

2.4V

(ก) แรงดัน (V)

แรงดันเฉลี่ย

เวลา

ดิวตี้ไซเกิล 75%

4.8V

(ข) แรงดัน (V)

เวลา

แรงดันเฉลี่ย ดิวตี้ไซเกิล 25 %

4.8V

3.6V 1.2V

(ค)

เวลา

(ง)

เวลา

รูปที่ 8-1 แสดงการเปรียบเทียบคาแรงดันทีเกิ ่ ดขึนเมื ้ อใช ่ PWM (ก) ปอนสัญญาณไฟตรง (ข) PWM มีดิวตีไซเกิ ้ ล 50% (ค) PWM มีดิวตี้ไซเกิล 75% (ง) PWM มีดิวตี้ไซเกิล 25%

8.3 การสรางสัญญาณ PWM ของ Arduino ใน Arduino มีฟงกชัน่ analogWrite() ทําใหไมโครคอนโทรลเลอรสามารถสรางสัญญาณอะนาลอกสง ออกทางขาพอรตเอาตพุตได โดยอาศัยเทคนิคการสรางสัญญาณ PWM (Pulse Width Modulation) หรือสัญญาณมอดู เลชันทางความกว ่ างพัลส ผูใช  งานสามารถปรับคาดิวตีไซเกิ ้ ลของสัญญาณพัลสได โดยคาดิวตีไซเกิ ้ ลมีคาระหวาง 0 ถึง 255 เมือค ่ าเปน 0 แรงดันทีขาที ่ กํ่ าหนดไวจะมีคาคงทีเป ่ น 0V เมือมี ่ คาเปน 255 แรงดันทีขาพอร ่ ตนันเท ้ ากับ +5V สําหรับคาระหวาง 0 ถึง 255 จะทําใหขาทีกํ่ าหนดไวมีแรงดันเปลียนแปลงสลั ่ บไปมาระหวาง 0 และ 5V ถามีคาสูงขึน้ ชวงเวลาทีขาพอร ่ ตนันเป ้ น 5V จะนานขึน้ ถาคาเปน 51 สัญญาณพัลสจะมีระดับสัญญาณ +5V เปนเวลานาน 20% ของคาบเวลา และมีแรงดัน 0V นาน 80% ของคาบเวลา หรือมีคาดิวตี้ไซเกิลเทากับ 20%นันเอง ่ ถามีคาเปน 127 สัญญาณพัลสจะมีระดับสัญญาณ +5V เปนเวลานานครึ่งหนึ่งของคาบเวลา และ 0V นานครึ่งหนึ่งของคาบเวลา หรือมีคาดิวตี้ไซเกิล 50% ถามีคาเปน 191 นันคื ่ อ สัญญาณพัลสจะมีระดับสัญญาณ +5V เปนเวลานานสามสวนสีของคาบเวลา ่ และมีแรงดัน 0V นานหนึงส ่ วนสีของคาบเวลา ่ หรือมีคาดิวตี้ไซเกิล 75% ในรูปที่ 8-2 แสดงสัญญาณ PWM ที่คาดิวตี้ไซเกิลตางๆ


  XT 133

้ ลของสัญญาณพัลส ดิวตีไซเกิ สามารถคํานวณไดจาก

20%

tW 50%

T t D  w  100% T

75%

โดยที่ tw คือความกวางของพัลส T คือ คาบเวลาของสัญญาณ พัลส 1 ลูก นั่นหมายความวา ความถี่จะ ไมมีผลตอการปรับหรือเปลียนแปลง ่ ดิวตี้ไซเกิลแตอยางใด

รูปที่ 8-2 แสดงสัญญาณ PWM ทีค่ าดิวตี้ไซเกิลตางๆ คาแรงดันของสัญญาณพัลสจะไดเปนคาเฉลียของสั ่ ญญาณพัลส ซึงสามารถคํ ่ านวณไดจากความสัมพันธทาง คณิตศาสตรตอไปนี้ Output_voltage = (on_time / off_time) * max_voltage ้ เราสามารถนําสัญญาณ PWM ที่ไดจากคําสั่ง analogWrite() นีไปปรั บความสวางของ LED หรือตอ ขยายกระแสเพือควบคุ ่ มความเร็วของมอเตอรไฟตรงได หลังจากเรียกใชคําสังนี ่ แล ้ วขาพอรตทีกํ่ าหนดจะมีสัญญาณ PWM ส งออกมาอย างตอเนื่อง จนกวาจะมีการเรียกใชคําสั่ง a na logWrite ในรอบใหม หรือเรียกคําสั่ง digitalRead หรือ digitalWrite ที่ขาพอรตเดียวกัน ฮารดแวร Arduino Leonardo (ซึ่งแผงวงจร POP-XT ใชอางอิงถึง) มีขาพอรตที่ทําหนาที่เปนเอาตพุต อะนาลอก 5 ขา คือ ขา 3, 5, 9, 10 และ 11 สําหรับบนแผงวงจร POP-XT ใชขา 5, 9 และ 10 ในการเชื่อมตอกับวงจร ขับมอเตอร ในขณะที่ขา 3 มีจุดตอออกมาใชงาน โดยเปนขารวมกับขา SDA สวนขา 11 ถูกตอกับลําโพงเปยโซ ่ รูปแบบดังนี้ การสังให ่ ขาพอรตทํางานสรางสัญญาณ PWM ตองสั่งผานฟงกชั่น analogWrite() ซึงมี analogWrite(pin,value);

เมือ่ pin คือ หมายเลขขาพอรตทีต่ องการ (3, 5, 9 ถึง 11) ่ องการ คาจาก 0 ถึง 255 value คาดิวตี้ไซเกิลทีต


  XT 134

8.4 ฟงกชั่นขับมอเตอร เพื่อใหการเขียนโปรแกรมภาษา C/C++ เพื่อขับมอเตอรของหุนยนต POP-BOT XT ทําไดงายขึน้ จึงมีการ สรางฟงกชั่นขับมอเตอรขึน้ รวมเขาไวในไฟลไลบรารี popxt.h มีคําสั่งตางๆ ดังนี้ motor(_channel,_power); เลือกวงจรขับมอเตอรและกําหนดความเร็ว motor_stop(_channel); หยุดการทํางานของวงจรขับมอเตอรทีต ่ องการ fd(speed); เคลือนที ่ ไปข ่ างหนา ่ ถอยหลั ่ ง bk(speed); เคลือนที tl(speed); เลียวไปทางซ าย ้ ้ tr(speed); เลียวไปทางขวา sl(speed); หมุนตัวทางซาย sr(speed); หมุนตัวทางขวา ao(); มอเตอรหยุดทํางานทังหมด ้

8.4.1 motor ่ ไฟตรง เปนฟงกชั่นขับเคลือนมอเตอร รูปแบบ

void motor(char _channel,int _power) พารามิเตอร _channel - กําหนดชองเอาตพุตมอเตอรไฟตรงของหุนยนต  POP-BOT XT มีคา 1 และ 2 _power - กําหนดกําลังขับมอเตอร มีคาในชวง -100 ถึง 100 ถากําหนดคา _power เปนบวก (1 ถึง 100) ทําใหมอเตอรหมุนไปในทิศทางหนึ่ง ถากําหนดคา _power เปนลบ (-1 ถึง -100) มอเตอรจะถูกขับใหหมุนไปในทิศทางตรงขาม ถากําหนดคา _power เปน 0 มอเตอรหยุดหมุน ไมแนะนําใหกําหนดคาเปน 0 หากตองการใหมอเตอร หยุดหมุนควรเรียกใชฟงกชัน่ motor_stop ตัวอยางที่ 8-1 motor(1,60); // ขับมอเตอรชอง A ดวยกําลัง 60% ของกําลังสูงสุด motor(1,-60); // ขับมอเตอรชอง A ดวยกําลัง 60% มีทิศทางการหมุนตรงขามกับคําสังก ่ อนหนา ตัวอยางที่ 8-2 motor(2,100); // ขับมอเตอรชอง B ดวยกําลัง 100% อันเปนคากําลังสูงสุด


  XT 135

8.4.2 motor_stop เปนฟงกชั่นหยุดขับมอเตอร รูปแบบ

void motor_stop(char _channel) พารามิเตอร _channel - กําหนดชองเอาตพุตมอเตอรไฟตรง มีคา 1, 2 และ ALL โดย ALLเปนการเลือกใหมอเตอรทัง้ 2 ชองหยุดทํางานพรอมกัน ตัวอยางที่ 8-3 // หยุดขับมอเตอรชอง 1 motor_stop(1); motor_stop(2); // หยุดขับมอเตอรชอง 2 ตัวอยางที่ 8-4 motor_stop(ALL); // มอเตอรทัง้ 2 ชองหยุดทํางานพรอมกัน

8.4.3 fd มาจากคําวา forward เปนฟงกชั่นกําหนดใหหุนยนต POP-BOT XT เคลือนที ่ ไปข ่ างหนา รูปแบบ

fd(unsigned int speed) พารามิเตอร speed คือเปอรเซ็นตความเร็วของมอเตอรมีคาตั้งแต 0 ถึง 100 ตัวอยางที่ 8-5 ่ หุนยนต  เคลื่อนที่ไปขางหนาดวยความเร็ว 60 เปอรเซ็นต fd(60); // สังให

8.4.4 fd2 ่ างหนาแบบกําหนด มาจากคําวา forward2 เปนฟงกชั่นทีกํ่ าหนดใหหุนยนต POP-BOT XT เคลือนที ่ ไปข ความเร็วมอเตอรแยกอิสระ รูปแบบ

fd2(unsigned int speed1 ,unsigned int speed2) พารามิเตอร speed1 คือ คาความเร็วของมอเตอร A มีคาตั้งแต 0 ถึง 100% speed2 คือ คาความเร็วของมอเตอร B มีคาตั้งแต 0 ถึง 100% ตัวอยางที่ 8-6 ่ หุนยนต  เคลื่อนที่เปนวงกลม เนื่องจากมอเตอร B หมุนเร็วกวามอเตอร A คอน fd2(30,80); // คําสังให ขางมาก


  XT 136

8.4.5 bk มาจากคําวา backward เปนฟงกชันกําหนดใหหุนยนต POP-BOT XT เคลือนที ่ ถอยหลั ่ ง รูปแบบ

bk(unsigned int speed) พารามิเตอร speed คือเปอรเซ็นตความเร็วของมอเตอรมีคาตั้งแต 0 ถึง 100 ตัวอยางที่ 8-7 // กําหนดใหหุนยนต  POP-BOT XT เคลือนที bk(90); ่ ่ถอยหลังดวยความเร็ว 90 เปอรเซ็นต

8.4.6 bk2 มาจากคําวา backward2 เปนฟงกชั่นกําหนดใหหุนยนต ่ ถอยหลั  POP-BOT XT เคลือนที ่ งแบบกําหนดความ เร็วมอเตอรอิสระ รูปแบบ

bk2(unsigned int speed1 ,unsigned int speed2) พารามิเตอร speed1 คือเปอรเซ็นตความเร็วของมอเตอร A มีคาตั้งแต 0 ถึง 100 speed2 คือเปอรเซ็นตความเร็วของมอเตอร B มีคาตั้งแต 0 ถึง 100 ตัวอยางที่ 8-8 bk2(80,80); // เปนคําสังเคลื ่ ่อนถอยหลังตรงดวยความเร็วเทากัน ซึงทํ ่ างานเหมือนกับคําสัง่ bk() ทั้งฟงกชั่น fd2() และ bk2() มีไวเพื่อปรับแตงการทํางานของมอเตอรไฟตรงทั้ง 2 ตัวของหุนยนต POPBOT XT ซึงอาจมี ่ ความแตกตางกันดานความเร็วในการหมุน ใหทํางานไดอยางใกลเคียงกันมากทีสุ่ ดดวยการปรับคา speed1 และ speed2

8.4.7 tl และ tr มาจากคําวา turn left และ turn right หรือเลียวซ ้ ายและเลียวขวานั ้ นเอง ่ โดยการเลียวของฟ ้ งกชันทั ่ งสองนี ้ จะ ้ กําหนดใหมอเตอรตัวใดตัวหนึงของหุ ่ นยนต  หยุดอยูกั บที่ จุดหมุนของหุนยนต  จะอยูที ล่ อของมอเตอรทีหยุ ่ ดอยูกั บที่ รูปแบบ

tl(unsigned int speed) และ tr(unsigned int speed) พารามิเตอร speed คือ คาความเร็วของมอเตอร มีคาตั้งแต 0 ถึง 100 เปอรเซ็นต ตัวอยางที่ 8-9 tl(60); // กําหนดใหหุนยนต  เลี้ยวซายดวยความเร็ว 60 เปอรเซ็นต tr(100); // กําหนดใหหุนยนต  เลี้ยวขวาดวยความเร็ว 100 เปอรเซ็นต


  XT 137

8.4.8 sl และ sr มาจากคําวา spin left และ spin right หรือหมุนตัวทางซายและทางขวา ในฟงกชั่นนี้จะกําหนดใหมอเตอร ไฟตรงทั้งสองตัวของหุนยนตหมุนในทิศทางตรงกันขาม จุดหมุนของการเลี้ยวจึงอยูที่กึงกลางของหุ ่ นยนต รูปแบบ

sl(unsigned int speed) และ sr(unsigned int speed) พารามิเตอร speed คือ คาความเร็วของมอเตอร มีคา 0 ถึง 100% ตัวอยางที่ 8-10 sl(70); // กําหนดใหหุนยนต  เลี้ยวซายดวยความเร็ว 70% sr(100); // กําหนดใหหุนยนต  เลี้ยวขวาดวยความเร็ว 100%

8.4.9 ao มาจากคําวา all motor off เปนฟงกชั่นหยุดการทํางานของมอเตอรทั้งสองตัวพรอมกันเหมือนกับการเรียก ใชฟงกชั่น motor_stop(ALL); รูปแบบ

ao() ตัวอยางที่ 8-7 void setup() { fd(100); // หุนยนต  เคลื่อนที่ไปขางหนาดวยความเร็วสูงสุด sleep(2000); // เปนเวลา 2 วินาที ao(); // กําหนดใหมอเตอรหยุดทํางาน หุนยนต  จะหยุดเคลื่อนที่ทันที }


  XT 138

    XT ่ ยนโปรแกรมที่ A5-1 จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  เปดโปรแกรม Arduino IDE เพือเขี POP-BOT XT จากนันปลดสาย ้ USB ออก นําหุนยนต  มาวางทีพื่ น้ เปดสวิตชจายไฟ สังเกตการทํางานของหุนยนต  หลังจากเปดสวิตชเพื่อจายไฟใหหุนยนต  ทํางาน หุนยนต  จะเริมเคลื ่ ่อนที่ทันที โดยเริ่มเคลื่อนที่ตรงไปขาง หนากอน จะสังเกตเห็นวาไฟ LED ทีตํ่ าแหนงมอเตอรทังคู ้ ติดเปนสีเขียว จากนันอี ้ ก 1 วินาที LED จะเปลี่ยนเปน สีแดง ใหดูทิศทางการเคลื่อนที่ของหุนยนต  วาถูกตองหรือไมถาหุนยนต  เคลื่อนไมถูกตองใหสลับสายของมอเตอร จนหุนยนตเคลื่อนที่ไดถูกตอง #include <popxt.h> void setup() {} void loop() { fd(80); sleep(1000); bk(80); sleep(1000); }

โปรแกรมที่ A5-1 ไฟล ForwardBackward.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับทดสอบ ขับเคลือนหุ ่ นยนต  POP-BOT XT ใหเคลือนที ่ ไปข ่ างหนาและถอยหลังสลับกันอยางตอเนือง ่


  XT 139

   โปรแกรมที่ A1-2 เปนการขับเคลื่อนหุนยนตโดยกําหนดคาการจายกําลังใหกับลอแตละลอไมเทากัน สง ผลใหหุนยนต  เคลื่อนที่เปนวงกลม นอกจากนี้ในโปรแกรมนี้ยังเพิ่มเติมคําสั่งตรวจสอบการกดสวิตชเพื่อหยุดการ ทํางานของหุนยนต  ดวย ถาหากกดสวิตช OK บนบอรดควบคุม หุนยนต  จะหยุดทํางาน

#include <popxt.h> void setup() { fd2(30,90); sw_ok_press(); ao(); } void loop() {}

โปรแกรมที่ A5-2 ไฟล CircleMove.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับทดสอบขับเคลือน ่ หุนยนต  POP-BOT XT ใหเคลือนที ่ เป ่ นวงกลม ดวยการกําหนดใหความเร็วของมอเตอรแตละตัวของ หุนยนต  ไมเทากัน


  XT 140

      เคลื่อนที่ตรงแลวเลี้ยวสลับกันไป ทําใหเกิดเสนทางเคลื่อนที่ โปรแกรมที่ A5-3 เปนการสั่งงานใหหุนยนต เปนรูปสี่เหลี่ยม โดยการเคลื่อนที่จะเกิดขึ้นเมื่อกดสวิตช OK บนแผงวงจร POP-XT ของหุนยนต 

#include <popxt.h> void setup() { setTextSize(2); glcd(1,1,”Press OK”); glcd(2,1,”to Start”); sw_ok_press(); glcdClear(); glcd(1,1,”Moving...”); } void loop() { fd(80); sleep(900); tr(80); sleep(400); }

// ผนวกไลบรารีหลัก // กําหนดขนาดตัวอักษรเปน 2 เทา // แสดงขอความเริ่มตนการทํางาน // ตรวจสอบการกดสวิตช OK // แสดงขอความเริ่มตนการเคลื่อนที่ // เคลื่อนที่ตรงดวยกําลัง 80% // เลี้ยวขวาดวยกําลัง 80%

โปรแกรมที่ A5-3 ไฟล Rectangle_Running.pde โปรแกรมภาษา C ของ Arduino สําหรับทดสอบขับเคลือน ่ หุนยนต  POP-BOT XT ใหเคลือนที ่ เป ่ นสีเหลี ่ ยม ่


  XT 141

     เคลื่อนที่ไปในทิศทางตางๆ ประกอบดวย เคลื่อนที่ตรงไปขาง โปรแกรมที่ A5-4 เปนการสั่งงานใหหุนยนต หนา 0.6 วินาที เลียวซ ้ าย 0.4 วินาที ถอยหลัง 0.6 วินาที หมุนตัวไปทางขวา 0.3 วินาที ถอยหลัง 0.6 วินาที หมุนตัวไปทางซาย 0.3 วินาที จากนั้นวนกลับเริ่มตนเคลือนที ่ ่ขางหนา แลวเคลื่อนที่ตามรูปแบบเดิมอยางตอเนื่อง #include <popxt.h> // ผนวกไฟลไลบรารี่หลัก void setup() { glcdClear(); // เคลียรหนาจอ GLCD setTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทา glcd(1,1,”Press OK”); // แสดงขอความเริ่มตนการทํางาน glcd(2,1,”to Start”); sw_ok_press(); // วนรอจนกระทังกดสวิ ่ ตช beep(); // สงเสียงออกลําโพง glcdClear(); // เคลียรหนาจอ GLCD } void loop() { glcdFillScreen(GLCD_RED); // เคลียรหนาจอ GLCD พื้นหลังสีแดง fd(80); // เคลื่อนที่ดานหนาความเร็ว 80 เปอรเซ็นต sleep(600); // เปนเวลา 0.6 วินาที glcdFillScreen(GLCD_GREEN); // เคลียรหนาจอ GLCD พืนหลั ้ งสีเขียว tl(60); // เลี้ยวซายความเร็ว 60 เปอรเซ็นต sleep(400); // เปนเวลา 0.4 วินาที glcdFillScreen(GLCD_BLUE); // เคลียรหนาจอ GLCD พื้นหลังสีนํ้าเงิน bk(80); // ถอยหลังความเร็ว 80 เปอรเซ็นต sleep(600); // เปนเวลา 0.6 วินาที glcdFillScreen(GLCD_YELLOW); // เคลียรหนาจอ GLCD พืนหลั ้ งสีเหลือง sr(60); // หมุนตัวทางขวาความเร็ว 60 เปอรเซ็นต sleep(300); // เปนเวลา 0.3 วินาที glcdFillScreen(GLCD_MAGENTA); // เคลียรหนาจอ GLCD พืนหลั ้ งสีบานเย็น bk(80); // ถอยหลังความเร็ว 80 เปอรเซ็นต sleep(600); // เปนเวลา 0.6 วินาที glcdFillScreen(GLCD_WHITE); // เคลียรหนาจอ GLCD พื้นหลังขาว sl(60); // หมุนตัวทางซายความเร็ว 60 เปอรเซ็นต sleep(300); // เปนเวลา 0.3 วินาที }

โปรแกรมที่ A5-4 ไฟล MultiDirectionMove.ino โปรแกรมภาษา C ของ Arduino สําหรับทดสอบขับเคลือน ่ ่ ไปในทิ ่ ศทางตางๆ ทีหลากหลาย ่ หุนยนต  POP-BOT XT ใหเคลือนที


  XT 142

เมื่ออัปโหลดโปรแกรมเรียบรอยแลว ปลดสาย USB ออก นําหุนยนต  POP-BOT XT มาวางบนพื้น แลว เปดสวิตชจยไฟ รอจนกระทั่งหุนยนตพรอมทํางาน ทีจอแสดงผลแสดงข ่ อความ Press OK to Start

ใหกดสวิตช OK บนแผงวงจรควบคุมของหุนยนต POP-BOT XT หุนยนต  จึงจะเริ่มตนการเคลื่อนที่ตาม ทิศทางที่กําหนดในโปรแกรม และเมื่อมีการเปลี่ยนทิศทางหรือรูปแบบการเคลื่อนที่ จอแสดงผลจะมีการเปลี่ยน สีตามไปดวย เพื่อแจงใหทราบถึงการเปลี่ยนแปลงที่เกิดขึ้น

       ฟงกชัน่ fd2(speed1,speed2) และ bk2(speed1,speed2) เปนฟงกชันควบคุ ่ มการ เคลื่อนที่ของหุนยนต  ทีทํ่ างานเหมือนกับฟงกชัน่ fd() และ bk() ความตางอยูทีฟ่ งกชัน่ fd2() และ bk2() มีตัวแปร ทีใช ่ กําหนดความเร็วของมอเตอร 2 ตัว สําหรับมอเตอร A และ B ของหุนยนต  POP-BOT XT เนื่องจากการขับเคลื่อนหุนยนต POP-BOT XT ใชมอเตอร 2 ตัว ความไมเทากันของมอเตอรอาจสงผล ใหการเคลือนที ่ ตรงของหุ ่ นยนต  อาจเอียงไปดานใดดานหนึง่ ดังนันก ้ อนทีสั่ งงานให ่ หุนยนต  ทํางานอัตโนมัติ จะตอง กําหนดการเคลื่อนที่ของหุนยนต  ใหมีความเทียงตรงก ่ อน ในโปรแกรมที่ A5-5 เปนโปรแกรมตัวอยางที่ใชคําสั่งงายๆ ในการควบคุมใหหุนยนต  เคลื่อนที่ไปขางหนา โดยมีการปรับแตงความเร็วขอบมอเตอรแตละตัวดวยฟงกชัน่ fd2 และ bk2 เพือให ่ การเคลือนที ่ มี่ ทิศทางทีตรงมาก ่ ที่สุดเทาที่จะเปนไปได


  XT 143

#include <popxt.h> void setup() { setTextSize(2); glcd(1,1,”Press OK”); glcd(2,1,”to Start”); sw_ok_press(); glcdClear(); glcd(1,1,”Moving...”); fd2(70,70); } void loop() {}

// ผนวกไฟลไลบรารี่หลัก // กําหนดขนาดตัวอักษรเปน 2 เทา // แสดงขอความเริ่มตนการทํางาน // ตรวจสอบการกดสวิตช OK // แสดงขอความเริ่มตนการเคลื่อนที่ // ควบคุมใหหุนยนต  เคลื่อนที่ไปขางหนาดวยความเร็ว 70%

่ โปรแกรมที่ A5-5 ไฟล MoveAlignment.ino โปรแกรมภาษา C ของ Arduino สําหรับทดสอบขับเคลือน หุนยนต  POP-BOT XT ใหเคลือนที ่ ตรงโดยปรั ่ บแตงความเร็วผานฟงกชั่น fd เพื่อใหหุนยนต  เคลื่อนที่ ไดตรงมากทีสุ่ ดเทาทีเป ่ นไปได  เคลื่อนที่ สังเกตทิศทางของการเคลื่อนที่ หลังจากอัปโหลดโปรแกรม แลวทดลองปลอยใหหุนยนต กรณีที่ 1 หุนยนตเริมเคลื ่ ่อนที่เอียงไปทางซาย แสดงวามอเตอรทางดานซายหมุนชากวามอเตอรทางดานขวา สิ่งทีต่ องทําคือ เพิ่มความเร็วของ มอเตอรดานซายใหเร็วขึ้น โดยใหปรับที่ตัวแปร speed1 ของฟงกชัน่ fd2 ซึงการปรั ่ บคาตองคอยๆ เพิ่มคาทีละ นอย จนกระทังหุ ่ นยนตเคลื่อนที่ตรงมากที่สุด กรณีที่ 2 หุนยนตเริมเคลื ่ ่อนที่เอียงไปทางขวา แสดงวามอเตอรทางดานขวาหมุนชากวามอเตอรทางดานซาย สิ่งทีต่ องทําคือ เพิ่มความเร็วของ มอเตอรดานขวาใหเร็วขึ้น โดยใหปรับที่ตัวแปร speed2 ของฟงกชัน่ fd2 ซึงการปรั ่ บคาตองคอยๆ เพิ่มคาทีละ นอย จนกระทังหุ ่ นยนตเคลื่อนที่ตรงมากที่สุด



  XT 145



 XT   าดับตอจากการขับเคลือนหุ ่ นยนต  แบบพื้นฐานคือ การอานคาจากตัวตรวจจับเพือนํ ่ ามากําหนด การเรียนรูในลํ เปนเงือนไขในการเคลื ่ อนที ่ ่ ตัวตรวจจับพืนฐานที ้ สุ่ ดทีทํ่ าหนาทีนี่ คื้ อ สวิตช (switch) ในบทนีจะกล ้ าวถึง การใชงาน แผงวงจรสวิตชรวมกับหุนยนต  POP-BOT XT เพือนํ ่ ามาใชตรวจจับการชน ทําใหหุนยนต  รับรูได  วา เคลือนที ่ ไปพบ ่ ่ สิงกี ่ ดขวาง จากนันตั ้ วควบคุมจะทําการประมวลผลเพือกํ ่ าหนดการเคลือนที ่ ให ่ หุนยนต POP-BOT XT สามารถเคลือน ทีพ่ นสิงกี ่ ดขวางไปได อุปกรณสําคัญทีใช ่ ในการเรียนรูนี คื้ อ แผงวงจรสวิตช ZX-01 มีวงจรและการทํางานแสดงในรูปที่ 9-1 เมือสวิ ่ ตช ถูกกดซึงเที ่ ยบไดกับการชนกับสิงกี ่ ดขวาง สัญญาณลอจิกทีเอาต ่ พุตจะเปลียนจากลอจิ ่ ก “1” เปน “0” จนกวาจะปลอย หรือไมเกิดการชน สัญญาณเอาตพุตจะเปลียนกลั ่ บไปเปน “1” อีกครัง้ ดวยคุณสมบัติการทํางานของตัวตรวจจับแบบนี้จึงนํามากําหนดเงือนไขในการเคลื ่ อนที ่ ให ่ กับหุนยนต  POP้ ตชเขาทีด่ านหนาของหุนยนต  เมือหุ ่ นยนต  POP-BOT XT เคลือนที ่ ไปชนกั ่ บสิงกี ่ ดขวาง BOT XT ได โดยติดตังสวิ จะทําใหสวิตชถูกกด ตัวควบคุมรับรูถึ งการเปลียนแปลงของอิ ่ นพุตทีต่ อกับสวิตช จากนันทํ ้ าการควบคุมใหหุนยนต  เคลือนที ่ ถอยหลั ่ ง ตอดวยการเปลียนทิ ่ ศทางการเคลือนที ่ ่ เพียงเทานีหุ้ นยนต  ก็จะสามารถเคลือนที ่ ผ่ านสิงกี ่ ดขวางไปได

LED1

Indicator

+V

R2 10k

ที่ชองเอาตพุต : ถากดสวิตช จะสงลอจิก ”0” ออกไปที่เอาตพุต LED สีแดงติด ถาไมกดสวิตช จะสงลอจิก ”1” ออกไปที่เอาตพุต LED สีแดงดับ

R1 510

R3 220

DATA

Signal output S1 GND Switch

รูปที่ 9-1 รูปรางและวงจรของแผงวงจรสวิตช ZX-01 ทีใช ่ ในชุดหุนยนต  POP-BOT XT


  XT 146

  แผงวงจรสวิตช ZX-01 เปนอุปกรณอินพุตดิจิตอล เมื่อสวิตชถูกกดจะใหเอาตพุตเปนลอจิก “0” ถาไมมี การกด ใหเอาตพุตเปนลอจิก “1” ในกิจกรรมนีเป ้ นการเขียนโปรแกรมงายๆ เพื่อทดสอบบการอานคาสถานะของ สวิตชเขามา เพื่อควบคุมการขับเสียงออกลําโพง (A6.1) ตอสายของแผงวงจรสวิตช ZX-01 เขาทีจุ่ ดตอพอรต 22/A4 และ 23/A5

Press OK to Start

ATMega32U4

100 TB6612

(A6.2) เปดโปรแกรม Arduino1.0 แลวพิมพโปรแกรมที่ A6-1 บันทึกไฟลชือ่ TouchSwitchTest.ino (A6.3) เปดสวิตชจายไฟใหแกแผงวงจร POP-XT ของหุนยนต  POP-BOT XT รอ 10 วินาทีใหตัวแผงวงจรควบคุม พรอมทํางาน จากนันต ้ อสาย USB เขากับคอมพิวเตอร (A6.4) ทําการคอมไพลและอัปโหลดโปรแกรมลงในแผงวงจร POP-XT ของหุนยนต  POP-BOT XT (A6.5) รันโปรแกรม ทีจอแสดงผลแสดงข ่ อความ Press OK To Start

่ างาน กดสวิตช OK บนแผงวงจร POP-XT ของหุนยนต POP-BOT XT เพื่อเริมการทํ จากนันทดลองกดสวิ ้ ตชของแผงวงจร ZX-01 ทีต่ อกับพอรต 22/A4 ไดยินเสียงความถี่ 1kHz ดังออกจากลําโพง นาน 0.3 วินาที และจอภาพจะกลายเปนสีแดง หาก กดสวิตชคางไว จะไดยินเสียงดังตอเนื่องเปนจังหวะ ทดลองกดสวิตชของแผงวงจร ZX-01 ทีต่ อกับพอรต 23/A5 ไดยินเสียงความถี่ 2kHz (เสียงแหลมกวา) ดังออกจากลําโพง นาน 0.3 วินาที และจอภพากลาย เปนสีเหลือง หากยังกดสวิตชคางไว จะไดยินเสียงดังตอเนื่องเปนจังหวะ


  XT 147

#include <popxt.h> void setup() { setTextSize(2); glcd(1,1,”Press OK”); glcd(2,1,”to Start”); sw_ok_press(); glcdClear(); glcd(1,1,”Let’s go!”); } void loop() { if(in(22)==0) { sound(1000,300); glcdFillScreen(GLCD_RED); } if(in(23)==0) { sound(2000,300); glcdFillScrren(GLCD_YELLOW); } }

// ผนวกไฟลไลบรารีหลัก // กําหนดขนาดตัวอักษรเปน 2 เทา // แสดงขอความเริ่มตน // ตรวจสอบการกดสวิตช OK // แสดงขอความพรอมทํางาน

// ถากดสวิตชตําแหนง 22 // ขับเสียงความถี่ 1kHz // เปลี่ยนสีหนาจอเปนสีแดง // ถากดสวิตชตําแหนง 23 // ขับเสียงความถี่ 2kHz // เปลี่ยนสีหนาจอเปนสีเหลือง

โปรแกรมที่ A6-1 ไฟล TouchSwitchTest.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับทดสอบการ อานคาจากสวิตชทีพอร ่ ตดิจิตอลของหุนยนต  POP-BOT XT


  XT 148

 XT เมื่อมีการติดตั้งสวิตช 2 ตัวใหแกหุนยนต  จะทําใหเกิดเหตุการณทีไม ่ ซํากั ้ น 4 กรณี อันนําไปสูการกํ  าหนด ใหหุนยนต  ทํางานแตกตางกันไป เหตุการณทังหมดประกอบด ้ วย 1. ไมกดสวิตชเลย : หุนยนต  POP-BOT XT หยุดเคลื่อนที่ 2. กดสวิตชพรอมกันสองตัว : หุนยนต  POP-BOT XT เคลื่อนที่ไปขางหนา 3. กดสวิตชดานซายทีต่ อกับพอรต 22/A4 เพียงตัวเดียว : หุนยนต  POP-BOT XT เลียวซ ้ าย 4. กดสวิตชดานซายทีต่ อกับพอรต 23/A5 เพียงตัวเดียว : หุนยนต  POP-BOT XT เลียวขวา ้ #include <popxt.h> // ผนวกไฟลไลบรารี่หลัก void setup() { setTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทา glcd(1,1,”Press OK”); // แสดงขอความเริ่มตน glcd(2,1,”to Start”); sw_ok_press(); // ตรวจสอบการกดสวิตช OK glcdClear(); glcd(1,1,”Let’s go!”); // แสดงขอความพรอมทํางาน } void loop() { if(in(22)==0&&in(23)==0) // สวิตชถูกกดทังสองตั ้ วหรือไม { fd(60); // ถาใช เคลื่อนที่ไปดานหนา } else if(in(22)==0) // สวิตชทีพอร ่ ต 22 ถูกกดหรือไม { tl(60); // ถาใช ควบคุมใหหุนยนต  เลี้ยวซาย } else if(in(23)==0) // สวิตชทีพอร ่ ต 23 ถูกกดหรือไม { tr(60); // ถาใช ควบคุมใหหุนยนต  เลี้ยวขวา } else { ao(); // ถาไมกดสวิตชหุนยนต  หยุดทํางาน } } สิงควรทราบจากโปรแกรม ่ ่ ใช ่ ในการตรวจสอบเงื่อนไขของโปรแกรมนี้ มีการใชคําสัง่ && หรือแอนด เพือเชื ่ อมและตรวจสอบเงื ่ ่อน คําสังที ไข 2 เงื่อนไข โดยเงื่อนไขจะตองเปนจริงทั้งคู ผลลัพธทีได ่ จึงจะเปนจริง จากโปรแกรมคือ ตองเกิดการกดสวิตชทัง้ สองตัว เงื่อนไข if ชุดแรกจึงจะเปนจริง

โปรแกรมที่ A7-1 ไฟล RemoteSwitch.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับทดสอบอานคา จากสวิตชเพือใช ่ ควบคุมการเคลือนที ่ ของหุ ่ นยนต  POP-BOT XT


  XT 149

จากเหตุการณขางตนนํามากําหนดเปนเงือนไขเพื ่ ่อเขียนโปรแกรมควบคุมการเคลือนที ่ ของหุ ่ นยนต  POPBOT XT ไดตามโปรแกรมที่ A7-1 (A7.1) ทําการถอดแผงวงจรสวิตช ZX-01 ทังสองตั ้ วออกจากโครงหุนยนต  โดยยังคงตอสายกับแผงวงจร POP-XT บนหุนยนต  POP-BOT XT อยู ดังนันจึ ้ งดูเหมือนแผงวงจรสวิตช ZX-01 เปนรีโมตคอนโทรลแบบมีสายทีต่ อเขากับ ตัวหุนยนต  POP-BOT XT

(A7.2) เขียนโปรแกรมที่ A7-1 ทําการคอมไพลและอัปโหลดไปยังหุนยนต POP-BOT XT ้ วควบคุมการเคลื่อนที่ของหุนยนต  POP-BOT XT ตามตองการ (A7.3) รันโปรแกรม แลวทดลองใชสวิตชทังสองตั


  XT 150

   จากกิจกรรมที่ 7 ไดเรียนรูการใชสวิตชในการควบคุมการเคลือนที ่ ของหุ ่ นยนต  POP-BOT XT เมือนํ ่ าสวิตช กลั บมาติ ดตั้ งที่ดานหนาของหุนยนต POP-BOT X T แล วแกไขโปรแกรมใหม โดยยังคงใชหลักการเดิมคือ ่ การกดสวิตขเปนเงื่อนไขสําคัญในการเคลื่อนที่ของหุนยนต  เพียงแตคราวนีหุ้ นยนต  POP-BOT XT จะเคลื่อนทีไป อยางตอเนือง ่ เมื่อสวิตชถูกกด นันคื ่ อ เกิดการชนกับสิงกี ่ ดขวางตรงหนา หรือดานขาง โปรแกรมที่สรางขึนใหม จะชวยในการตัดสินใจของหุนยนตตอไปวา จะเคลื่อนที่ตอไปอยางไร เพื่อใหสามารถผานสิ่งกีดขวางไปได

สําหรับในกิจกรรมนี้ กําหนดใหเมื่อเริมทํ ่ างาน หุนยนต  POP-BOT XT เคลื่อนที่ตรงไปขางหนา โดยมีการ ตรวจสอบการชนอยูตลอดเวลา  เมื่อสวิตชทางซายถูกกดหรือถูกชน หุนยนต  POP-BOT XT จะเคลื่อนที่ถอยหลัง แลวหมุนตัวเพื่อเปลี่ยนทิศทางการเคลื่อนที่ไปทางขวา


  XT 151

ในทางตรงขามหากเกิดการชนที่สวิตชดานขวา หุนยนต จะเคลื่อนที่ถอยหลังเชนกัน แลวหมุนตัวเพื่อ เปลี่ยนทิศทางการเคลื่อนที่ไปทางซาย

จากแนวคิดในการทํางานนํามาสรางเปนโปรแกรมควบคุมหุนยนต POP-BOT XT ใหเคลื่อนที่หลบหลีก สิ่งกีดขวางดวยการชนไดดังแสดงในโปรแกรมที่ A8-1 (A8.1) เขียนโปรแกรมที่ A8-1 ทําการคอมไพลและอัปโหลดไปยังหุนยนต POP-BOT XT (A8.2) ปลดสาย USB ออก แลวนําหุนยนต  ไปวางบนพื้น จัดเตรียมสิ่งกีดขวาง จากนันรั ้ นโปรแกรม ทีหน ่ าจอแสดงผลแสดงขอความ Press OK to Start

 POP-BOT XT สังเกตการเคลื่อนที่ของหุนยนต  POP-BOT XT ในภาวะที่ชน ใหกดสวิตช OK ทีหุ่ นยนต และไมชนสิ่งกีดขวาง ตรวจสอบดูวา มีการทํางานตรงตามเงื่อนไขที่กําหนดไวหรือไม


  XT 152

// ผนวกไฟลไลบรารีหลัก #include <popxt.h> void setup() { setTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทา glcd(1,1,”Press OK”); // แสดงขอความเริ่มตน glcd(2,1,”to Start”); sw_ok_press(); // ตรวจสอบการกดสวิตช OK glcdClear(); glcd(1,1,”Let’s go!”); // แสดงขอความพรอมทํางาน } void loop() { fd(70); if(in(22)==0) // ตรวจสอบการชนของสวิตชดานซาย { bk(80); // ถอยหลัง sleep(300); sr(80); // เลี้ยวขวา sleep(200); } if(in(23)==0) // ตรวจสอบการชนของสวิตชดานขวา { bk(80); // ถอยหลัง sleep(400); sl(80); // เลี้ยวซาย sleep(400); } } สิงที ่ ่ควรทราบจากโปรแกรม สังเกตวา โปรแกรมนีกํ้ าหนดคาหนวงเวลาในฟงกชัน่ Sleep() ของการถอยหลังและการเลียวซ ้ ายขวาไวไมเทากัน ทังนี ้ ้เปนการชวยในกรณีทีหุ่ นยนต  เคลื่อนที่เขาไปติดอยูในมุม เนื่องจากการถอยและเลี้ยวดวยเวลาที่ไมเทากัน จะทํา ใหหุนยนต  เคลื่อนที่หลุดออกมาจากมุมไดงายขึ้น

โปรแกรมที่ A8-1 ไฟล ObjectAvoider.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับควบคุมหุนยนต POP-BOT XT ใหเคลือนที ่ หลบหลี ่ กสิงกี ่ ดขวางดวยการชนหรือสัมผัส


  XT 153



XT   หนึงภาระกิ ่ จของการเรียนรูเพื  อควบคุ ่ มหุนยนต  อัตโนมัติขนาดเล็กคือ การตรวจจับเสนและการเคลือนที ่ ตาม ่ ้ โดยเนือหาในบทนี ้ จะเริ ้ มต ่ นดวยการอธิบายการ เสน สําหรับชุดหุนยนต  POP-BOT XT ก็สามารถปฏิบัติภาระกิจนีได ทํางานของตัวตรวจจับแสงสะทอนอินฟราเรดซึงนํ ่ ามาประยุกตใชงานเปนตัวตรวจจับเสน การอานคาจากตัวตรวจ ่ จับในพื้นที่ที่มีสีตางกัน จากนันเข ้ าสูการทดลองเขี  ยนโปรแกรมภาษา C เพือควบคุ ่ มใหหุนยนต POP-BOT XT เคลือน ทีตามเส ่ นทังแบบไม ้ พิจารณาทางแยกและพิจารณาทางแยก

10.1 คุณสมบัติของแผงวงจรตรวจจับแสงสะทอนอินฟราเรด เปนแผงวงจรทีใช ่ ในการตรวจสอบการสะทอนของแสงอินฟราเรดของตัวตรวจจับแสงสะทอนอินฟราเรด ซึงรวมตั ่ วสงและตัวรับไวในตัวถังเดียวกัน โดยตัวตรวจจับแสงสะทอนอินฟราเรดทีนํ่ ามาใชคือ TCRT5000 ในรูปที่ 10-1 แสดงการทํางานของแผงวงจรตรวจจับแสงสะทอนอินฟราเรดเมื่อนํามาใชงานกับพื้นผิวสีขาวและดํา เมือจ ่ ายไฟเลียง ้ LED อินฟราเรดภายในตัวโมดูล TCRT5000 จะเปลงแสงออกมาตลอดเวลา สวนตัวรับซึง่ เปนโฟโตทรานซิสเตอรจะไดรับแสงอินฟราเรดจากการสะทอนกลับ โดยปริมาณของแสงที่ไดรับจะมากหรือนอย ขึนอยู ้ กั บวา มีวัตถุมากีดขวางหรือไม และวัตถุนันมี ้ ความสามารถในการสะทอนแสงอินฟราเรดไดดีเพียงไร ซึงขึ ่ นกั ้ บ ลักษณะพืนผิ ้ วและสีของวัตถุ โดยวัตถุสีขาวผิวเรียบจะสะทอนแสงอินฟราเรดไดดี ทําใหตัวรับแสงอินฟราเรดไดรับ แสงสะทอนมาก สงผลใหแรงดันทีเอาต ่ พุตของวงจรสูงตามไปดวย ในขณะทีวั่ ตถุสีดําสะทอนแสงอินฟราเรดไดนอย ทําใหตัวรั บอิ นฟราเรดสงแรงดันออกมาตํา่ ดวยคุณสมบั ติดังกลาวจึงนิยมนําแผงวงจรตรวจจับแสงสะทอน อินฟราเรดนีมาใช ้ ในการตรวจจับพื้นหรือเสน โดยตองติดตังไว ้ ดานลางของโครงหุนยนต 

510 10k

+V

TCRT5000

OUT

แรงดันเอาตพุตคาสูง

510

GND

LED อินฟราเรด

10k

กระแสไฟฟา

TCRT5000

กระแสไฟฟา

+V

OUT

แรงดันเอาตพุตคาต่ํา GND

LED อินฟราเรด โฟโตทรานซิสเตอร พื้นสีขาว

โฟโตทรานซิสเตอร พื้นสีดํา

รูปที่ 10-1 แสดงการทํางานของแผงวงจรตรวจจับแสงสะทอนอินฟราเรดกับพืนผิ ้ วสีขาวและดํา


  XT 154

่ บเคลือนหุ ่ นยนต  ตรวจจับเสน 10.2 การเตรียมความพรอมกอนพัฒนาโปรแกรมเพือขั 10.2.1 เตรียมอุปกรณสําหรับสรางสนามทดสอบ ในการพัฒนาโปรแกรมเพือควบคุ ่ มใหหุนยนต  เคลือนที ่ ตามเส ่ น โดยใชตัวตรวจจับแสงสะทอนอินฟราเรดใน การวิเคราะหเสนและพืนสนามนั ้ น้ จะเปนการกําหนดเงือนไขเพี ่ อเปรี ่ ยบเทียบกับคาอางอิงคาหนึงที ่ ได ่ จากการทดสอบ อานคาของสภาวะแสงทีได ่ จากเสนและพืนสนามที ้ ใช ่ งานจริง โดยอาศัยความแตกตางของการสะทอนแสงอินฟราเรด ของแตละพืนผิ ้ วทีมี่ สีตางกัน เชน พืนผิ ้ วสีขาวสามารถสะทอนแสงอินฟราเรดไดดี สวนพืนผิ ้ วสีดําสามารถสะทอนแสง อินฟราเรดไดนอย เนืองจากสี ่ ดํามีความสามารถในการดูดกลืนแสงอินฟราเรดไดมาก การเรียนรูในบทนี  เลื ้ อกใชสนาม ทดสอบอางอิงทีมี่ พืนสนามเป ้ นสีขาวและเสนเปนสีดํา ดังนันขอแนะนํ ้ าใหผูพั ฒนาสรางสนามทดสอบขึนมาก ้ อน สําหรับสนามทดสอบตัวอยางที่ใชในหนังสือเลมนี้ ทําจากแผนพลาสติกลูกฟูก (หรือชื่อเรียกกันทัวไปว ่ า แผนฟวเจอรบอรด) มาติดเทปสีดํา โดยมีอุปกรณและเครื่องมือที่ใชดังนี้ 1. แผนพลาสติกลูกฟูก (หรือชือเรี ่ ยกทัวไปว ่ า แผนฟวเจอรบอรด) สีขาวและดํา ขนาด 90 x 60 เซนติเมตร อาจเล็กใหญกวานีก็้ ไดอยางละ 1 แผนขอใหมีพืนที ้ มากพอสํ ่ าหรับการเคลือนที ่ ของหุ ่ นยนต  POP-BOT XT ่ ความยืดหยุนสู  ง สามารถ 2. เทปพันสายไฟสีดําขนาด 1 นิว้ จํานวน 2 มวน แนะนํายีห่ อ 3M เนืองจากมี ติดเปนเสนโคงไดดี 3. กรรไกรสําหรับตัดเทปพันสายไฟ

่ างระหวางเสนและพืนสนาม ้ 10.2.2 กําหนดคาอางอิงเพือแยกความแตกต ่ ในการเปรียบเทียบเพือให ่ หุนยนต  ทราบวา ตัวตรวจจับพบเสนหรือพืนสนามนั ้ น้ ในการกําหนดคาอางอิงเพือใช โดยทัวไปจะอาศั ่ ยการเขียนโปรแกรมอานคาอะนาลอกจากแผงวงจรตรวจจับแสงสะทอนอินฟราเรดแตละตัวขึนมา ้ แสดงผลเพือสั ่ งเกตคาผลลัพธทีได ่ จากเสนและพืนสนามมี ้ คาแตกตางกันเพียงไร ปกติแลวคาทังสองต ้ องแตกตางกันพอ สมควร ในการเขียนโปรแกรมภาษา C ดวย Arduino เพื่ออานคาจากแผงวงจรตรวจจับแสงสะทอนอินฟราเรดของ แผงวงจรควบคุมในหุนยนต  POP-BOT XT จะใชฟงกชั่น analog ซึงให ่ คาผลลัพธ 0 ถึง 1023 เมื่อแผงวงจรตรวจ จับแสงสะทอนอินฟราเรดไปอยูบริเวณตําแหนงของเสนสีดําจะใหคาตํามี ่ แนวโนมเอียงไปทางคา 0 ถาไปอยูใน บริเวณพื้นสนามสีขาวจะใหคาสูงที่มีแนวโนมเอียงไปทางคา 1023 สามารถทดสอบไดจากกิจกรรมที่ 9 ซึงช ่ วยให ผูพั ฒนาโปรแกรมสามารถกําหนดคาอางอิงสําหรับใชเปรียบเทียบเพือแยกแยะระหว ่ างเสนและพืนสนาม ้ ซึงจะนํ ่ า ไปใชในการพัฒนาโปรแกรมเพื่อควบคุมใหหุนยนต POP-BOT XT สามารถตรวจจับและเคลือนที ่ ตามเส ่ นได


  XT 155

  ในกิจกรรมนีเป ้ นการอานคาจากแผงวงจรตรวจจับแสงสะทอนอินฟราเรด ZX-03 เพื่อนําคาที่อานไดนีมา ้ แยกแยะวา พื้นทีหรื ่ อเสนทีทํ่ าการตรวจจับนันเป ้ นสีขาวหรือดํา โดยผลของการอานคาจากตัวตรวจจับจะถูกนํามา แสดงที่หนาจอแสดงผลของหุนยนต (A9.1) เปดโปรแกรม Arduino1.0 เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A9-1 (A9.2) จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT XT ปลดสาย USB ออก (A9.3) สรางแผนทดสอบสี โดยกําหนดพื้นผิวทังสี ้ ขาวและสีดํา มีขนาดไมนอยกวา 30x30 ซม. ดังรูป

่ อแผงวงจร ZX-03 ทังสองตั ้ วใหถูกตองกอนการทดสอบ โดย ZX-03 ดานซายตองตอ (A9.4) ตรวจสอบการเชือมต กับพอรต 18/A0 และ ZX-03 ดานขวาตอกับพอรต 19/A1 #include <popxt.h> // ผนวกไฟลไลบรารี่หลัก void setup() { setTextSize(3); glcdMode(3); glcd(1,1,"Press OK"); //แสดงขอความที่จอแสดงผล sw_ok_press(); // วนรอจนกระทังกดสวิ ่ ตช OK } void loop() { glcd(1,0,"L=%d ",analog(0)); // อานคาจากแผงวงจร ZX-03 ดานซาย glcd(3,0,"R=%d ",analog(1)); // อานคาจากแผงวงจร ZX-03 ดานขวา sleep(100); }

โปรแกรมที่ A9-1 ไฟล SurfaceRead.pde โปรแกรมภาษา C ของ Arduino1.0 สําหรับอานคาจากแผงวงจร ตรวจจับแสงสะทอนอินฟราเรดแสดงผลผานจอภาพกราฟก LCD สีของหุนยนต  POP-BOT XT


  XT 156

TB6612

R=100

100

L=100

(A9.5) นําหุนยนต  POP-BOT XT ทีโปรแกรมแล ่ วจากขันตอนที ้ ่ (A9.3) ไปวางบนแผนทดสอบฝงสี  ดํา อานคาได 80 ถึง 250

100 TB6612

TB6612

R=900

100

L=900

 POP-BOT XT ไปวางบนแผนทดสอบฝงสี  ขาว (A9.6) นําหุนยนต อานคาได 700 ถึง 1000

100 TB6612

จากการทดลองพบวา คาทีอ่ านไดจากสีขาวมีคาอยูประมาณ  700 ถึง 1000 คาทีอ่ านไดจากสีดํามีคา อยูประมาณ  80 ถึง 250 ดังนั้นคาทีเหมาะสม ่ เพื่อใชเปนคาอางอิงจะอยูที ่ (700+250) /2 = 500 ในกรณี ยกตัวหุนยนต  ขึ้นจากพื้น เพื่อไมใหเกิดการสะทอน คาทีอ่ านไดควรมีคาไมเกิน 30


  XT 157

   นีคื่ อตัวอยางกิจกรรมประยุกตเพือสร ่ างระบบกันขโมยอยางงายๆ เมือหุ ่ นยนต  ถูกยกขึนจากพื ้ น้ (โดยทียั่ งมี การจายไฟอยู) แผงวงจรตรวจจับแสงสะทอนอินฟราเรด ZX-03 ทีติ่ ดตังอยู ้ ใต  หุนยนต  จะไมสามารถตรวจจับแสงสะทอน ได คาทีอ่ านไดจึงนอยมาก (นอยกวาคาของสีดํา) จึงนําความแตกตางของระดับขอมูลนีมาใช ้ ประโยชนได (A10.1) เปดโปรแกรม Arduino1.0 เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A10-1 (A10.2) จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT XT ปดสวิตช ปลดสาย USB ออก (A10.3) นําหุนยนต  วางไวบนพื้น แลวจึงเปดสวิตชจายไฟแกหุนยนต  ขณะนี้หุนยนต  จะไมมีการทํางานใดๆ มีเพียงไฟแสดงสถานะไฟเลี้ยงติดอยูเทานัน้ และหนาจอแสดงผล เปนสีดํา (A10.4) ทดลองยกหุนยนต  ขึ้นจากพื้น หุนยนต  จะขับเสียงออกทางลําโพง พื้นจอแสดงผลเปลียนเป ่ นสีแดง เพื่อแจงเตือนใหทราบวา ขณะนี้หุน ยนตถูกยกขึ้นจากพื้น #include <popxt.h> void setup() {} void loop() { if(analog(0)<20) { sound(2500,500); glcdFillScreen(GLCD_RED); } else { glcdClear(); } }

// ผนวกไฟลไลบรารี่หลัก

// ตรวจสอบคาจาก ZX-03 ดานซาย // สงเสียงเตือนออกลําโพง // พืนจอแสดงผลเปลี ้ ่ยนเปนสีแดง

// พืนจอแสดงผลเป ้ นสีดํา

โปรแกรมที่ A10-1 ไฟล AlarmBOT.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับตรวจจับการยก หุนยนต  POP-BOT XT ขึนจากพื ้ ้น


  XT 158

   กิจกรรมนีต้ อยอดมาจากกิจกรรมที่ 10 เมื่อหุนยนต  POP-BOT XT สามารถตรวจจับสภาวะการไมมีแสง สะทอนได จึงนําความสามารถนีมาใช ้ ในการตรวจจับพื้นที่ทีมี่ ขอบเขต เชน บนโตะ หรือบนกระดานที่อยูสู งจาก พื้น แลวเขียนโปรแกรมเพื่อทําใหหุนยนต  POP-BOT XT สามารถเคลื่อนที่อยูในพื  ้นที่กําหนด ่ บนโต ่ ะอยางตอเนือง ่ โดยมีแผงวงจรตรวจจับแสงสะทอน ในกิจกรรมนี้หุนยนต  POP-BOT XT จะเคลือนที ZX-03 ทังสองตั ้ วทําหนาทีตรวจจั ่ บวา หุนยนต  ยังอยูเคลื  อนที ่ อยู ่ บนโต  ะ เมื่อใดก็ตามทีแผงวงจรตรวจจั ่ บ ZX-03 อาน คาแสงสะทอนไดนอย แสดงวา หุนยนต  กําลังจะออกนอกพื้นที่หรือกําลังจะเคลื่อนที่ตกโตะ ก็จะตองควบคุมให หุนยนต  เคลื่อนที่ถอยหลังทันที จากนันเปลี ้ ยนเส ่ นทาง ดวยการทํางานแบบนี้หุนยนต  POP-BOT XT จะสามารถ เคลื่อนทีอยู ่ บนโต  ะไดอยางตอเนื่อง

(A11.1) เปดโปรแกรม Arduino1.0 เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A11-1 #include <popxt.h> int L,R; void setup() { setTextSize(2); glcd(1,1,"Press OK"); glcd(2,1,"to Start"); sw_ok_press(); glcdClear(); glcd(1,1,"Moving..."); }

// ผนวกไฟลไลบรารี่หลัก

// กําหนดขนาดตัวอักษรเปน 2 เทา // แสดงขอความเริ่มตน // ตรวจสอบการกดสวิตช OK // แสดงขอความพรอมทํางาน


  XT 159

void loop() { fd(60); // เคลื่อนที่ตรงไปขางหนา L=analog(0); // กําหนดใหตัวตรวจจับทีช่ อง A0 เปนตัวตรวจจับดานซาย R=analog(1); // กําหนดใหตัวตรวจจับทีช่ อง A1 เปนตัวตรวจจับดานซาย if (L<500&&R<500) // ตัวตรวจจับทังสองตั ้ วออกนอกโตะ { bk(80); // ถอยหลัง sound(1000,100); // ขับเสียงแจงเปลี่ยนเสนทางเคลื่อนที่เนื่องจากพบวา กําลังจะออกนอกโตะ sleep(500); sr(60); // หมุนขวาเพือเปลี ่ ่ยนทิศทางการเคลื่อนที่ sleep(300); } else if(L<500) // ตัวตรวจจับดานซายออกนอกโตะ { bk(80); // ถอยหลัง sound(1500,100); // ขับเสียงแจงเปลี่ยนเสนทางเคลื่อนที่ sleep(400); sr(60); // หมุนขวาเพือเปลี ่ ่ยนทิศทางการเคลื่อนที่ sleep(300); } else if(R<500) // ตัวตรวจจับดานขวาออกนอกโตะ { bk(80); // ถอยหลัง sound(1500,100); // ขับเสียงแจงเปลี่ยนเสนทางเคลื่อนที่ sleep(300); sl(60); // หมุนซายเพือเปลี ่ ่ยนทิศทางการเคลื่อนที่ sleep(500); } } คําอธิบายโปรแกรมเพิมเติ ่ ม โปรแกรมนีสร ้ างตัวแปรขึ้นมา 2 ตัวคือ L และ R สําหรับเก็บคาที่อานไดจากแผงวงจรตรวจจับแสงสะทอน อินฟราเรด ZX-03 ทังด ้ านซายและขวา จากนั้นนําคาของตัวแปรมาตรวจสอบในคําสัง่ IF เมื่อพบวา หุนยนต  กําลังจะ เคลื่อนที่ออกนอกพืนโต ้ ะ ก็จะสังให ่ หุนยนต  ถอยหลัง แลวสงเสียงออกลําโพง จากนั้นหมุนตัวเพื่อเปลี่ยนทิศทาง จะพบวา มีการเรียกใชคําสัง่ sound ตอจากคําสังถอยหลั ่ ง (bk();) ทังนี ้ ้เนื่องจากคําสัง่ sound ตองใชเวลาใน การทํางาน ถาเรียกใชกอนที่จะถอยหลัง หุนยนต  อาจตกจากโตะในขณะทีหุ่ นยนต  กําลังขับเสียงออกลําโพง

โปรแกรมที่ A11-1 ไฟล EdgeDetect.ino โปรแกรมภาษา C สําหรับควบคุมหุนยนต  POP-BOT XT ไมใหเคลือนที ่ ตกโต ่ ะ


  XT 160

(A11.2) จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT XT ปดสวิตช ปลดสาย USB ออก (A11.3) นําหุนยนต  วางไวบนโตะ เปดสวิตชจายไฟแกหุนยนต  กดสวิตช OK เพื่อเริมต ่ นการทํางาน หุนยนต  จะเคลือนที ่ ตรงมาข ่ างหนาอยางตอเนืองจนกระทั ่ งแผงวงจตรวจจั ่ บแสงสะทอนอินฟราเรด ZX-03 ตัวใดตัวหนึงหรื ่ อทั้งคูเลยขอบโตะออกมา นั่นคือ พบวา หุนยนต  กําลังจะเคลื่อนที่ตกโตะ หุนยนตจะถอยหลัง แลวหมุนตัวไปในทิศทางตรงขามกับแผงวงจรตรวจจับ ZX-03 ดานที่ตรวจพบวา ไมมีการสะทอนแสง นั่นคือ แผงวงจรตรวจจับไมอยูบนโต  ะแลว กรณีตัวตรวจจับทั้งสองตัวพนขอบโตะ การเคลื่อนที่เปนดังนี้

2 1 00

3

1 00

100

TB 66 12

TB 66 12

1

TB 66 12

5

6

100

4

10 0

TB 66 12

100

TB 661 2

TB6 61 2

100

กรณีตัวตรวจจับดานซายพนขอบโตะ การเคลื่อนที่เปนดังนี้

10 0

TB6 61 2

100

TB 661 2

TB6 61 2

กรณีตัวตรวจจับดานขวาพนขอบโตะ การเคลื่อนที่เปนดังนี้

100 61

2

10 T B6

TB6 612

TB

66

12

10 0

0


  XT 161

XT จากกิจกรรมที่ 9 เปนการทดสอบใหทราบวา หุนยนต  POP-BOT XT ตัวทีกํ่ าลังใชงานนีมี้ คาอางอิงหรือ จุดตัดสินใจระหวางสีดําและขาวอยูที่ 500 ดังนั้นถาคาทีอ่ านไดจากแผงวงจรตรวจับแสงะสะทอนอินฟราเรด ZX03 ตํ่ากวา 500 จะไดรับการตีความวาเปนสีดําเสมอ เพื่อเปนการยืนยันผลการตรวจจับในกิจกรรมนีจึ้ งกําหนดใหหุนยนต  POP-BOT XT เคลื่อนที่ตรงมาขาง หนาอยางอิสระ จนหระทั่งพบเสนสีดํา หุนยนต  POP-BOT XT จะตองหยุดการเคลื่อนที่ทันที

(A12.1) เปดโปรแกรม Arduino1.0 เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A12-1 (A12.2) จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT XT ปดสวิตช ปลดสาย USB ออก (A12.3) นําเทปสีดําติดยาว 30 ซม .ลงบนพื้นที่สําหรับการทดสอบ (A12.4) นําหุนยนต  วางไวบนพื้น ใหหางจากเทปสีดําประมาณ 60 ซม. เปดสวิตชจายไฟแกหุนยนต  กดสวิตช OK หุนยนต  จะเคลื่อนทีตรงมาข ่ างหนาอยางตอเนื่อง และหยุดเมื่อตัวตรวจจับแสงสะทอนอินฟราเรด ZX-03 ตัวใดตัวหนึงที ่ ่อยูดานหนาของหุนยนต  พบเสนสีดํา (A12.5) จากการทดสอบโปรแกรมที่ A12-1 พบวา เมือใช ่ เพียงคําสัง่ ao(); เพือหยุ ่ ดการทํางานของมอเตอร ในความ เปนจริง มอเตอรอาจไมไดหยุดในทันที มันอาจมีแรงเฉือยที ่ ทํ่ าใหหุนยนต  เคลือนที ่ ไปข ่ างหนาไดอีกเล็กนอย ดังนันถ ้ า ตองการหยุดแบบทันทีทันใด จะตองใชการถอยหลังดวยระยะเวลาสันๆ ้ กอนหยุด ดังแสดงในโปรแกรมที่ A12 -2 (A12.6) เขียนโปรแกรมที่ A12-2 แลวคอไมไฟลและอัปโหลดไปยังหุนยนต POP-BOT XT (A12.7) ยังคงใชสนามทดสอบแบบเดิม วางหุนยนตในตําแนงเดียวกับขันตอนที ้ ่ (A11.4) จากนั้น เปดสวิตชจาย ไฟแกหุนยนต  กดสวิตช OK เพื่อเริมต ่ นการทํางาน หุนยนต  จะเคลื่อนทีตรงมาข ่ างหนาอยางตอเนื่อง และหยุดเมื่อตัวตรวจจับแสงสะทอนอินฟราเรด ZX-03 ดานซายพบเสนสีดํา การหยุดในครั้งนี้กระทําไดนิงกว ่ าการใชโปรแกรมที่ A12-1


  XT 162

// ผนวกไฟลไลบรารีหลัก #include <popxt.h> void setup() { setTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทา glcd(1,1,"Press OK"); // แสดงขอความเริ่มตน sw_ok_press(); // ตรวจสอบการกดสวิตช OK glcd(1,1,"Moving..."); // แสดงขอความการทํางาน fd(60); // เคลื่อนที่ตรงไปขางหนา while(analog(0)>500); // ตรวจสอบคาจากตัวตรวจจับทีช่ อง A0 จนกระทังเงื ่ ่อนไขเปนเท็จ ao(); // หยุดการทํางานของมอเตอร } void loop() {} การทํางานของโปรแกรม เมื่อกดสวิตช OK หุนยนต  จะเริ่มเคลื่อนที่ไปพรอมกับอานคาจากแผงวงจรตรวจจับ ZX-03 ทีช่ อง A0 (ดาน ซาย) เมื่อใดที่อานคาไดนอยกวา 500 จะตีความวา พบเสนสีดํา จึงสั่งใหมอเตอรทังหมดหยุ ้ ดทํางานดวยคําสัง่ ao();

โปรแกรมที่ A12-1 ไฟล BlackLineDetect.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับตรวจจับ เสนสีดําของหุนยนต  POP-BOT XT #include <popxt.h> void setup() { setTextSize(2); glcd(1,1,"Press OK"); sw_ok_press(); glcd(1,1,"Moving..."); fd(60); while(analog(0)>500); bk(100); sleep(100); ao(); } void loop() {}

// ผนวกไฟลไลบรารีหลัก // กําหนดขนาดตัวอักษรเปน 2 เทา // แสดงขอความเริ่มตน // ตรวจสอบการกดสวิตช OK // แสดงขอความการทํางาน // ตรวจสอบคาจากตัวตรวจจับทีช่ อง A0 จนกระทังเงื ่ ่อนไขเปนเท็จ // ถอยหลังสั้นๆ เพือทํ ่ าการหยุด // หยุดการทํางานของมอเตอร

โปรแกรมที่ A12-2 ไฟล BlackLineDetect2.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับตรวจจับ เสนสีดําของหุนยนต  POP-BOT XT และหยุดไดแมนยํามากขึนด ้ วยการเพิมคํ ่ าสัง่ bk(); กอนหยุด


  XT 163

 XT     เคลือนที ่ ตามเส ่ นคือ ควบคุมใหหุนยนต  เคลือนที ่ โดยที ่ ตั่ วตรวจจับเสนทังสองตั ้ วอยู หัวใจหลักของหุนยนต ในตําแหนงที่ครอมเสน ดังนั้นจะเกิดเหตุการณขึ้น 4 กรณี ซึงนํ ่ ามาใชกําหนดเงื่อนไขของการทํางานไดดังนี้

100

 อยูในแนวเสนของสนามหรือครอมเสน กรณีที่ 1 หุนยนต

TB 6612

 เคลื่อนทีตรงไปข ่ างหนา ตองกําหนดใหหุนยนต

100

กรณีที่ 2 หุนยนต  เคลือนที ่ เอี ่ ยงไปทางขวา ตัวตรวจจับเสนดานซายพบเสนสีดํา

TB66 12

ตองกําหนดใหหุนยนต  เคลื่อนทีมาทางซ ่ าย


  XT 164

10

0

 เคลื่อนทีเอี ่ ยงไปทางซาย ตัวตรวจจับเสนดานขวาพบเสนสีดํา กรณีที่ 3 หุนยนต

12 TB 66

ตองกําหนดใหหุนยนตเคลื่อนที่มาทางขวา

100

 พบเสนตัด ตัวตรวจจับเสนทังคู ้ พบเสนสีดํา กรณีที่ 4 หุนยนต

TB6612

ตองเลือกวา ตองการใหหุนยนต  เคลื่อนที่ไปทางตรง เลียวซ ้ าย หรือเลียวขวา ้

 (A13.1) เปดโปรแกรม Arduino1.0 เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A12-1 (A13.2) จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT XT ปดสวิตช ปลดสาย USB ออก


  XT 165

(A13.3) ใชแผนพลาสติกลูกฟูกขนาด 90 x 60 เซนติเมตร (หรือขนาดอื่นก็ไดตามตองการ แตควรมีขนาดใหญ เพียงพอใหหุนยนต  สามารถเคลื่อนที่ไดโดยสะดวก) มาทําเปนพื้นสนาม แลวติดเทปสีดําตามรูป

 POP-BOT XT วางไวครอมเสน เปดสวิตชจายไฟแกหุนยนต  กดสวิตช OK เพือเริ ่ มต ่ นการทํางาน (A13.4) นําหุนยนต  จะเคลื่อนที่ขามเสนตัด หุนยนต  POP-BOT XT จะเคลื่อนที่ตามเสนอยางตอเนื่องเมื่อพบเสนตัด หุนยนต และขับเสียง “ติ้ด” ออกทางลําโพง (A13.5) ทดลองเพิมความเร็ ่ วของหุนยนต  POP-BOT XT จนกระทังได ่ ความเร็วสูงสุดทีหุ่ นยนต  ยังคงสามารถเคลือน ่ ที่ไดโดยไมหลุดออกจากเสน

    นสวนหนึงของการตรวจสอบและค ่ นหาสาเหตุในกรณีทีหุ่ นยนต  ไมเคลือนที ่ ตามเส ่ น คําแนะนําตอไปนี้ เป โดยรวบรวมจากประสบการณตรงที่ไดจากการแนะนําและอบรมทั้งจากผูใชงานทัวไป ่ นักเรียน และนักศึกษา 1. ตรวจสอบการเชือมต ่ อสายของแผงวงจรตรวจจับแสงสะทอนอินฟราเรด ZX-03 ทีนํ่ ามาใชเปนตัวตรวจ จับเสนทั้งสองตัววา มีการตอสลับขาพอรตกันหรือไม โดยตัวตรวจจับเสนดานซายตองตอกับพอรต A0/18 สวน ตัวตรวจจับเสนดานขวาตอกับพอรต A1/19 2. ตรวจสอบการตอสายมอเตอรวา มีการตอสลับกันระหวางมอเตอร A และมอเตอร B หรือไม โดย มอเตอร A (หรือมอเตอร 1) ในที่นีคื้ อ มอเตอรดานซาย สวนมอเตอร B (หรือมอเตอร 2) คือ มอเตอรดานขวา 3. การติดตั้งตัวตรวจจับเสนสูงหรือตํ่ากวาคาทีควรจะเป ่ นหรือไม ควรติดตั้งสูงจากพื้นในชวง 5 ถึง 10 มิลลิเมตร 4. ทดสอบการอานคาและเลือกคาอางอิงสําหรับใชตัดสินวา เปนสีดําหรือขาวอีกครั้งตามขั้นตอนใน กิจกรรมที่ 9 เพื่อตรวจสอบการทํางานของตัวตรวจจับเสนวา ยังทํางานถูกตองอยูหรื  อไม


  XT 166

#include <popxt.h> int L,R; void setup() { setTextSize(2); glcd(1,1,"Press OK"); sw_ok_press(); glcd(1,1,"Moving..."); } void loop() { L=analog(0); R=analog(1); if (L<500&&R<500) { fd(60); sound(2000,200); } else if(L>500&&R>500) { fd(60); } else if(L<500) {

sl(60); sleep(20);

} else if(R<500) {

}

}

sr(60); sleep(20);

// ผนวกไฟลไลบรารีหลัก

// กําหนดขนาดตัวอักษรเปน 2 เทา // แสดงขอความเริ่มตน // ตรวจสอบการกดสวิตช OK // แสดงขอความการทํางาน

// อานและเก็บคาของตัวตรวจจับเสนดานซาย // อานและเก็บคาตัวตรวจจับเสนดานขวา // พบเสนตัดสีดําหรือไม // เคลื่อนที่ตรงตอไปเพือข ่ ามทางแยก พรอมขับเสียงสัญญาณ // ตรวจสอบวา หุนยนต  ครอมเสนอยูหรือไม // ถายังครอมเสนอยู ควบคุมใหเคลื่อนที่ตรงตอไปดวยชวงเวลาสันๆ ้ // ตรวจพบวา หุนยนต  เคลื่อนที่เอียงไปทางขวา // เพราะตัวตรวจจับเสนดานซายพบเสนสีดํา // หมุนตัวทางซายเล็กนอย เพือให ่ กลับมาครอมเสน // ตรวจพบวา หุนยนต  เคลื่อนที่เอียงไปทางซาย // เพราะตัวตรวจจับเสนดานขวาพบเสนสีดํา // หมุนตัวทางขวาเล็กนอย เพือให ่ กลับมาครอมเสน

โปรแกรมที่ A13-1 ไฟล SimpleLineTracking.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับควบคุม หุนยนต  POP-BOT XT เคลือนที ่ ตามเส ่ นสีดํา โดยใชตัวตรวจจับเสน 2 ตัว


  XT 167

  ในกิจกรรมนีเป ้ นตัวอยางที่จําลองมาจากการแขงขันเขาวงกตแบบเสนหรือ Maze Solving อันเปนการ กิจกรรมทีต่ องการใหหุนยนต  เคลื่อนทีตามเส ่ น เมื่อพบจุดตัด จะตองมีการเลียวเพื ้ ่อเปลี่ยนเสนทาง และจะเคลือน ่ ที่ในลักษณะนี้ไปจนกระทังพบเส ่ นตัดทั้งหมดทีมี่ ในสนามแขงขัน

 ใชเทปผาหรือเทปพันสายไฟสีดําติดลงบนแผนพลาสติกลูกฟูกขนาด 90x60 เซนติเมตร (หรือขนาดอื่น ก็ไดตามตองการ แตควรมีขนาดใหญเพียงพอใหหุนยนต  สามารถเคลื่อนที่ไดโดยสะดวก) ตามรูป

  ในการทํากิจกรรมลักษณะนี้ ปจจัยหนึงที ่ ่มีความสําคัญมากคือ การเลี้ยวแบบ 90 องศาอยางแมนยํามา พอ จึงตองมีการสรางฟงกชันสํ ่ าหรับทําหนาทีนี่ โดยเฉพาะ ้ ซึงในที ่ ่นีตั้ ้งชื่อวา ฟงกชั่น R90() เปนฟงกชั่นเลียว ้ ขวา 90 องศาเมื่อพบเสนตัด การเลี้ ยวขวาเมื่อพบเส นตัดใหเกิดความแมนยํานัน้ หุนยนต  จะตองเคลื่อนที่ตรงไปขางหนาเล็กนอย จากนันสั ้ งให ่ หุนยนต  เลียว ้ ในขณะทีเลี ่ ยวจะต ้ องตรวจสอบตัวตรวจจับเสนในทีนี่ คื้ อ แผงวงจร ZX-03 ในดานทีเลี ่ ้ยว วา พบเสนตัดทังแถบแล ้ วหรือไม หากพบแลวถือวา การเลียวนั ้ ้นสมบูรณ ก็จะเคลื่อนที่ตรงตอไป ในรูปที่ A14-1 แสดงลักษณะการทํางานของหุนยนต  เมื่อกระทําฟงกชัน่ R90() ฟงกชันนี ่ จะถู ้ กเรียกใชเมื่อหุนยนต  POP-BOT XT เคลื่อนที่ไปพบเสนตัด


  XT 168

รูปที่ A14-1 การทํางานของหุนยนต  เมือกระทํ ่ าฟงกชัน่ R90() เพือให ่ การเลียวขวาแม ้ นยําขึน้

 (A14.1) เปดโปรแกรม Arduino1.0 เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A14-1 (A14.2) จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT XT ปดสวิตช ปลดสาย USB ออก (A14.3) นําหุนยนต  POP-BOT XT วางไวครอมเสน เปดสวิตชจายไฟแกหุนยนต  กดสวิตช OK เพือเริ ่ มต ่ นการทํางาน หุนยนต  POP-BOT XT จะเคลื่อนที่ตามเสนอยางตอเนื่องเมื่อพบเสนตัด หุนยนต  จะเลี้ยวขวาพรอมทั้ง สงเสียง “ติ้ด” ออกมาทุกครั้ง


  XT 169

#include <popxt.h> // ผนวกไฟลไลบรารีหลัก int L,R; /* โปรแกรมยอยเลี้ยวขวาเมื่อเจอทางแยก */ void R90() { fd(60); // เคลื่อนที่ตรงไปขางหนาเล็กนอย sound(1500,100); while(analog(1)>500) // หมุนตัวไปทางขวา จนกระทังตั ่ วตรวจจับเสนดานขวาพบสีดํา { sr(60); } while(analog(1)<500) // หมุนขวาตอไป จนกระทังตั ่ วตรวจจับเสนดานขวาพบสีขาว { sr(60); } } void setup() { setTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทา glcd(1,1,"Press OK"); // แสดงขอความเริ่มตน sw_ok_press(); // ตรวจสอบการกดสวิตช OK glcd(1,1,"Moving..."); // แสดงขอความการทํางาน } void loop() { L=analog(0); // อานและเก็บคาจากตัวตรวจจับเสนดานซาย R=analog(1); // อานและเก็บคาจากตัวตรวจจับเสนดานขวา if (L<500&&R<500) // พบเสนตัดสีดําหรือไม { R90(); // เรียกโปรแกรมยอยเลี้ยวขวา 90 องศา } else if(L>500&&R>500) // ตรวจสอบวา หุนยนต  ครอมเสนอยูหรือไม { fd(60); // ถายังครอมเสนอยู ควบคุมใหเคลื่อนที่ตรงตอไปดวยชวงเวลาสันๆ ้ } else if(L<500) // ตรวจพบวา หุนยนต  เคลื่อนที่เอียงไปทางขวา { sl(60); // หมุนตัวทางซายเล็กนอย เพือให ่ กลับมาครอมเสน sleep(20); } else if(R<500) // ตรวจพบวา หุนยนต  เคลื่อนที่เอียงไปทางซาย { sr(60); // หมุนตัวทางขวาเล็กนอย เพือให ่ กลับมาครอมเสน sleep(20); } }

โปรแกรมที่ A14-1 ไฟล SimpleMaze.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับควบคุมหุนยนต POP-BOT XT เคลือนที ่ ตามเส ่ นสีดําและเลียวขวาเมื ้ อพบเส ่ นตัด


  XT 170

 XT    ในกรณีหุนยนต  เคลือนที ่ ตามเส ่ นตองการตรวจจับทางแยกทีมี่ ความซับซอนเพิมขึ ่ น้ เชน เมือพบทางแยกที ่ ่ 1 ตองเลี้ยวซาย เมื่อพบทางแยกที่ 2 ตองเลี้ยวขวา เมื่อพบทางแยกที่ 3 ใหเคลื่อนที่ตรงไป หรือเมื่อพบทางแยกที่ 4 จะตองกลับมาเลียวขวา ้ ผูใชงานจะตองสรางตัวแปรขึ้นมาเพื่อชวยในการตรวจนับทางแยก เมื่อใดก็ตามที่ตรวจพบทางแยก ตัวแปรทีใช ่ ตรวจนับทางแยกจะเพิ่มคาขึ้น 1 คา หลังจากนัน้ ตรวจสอบ ค าของตั วแปรนี้วา เปนคาของทางแยกที่ตองเลี้ยวไปทิศทางใด จากนั้นก็เรียกโปรแกรมการเลี้ยวซายหรือขวา หรือตรงไปมาทํางานตอไป

 (A15.1) สรางสนามทดสอบตามรูปโดยใชเทปพันสายไฟสีดําติดลงบนแผนพลาสจิกลูกฟูกหรือพลาสวูด ขนาด 90x120 ซม. หรือขนาดอืนก็ ่ ไดตามตองการ แตควรมีขนาดใหญเพียงพอใหหุนยนต  สามารถเคลือนที ่ ได ่ โดยสะดวก

(A15.2) เปดโปรแกรม Arduino1.0 เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A15-1 (A15.3) จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT XT ปดสวิตช ปลดสาย USB ออก


  XT 171

#include <popxt.h> int L,R,x=0;

// ผนวกไฟลไลบรารีหลัก

/* โปรแกรมยอยเลี้ยวขวาเมือพบทางแยก ่ */ void R90() { fd(60); // เคลื่อนที่ตรงไปขางหนาเล็กนอย sound(1500,100); while(analog(1)>500) // หมุนตัวไปทางขวา จนกระทังตั ่ วตรวจจับเสนดานขวาพบสีดํา { sr(60); } while(analog(1)<500) // หมุนขวาตอไป จนกระทังตั ่ วตรวจจับเสนดานขวาพบสีขาว { sr(60); } } /* โปรแกรมยอยเลี้ยวซายเมื่อพบทางแยก */ void L90() { fd(60); // เคลื่อนที่ตรงไปขางหนาเล็กนอย sound(1500,100); while(analog(0)>500) // หมุนตัวไปทางซาย จนกระทังตั ่ วตรวจจับเสนดานซายพบสีดํา { sl(60); } while(analog(0)<500) // หมุนซายตอไป จนกระทังตั ่ วตรวจจับเสนดานซายพบสีขาว { sl(60); } } void setup() { setTextSize(2); glcd(1,1,"Press OK"); sw_ok_press(); glcd(1,1,"Moving..."); } void loop() { L=analog(0); R=analog(1);

// กําหนดขนาดตัวอักษรเปน 2 เทา // แสดงขอความเริ่มตน // ตรวจสอบการกดสวิตช OK // แสดงขอความการทํางาน

// อานและเก็บคาจากตัวตรวจจับเสนดานซาย // อานและเก็บคาจากตัวตรวจจับเสนดานขวา


  XT 172

if (L<500&&R<500) { if(x==6) { x=0; } x++; if (x==3) { R90(); } else { L90(); } } else if(L>500&&R>500) { fd(60); } else if(L<500) { sl(60); sleep(20); } else if(R<500) { sr(60); sleep(20); }

// พบเสนตัดสีดํา (ทางแยก) หรือไม // ตรวจสอบการนับทางแยก ครบ 1 รอบแลวหรือไม // ถาครบ ลางคาการนับทางแยก // เพิมค ่ า x ขึนหนึ ้ ่งคาเพือนั ่ บทางแยก // เปนทางแยกที่ 3 หรือไม // ถาเปนทางแยกที่ 3 ใหเลี้ยวขวา

// ถาไมใชทางแยกที่ 3 ใหเลี้ยวซาย // ตรวจสอบวา หุนยนต  ครอมเสนอยูหรือไม // ถายังครอมเสนอยู ควบคุมใหเคลื่อนที่ตรงตอไปดวยชวงเวลาสันๆ ้ // ตรวจพบวา หุนยนต  เคลื่อนที่เอียงไปทางขวา // หมุนตัวทางซายเล็กนอย เพือให ่ กลับมาครอมเสน // ตรวจพบวา หุนยนต  เคลื่อนที่เอียงไปทางซาย // หมุนตัวทางขวาเล็กนอย เพือให ่ กลับมาครอมเสน

} สวนเพิ่มเติมจากโปรแกรม ่ ่อพบแลวตองเลี้ยวขวา นั่นคือ ทางแยกที่ 3 สวนทางแยกอื่นๆ เมื่อ สนามที่ใชในการทดสอบมีทางแยกเดียวทีเมื หุนยนต  ตรวจพบ ใหทําการเลี้ยวซายทังหมด ้ การกําหนดเงื่อนไขในการทํางานคือ ตรวจสอบวาทางแยกทีพบ ่ เปนทาง แยกที่ตองเลี้ยวขวาหรือไม ถาใช เรียกโปรแกรมยอยเลี้ยวขวา [R90()] มาทํางาน แตถาไมใช เรียกโปรแกรมยอย เลี้ยวซาย [L90()]มาทํางานแทน

โปรแกรมที่ A15-1 ไฟล MultipleCrossingTrack.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับควบคุม หุนยนต  POP-BOT XT เคลือนที ่ ตามเส ่ นและตรวจจับทางแยกทีซั่ บซอน


  XT 173

(A15.4) นําหุนยนต  POP-BOT XT วางไวครอมเสน เปดสวิตชจายไฟแกหุนยนต  กดสวิตช OK เพือเริ ่ มต ่ นการทํางาน หุนยนต  POP-BOT XT จะเคลื่อนที่ตามเสนอยางตอเนื่องเมื่อพบทางแยกที่ 1, 2, 4, 5, 6, 7 และ 8 หุนยนต  จะเลี้ยวซายทั้งหมด และจะเลี้ยวขาวเมื่อพบทางแยกที่ 3 ทุกครั้งที่พบทางแยก หุนยนต  จะขับเสียง “ติ้ด” ออกมาเพื่อแจงสถานะการทํางาน


  XT 174


  XT 175



 XT  อีกหนึงตั ่ วอยางการใชงานอินพุตอะนาลอกของแผงวงจร POP-XT และฟงกชันอ ่ านคาสัญญาณอะนาลอก ของ Arduino คือ การติดตอกับตัวตรวจจับพิเศษทีให ่ ผลการทํางานเปนแรงดัน แตสามารถใหผลการทํางานเปนคาหรือ ปริมาณทางฟสิกสทีชั่ ดเจน โมดูลวัดระยะทางดวยแสงอินฟราเรด GP2D120 เปนตัวอยางของตัวตรวจจับทีมี่ การทํางาน ในลักษณะนี้ ผลของการตรวจจับของ GP2D120 สามารถนําไปคํานวณดวยกระบวนการทางซอฟตแวรเพือให ่ ไดผล การทํางานออกมาเปนระยะทางในหนวยเซนติเมตรหรือนิวได ้ ตามตองการ การใชงานโมดูล GP2D120 ในหุนยนต POP-BOT XT คือ นํามาใชตรวจจับวัตถุแบบไมสัมผัส (contact less) รวมไปถึงสามารถนําไปใชในการคนหาวัตถุหรือสิงกี ่ ดขวางได

11.1 คุณสมบัติของ GP2D120 ใชการตรวจจับระยะทางดวยการสะทอนแสงอินฟราเรด  วัดระยะทางได 4 ถึง 30 เซนติเมตร  ไฟเลียง ้ 4.5 ถึง 5V กระแสไฟฟา 33 mA  ใหเอาตพุตเปนแรงดันในยาน 0.4 ถึง 2.4V ทีไฟเลี ่ ยง ้ +5V 

LED อินฟราเรดตัวสง

กราฟแสดงการทํางานของ GP2D120

ตัวรับแสงอินฟราเรด

แรงดันเอาตพุต (V) 2.8

GP2D120

2.4 Vout GND

Vcc

2.0 1.6

ไฟเลี้ยง

1.2 0.8

38.3ฑ9.6 มิลลิวินาที

0.4

การวัดระยะหาง แรงดันเอาตพุต

วัดครั้งที่ 1 ไมแนนอน

วัดครั้งที่ 2

วัดครั้งที่ n

เอาตพุตครั้งที่ 1 เอาตพุตครั้งที่ 2 5 มิลลิว ินาที

0

เอาตพุตครั้งที่ n

0

4

8

12

16

20

24

28

32

ระยะหางจากวัตถุที่ตรวจจับ (cm)

* ใชกระดาษเทาขาวรุน R-27 ของ Kodak ซึ่ง ดานขาวมีอัตราการสะทอนแสง 90% เปน วัตถุสําหรับสะทอนแสงเพื่อวัดระยะทาง

รูปที่ 11-1 แสดงการจัดขา ไดอะแกรมเวลาจังหวะการทํางาน และกราฟแสดงการทํางานของ GP2D120


  XT 176

GP2D120 เปนโมดูลตรวจจับระยะทางแบบอินฟราเรดมีขาตอใชงาน 3 ขาคือ ขาตอไฟเลียง ้ (Vcc), ขากราวด (GND) และขาแรงดันเอาตพุต (Vout) การอานคาแรงดันจาก GP2D120 จะตองรอใหพนชวงเตรียมความพรอมของ โมดูลกอน ซึงใช ่ เวลาประมาณ 32.7 ถึง 52.9 มิลลิวินาที ดังนันในการอ ้ านคาแรงดันจึงควรรอใหพนชวงเวลาดังกลาว ไปกอน ดังแสดงขอมูลเบืองต ้ นในรูปที่ 10-1 คาแรงดันเอาตพุตของ GP2D120 ที่ระยะทาง 30 เซนติเมตรที่ไฟเลียง ้ +5V อยูในชวง 0.25 ถึง 0.55V โดย คากลางคือ 0.4V ชวงของการเปลี่ยนแปลงแรงดันเอาตพุตทีระยะทาง ่ 4 เซนติเมตรคือ 2.25V 0.3V

11.2 คําเตือนเกี่ยวกับสายสัญญาณของโมดูล GP2D120 ล GPD120 มีการจัดขาสัญญาณทีแตกต ่ างจากจุดตอบนแผงวงจรควบคุมของหุนยนต  POP-BOT เนืองจากโมดู ่ XT แมวาจะมีรูปรางเหมือนกันก็ตาม ดังนันจึ ้ งมีการตอสายสัญญาณแบบพิเศษใหแกโมดูล GP2D120 โดยตอกับโมดู ลไวแลว ผูใช  งานเพียงนําปลายของสายสัญญาณอีกดานหนึงต ่ อเขากับจุดตอสัญญาณบนแผงวงจรควบคุมหลักไดเลย โดยตองไมถอดสายสัญญาณทีติ่ ดกับตัวโมดูลและหามเปลียนสายสั ่ ญญาณของโมดูล GP2D120 สลับกับสายสัญญาณ ของตัวตรวจจับแบบอืนๆ ่ เด็ดขาด

11.3 การอานคาขอมูลจาก GP2D120 ดวยวงจรแปลงสัญญาณอะนาลอกเปนดิจิตอล ่ ตรวจวั ่ ดได เชน วัดแรงดัน Vout เทากับ 0.5V คาแรงดันเอาตพุตจาก GP2D120 จะเปลียนแปลงตามระยะทางที จะเทียบเปนระยะทางได 26 เซนติเมตร หรือที่ Vout เทากับ 2V จะเทียบเปนระยะหางจากวัตถุ 6 เซนติเมตร เปนตน สามารถสรุปขอมูลการเทียบคา Vout กับระยะทางในตารางที่ 11-1 อยางไรก็ตาม เพือช ่ วยใหการอานคาจากโมดูล GP2D120 ทําไดงายขึน้ จึงไดสรางไฟลไลบรารีสําหรับใชงาน กับโมดูล GP2D120 โดยเฉพาะขึนมา ้ นันคื ่ อไลบรารี gp2d120_lib.h จะตองผนวกไฟลไลบรารีไวในตอนตนของ โปรแกรมกอนใชงานดวยคําสัง่ #include <gp2d120_lib.h>

ล GP2D120 ใหผลการทํางานเปนแรงดันไฟตรงทีสั่ มพันธกับระยะทางทีตรวจวั ่ ดได ดังนันใน ้ เนืองจากโมดู ่ การใชงานจึงตองตอโมดูลตรวจจับนีเข ้ ากับอินพุตสัญญาณอะนาลอกของ POP-BOT XT นันคื ่ อ พอรต A0 ถึง A7 ฟงกชั่นทีใช ่ ในการอานคาระยะทางที่วัดไดจากโมดูล GP2D120 คือ getdist() มีวิธีการใชงานดังนี้ รูปแบบ

unsigned int getdist(char adc_ch) พารามิเตอร adc_ch ทําหนาที่รับการกําหนดชองอะนาลอกที่ใชงานตั้งแต 0 ถึง 7 ตามทีได ่ ตอใชงาน การคืนคา ระยะทางในหนวยเซนติเมตร ตัวอยางที่ 11-1 dist = getdist(3); // อานคาระยะทางจาก GP2D120 จากชอง An3


  XT 177

ตารางที่ 11-1 แสดงความสัมพันธระหวางระดับแรงดัน Vout ของ GP2D120 กับคาจากวงจรแปลง สัญญาณอะนาลอกเปนดิจิตอลและระยะทางทีวั่ ดได (ไดจากการคํานวณ)


  XT 178

   XT      XT ้ โดยใชสกรู 3x10 มม.และนอต 3 มม. (A16.1.1) นําฉากโลหะ 2x3 รูยึดเขากับรูยึดของโมดูล GP2D120 ทังสองรู ดังรูป







 

(A16.1.2) นําโมดูล GP2D120 ยึดเขากับบริเวณดานหนาของหุนยนต  โดยใชสกรู 3x10 มม. และนอต 3 มม. ขันยึดเขากับดานหนาของหุนยนต  ดังรูป


  XT 179

(A16.1.3) เสียบสายของโมดูล GP2D120 เขาทีตํ่ าแหนง 20/A2

จุดตอ 20/A2

 POP-BOT XT ทีพร จะไดหุนยนต ่ อมสําหรับการทําภารกิจตรวจจับวัตถุแบบไมสัมผัส

   โมดูล GP2D120 ใหผลการตรวจจับเปนแรงดันไฟตรงที่สัมพันธกับระยะทาง การอานคาของหุนยนต POP-BOT XT จึงตองใชคําสั่งอานคาสัญญาณอะนาลอก หากคาทีอ่ านไดมีคามากแสดงวา อยูใกล  วัตถุทีตรวจ ่ จับ ถาคาทีได ่ นอยแสดงวาวัตถุอยูไกล  อยางไรก็ตาม เพื่อชวยใหหุนยนต  POP-BOT XT สามารถอานคาระยะ หางจากโมดูล GP2D120 เปนคาในหนวยเซนติเมตร จึงเรียกใชไฟลไลบรารี gp2d120_lib.h (A16.2.1) เปดโปรแกรม Arduino1.0 เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A16-1 #include <popxt.h> #include <gp2d120_lib.h> int raw,dist; void setup() { setTextSize(2); glcdMode(1); glcd(1,1,”Press OK”); sw_ok_press(); glcdClear(); } void loop() { raw=analog(20); dist=getdist(20); glcd(2,1,”RAW Data = %d “,raw); glcd(3,1,”Distance = %d CM”,dist); sleep(100); }

// ผนวกไฟลไลบรารี่หลัก

// แสดงขอความออกหนาจอ GLCD // วนรอจนกระทังกดสวิ ่ ตช

// อานคาขอมูลดิบ // อานคาหนวยเปนเซนติเมตร // แสดงคาของขอมูลดิบทีจอแสดงผล ่ // แสดงคาเซนติเมตรที่จอแสดงผล

โปรแกรมที่ A16-1 ไฟล GP2D120_Reading.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับทดสอบ อานคาจากโมดูลวัดระยะทาง GP2D120 ของหุนยนต  POP-BOT XT


  XT 180

(A16.2.2) จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT XT จากนันรั ้ นโปรแกรม (A16.2.3) ทดลองนําวัตถุมาวางขวางหนาหุนยนต POP-BOT XT แลวเลื่อนใหเขาใกลหรือหางออกจากโมดูล GP2D120 สังเกตผลการทํางานผานจอแสดงผลของหุนยนต 

100 F

A TM e g a 3 2 U 4

220 F

TB 6 6 1 2

100

ปรับระยะหางของสิ่งกีดขวาง ใหเขาใกลและหางออก ในชวง 4 ถึง 32 เซนติเมตร


  XT 181

   XT   จากโปรแกรมที่ A16-1 แสดงใหเห็นวา โมดูล GP2D120 สามารถตรวจจับวัตถุและตรวจสอบระยะหาง จากวัตถุไดอยางแมนยําในระยะ 4 ถึง 30 เซนติเมตร สําหรับในกิจกรรมนีเป ้ นการสั่งงานใหหุนยนต  เคลื่อนที่ และ เมื่อหุนยนต  ตรวจพบสิ่งกีดขวางอยูด านหนาในระยะ 10 เซนติเมตร หุนยนต  POP-BOT XT จะถอยหลังออกจาก สิ่งกีดขวางนัน้ แลวเปลี่ยนทิศทางการเคลื่อนที่เพื่อหลบหลีกสิงกี ่ ดขวางนัน้ (A17.1) เปดโปรแกรม Arduino1.0 เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A17-1 (A17.2) จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT XT ปลดสายตอคอมพิวเตอรออก (A17.3) นําหุนยนต  POP-BOT XT มาวางบนพื้น เปดสวิตชเพื่อรันโปรแกรม สังเกตการเคลื่อนที่ของหุนยนต  หุนยนต  POP-BOT XT จะเคลื่อนที่ตรงไปขางหนาอยางตอเนื่อง #include <popxt.h> // ผนวกไฟลไลบรารี่หลัก void setup() { setTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทา glcd(1,1,"Press OK"); // แสดงขอความเริ่มตน glcd(2,1,"to Start"); sw_ok_press(); // ตรวจสอบการกดสวิตช OK glcdClear(); glcd(1,1,"Let’s go!"); // แสดงขอความพรอมทํางาน } void loop() { fd(70); if(analog(20)>250) // ตรวจพบวัตถุในระยะ 10 เซนติเมตร { bk(80); // ถอยหลัง glcdFillScreen(color[random(8)]); // เคลียรหนาจอ แลวเปลี่ยนสีพืนจอแสดงผลด ้ วยการสุม sleep(300); sl(70); // หมุนตัวไปทางซาย เพือเปลี ่ ่ยนเสนทางการเคลื่อนที่ sleep(600); } }

โปรแกรมที่ A17-1 ไฟล TouchlessObjectAvoider.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับทดสอบ การทํางานของหุนยนต  POP-BOT XT ในการตรวจจับวัตถุแบบไมสัมผัส


  XT 182

(A17.4) นําวัตถุมาวางขวางหนาหุนยนต  แลวสังเกตการเคลื่อนที่ของหุนยนต  เพื่อตรวจจับพบสิงกี ่ ดขวาง เมื่อหุนยนต  POP-BOT XT เคลื่อนที่เขาใกลวัตถุมากกวา 10 เซนติเมตร (โดยประมาณ) หุนยนต  จะทํา การเคลื่อนที่ถอยหลังเปนเวลา 0.3 วินาที ขณะที่ถอยหลังมีการแสดงสถานะที่หนาจอดวยการเปลี่ยนสีพื้นของ จอแสดงผลแบบสุม มีดวยกัน 8 สีคือ สีแดง, สีเขียว, สีนําเงิ ้ น, สีเหลือง, สีดํา, สีขาว, สีฟา และสีบานเย็น จากนั้น หมุนตัวไปทางซาย 0.6 วินาทีเพื่อเปลี่ยนเสนทางการเคลื่อนที่

2

3

100

1

100

100

TB66 12

TB66 12

TB661 2

5 0 10

4

0 10

TB

2 1 66 TB

12 66


  XT 183



XT   ในบทนีนํ้ าเสนอการควบคุมเซอรโวมอเตอรของหุนยนต  POP-BOT XT โดยแผงวงจร POP-XT ของหุนยนต  สามารถขับเซอรโวมอเตอรได 3 ตัว ผานทางจุดตอพอรต 30 (SV1), 12 (SV2) และ 13 (SV3) ซึงเรี ่ ยกวา เอาตพุต เซอรโวมอเตอร

12.1 หลักการทํางานของเซอรโวมอเตอร เซอรโวมอเตอรทีใช ่ ในหุนยนต  POP-BOT XT เปนเซอรโวมอเตอรแบบอะนาลอกขนาดเล็ก บางครังเรี ้ ยกวา R/C เซอรโวมอเตอร โดย R/C มาจากคําวา Radio Control เนืองจากในอดี ่ ต เซอรโวมอเตอรมักนําไปใชในการขับ เคลือนกลไกในเครื ่ ่องบิน, รถ หรือเรือที่บังคับดวยคลืนวิ ่ ทยุ การกําหนดชือ่ R/C เพื่อใหทราบถึงประเภทของงาน ที่นําเซอรโวมอเตอรนีไปใช ้ นันเอง ่ เซอรโวมอเตอรเปนอุปกรณแมเหล็กไฟฟาแบบหนึงที ่ ใช ่ ในการหมุนตัวขับ (actuator) ไปยังตําแหนงตางๆ ดวย ความแมนยํา ปกติแลวเซอรโวมอเตอรทียั่ งไมไดรับการปรับแตงใดๆ นันจะใช ้ งานกันอยูในรถ,  เรือ หรือเครืองบิ ่ นบังคับ วิทยุ เพือทํ ่ าหนาทีควบคุ ่ มตําแหนงของอุปกรณ เชน การบังคับเลียวของรถบั ้ งคับวิทยุ หรือใชสําหรับปรับหางเสือของ เรือหรือเครืองบิ ่ น ซึงงานเหล ่ านีต้ องการแรงบิดของมอเตอรทีสู่ งพอสมควรดังนันเซอร ้ โวมอเตอรจึงมีอัตราทดทีมาก ่ พอสมควรเพือให ่ สามารถรองรับงานดังกลาวได เซอรโวมอเตอรมีมุมในการหมุนมาตรฐานคือ 0 ถึง 90 องศา และ 0 ถึง 180 องศา ปจจุบันนิยมในแบบ 0 ถึง 180 องศา โดยสามารถดัดแปลงใหหมุนไดครบรอบ 360 องศาดวย สายตอใชงานมาตรฐานมี 3 เสนคือ สายสัญญาณ (S), สายไฟเลียง ้ (+V) และสายกราวด (G) โดยในรูปที่ 12-1 แสดงสวนประกอบตางๆ และการจัดขาของปลั๊กหรือ คอนเน็กเตอรของเซอรโวมอเตอร

       รูปที่ 12-1 แสดงสวนประกอบของเซอรโวมอเตอร

STANDARD SERVO MOTOR


  XT 184

  รูปที่ 12-2 ลักษณะคอนเน็กเตอรของเซอรโวมอเตอร ปจจุบันเซอรโวมอเตอรมีดวยกัน 2 ชนิดหลักๆ คือ ชนิดอะนาลอกและดิจิตอล รูปรางภายนอกของเซอรโว มอเตอรทังสองชนิ ้ ดจะคลายกันมาก ความแตกตางจะอยูที วงจรควบคุ ่ มทีอยู ่ ภายใน  โดยในชนิดอะนาลอกจะใชวงจร อิเล็กทรอนกสทีประกอบด ่ วยอุปกรณสารกึงตั ่ วนํา จําพวก ทรานซิสเตอร มอสเฟต หรือไอซีออปแอมปเปนหลัก ใน ขณะทีชนิ ่ ดดิจิตอลจะใชไมโครโปรเซสเซอรหรือไมโครคอนโทรลเลอรเปนตัวควบคุมหลัก

12.1.1 คอนเน็กตอรของเซอรโวมอเตอร ่ ในการเชือมต ่ อของเซอรโวมอเตอร มีดวยกัน 2 มาตรฐานคือ รูปที่ 12-2 แสดงลักษณะของคอนเน็กเตอรทีใช แบบ S และแบบ J การจัดขาจะเหมือนกัน ความแตกตางคือ ลักษณะของคอนเน็กเตอรและการกําหนดสีของสาย สัญญาณ สําหรับยีห่ อ Futaba ของญีปุ่ น กําหนดใหคอนเน็กเตอรแบบ J มีปกยืนออกมาเพิ ่ มขึ ่ นในด ้ านเดียวกับสาย สัญญาณ และกําหนดใหสายสัญญาณมีสีขาว สวนแบบ S สายสัญญาณจะเปนสีขาว และคอนเน็กเตอรจะเรียบเหมือน กันทังสองด ้ านของสายเชือมต ่ อ สวนสายไฟเลียงเป ้ นสีแดง และสายกราวดเปนสีดําเหมือนกันทังสองแบบ ้ อยางไรก็ตาม มีความเปนไปไดที่ผูผลิตอืนๆ ่ อาจกําหนดรูปแบบและสีของสายสัญญาณแตกตางออกไป แตการจัดเรียงตําแหนงจะเหมือนกัน

12.1.2 โครงสรางของเซอรโวมอเตอร ในรูปที่ 12-3 แสดงโครงสรางภายในของเซอรโวมอเตอร สวนประกอบหลักคือ มอเตอรไฟตรงขนาดเล็ก, ชุดเฟองทด, แผงวงจรควบคุม และตัวตานทานปรับคาได (POT : Potentiometer) แกนของมอเตอรไฟตรงจะตอเขา กับชุดเฟอง เพือลดความเร็ ่ วรอบลง สงผลใหแรงบิดทีแกนหมุ ่ นมากขึน้ ทังหมดทํ ้ างานรวมกันภายใตความสัมพันธ P = kwg โดยที่ P คือ พลังงานทีป่ อนใหแกมอเตอร k คือ คาคงที่ w คือ ความเร็วรอบ ในหนวย รอบตอนาที (rpm : round per minute) g คือ แรงบิดหรือทอรค (torque) ถาหากพลังงานทีจ่ ายใหคงที่ เมื่อลดความเร็วรอบลง นันย ่ อมทําแรงบิดของมอเตอรเพิ่มขึ้น


  XT 185

 



 

 

    

รูปที่ 12-3 โครงสรางภายในของเซอรโวมอเตอร การหมุนของมอเตอรไดรับการควบคุมจากวงจรควบคุม โดยมี POT เปนตัวกําหนดขอบเขตของแกนหมุน ซึงหากไม ่ มีการปรับแตงใดๆ แกนหมุนของมอเตอรจะสามารถหมุนไดในขอบเขต 0 ถึง 180 องศา ดังนันในการปรั ้ บ แตงใหเซอรโวมอเตอรสามารถขับแกนหมุนไดรอบตัวจึงมักจะใชวีการถอด POT ออก แลวแทนทีด่ วยตัวตานทานคา คงที่ 2 ตัว หรือดัดแปลงใหแกนหมุนของ POT สามารถหมุนไดรอบตัว แกนหมุนของเซอรโวมอเตอรจะมีสวนปลายเปนรองเฟอง (spline) เพือให ่ สามารถติดตังอุ ้ ปกรณทีใช ่ ในการ เชือมโยงไปยั ่ งตัวขับหรือกลไกอืนๆ ่ อุปกรณทีใช ่ เชือมโยงนั ่ นเรี ้ ยกวา ฮอรน (horn) ซึงมี ่ ดวยกันหลายรูปแบบทังแบบ ้ เปนแขน, เปนแทง, กากบาท, แผนกลม เปนตน สําหรับรองเฟองของเซอรโวมอเตอรแตละยีห่ อก็มีจํานวนไมเทากัน โดยของ Hitec จะมี 24 รองเฟอง สวนของ Futaba มี 25 รองเฟอง ทําใหฮอรนของทังสองยี ้ ห่ อใชรวมกันไมได

12.1.3 สัญญาณพัลสสําหรับควบคุมเซอรโวมอเตอร การควบคุมเซอรโวมอเตอรทําไดโดยการสรางสัญญาณพัลสปอนใหกับวงจรควบคุมภายในเซอรโวมอเตอร ดังใน รูปที่ 12-4 เริมต ่ นใหสรางพัลสคาบเวลา 20 มิลลิวินาที แลวปรับความกวางของพัลสชวงบวก โดยพัลสกวาง 1 มิลลิวินาที มอเตอรจะหมุนไปตําแหนงซายมือสุด ถาสงพัลสกวาง 1.5 มิลลิวินาที แกนหมุนของมอเตอรจะเคลือนที ่ ไปยั ่ งตําแหนง กึงกลาง ่ และถาสงพัลสกวาง 2 มิลลิวินาที แกนหมุนของมอเตอรจะเคลือนที ่ ไปยั ่ งตําแหนงขวามือสุด การปอนสัญญาณพัลสที่มีคาบเวลาชวงบวกตั้งแต 1.5 ถึง 2 มิลลิวินาทีจะทําใหเซอรโวมอเตอรหมุนทวน เข็มนาฬิกา โดยถาคาความกวางพัลสยิ่งหางจาก 1.5 มิลลิวินาทีมากเทาใด ความเร็วในการหมุนก็จะมากขึ้นเทานัน้ นันคื ่ อ ความเร็วสูงสุดของการหมุนทวนเข็มนาฬิกาจะเกิดขึ้นเมือสั ่ ญญาณพัลสควบคุมที่ความกวาง 2 มิลลิวินาที การปอนสัญญาณพัลสที่มีคาบเวลาชวงบวกตั้งแต 1 ไปจนถึง 1.5 มิลลิวินาที ทําใหเซอรโวมอเตอรหมุน ตามเข็มนาฬิกา ซึงถ ่ าคาความกวางพัลสเขาใกล 1 มิลลิวินาทีความเร็วในการหมุนของเซอรโวมอเตอรก็จะมาก นันคื ่ อ ความเร็วสูงสุดของการหมุนตามเข็มนาฬิกาจะเกิดขึ้นเมือสั ่ ญญาณพัลสควบคุมที่ความกวาง 1 มิลลิวินาที


  XT 186





 



  

STANDARD SERVO MOTOR



 

STANDARD SERVO MOTOR



   รูปที่ 12-4 แสดงพัลสทีใช ่ ควบคุมเซอรโวมอเตอร

STANDARD SERVO MOTOR


  XT 187

12.1.4 การทํางานของแผงวงจรควบคุมในเซอรโวมอเตอรชนิดอะนาลอก การหมุนของเซอรโวมอเตอรนันจะไม ้ ไดหมุนเปนอิสระเหมือนมอเตอรทั่วๆ ไป โดยชวงระยะการหมุน ปกติจะอยูระหว  าง 0 ถึง 180 องศา ตําแหนงการหมุนของแกนมอเตอรในเซอรโวมอเตอรนีสามารถควบคุ ้ มไดอยาง แมนยํา เนืองจากภายในเซอร ่ โวมอเตอรมีวงจรอิเล็กทรอนิกสทําหนาที่ตรวจสอบตําแหนงของเซอรโวมอเตอรอยู ตลอดเวลา ลักษณะการตรวจสอบจะใชการปอนกลับคาตําแหนงจากตัวตานทานปรับคาได แลวนําคานีไปเปรี ้ ยบ เทียบกับคาพัลสที่ปอนเขาทางขาควบคุม คาของผลตางที่ไดจะไปปรับตําแหนงของมอเตอรจนไมเกิดคาผลตาง ก็จะไดตําแหนงของมอเตอรที่แมนยํา ในรูปที่ 12-5 แสดงไดอะแกรมการทํางานของแผงวงจรควบคุมในเซอรโวมอเตอรชนิดอะนาลอก สัญญาณ พัลสควบคุมถูกสงเขามาทางอินพุต จะถูกสงไปยังวงจรกําเนิดสัญญาณพัลสภายในดวย โดยมีความกวางที่เปนสัด สวนกับตําแหนงของแกนหมุนในปจจุบัน ทั้งสัญญาณพัลสที่กําเนิดขึนภายในกั ้ บสัญญาณพัลสควบคุมจะถูกสงไป ยังวงจรเปรียบเทียบ เพือทํ ่ าการหักลางสัญญาณ โดยทิศทางของสัญญาณจะขึ้นอยูกับวา ระหวางสัญญาณพัลสควบ คุมทางอินพุตกับสัญญาณพัลสภายใน สัญญาณพัลสใดมีความกวางมากกวา โดยเอาตพุตทีได ่ เปนสัญญาณลอจิก “0” หรือ “1” แลวสงไปยังวงจรขับมอเตอรแบบ H-บริดจ เพื่อกําหนดทิศทางการหมุน ทางดานคาความแตกตางที่ เกิดขึ้นระหวางพัลสทั้งสองสัญญาณจะถูกสงไปยังวงจรเพิ่มความกวางพัลส เพื่อสรางสัญญาณพัลสสําหรับสงไป ขับมอเตอรผานวงจรขับมอเตอรแบบ H-บริดจ โดยความแตกตางของความกวางพัลส 1% ทําใหเกิดสัญญาณพัลส สําหรับขับมอเตอรในระดับ 50% และความเร็วนีจะลดลงเมื ้ อแกนหมุ ่ นของมอเตอรเคลือนที ่ เข ่ าสูตํ าแหนงทีกํ่ าหนด อันเปนผลมาจากความแตกตางของความกวางสัญญาณพัลสเริ่มลดลง และหยุดลงเมือสั ่ ญญาณพัลสที่นํามาเปรียบ เทียบมีคาความกวางเทากัน  

    

 



   



  



รูปที่ 12-5 ไดอะแกรมการทํางานของแผงวงจรควบคุมในเซอรโวมอเตอรชนิดอะนาลอก


  XT 188

12.1.5 วัสดุของเฟองในเซอรโวมอเตอร ชุดเฟองในเซอรโวมอเตอรโดยสวนใหญผลิตมาจากวัสดุ 3 ชนิดคือ (1) ไนลอน : เปนวัสดุทีนิ่ ยมนํามาใชผลิตเฟองมากที่สุด เนืองจากมี ่ นําหนั ้ กเบา และมีเสียงรบกวนนอย เมื่อทํางาน ความทนทานพอสมควร มักพบในเซอรโวมอเตอรขนาดเล็กและราคาถูก (2) โลหะ : เฟองทีผลิ ่ ตดวยโลหะมีความทนทานสูง แข็งแรง สามารถทนแรงเสียดทานเมือเฟ ่ องขบกัน ไดสูงมาก ทําใหสามารถนํามาสรางเซอรโวมอเตอรทีมี่ แรงบิดสูงมากได โลหะทีพบมากที ่ สุ่ ดในการนํามาผลิตเฟองคือ ทองเหลือง และถาหากมีงบประมาณมากเพียงพอ ควรเลือกใชเซอรโวมอเตอรทีใช ่ เฟองทีผลิ ่ ตจากไทเทเนียม (3) คารบอไนต (Karbonite) : เปนวัสดุพิเศษทีทํ่ ามาจากคารบอน แลวแปรรูปเปนวัสดุทีคล ่ ายพลาสติก Hitec เปนผูที ่นําเทคโนโลยีนีมาใช ้ เปนวัตถุดิบในการผลิตเฟอง โดยคารบอไนตจะมีความแข็งแรงและทนทานมาก กวาเฟองไนลอน ในขณะที่มีนําหนั ้ กเบา ดังในเซอรโวมอเตอรสมัยใหมจึงนิยมใชเฟองที่ผลิตจากวัสดุชนิดนี้

12.1.6 คุณสมบัติทางเทคนิคที่สําคัญของเซอรโวมอเตอร มี 2 คาคือ ความเร็ว (speed) และ แรงบิดหรือทอรค (torque) ความเร็วหมายถึง ระยะเวลาทีทํ่ าใหแกนหมุน ของมอเตอรเคลือนที ่ สู่ ตํ าแหนงมุมทีกํ่ าหนด อาทิ เซอรโวมอเตอรมีความเร็ว 0.15 วินาทีสําหรับ 60 องศา หมายถึง เซอรโวมอเตอรตัวนีสามารถขั ้ บใหแกนหมุนเคลือนที ่ ไปยั ่ งตําแหนงมุม 60 องศาภายในเวลา 0.15 วินาที สวนแรงบิดมักจะปรากฏในหนวยของออนซ-นิว้ (ounce-inches : oz-in) หรือ กิโลกรัม-เซนติเมตร (kg-cm) เปนคุณสมบัติที่จะบอกตอผูใชงานวา เซอรโวมอเตอรตัวนี้มีแรงในการขับโหลดที่มีนําหนั ้ กในหนวยออนซให สามารถเคลือนที ่ ไปได ่ 1 นิว้ หรือนําหนั ้ กในหนวยกิโลกรัมใหเคลือนที ่ ไปได ่ 1 เซนติเมตร (นํ้าหนัก 1 ออนซเทา กับ 0.028 กิโลกรัมโดยประมาณ หรือ 1 กิโลกรัมเทากับ 35.274 ออนซ) อยางไรก็ตาม คาของความเร็วและแรงบิดตองสัมพันธกับแรงดันไฟเลียงที ้ จ่ ายใหแกเซอรโวมอเตอรดวย ซึง่ มักจะแรงดัน 4.8 หรือ 6V นอกจากนันยั ้ งมีปจจัยเกียวกั ่ บแรงเสียดทานในระบบเฟองภายในเซอรโวมอเตอร การหลอลืน่ การเชือมโยงระหว ่ างเฟองตอเฟองในชุดเฟองทด ทีส่ งผลใหความเร็วและแรงบิดของเซอรโวมอเตอรเปลียนแปลงไปได ่ 

 POP-BOT XT 12.2 ฟงกชั่นสําหรับขับเซอรโวมอเตอรของหุนยนต ่ ในไฟลไลบรารี popxt.h ดังนี้ การควบคุมเซอรโวมอเตอรของหุนยนต POP-BOT XT จะใชฟงกชั่นทีอยู

servo เปนฟงกชั่นกําหนดตําแหนงแกนหมุนของเซอรโวมอเตอร ควบคุมได 3 ตัวในเวลาเดียวกัน รูปแบบ

void servo(unsigned char _ch, int _pos)

พารามิเตอร _ch - ชองเอาตพุตเซอรโวมอเตอร มีคา 1 ถึง 3 _pos - กําหนดตําแหนงแกนหมุนของเซอรโวมอเตอร มีคาในชวง 0 ถึง 180 และ -1 ถากําหนดเปน -1 หมายถึง ไมใชงานเซอรโวมอเตอรทีช่ องนั้นๆ


  XT 189

  ในกิจกรรมนีเป ้ นการควบคุมตําแหนงแกนหมุนของเซอรโวมอเตอรดวยคาทีอ่ านไดจากปุม KNOB บนแผง วงจรควบคุม POP-XT (A18.1) เปดโปรแกรม Arduino IDE เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A18-1 (A18.2) ทําการคอมไพล แลวอัปโหลดไปยังแผงวงจรควบคุม POP-XT บนหุนยนต  POP-BOT XT จากนันป ้ ดสวิตช ปลดสายดาวนโหลดออก (A18.3) ตอเซอรโวมอเตอรเขาทีจุ่ ดตอเซอรโวมอเตอร SV1 บนแผงวงจรควบคุม POP-XT โดยสังเกตขั้วตอใหดี สีดําคือขั้วลบ, สีแดงเปนขัวบวก ้ และสีขาวหรือสีเหลืองเปนสายสัญญาณ (S)

(A18.4) เปดสวิตชเพื่อจายไฟใหแกแผงวงจร POP-XT กดสวิตช OK เพื่อเริมการทํ ่ างาน ตามดวยปรับปถุม KNOB บนแผงวงจร POP-XT สังเกตการทํางานของเซอรโวมอเตอร เมื่อหมุนปรับคาของปุม KNOB ทีจอแสดงผลจะแสดงค ่ าของ KNOB และเซอรโวมอเตอรถูกขับใหแกน หมุนไปมาตามทิศทางของการหมุนปุม KNOB


  XT 190

#include <popxt.h> int x; void setup() { glcdMode(1); setTextSize(2); glcd(1,1,"Press OK"); sw_ok_press(); glcdClear(); } void loop() { x=map(knob(),80,1023,0,180); glcd(2,1,"Servo = %d ",x); servo(1,x); }

// ผนวกไฟลไลบรารีหลัก

// เลือกการแสดงผลโหมด 1 แสดงผลในแนวนอน // กําหนดขนาดตัวอักษรเปน 2 เทา // แสดงขอความเริ่มตน // ตรวจสอบการกดสวิตช OK

// อานคาจาก KNOB แปลงเปนคา 0 ถึง 180 เก็บในตัวแปร x // สงคาตําแหนงของเซอรโวมอเตอรไปแสดงทีหน ่ าจอแสดงผล // สงคาตําแหนงไปยังเซอรโวมอเตอรชอง SV1

โปรแกรมที่ A18-1 ไฟล ServoKnob.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับควบคุมเซอรโว มอเตอรดวยการปรับคาแรงดันอะนาลอกปอนใหแกแผงวงจร POP-XT


  XT 191

       XT (A20.1.1) นําฉากโลหะ 2x3 รู จํานวน 2 ตัวมายึดเขาดวยกันดวยสกรู 3x6 มม. และนอต 3 มม. ดังรูป





   (A20.1.2) คลายสกรูทียึ่ ดกานหมุนของเซอรโวมอเตอร แลวถอดกานหมุนออก เก็บสกรูเกลียวปลอยที่ใชยึดไว จากนันนํ ้ าฉากโลหะยึดเขากับเซอรโวมอเตอร แลวใชสกรูขนาด 3x10 มม. ขันยึดดังรูป

        


  XT 192

(A20.1.3) นําเซอรโวมอเตอรยึดเขาทีด่ านหนาของหุนยนต  (ดูจากตําแหนงที่วงกลมไว) โดยใชสกรู 3x10 มม. อีก 2 ตัวกับนอต 3 มม. ขันยึด

(A20.1.4) ทําแขนสําหรับตีโดยใชแทงตอลพาสติก 12 รู ยึดกับแกนหมุนของเซอรโวมอเตอร โดยใชสกรูยึดกาน หมุนทีถอดไว ่ จากขั้นตอนที่ (A20.1.2) มาขันยึดแทงตอใหแนน ตอสายของเซอรโวมอเตอรเขาทีจุ่ ดตอเอาตพุต เซอรโวมอเตอรชองที่ 1 หรือ SV1 เพียงเทานีก็้ จะไดหุนยนต  สําหรับภารกิจ ObjectHitter-BOT


  XT 193

     POP-BOT XT สําหรับภารกิจ ObjectHitter-BOT เสร็จแลว ลําดับตอไปคือ การเขียน หลังจากสรางหุนยนต โปรแกรมเพื่อทดสอบการเลคื่อนที่ตามเสนเพื่อคนหาจุดตัดและควบคุมการทํางานของเซอรโวมอเตอร (A20.2.1) เปดโปรแกรม Arduino IDE เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A20-1 ้ ดสวิตช (A20.2.2) ทําการคอมไพล แลวอัปโหลดไปยังแผงวงจรควบคุม POP-XT บนหุนยนต  POP-BOT XT จากนันป ปลดสายดาวนโหลดออก (A20.2.3) ติดเทปสีดําบนพื้น จากนันนํ ้ าหุนยนต  มาวางใหหางเสนประมาณ 30 ซม. (A20.2.4) เปดสวิตชเพื่อจายไฟ แลวกดสวิตช OK ใหหุนยนต  เริมทํ ่ างาน หุนยนต POP-BOT XT จะเคลื่อนที่ตรงเขาหาเสนสีดํา เมื่อพบเสน หุนยนต  จะหยุดเคลื่อนที่แลวทําการ ขับเซอรโวมอเตอรใหแกนหมุนเคลือนที ่ ไปยั ่ งตําแหนง 180 องศาจากนันหมุ ้ นกลับมายังตําแหนง 0 องศา มีลักษณะ อาการคลายกับหุนยนตทําการเหวี่ยงแขนตี #include <popxt.h> int L,R,x=0; void setup() { setTextSize(2); glcd(1,1,"Press OK"); glcd(2,1,"to Start"); sw_ok_press(); glcdClear(); glcd(1,1,"Let’s go!"); servo(1,0); sleep(1000); fd(60); } void loop() { if(analog(0)<500) { ao(); servo(1,180); sleep(1000); servo(1,0); while(1); } }

// ผนวกไฟลไลบรารีหลัก

// กําหนดขนาดตัวอักษรเปน 2 เทา // แสดงขอความเริ่มตน // ตรวจสอบการกดสวิตช OK // แสดงขอความพรอมทํางาน // ใหเซอรโวไปอยูทีตํ่ าแหนง 0 องศา // เริ่มตนขับเคลื่อนหุนยนต

// ตรวจสอบวาเจอเสนตัด // หมุนเซอรโวไปที่ตําแหนง 180 องศา // รอใหเซอรโวหมุนไปทีตํ่ าแหนงนั้น // หมุนเซอรโวกลับมาที่ตําแหนง 0 องศา // หยุดที่นี่

โปรแกรมที่ A20-1 ไฟล ServoHitting.ino โปรแกรมภาษา C ของ Arduino สําหรับควบคุมเซอรโวมอเตอร ของหุนยนต  POP-BOT XT ในภารกิจ ObjectHitter-BOT


  XT 194

  

START

STOP

หลังจากทดสอบการควบคุมเซอรโวมอเตอรเรียบรอย ลําดับตอไปคือ เขียนโปรแกรมเพื่อปฏิบัติภารกิจ โดยสนามของภารกิจนี้แสดงดังรูป

จากจุด START หุนยนต  ตองเคลื่อนที่ตามเสน มีสิ่งที่ตองทํา 4 อยางเมื่อตรวจพบ เสนตัดคือ 1. เลียวซ ้ าย ในทางโปรแกรมตองเขียนใหหุนยนต  ทํางานดวยฟงกชัน่ L90() 2. เลียวขวา ้ ในทางโปรแกรมตองเขียนใหหุนยนต  ทํางานดวยฟงกชัน่ R90() 3. เดินตรง ในทางโปรแกรมตองเขียนใหหุนยนต  ทํางานดวยฟงกชัน่ FF() 4. ตีวัตถุทีวางอยู ่ ที ปลายเส ่ นรูปตัว T แลวหมุนตัวกลับ ในทางโปรแกรมตองเขียนใหหุนยนต  ทํางาน ดวยฟงกชัน่ hit() เมือพิ ่ จารณาจากสนามของภารกิจนี้ จะพบวา หุนยนต  จะเคลือนที ่ และทํ ่ างานตามฟงกชันเหมื ่ อนๆ กันทัง้ 4 ทางแยกของสนาม ดังนั้นผูพั ฒนาโปรแกรมสามารถวนทํางาน 4 รอบเพื่อปฏิบัติตามเงื่อนไขได โดยกําหนดตัว แปรขึนมาตั ้ วหนึ่ง (y) สําหรับนับการเกิดขึ้นซํ้าของเหตุการณ และกําหนดตัวแปรอีกตัวหนึ่ง (x) สําหรับนับทาง แยก ในการทําภารกิจ 1 รอบ จะมีเหตุการณทีเกิ ่ ดขึ้นเมื่อพบทางแยกดังนี้


  XT 195

1. พบทางแยกครั้งที่หนึ่ง หุนยนต  เลียวซ ้ าย 2. พบทางแยกครั้งที่สอง หุนยนต  ตีวัตถุ แลวหมุนตัวกลับ จากนันเคลื ้ ่อนที่ตรง 3. พบทางแยกครั้งที่สาม หุนยนต  เคลื่อนที่ตรงขามทางแยกไป 4. พบทางแยกครั้งที่สี่ หุนยนต  ตีวัตถุ แลวหมุนตัวกลับ จากนันเคลื ้ ่อนที่ตรง 5. พบทางแยกครั้งที่หา หุนยนต  เลียวขวา ้

(A20.3.1) เปดโปรแกรม Arduino IDE เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A20-2 (A20.3.2) ทําการคอมไพล แลวอัปโหลดไปยังแผงวงจรควบคุม POP-XT บนหุนยนต  POP-BOT XT จากนันป ้ ดสวิตช ปลดสายดาวนโหลดออก


  XT 196

#include <popxt.h> // ผนวกไฟลไลบรารีหลัก int L,R,x=0,y=0; /* ฟงกชันเดิ ่ นตรงเมื่อเจอทางแยก */ void FF() { fd(60); sleep(300); } /* ฟงกชันเลี ่ ้ยวขวาเมื่อเจอทางแยก */ void R90() { fd(60); // เคลื่อนที่ตรงไปดานหนาเล็กนอย sound(1500,100); while(analog(1)>500) // วนเลี้ยวขวาจนกระทังเซนเซอร ่ ดานขวาเจอสีดํา { sr(60); } while(analog(1)<500) // วนเลี้ยวขวาตอไปกระทั่งเซนเซอรดานขวาเจอสีขาว { sr(60); } } /*ฟงกชันเลี ่ ้ยวซายเมื่อเจอทางแยก */ void L90() { fd(60); // เคลื่อนที่ตรงไปดานหนาเล็กนอย sound(1500,100); while(analog(0)>500) // วนเลี้ยวซายจนกระทังเซนเซอร ่ ดานซายเจอสีดํา { sl(60); } while(analog(0)<500) // วนเลี้ยวซายตอไปกระทั่งเซนเซอรดานซายเจอสีขาว { sl(60); } } /* ฟงกชันตี ่ กระปองและหมุนตัวกลับ */ void hit() { bk(100); // ถอยหลังเล็กนอย sleep(50); ao(); // หยุดขับมอเตอร servo(1,180); // ขับเซอรโวมอเตอรใหแกนหมุนไป 180 องศา sleep(1000); servo(1,0); bk(60); // ขับเซอรโวมอเตอรใหแกนหมุนกลับไปยังตําแหนง 0 องศา sleep(200); R90(); // หมุนขวา 90 องศา }


  XT 197

void setup() { setTextSize(2); glcd(1,1,"Press OK"); glcd(2,1,"to Start"); sw_ok_press(); glcdClear(); glcd(1,1,"Let’s go!"); } void loop() { L=analog(0); R=analog(1); if (L<500&&R<500) { if(x==5) { x=0; y++; if (y==4) { ao(); servo (1,-1); while(1); } } x++; if (x==1) { L90(); } else if(x==2||x==4) { hit(); } else if (x==3) { FF(); } else if (x==5) { R90(); } }

// กําหนดขนาดตัวอักษรเปน 2 เทา // แสดงขอความเริ่มตน // ตรวจสอบการกดสวิตช OK // แสดงขอความพรอมทํางาน

// เก็บคาตัวตรวจจับเสนดานซาย // เก็บคาตัวตรวจจับเสนดานขวา // พบเสนตัดสีดําหรือไม // ตรวจสอบการนับแยกครบ 1 รอบ // ถาครบแลว ทําการเคลียรคาการนับแยก // เพิมค ่ าแขนยอยทางแยก // ถาหุนยนตเคลื่อนที่ครบทัง้ 4 แขนของสนาม // หยุดการทํางานของหุนยนต // หยุดการทํางานของเซอรโวมอเตอร

// เพิมค ่ า x ขึ้นหนึ่งคา เพือนั ่ บทางแยก // แยกที่ 1 เลี้ยวซาย

// แยกที่ 2 หรือ 4 ตีวัตถุ

// แยกที่ 3 เคลื่อนที่ตรงเพือข ่ ามทางแยก

// แยกที่ 5 เลี้ยวขวา


  XT 198

}

else if(L>500&&R>500) { fd(60); } else if(L<500) { sl(60); sleep(20); } else if(R<500) { sr(60); sleep(20); }

// ตรวจสอบวา หุนยนต  ครอมเสนอยูหรือไม // ถายังครอมเสนอยู ควบคุมใหเคลื่อนที่ตรงตอไปดวยชวงเวลาสันๆ ้ // ตรวจพบวา หุนยนต  เคลื่อนที่เอียงไปทางขวา // หมุนตัวทางซายเล็กนอย เพือให ่ กลับมาครอมเสน // ตรวจพบวา หุนยนต  เคลื่อนที่เอียงไปทางซาย // หมุนตัวทางขวาเล็กนอย เพือให ่ กลับมาครอมเสน

โปรแกรมที่ A20-1 ไฟล ObjectHitterBOT.ino โปรแกรมภาษา C ของ Arduino สําหรับควบคุมการเคลือนที ่ ่ ตามเสนและขับเซอรโวมอเตอรของหุนยนต  POP-BOT XT ในภารกิจ ObjectHitter-BOT  เริมทํ ่ างาน (A20.3.4) เปดสวิตชเพื่อจายไฟ แลวกดสวิตช OK ใหหุนยนต หุนยนต  จะเคลื่อนที่ตามเสน เมื่อพบจุดตัดแรกจะเลี้ยวซาย แล วเคลื่อนที่ตรงไปจนกระทั่งพบทางแยกหรือจุดตัดที่สอง ซึงเป ่ น ตําแหนงทีใกล ่ กับวัตถุ หุนยนต  จะทําการตีวัตถุใหลม แลวหมุนตัวกลับ เคลื่ อนทีตรงกลั ่ บมาตามเสนทางเดิม จนกระทั่งพบทางแยกที่สาม หุนยนต เคลื่ อนที่ตรงข ามทางแยกไป จากนั้นจะพบทางแยกที่สี่ ทีตํ่ าแหนงนีเป ้ นปลายแขนอีกดานหนึงของสนาม ่ ซึงมี ่ วัตถุอยู หุนยนต  จะทําการตีวัตถุ แลวหมุนตัวกลับมาเพือ่ เคลือนที ่ ตรงกลั ่ บมา จนกระ ทั่งพบทางแยกที่หา หุนยนต  จะเลี้ยวขวา จากนันการทํ ้ างานก็จะวน ในลักษณะเดิมจนครบทุกแขนของสนาม หุนยนต  จะเคลือนที ่ ไปยั ่ งจุด STOP แลวหยุด


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.