XT 1
ArduinoPOP-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 100F 10V
C5 0.1F
44 43 42 41 40 39 38 37 36 35 34 1 33 32 2 31 3 4
UGnd 5 UCap
VBus PB0
C1 1F
IC1 ATMega32U4 (TQFP44)
6 7
8 17 PB1 9 15 PB2 10 16 PB3 11 14
30 29 28 27 26
Pxx
C12 0.1F
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 10F 16V
25-character 16-line
C16 10F 16V
C15 0.1F
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 10F 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.1F
รูปที่ 1-2 วงจรสมบูรณของแผงวงจรควบคุม POP-XT
D1 1N4148
C18 0.1F
PB4
R9 4.7
SW3 RESET
R11 1k
PE2
+5V C9 0.1F
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.1F
+USB
R4 4k7 LED1 BLUE
4
2
IC4 NCP1450 - 5.0
xx C7 0.1F
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
FA 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 แลวหยุด