• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Pop bot xt th-weerachat
 

Pop bot xt th-weerachat

on

  • 3,780 views

Pop bot xt th-weerachat

Pop bot xt th-weerachat

Statistics

Views

Total Views
3,780
Views on SlideShare
2,075
Embed Views
1,705

Actions

Likes
1
Downloads
0
Comments
1

4 Embeds 1,705

http://kruweerachat.wordpress.com 1682
https://www.facebook.com 19
https://www.google.co.th 2
http://webcache.googleusercontent.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1 previous next

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • ขอโหลดเพื่อนำไปศึกษาและทดลองได้มั้ยครับ
    ทำอย่างไรถึงจะsave ได้ครับ
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Pop bot xt th-weerachat Pop bot xt th-weerachat Document Transcript

    • XT 1Arduinocompatiblerobotkitactivity manualArduinoPOP-BOT XT
    • 2XTXTใครควรใชหนังสือเลมนี้1.นักเรียนนิสิตนักศึกษาและบุคคลทั่วไปที่มีความสนใจในการนําไมโครคอนโทรลเลอรไปประยุกตใชในการทดลองเกี่ยวกับการทํางานของระบบอัตโนมัติหรือสนใจในการเรียนรูและทดลองไมโครคอนโทรลเลอรในแนวทางใหมที่ใชกิจกรรมหุนยนตอัตโนมัติเปนสื่อ2.สถาบันการศึกษาโรงเรียนวิทยาลัยมหาวิทยาลัยที่มีการเปดการเรียนการสอนวิชาอิเล็กทรอนิกสหรือภาควิชาวิศวกรรมอิเล็กทรอนิกสและคอมพิวเตอร3.คณาจารยที่มีความตองการศึกษาและเตรียมการเรียนการสอนวิชาไมโครคอนโทรลเลอรรวมถึงวิทยาศาสตรประยุกตที่ตองการบูรณาการความรูทางอิเล็กทรอนิกส-ไมโครคอนโทรลเลอร-การเขียนโปรแกรมคอมพิวเตอร-การทดลองทางวิทยาศาสตรในระดับมัธยมศึกษาอาชีวศึกษาและปริญญาตรีรายละเอียดที่ปรากฏในหนังสือเลมนี้ไดผานการตรวจทานอยางละเอียดและถวนถี่ เพื่อใหมีความสมบูรณและถูกตองมากที่สุดภายใตเงื่อนไขและเวลาที่พึงมีกอนการจัดพิมพเผยแพรความเสียหายอันอาจเกิดจากการนําขอมูลในหนังสือเลมนี้ไปใช ทางบริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด มิไดมีภาระในการรับผิดชอบแตประการใดความผิดพลาดคลาดเคลื่อนที่อาจมีและไดรับการจัดพิมพเผยแพรออกไปนั้นทางบริษัทฯจะพยายามชี้แจงและแกไขในการจัดพิมพครั้งตอไปสงวนลิขสิทธิ์ตาม พ.ร.บ. ลิขสิทธิ์ พ.ศ. 2537หามการลอกเลียนไมวาสวนหนึ่งสวนใดของหนังสือเลมนี้ นอกจากจะไดรับอนุญาตดําเนินการจัดพิมพและจําหนายโดยบริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด108 ซ.สุขุมวิท 101/2 ถ.สุขุมวิท แขวงบางนา เขตบางนา กรุงเทพฯ 10260โทรศัพท 0-2747-7001-4โทรสาร 0-2747-7005
    • XT 3XT   ชุดหุนยนต POP-BOTXTเปนโครงการที่นําเสนอทางเลือกในการเรียนรูไมโครคอนโทรลเลอรอยางงายดวยซอฟตแวร Arduino เพื่อนําเสนอแนวทางและกิจกรรมในการประยุกตใชไมโครคอนโทรลเลอรและซอฟตแวรโปรแกรมภาษาC/C++ระบบเปดหรือโอเพนซอรสมาสรางเปนหุนยนตอัตโนมัติขนาดเล็กหรือProgrammableMobileRobotโดยหุนยนตที่ใชในโครงการนี้เปนชุดหุนยนตอัตโนมัติที่ขับเคลื่อนดวยมอเตอรไฟตรงที่มีเฟองทดในตัววัตถุประสงคในการดําเนินการโครงการนี้คือ1.เพื่อใหนําเสนอแนวทางในการนําแผงวงจรไมโครคอนโทรลเลอร POP-XT ไปใชในกิจกรรมที่มีความหลากหลายโดยเฉพาะอยางยิ่งกับการจัดกิจกรรมเกี่ยวกับการควบคุมหุนยนตอัตโนมัติ2.เพื่อเปนตัวอยางหรือทางเลือกในการขยายโอกาส สําหรับการพัฒนาสื่อการเรียนการสอนวิทยาศาสตรและเทคโนโลยีที่ใชหุนยนตเปนสื่อสําหรับครู-อาจารย3. เพื่อเตรียมการสําหรับการฝกอบรมเพื่อการประลองความรูความสามารถในการเขียนโปรแกรมควบคุมหุนยนตอัตโนมัติสําหรับการจัดสื่อหรือคูมือประกอบในการเรียนรูและดําเนินกิจกรรมนั้นไดจัดทําหนังสือสรางและพัฒนาโปรแกรมควบคุมหุนยนตอัตโนมัติดวยโปรแกรมภาษาC/C++กับArduinoและPOP-BOTXT เพื่อใชประกอบในการเรียนรูและทดลองพรอมกันนี้สามารถใชหนังสือเรียนรูระบบควบคุมอยางงายดวยโปรแกรมภาษาCกับArduinoและบอรดไมโครคอนโทรลเลอรPOP-XTประกอบในการเรียนรูและทําความเขาใจรวมดวยไดชุด POP-BOT XT robot kit และ POP-BOT XT Lite robot kit เปนสื่อการเรียนรูทางเลือกสําหรับครู-อาจารย,นักเรียนและนักพัฒนาระบบสมองกลฝงตัวอิสระที่มีความประสงคในการตอยอดหรือประยุกตใชไมโครคอนโทรลเลอรและซอฟตแวรArduinoในกิจกรรมดานหุนยนตอัตโนมัติที่ควบคุมดวยโปรแกรมภาษา C/C++ดําเนินการโดยบริษัทอินโนเวตีฟ เอ็กเพอริเมนต จํากัด การจัดหาสื่อการเรียนรูนี้เปนไปในรูปแบบสมัครใจการบริการเกี่ยวกับการจัดหาและซอมแซมอุปกรณอยูภายใตความรับผิดชอบของบริษัทอินโนเวตีฟ เอ็กเพอริเมนต จํากัด
    • 4XTการนําเสนอขอมูลเกี่ยวกับขอมูลทางเทคนิคและเทคโนโลยีในหนังสือเลมนี้เกิดจากความตองการที่จะอธิบายกระบวนการและหลักการทํางาน ของอุปกรณในภาพรวมดวยถอยคําที่งายเพื่อสรางความเขาใจแกผูอาน ดังนั้นการแปลคําศัพททางเทคนิคหลายๆ คําอาจไมตรงตามขอบัญญัติของราชบัณฑิตยสถาน และมีหลายๆ คําที่ยังไมมีการบัญญัติอยางเปนทางการ คณะผูเขียนจึงขออนุญาตบัญญัติศัพทขึ้นมาใชในการอธิบายโดยมีขอจํากัดเพื่ออางอิงในหนังสือเลมนี้เทานั้นทั้งนี้สาเหตุหลักของขอชี้แจงนี้มาจาก การรวบรวมขอมูลของอุปกรณในระบบสมองกลฝงตัวและเทคโนโลยีหุนยนตสําหรับการศึกษาเพื่อนํามาเรียบเรียงเปนภาษาไทยนั้นทําไดไมงายนักทางคณะผูเขียนตองทําการรวบรวมและทดลองเพื่อใหแนใจวาความเขาใจในกระบวนการทํางานตางๆนั้นมีความคลาดเคลื่อนนอยที่สุดเมื่อตองทําการเรียบเรียงออกมาเปนภาษาไทยศัพททางเทคนิคหลายคํามีความหมายที่ทับซอนกันมากการบัญญัติศัพทจึงเกิดจากการปฏิบัติจริงรวมกับความหมายทางภาษาศาสตรดังนั้นหากมีความคลาดเคลื่อนหรือผิดพลาดเกิดขึ้นทางคณะผูเขียนขอนอมรับและหากไดรับคําอธิบายหรือชี้แนะจากทานผูรูจะไดทําการชี้แจงและปรับปรุงขอผิดพลาดที่อาจมีเหลานั้นโดยเร็วที่สุดทั้งนี้เพื่อใหการพัฒนาสื่อทางวิชาการ โดยเฉพาะอยางยิ่งกับความรูของเทคโนโลยีสมัยใหมสามารถดําเนินไปไดอยางตอเนื่องภายใตการมีสวนรวมของผูรูในทุกภาคสวน
    • XT 5บทที่ 1 á ¹ йíÒÍØ» ¡ Ã³ì· Ò§Î ÒÃì´ á ÇÃì¢ Í § POP-BOT XT...........................................................7บทที่ 2 ลงมือสรางหุนยนตPOP-BOTXT..............................................................................19บทที่ 3 แนะนําโปรแกรมArduino1.0..................................................................................27บทที่ 4 โครงสรางโปรแกรมของArduino..................................................................................47บทที่ 5 การพัฒนาโปรแกรมสําหรับหุนยนต POP-BOTXT ดวยArduino1.0.....................75บทที่ 6 ทดสอบการควบคุมฮารดแวรของ POP-XT แผงวงจรควบคุมของหุนยนตPOP-BOTXT..............................................................................................................83บทที่ 7 ไลบรารีสําหรับการพัฒนาโปรแกรมของหุนยนต POP-BOTXT..........................101บทที่ 8 ขับเคลื่อนหุนยนต POP-BOTXT................................................................................131บทที่ 9 หุนยนต POP-BOTXT กับสวิตชและการตรวจจับการชน....................................145บทที่ 10 หุนยนต POP-BOTXT กับภารกิจตรวจจับเสน....................................................153บทที่ 11 หุนยนต POP-BOTXT กับการตรวจจับวัตถุแบบไมสัมผัส...................................175บทที่ 12 หุนยนต POP-BOTXT กับการขับเซอรโวมอเตอร................................................183
    • 6XT
    • XT 7XTPOP-BOT XT เปนชุดอุปกรณสําหรับสรางและพัฒนาโปรแกรมเพื่อควบคุมหุนยนตอัตโนมัติขนาดเล็กที่ขับเคลื่อนดวยมอเตอรไฟตรงและชุดเฟองขับ มีดวยกัน 2 รุนคือ1. POP-BOT X T Lite kit ในชุดนี้ประกอบดวย แผงวงจรควบคุมหลักซึ่งมีไมโครคอนโทรลเลอรATmega32U4 เปนอุปกรณหลักและโมดูลแสดงผลกราฟก LCD สีในตัว, แผงวงจรอุปกรณตรวจจับสัญญาณหรือเซนเซอร (sensor) พื้นฐาน, มอเตอรไฟตรงพรอมชุดเฟองขับหรือ DC motor gearbox และชิ้นสวนทางกลที่จําเปนทําใหนําชุดPOP-BOTXT Liteนี้ไปใชในการเรียนรูและเขียนโปรแกรมเพื่อควบคุมหุนยนตอัตโนมัติดวยภาษาC/C++ ในเบื้องตนไดภายใตงบประมาณที่เหมาะสม2. POP-BOT XT Standard kit ในชุดประกอบดวยอุปกรณหลักเหมือนกับชุดPOP-BOT XT Lite มีการเพิ่มตัวตรวจจับระยะทางดวยแสงอินฟราเรด, ตัวตรวจจับแสงสะทอนอินฟราเรดอีก 2 ตัว (รวมเปน 4 ตัว), เซอรโวมอเตอร และชิ้นตอพลาสติกเพิ่มเติม เพื่อใหนําหุนยนต POP-BOTXT นี้มาใชในการเรียนรู, ทดลองและพัฒนาหุนยนตอัตโนมัติแบบโปรแกรมได ทั้งยังรองรับกิจกรรมการแขงขันไดเปนอยางดี1.1รายการอุปกรณที่ใชในหุนยนต POP-BOT XT1. แผงวงจรควบคุมหุนยนต 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. ซีดีรอมบรรจุซอฟตแวรและตัวอยางโปรแกรมการทดลอง
    • 8XT15. หนังสือการสรางและทดลองเขียนโปรแกรมควบคุมหุนยนตอัตโนมัติดวยภาษา C (เลมนี้)16. โมดูลตรวจจับและวัดระยะทางแบบอินฟราเรด GP2D120**17. เซอรโวมอเตอร*** จัดใหมีจํานวนเพิ่มขึ้นในชุด POP-BOTXT Standard kit** เปนอุปกรณที่มีเพิ่มเติมในชุด POP-BOT XT Standard kit1.2 คุณสมบัติของชุดอุปกรณในสวนไมโครคอนโทรลเลอรหลัก1.2.1 แผงวงจรควบคุมหลัก POP-XTPOP-XT เปนแผงวงจรไมโครคอนโทรลเลอรสที่ใชไมโครคอนโทรลเลอรตระกูล AVR เบอรATmega32U4 ของ Atmel (www.atmel.com) มีสวนเชื่อมตอพอรต USB เพื่อใชในการสื่อสารขอมูลและดาวนโหลดโปรแกรมไดในตัว โดยไมตองใชสายสัญญาณหรืออุปกรณแปลงสัญญาณใดๆ เพิ่มเติม จึงทําใหการใชงานงายและสะดวกมากรวมถึงPOP-XTไดเลือกใชฮารดแวรที่เขากันไดกับฮารดแวรของโครงการไมโครคอนโทรลเลอรระบบเปด (โอเพนซอรส : open source) ที่ชื่อ Arduino (www.arduino.cc/en) ในรุน Arduino Leonardo จึงทําใหสามารถนําชุดพัฒนาของArduino1.0มาใชงานได ภายในชุดพัฒนาของArduino1.0มีไลบรารีฟงกชันภาษาซีสําหรับติดตอกับฮารดแวรจํานวนมากไวให ทําใหเขียนโปรแกรมสั่งงานอุปกรณตางๆไดงาย โดยไมจําเปนตองศึกษาลงไปในรายละเอียดของไมโครคอนโทรลเลอรมากนักแตถาหากมีความตองการพัฒนาในระดับที่สูงขึ้นก็สามารถนําPOP-XT ไปใชรวมกับเครื่องมือพัฒนาโปรแกรมรวมถึงคอมไพเลอรอื่นๆ ไดเชนกันสวนประกอบทั้งหมดของแผงวงจร 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
    • 10XTรูปที่1-2วงจรสมบูรณของแผงวงจรควบคุมPOP-XTPE6IC1ATMega32U4(TQFP44)UVccD-D+UGndUCapVBusPB0PB1PB2PB3PB7RSTVccGNDXTAL2XTAL1PD0PD1PD2PD3PD5AVccGNDAREFPF0PF1PF4PF5PF6PF7GNDVccSCL3 RXD0 A76SDA2 TXD1 4CR116MHzSW2RESETR34k7ISPC11F+5VA0 18A1 19A3 21A5 23A2 20A4 22R44k7LED1BLUE+5V+5V+5VR127D-D+IDGNDVUSBK1mini B-USBUSB port+USBK3BATT4.8-7.2V+5VPF7PF6PF4PF0PF5PF1PD0 PD2 PD7PD1 PD3 PD4GA6SP1PIEZOSpeaker30+VmGNDSV112+VmGNDSV213+VmGNDSV3IC2TB6612FNGA1A1PGPGA2A2B2B2PGPGB1B1R71kR81kA BBDIRBPWM10795ADIRAPWMDC. MOTOROUTPUT+VmPWMA+Vm+VmPWMBBIN2BIN1GNDSTBVccAIN1AIN2+Vm+Vm+ - + -PB5 PB6PE6PC6R54k7+5VR64k7+5V+5VQ1KRC102+VmSWITCHON+VmIC3KIA278R051 23D1MBRS340IC4NCP1450- 5.0215,6,7,841,2,3Q3FDS6680A54+5V113R227C20.01FC310F16VC40.1FC50.1FC6100F10VC70.1FC80.1FQ2KRC102C90.1FC10470F16VC11470F16VL110HC120.1FC13220F10V111098765432144 43 42 41 40 39 38 37 36 35 3433323130292827262524232221201918171615141312PE2PC7PC6PB6PB5PB4PD7PD6PD4AVccGND1 2 3 4 5 6 7 8 9 10 11 1224 23 22 21 20 19 18 17 16 15 14 134RST17151614318xx Pxx +7REF23222120191831PE213511109814301261614320RST+1715PB4A8SPIExt.GNDGNDGND+N/CGNDCSVccVccCLKMISOD/C/RSTGNDLEDALEDKGNDN/C1 2 3 4 5 6 7 8 9 10 11 12 13 14SW3RESET+3.3VR104.7kD11N4148+3.3V+3.3VR94.7R114.7kR134.7kR124.7kR144.7kR164.7kR154.7kR174.7kR184.7k31 PE216 PB215 PB117 PB0RSTGLCD160x128 pixel25-character16-lineIC5LM1117-3.3V+5V +3.3VC1410F16VC150.1FC1610F16VR111kVR1KNOBR111kSW5OK+5V8 PB4C180.1FC170.1F
    • XT 111.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-3Q1KRC102(DTC114)R1(Default = 510)LED1+Sรูปที่1-3รูปรางและวงจรของแผงวงจรไฟแสดงผลZX-LED
    • 12XT1.2.3เซอรโวมอเตอรแบบมาตรฐาน (เปนอุปกรณเสริมมีในชุด POP-BOTXT Standardkit)มีสายตอใชงาน 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”ไฟสีแดงติดรูปที่1-4รูปรางและวงจรของแผงวงจรสวิตชที่ใชในชุดหุนยนตPOP-BOTXTDATAR3220R210kR1510LED1S1SwitchIndicatorSignal outputGND+V
    • XT 131.3.2 แผงวงจรตรวจจับแสงสะทอนอินฟราเรด : ZX-03มีวงจรและหนาตาของแผงวงจรแสดงในรูปที่ 1-5 เปนแผงวงจรที่ใชในการตรวจสอบการสะทอนของแสงอินฟราเรดของตัวตรวจจับแสงสะทอนอินฟราเรดซึ่งรวมตัวสงและตัวรับไวในตัวถังเดียวกัน โดยตัวตรวจจับแสงสะทอนอินฟราเรดที่นํามาใชคือ TCRT5000เมื่อจายไฟเลี้ยง LED อินฟราเรดภายในตัวโมดูล TCRT5000 จะเปลงแสงออกมาตลอดเวลา สวนตัวรับซึ่งเปนโฟโตทรานซิสเตอรจะไดรับแสงอินฟราเรดจากการสะทอนกลับ โดยปริมาณของแสงที่ไดรับจะมากหรือนอยขึ้นอยูกับวามีวัตถุมากีดขวางหรือไมและวัตถุนั้นมีความสามารถในการสะทอนแสงอินฟราเรดไดดีเพียงไรซึ่งขึ้นกับลักษณะพื้นผิวและสีของวัตถุ โดยวัตถุสีขาวผิวเรียบจะสะทอนแสงอินฟราเรดไดดี ทําใหตัวรับแสงอินฟราเรดไดรับแสงสะทอนมาก สงผลใหแรงดันที่เอาตพุตของวงจรสูงตามไปดวย ในขณะที่วัตถุสีดําสะทอนแสงอินฟราเรดไดนอยทําใหตัวรับอินฟราเรดสงแรงดันออกมาตํ่า ดวยคุณสมบัติดังกลาวจึงนิยมนําแผงวงจรตรวจจับแสงสะทอนอินฟราเรดนี้มาใชในการตรวจจับพื้นหรือเสน โดยตองติดตั้งไวดานลางของโครงหุนยนตเนื่องจากแผงวงจรตรวจจับแสงสะทอนอินฟราเรด ZX-03 ใหผลการทํางานเปนแรงดันไฟตรง ดังนั้นในการใชงานกับ POP-BOT XT จึงตองตอเขากับชองอินพุตอะนาลอกของแผงวงจรหลัก จากนั้นใชความรูจากการอานคาสัญญาณอะนาลอก เพื่ออานคาจากแผงวงจรตรวจจับแสงสะทอนอินฟราเรดนําไปสูการตรวจจับเสนตอไปรูปที่1-5หนาตาและวงจรของแผงวงจรตรวจจับแสงสะทอนอินฟราเรดที่ใชในชุดหุนยนตPOP-BOTXT10kTCRT5000510+VGNDOUTตัวตรวจจับแสงสะทอนอินฟราเรดจุดตอสัญญาณ
    • 14XTLED อินฟราเรดตัวสง ตัวรับแสงอินฟราเรดGP2D12GNDVout VccGP2D1204 8 12 16 20 24 28 32000.40.81.21.62.02.42.8แรงดันเอาตพุต(V)ระยะหางจากวัตถุที่ตรวจจับ (cm)กราฟแสดงการทํางานของ GP2D120หลักการทํางานของโมดูลวัดระยะทางดวยแสงอินฟราเรดโมดูลวัดระยะทางสงแสงอินฟราเรดไปกระทบวัตถุผานเลนสนูนเพื่อโฟกัสแสงใหไปยังจุดใดจุดหนึ่ง เมื่อแสงกระทบวัตถุจะเกิดการสะทอนกลับมายังภาครับที่มีเลนสภาครับทําหนาที่รวมแสงและกําหนดจุดตกกระทบ แสงจะถูกสงไปยังโฟโตทรานซิสเตอรจํานวนมากที่ตอเรียงตัวกันเปนสวนรับแสงหรืออะเรยรับแสง ตําแหนงที่แสงตกกระทบนี้นํามาคํานวณหาระยะทาง (L) จากภาคสงไปยังวัตถุได โดยใชสูตรหาสามเหลี่ยมคลายดังนี้L FA X ดังนั้นคา L จะมีคาเทากับF ALXคาที่ไดจากโฟโตทรานซิสเตอรจะถูกเปลี่ยนเปนระดับแรงดันซึ่งใหผลการเปลี่ยนแปลงตามระยะทางที่ตรวจวัดไดLAFXวัตถุGP2D120LED อินฟราเรดตัวสงสวนรับแสงรูปที่1-6แสดงรูปรางการจัดขาและกราฟแสดงการทํางานของGP2D1201.3.3 GP2D120 โมดูลตรวจจับระยะทางแบบอินฟราเรด(เปนอุปกรณเสริมมีในชุด POP-BOTXT Standardkit)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
    • XT 151.4ขอมูลของสายสัญญาณที่ใชในชุดหุนยนต POP-BOT XT1.4.1 สายJST3AA-8 : สายเชื่อมตอระหวางแผงวงจรสายJST3AA-8ใชเชื่อมตอระหวางแผงวงจรควบคุม POP-XT กับแผงวงจรตรวจจับและแผงวงจรอุปกรณตางๆเปนสายแพ3เสนยาว8นิ้วปลายสายทั้งสองดานติดตั้งคอนเน็กเตอรแบบJST3ขาตัวเมียระยะหางระหวางขา 2 มิลลิเมตร มีการจัดขาดังนี้ระยะหางระหวางขา 2 มม. ระยะหางระหวางขา 2 มม.GNDS+5V1.4.2 สาย USB-miniBเปนสายสัญญาณสําหรับเชื่อมตอระหวางพอรต USB ของคอมพิวเตอรกับแผงวงจร POP-XT
    • 16XT1.5ขอมูลของอุปกรณทางกลที่ใชในชุดหุนยนต POP-BOT XT1.5.1 ลอพลาสติกสําหรับชุดเฟองขับมอตอรและยางเปนลอกลม มีเสนผานศูนยกลาง 65 มิลลิเมตร สามารถสวมเขากับแกนของชุดเฟองขับมอเตอรไดทันทีโดยไมตองดัดแปลงเพิ่มเติมขันยึดดวยสกรูเกลียวปลอย2มิลลิเมตรสวนยางขอบลอที่ใชรวมดวยผลิตจากยางพาราผิวมีดอกยางเพื่อชวยเพิ่มสมรรถนะในการเกาะพื้นผิว1.5.2 แผนกริดเปนแผนพลาสติกที่ผลิตจากวัสดุ ABS ขนาด 80x60 มิลลิเมตร และ 80x80 มิลลิเมตร อยางละ 1 แผน ในแตละมีรูขนาด 3 มิลลิเมตรที่มีระยะหางกัน 5 มิลลิเมตร1.5.3 แผนฐานกลมเปนแผนพลาสติกที่ผลิตจากวัสดุABSขนาดเสนผานศูนยกลางมิลลิเมตรเปนแผนฐานสําหรับยึดอุปกรณตางๆมีรูปรางเปนกลมประกอบดวยลอกลมกึ่งอิสระทั้งดานหนาและหลังชวยเสริมความคลองตัวใหกับหุนยนตไดเปนอยางดี ที่แผนฐานมีรูขนาด 3 มิลลิเมตรสําหรับติดตั้งอุปกรณหรือโครงสรางกลไกเพิ่มเติม
    • XT 171.5.4ชิ้นตอพลาสติกเปนชิ้นสวนพลาสติกแข็งเหนียว มี 3 แบบคือ ชิ้นตอแนวตรง, ชิ้นตอมุมฉาก และชิ้นตอมุมปาน สามารถเสียบตอกันได ใชตอกันเปนโครงสรางหรือตกแตง บรรจุ 3 แบบ รวม 30 ชิ้นตอชุด (60 ชิ้นตอชุด สําหรับ POP-BOT XT Standard kit)1.5.5แทงตอพลาสติกเปนชิ้นสวนพลาสติกแข็งเหนียวในแตละชิ้นจะมีรูขนาด3มิลลิเมตรสําหรับรอยสกรูเพื่อติดตั้งหรือตอกับชิ้นสวนโครงสรางอื่นๆ ที่ปลายของแทงตอสามารถเสียบเขากับชิ้นตอพลาสติกได ในชุดมี 3 ขนาด คือ 3, 5 และ12 รู แตละขนาดมี 4 ชิ้น1.5.6กลองรองกะบะถานเปนถาดสําหรับรองรับกะบะถานของแผงวงจร RBX-168 เพื่อยึดกับแผนฐานแบบตางๆ ไดสะดวกขึ้นทําจากพลาสติกเหนียว ตัดเจาะได มีรูสําหรับติดตั้งเขากับแผนฐานหรือโครงสรางหลักอื่นๆ ได
    • 18XT1.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 XT เปนหุนยนตอัตโนมัติขนาดเล็กที่ควบคุมดวยไมโครคอนโทรลเลอร AVR เบอรATmega32U4สรางขึ้นจากอุปกรณและชิ้นสวนจํานวนไมมากแตรองรับความตองการในการเรียนรูไดอยางครบถวนรอบดานไมวาจะเปนการควบคุมมอเตอรไฟตรงเพื่อขับเคลื่อนหุนยนตในลักษณะตางๆทางเคลื่อนที่ตรงถอยหลังหมุนตัวเลี้ยวซายและขวาการอานคาจากตัวตรวจจับชนิดตางๆทั้งแบบดิจิตอลและอะนาลอกเพื่อนํามาใชประกอบการตัดสินใจในการทํางานภายใตภาวะเงื่อนไขตางๆการติดตอกับอุปกรณแสดงผลอยางโมดูลกราฟกLCDในบทนี้นําเสนอการประกอบตัวหุนยนตPOP-BOTXT แบบมาตรฐานและจะใชโครงสรางนี้เปนหลักในการเขียนโปรแกรมเพื่อควบคุมการทํางานอยางไรก็ตามผูสรางสามารถดัดแปลงใหแตกตางออกไปไดหากแตเมื่อนํามาเขียนโปรแกรมจะตองคํานึงถึงผลของการดัดแปลงทางโครงสรางที่มีตอการทํางานของตัวตรวจจับและโปรแกรมดวยPOP-BOT XTArduino Leonardo compatible robot ขับเคลื่อนดวยมอเตอรไฟตรงพรอมชุดเฟองขับและลอกลม ควบคุมดวยไมโครคอนโทรลเลอรATmega32U4 สามารถติดตั้งแผงวงจรตรวจจับแสงสะทอนอินฟราเรดเพื่อตรวจจับเสน,แผงวงจรสวิตชตรวจจับการชน,โมดูลวัดระยะทางแบบอินฟราเรดเพื่อวัดระยะทางและหลบหลีกสิ่งกีดขวางแบบไมสัมผัส,แผงวงจรเชื่อมตอจอยสติ๊กของเครื่องเลนเกมสเพื่อควบคุมแบบใชสาย, แผงวงจรรับแสงอินฟราเรดเพื่อควบคุมจากระยะไกล,โมดูลสื่อสารขอมูลผานระบบบลูทูธเพื่อควบคุมแบบไรสาย มีโมดูลกราฟกLCDสีสําหรับแสดงผลการทํางาน ขับRCเซอรโวมอเตอรได 3ชองจึงสามารถติดตั้งกลไกเคลื่อนไหวเพิ่มเติมได ใชไฟเลี้ยงจากแบตเตอรี่AAแบบอัลคาไลนหรือแบบประจุไดจํานวน4กอน ดาวนโหลดโปรแกรมผานทางพอรตUSBของคอมพิวเตอร
    • 20XTบอรด POP-XT x1แผนฐานพลาสติกกลม x 1 ถาดรองกะบะถาน x 1ลอพลาสติกพรอมยาง x 2 ชุดเฟองขับมอเตอร x 2 เสารองโลหะ 33 มม. x 4แผงวงจรตรวจจับแสงสะทอนอินฟราเรด ZX-03 x 2ชุดชิ้นตอพลาสติกฉากโลหะ 2x2 x 2สกรูเกลียวปลอย 2 มม. x 2ชุดเสารองพลาสติก ชุดสกรูและนอตแผงวงจรสวิตช x 2ชุดแทงตอ 3 รู , 5 รู และ 12 รู
    • XT 21(1) นําชุดเฟองขับมอเตอรยึดเขากับถาดรองกะบะถาน โดยใชสกรูหัวตัดขนาด 3 x 8 มม. ขันยึดในตําแหนงดังรูป(2)นําเสารองโลหะขนาด32มม.ยึดเขากับถาดรองกะบะถานแลวใชสกรูหัวตัดขนาด3x 8มม.ขันยึดในตําแหนงดังรูป(3) นําลอพลาสติกพรอมยางเสียบเขากับแกนมอเตอรสีชมพู แลวใชสกรูเกลียวปลอย 2 มม. ขันยึดสกรูหัวตัด 3x8เสารองโลหะ 32 มม.เสารองโลหะ 32 มม.สกรูเกลียวปลอย 2 มม.
    • 22XT(4)นําชุดมอเตอรยึดเขากับฐานพลาสติกของหุนยนตแลวใชสกรูขนาด3x6มม.ขันยึดในตําแหนงดังรูปจะสังเกตไดวาการวางมอเตอรทั้งสองดานไมสมมาตรกันแตลอพลาสติกจะอยูตรงกลางพอดี(5)นําแผงวงจรตรวจจับแสงสะทอนอินฟราเรดZX-03รอยดวยสกรู3x15 มม.ยึดเขากับแทงตอ5รูทําเหมือนกัน2ชุดสําหรับดานซายและขวาของหุนยนต(6) ยึดแผงวงจรตรวจจับแสงสะทอนอินฟราเรดจากขั้นตอนที่ (5) เขาที่ดานหนาของหุนยนตทั้งทางซายและขวาโดยใชสกรูขนาด3x10มม.ขันยึดแทงตอ 5 รูZX-03ZX-03
    • XT 23(7)นําแทงตอ5รูอีกสองอันมายึดเขาที่ดานหนาของฐานหุนยนตดังรูปโดยใชสกรู3x10มม.ขันยึดติดตั้งทั้งสองขางของหุนยนตดังรูป(8)นําแผงวงจรสวิตชยึดเขากับยึดเขากับชิ้นตอมุมฉากโดยใชสกรู3x10มม.และนอต3มม.ขันยึดจากนั้นนําชิ้นตอมุมปานเสียบเขากับปลายอีกดานหนึ่งของชิ้นตอมุมฉากทําเหมือนกัน2ชุดชิ้นตอมุมปานสกรู 3x10 มม.ชิ้นตอมุมฉากนอต 3 มม.
    • 24XT(9) นําชุดแผงวงจรสวิตชติดตั้งเขากับฐานของหุนยนต โดยเสียบเขาไปที่แทงตอดังรูป(10) นําแผงวงจรPOP-XTวางลงบนกลองรองกะบะถานโดยหันดานจุดตอตัวตรวจจับไวดานหนาของหุนยนตดังรูปดานจุดตอตัวตรวจจับ
    • XT 25(11)นําสายมอเตอรตอเขากับจุดตอมอเตอรโดยใหตรวจสอบขั้วของมอเตอรจากการหมุนลอเมื่อตอสายแลวหมุนลอไปดานหนาLEDแสดงสถานะของมอเตอรควรติดเปนสีเขียวหมุนลอกลับไปทางดานหลังในทิศตรงขาม LEDควรติดเปนสีแดง ถาไมใชใหสลับขั้วตอสายมอเตอรจนกระทั่งLEDแสดงสีที่ถูกตองทั้งสองลอ(12)จากนั้นตอสายของแผงวงจรตรวจจับแสงสะทอน ZX-03ดานซายเขาที่จุดตอA1/19และตอZX-03ทางดานขวาเขาที่จุดตอA0/18 ตอสายจากแผงวงจรสวิตชดานซายเขากับจุดตอA5/23และตอสายจากแผงวงจรสวิตชดานขวาเขากับจุดตอA4/22สายตอของมอเตอรB ดานขวาสายตอของมอเตอรA ดานซายมอเตอร A ตอกับลอดานซายZX-03ขวาตอที่ A0/18ZX-03ซายตอที่A1/19ZX-01ซายตอที่ A5/23ZX-01ขวาตอที่ A4/22มอเตอร B ตอกับลอดานขวา
    • 26XT(13) จะไดหุนยนตPOP-BOTXT ที่พรอมสําหรับการเขียนโปรแกรมตอไป
    • XT 27ในบทนี้จะอธิบายสวนประกอบและรายละเอียดของโปรแกรม Arduino1.0 ที่ใชในการเขียนโปรแกรมคอมไพลโปรแกรม และอัปโหลดโปรแกรมไปยังหุนยนต POP-BOT XT โดยซอฟตแวร Arduino1.0 สามารถรันบนระบบปฏิบัติการไดทุกแบบ ไมวาจะเปน วินโดวสที่รองรับตั้งแตวินโดวส XP ขึ้นไป, MAC OS และ Linux3.1 การติดตั้งซอฟตแวร Arduinoในชุดซอฟตแวรที่มาพรอมกับชุดหุนยนต POP-BOT XT ประกอบดวย ซอฟตแวร Arduino 1.0 ที่บรรจุไดรเวอรและขอมูลสําหรับติดตอกับแผงวงจรPOP-XTของหุนยนตPOP-BOTXT ซึ่งเขากันไดกับฮารดแวรArduinoLeomardo,ไฟลไลบรารีของหุนยนต POP-BOT XT ที่ชื่อ popxt.h และโปรแกรมตัวอยาง มีขั้นตอนการติดตั้งดังนี้(ภาพประกอบที่เปนหนาตางตางๆ ของโปรแกรมอางอิงกับระบบปฏิบัติการวินโดวส 7)(3.1.1)นําแผนซีดีรอมที่มากับชุดหุนยนตPOP-BOTXT ใสเขาไปในซีดีรอมไดรฟของคอมพิวเตอรคนหาและดับเบิ้ลคลิกที่ไฟล Arduino1.0 POP-BOT XT Setup.exe จะปรากฎหนาตางตอนรับสูการติดตั้งใหคลิก Nextหนาตางติดตั้งจะสอบถามตําแหนงการติดตั้งโปรแกรมใหกด Next ขามขั้นตอนนี้ไป
    • 28XT(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 อันเปนการเลือกใหทําการติดตั้งไดรเวอรตอไป
    • 30XT(3.1.5)จากนั้นการติดตั้งไดรเวอรขั้นตนจะเกิดขึ้นรอจนกระทั่งติดตั้งเสร็จจะปรากฏหนาตางแจงการติดตั้งไดรเวอรเสร็จสมบูรณและแสดงชื่อของไดรเวอรที่ติดตั้งลงไป ในที่นี้คือ Arduino LLC คลิกปุม Finish ตอบรับการติดตั้งเสร็จสิ้น(3.1.6) โปรแกรมจะสรางชื่อ Arduino1.0 ไวที่ Start Menu ทําการทดสอบวา โปรแกรมติดตั้งเรียบรอยหรือไม ดวยการใหเขาไปที่ Start Menu และเลือกเปดโปรแกรม Arduino ขึ้นมาหนาตางของโปรแกรม Arduino 1.0 จะเปดขึ้นมา เปนการยืนยันวา การติดตั้งโปรแกรมเปนไปอยางถูกตอง
    • XT 313.2 ติดตั้งไดรเวอรใหกับหุนยนต POP-BOT XTสําหรับวินโดวส 7ในการใชงานหุนยนต 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 ของคอมพิวเตอรมิเชนนั้นการติดตั้งไดรเวอรอาจมีขอผิดพลาดได
    • 32XT(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 วินาที)มีโอกาสที่ระบบจะตรวจพบวา มีอุปกรณที่ไมมีไดรเวอรติดตั้งอยู หรือติดตั้งไดรเวอรไมสมบูรณ ดังรูปไมตองตกใจใหคลิกตอบไปที่Clickherefordetailsระบบจะแจงใหทราบถึงอุปกรณที่ไมมีไดรเวอรรองรับหรือไดรเวอรไมสมบูรณ ซึ่งก็คือ อุปกรณที่ชื่อวา POP-XT Bootloader ซึ่งไมสําคัญ เพราะไดรเวอรที่ถูกตองและใชงานจริงคือ UniconBoard & POP-XT (COMxx) หากที่รายการนี้มีขอความแจงสถานะตอทายวา Readyto us ถือวา ใชไดใหกลับไปตรวจสอบตําแหนงพอรตCOMอีกครั้งที่ DeviceManager ตามขั้นตอนที่(3.2.3) ถึง(3.2.5)
    • 34XT3.3 ติดตั้งไดรเวอรใหกับหุนยนต POP-BOT XTสําหรับวินโดวส 7 ในกรณีที่ไมสามารถติดตั้งตามขั้นตอนในหัวขอ 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 ที่มีเครื่องหมาย ! ปรากฎอยูซึ่งหมายถึง การติดไดรเวอรของอุปกรณตัวนี้ยังไมสมบูรณ ใหคลิกเมาสปุมขวาที่อุปกรณตัวนี้ แลวเลือก UpdateDriver Software..(3.3.6)จะปรากฎหนาตางตัวเลือกคนหาไดรเวอรแบบอัตโนมัติหรือหาดวยตนเองภายในคอมพิวเตอรใหเลือก Browse my computer for driver software อันเปนการเลือกตคนหาไดรเวอรดวยตนเอง
    • 36XT(3.3.7) ระบุตําแหนงของไดรเวอรไปที่ C:ArduinoDrivers จากนั้นกด Next(3.3.8)โปรแกรมจะแจงเตือนเรื่องความปลอดภัยของไดรเวอรที่เราติดตั้งลงไปใหเลือกหัวขอInstallthisdriver software anyway เพื่อยืนยันการติดตั้ง
    • XT 37(3.3.9)ระบบจะใชเวลาสักครูเพื่อติดตั้งไดรเวอรจากนั้นที่หนาตางDeviceManagerจะแสดงชื่ออุปกรณUniconBoard& POP-XT (COMxx) โดยหมายเลขของ COM นั้นขึ้นอยูกับการลงทะเบียนของคอมพิวเตอรแตละเครื่อง ซึ่งอาจแตกตางกัน โดยปกติจะมีหมายเลขตําแหนงตั้งแต COM2 ขึ้นไป(3.3.10) ขั้นตอนสุดทายจะตองจดจํากําหนดตําแหนงพอรต COM ที่เกิดขึ้นจากการติดตั้งไดรเวอรในขอ(3.2.8) เพื่อนําไปใชในซอฟตแวร Arduino1.0 เพื่อเลือกชองทางการติดตอกับฮารดแวรไดถูกตอง (จากตัวอยางตําแหนงพอรตที่ใชงานคือ COM2)การติดตั้งไดรเวอรอาจมีขั้นตอนพอสมควรดังนั้นจึงขอใหผูใชงานปฏิบัติตามเพื่อลดความผิดพลาดที่อาจเกิดขึ้นไดเมื่อติดตั้งไดรเวอรไดเรียบรอย หุนยนต POP-BOT X T ก็พรอมสําหรับการอัปโหลดโปรแกรมจากคอมพิวเตอรเพื่อทําการทดสอบและเริ่มตนการเรียนรูเพื่อพัฒนาโปรแกรมควบคุมหุนยนตอัตโนมัติขนาดเล็กในลําดับตอไป
    • 38XT3.4 ติดตั้งไดรเวอรใหกับหุนยนต POP-BOT XTสําหรับวินโดวส XPสําหรับวินโดวส XP จะมีขั้นตอนและหนาตางของการติดตั้งไดรเวอรที่แตกตางไปจากวินโดวส 7 ดังนี้(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ของคอมพิวเตอรมิเชนนั้นการติดตั้งไดรเวอรอาจมีขอผิดพลาดได220 F100 FTB6612ATMega32U4100(3.4.3)หลังจากตอสายที่มุมขวาลางของคอมพิวเตอรจะแจงวาตรวจพบฮารดแวรตัวใหมเปนอุปกรณUSBคอมโพสิต และสอบถามถึงตําแหนงของไฟลไดรเวอรที่ตองการติดตั้ง ใหคลิกเลือกที่ชอง Install from a list orspecific location (Advanced) จากนั้นคลิกที่ปุม Next เพื่อผานขั้นตอนนี้ไป
    • XT 39(3.4.4) เลือกตําแหนงของไดรเวอรไปที่ C:ArduinoDrivers ตามรูป แลวคลิกปุม Next(3.4.5) จากนั้นกระบวนการติดตั้งไดรเวอรจะเริ่มขึ้น รอจนกระทั่งเสร็จคลิกปุม Finish เพื่อจบการติดตั้ง
    • 40XT(3.4.10)ตรวจสอบตําแหนงของพรอตอนุกรมของบอรดPOP-XTที่เกิดขึ้นไดที่ControlPanel>System>Hardware>DeviceManagerแลวดูที่รายการPortsจะพบชื่อUniconBoard&POP-XT(COMxx)จากตัวอยางคือ COM104เปนการยืนยันวา การติดตั้งไดรเวอรของแผงวงจร POP-XT เสร็จสมบูรณ เมื่อติดตั้งไดรเวอรไดเรียบรอยหุนยนต POP-BOT XT ก็พรอมสําหรับการอัปโหลดโปรแกรมจากคอมพิวเตอรเพื่อทดสอบและเริ่มตนการเรียนรูเพื่อพัฒนาโปรแกรมควบคุมหุนยนตอัตโนมัติขนาดเล็กในลําดับตอไป
    • XT 413.5 การติดตั้งซอฟตแวร Arduino1.0 บนคอมพิวเตอร Macintosh ที่ใชระบบปฏิบัติการ 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
    • 42XT(3.5.5) ดับเบิ้ลคลิกเพื่อเปดซอฟตแวร Arduino จากนั้นไปที่เมนู Tools เลือก Board เปนรุนPOP-XT(3.5.6)เปดสวิตชจายไฟแกแผงวงจรPOP-XTรอสักครูเพื่อใหแผงวงจรเตรียมความพรอมใชเวลาประมาณ10 วินาที จากนั้นจึงเสียบสาย USB จากแผงวงจร POP-XT เขาที่พอรต USB ของคอมพิวเตอร Macintosh(3.5.7) ไปที่เมนูTools เลือกSerialPort จะพบอุปกรณที่ชื่อ /dev/tty.usbmodemxxxx โดย xxxx ที่ตามมาขางหลังอาจจะมีชื่อใด ๆ อยูก็ได ใหเลือกใชการสื่อสารอนุกรมจากอุปรณตัวนี้หากไดตามนี้แสดงวา การติดตั้งไดรเวอรของแผงวงจร POP-XT เสร็จสมบูรณ พรอมสําหรับการนําไปใชงานจริงกับหุนยนต POP-BOT XT
    • XT 433.6 สวนประกอบของหนาจอโปรแกรม Arduino1.0เมื่อเรียกใหโปรแกรมทํางาน จะมีหนาตาดังรูปที่ 3-1 ตัวโปรแกรมประกอบดวยสวนตางๆ ดังนี้ เมนู (Menu) ใชเลือกคําสั่งตางๆ ในการใชงานโปรแกรมแถบเครื่องมือ (Toolbar) เปนการนําคําสั่งที่ใชงานบอยๆ มาสรางเปนปุมเพื่อใหเรียกใชคําสั่งไดรวดเร็วขึ้น แถบเลือกโปรแกรม(Tabs)เปนแถบที่ใชเลือกไฟลโปรแกรมแตละตัว(กรณีที่เขียนโปรแกรมขนาดใหญประกอบดวยไฟลหลายตัว) พื้นที่เขียนโปรแกรม (Text editor) เปนพื้นที่สําหรับเขียนโปรแกรมภาษา C/C++ พื้นที่แสดงสถานะการทํางาน (Message area) เปนพื้นที่โปรแกรมใชแจงสถานะการทํางานของโปรแกรม เชน ผลการคอมไพลโปรแกรมรูปที่3-1แสดงสวนประกอบของโปรแกรมArduino1.0แถบเครื่องมือ (Tools bar)แถบเลือกโปรแกรม (Tab)เมนู (Menu)พื้นที่แสดงสถานะการทํางาน (Message area)Serial Monitorคลิกเพื่อเปดหนาตางสําหรับรับและสงขอมูลอนุกรมระหวางฮารดแวรArduino กับคอมพิวเตอรพื้นที่สําหรับเขียนโปรแกรม(Text Editor)
    • 44XT พื้นที่แสดงขอมูล (Text area) ใชแจงวาโปรแกรมที่ผานการคอมไพลแลวมีขนาดกี่ไบต ปุมสําหรับเปดหนาตาง Serial Monitor ปุมนี้จะอยูทางมุมบนดานขวามือ คลิกปุมนี้เมื่อตองการเปดหนาตางสื่อสารและแสดงขอมูลอนุกรม โดยตองมีการตอฮารดแวร Arduino และเลือกพอรตการเชื่อมตอใหถูกตองกอนหนาตางSerialMonitorมีบทบาทคอนขางมากในการใชแสดงผลการทํางานของโปรแกรมแทนการใชอุปกรณแสดงผลอื่นๆ เนื่องจาก Arduino ไดเตรียมคําสั่งสําหรับใชแสดงคาของตัวแปรที่ตองการดูผลการทํางานไวแลว นั่นคือ Serial.print สวนการสงขอมูลจากคอมพิวเตอรไปยังฮารดแวร Arduino หรือแผงวงจรควบคุมใหพิมพขอความและคลิกปุมSendในการรับสงขอมูลตองกําหนดอัตราเร็วในการถายทอดขอมูลหรือบอดเรต(baud rate) ใหกับโปรแกรมในคําสั่ง Serial.begin กรณีที่ใชงานกับคอมพิวเตอร Mcintosh หรือคอมพิวเตอรที่ติดตั้งระบบปฏิบัติการ Linux ตัวฮารดแวรของ Arduino จะรีเซ็ตเมื่อเริ่มเปดใชงาน Serial monitor3.6.1 เมนูบารเปนสวนที่แสดงรายการ (เมนู) ของคําสั่งตางๆ ของโปรแกรม ประกอบดวย3.6.1.1 เมนู Fileใน Arduino จะเรียกโปรแกรมที่พัฒนาขึ้นวา สเก็ตช (Sketch) และในโปรแกรมของผูใชงานอาจมีไฟลโปรแกรมหลายตัว จึงเรียกรวมวาเปน สเก็ตชบุก (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 : หยุดการคอมไพลโปรแกรม Add file : เพิ่มไฟลใหกับสเก็ตชบุกปจจุบัน เมื่อใชคําสั่งนี้โปรแกรม Arduino จะทําการคัดลอกไฟลที่เลือกไวมาเก็บไวในโฟลเดอรเดียวกันกับโปรแกรมที่กําลังพัฒนา ImportLibrary:เปนคําสั่งเรียกใชไลบรารีเพิ่มเติมเมื่อคลิกเลือกคําสั่งนี้แลวโปรแกรมArduinoIDEจะแสดงไลบรารีใหเลือกเมื่อเลือกแลว โปรแกรมจะแทรกบรรทัดคําสั่ง #include ลงในสวนตนของไฟล Show Sketch folder: สั่งเปดโฟลเดอรที่เก็บโปรแกรมของผูใช
    • 46XT3.6.1.4เมนู Toolsใชจัดรูปแบบของโคดโปรแกรม,เลือกรุนของฮารดแวรไมโครคอนโทรลเลอรArduino,เลือกพอรตอนุกรมเมนูที่ใชงานในหุนยนต POP-BOT XT มีดังนี้ Auto Format : จัดรูปแบบของโคดโปรแกรมใหสวยงาม เชน กั้นหนาเยื้องขวา จัดตําแหนงของวงเล็บปกกาปดใหตรงกับปกกาเปดถาเปนคําสั่งที่อยูภายในวงเล็บปกกาเปดและปดจะถูกกั้นหนาเยื้องไปทางขวามากขึ้น Archive Sketch : สั่งบีบอัดไฟลโปรแกรมทั้งโฟลเดอรหลักและโฟลเดอรยอยของสเก็ตชบุกปจจุบัน ไฟลที่สรางใหมจะมีชื่อเดียวกับสเก็ตชบุกปจจุบันตอทายดวย -510123.zip Export Folder : สั่งเปดโฟลเดอรที่เก็บสเก็ตชบุกปจจุบัน Board:เลือกฮารดแวรของบอรไมโครคอนโทรลเลอรArduinoสําหรับPOP-XTหรือหุนยนต POP-BOT XT ใหเลือกPOP-XTหรือUniconBoard เนื่องจากPOP-XTเปนหนึ่งในอนุกรมของบอรดUniconที่พัฒนาขึ้นโดยบริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด หรือ inex ซึ่งเขากันไดกับฮารดแวร Arduini Leomardo Serial Port : เลือกหมายเลขพอรตอนุกรมของคอมพิวเตอรที่ใชติดตอกับฮารดแวร Arduino รวมทั้งแผงวงจร POP-XT และ Unicon Board3.6.1.5เมนู Helpเมื่อตองการความชวยเหลือหรือตองการขอมูลเกี่ยวกับโปรแกรมใหเลือกเมนูนี้เมื่อเลือกเมนูยอยตัวโปรแกรมจะเปดไฟลเว็บเพจ (ไฟลนามสกุล .html) ที่เกี่ยวของกับหัวขอนั้นๆ ซึ่งอยูภายในโฟลเดอรที่เก็บ Arduino IDE3.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 (Arduinoprogramming 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() เปนโคดโปรแกรมที่ทํางานเชนอานคาอินพุตประมวลผลสั่งงานเอาตพุตฯลฯ โดยสวนกําหนดคาเริ่มตนเชนตัวแปรจะตองเขียนที่สวนหัวของโปรแกรมกอนถึงตัวฟงกชั่นนอกจากนั้นยังตองคํานึงถึงตัวพิมพเล็ก-ใหญของตัวแปรและชื่อฟงกชั่นใหถูกตอง
    • 48XT4.1.1 สวนของฟงกชั่น setup()ฟงกชั่นนี้จะเขียนที่สวนตนของโปรแกรม ทํางานเมื่อโปรแกรมเริ่มตนเพียงครั้งเดียว ใชเพื่อกําหนดคาของตัวแปร โหมดการทํางานของขาตางๆ เริ่มตนเรียกใชไลบรารี่ ฯลฯฯตัวอยางที่ 4-1int buttonPin = 3;void setup(){beginSerial(9600);pinMode(buttonPin, INPUT);}void loop(){if (digitalRead(buttonPin) == HIGH)serialWrite(‘H’);elseserialWrite(‘L’);delay(1000);}ในขณะที่โปรแกรมภาษา C มาตรฐานที่เขียนบน AVR GCC (เปนโปรแกรมภาษา C ที่ใช C คอมไพเลอรแบบ GCC สําหรับไมโครคอนโทรลเลอร AVR) จะเขียนไดดังนี้int main(void){init();setup();for (;;)loop();return ;}4.1.2 สวนของฟงกชั่น loop()หลังจากที่เขียนฟงกชั่น setup()ที่กําหนดคาเริ่มตนของโปรแกรมแลว สวนถัดมาคือฟงกชั่น loop()ซึ่งมีการทํางานตรงตามชื่อคือ จะทํางานตามฟงกชั่นนี้วนตอเนื่องตลอดเวลา ภายในฟงกชั่นนี้จะมีโปรแกรมของผูใช เพื่อรับคาจากพอรต ประมวล แลวสั่งเอาตพุตออกขาตางๆ เพื่อควบคุมการทํางานของบอรดตัวอยางที่ 4-2int buttonPin = 3; // setup initializes serial and the button pinvoid setup(){beginSerial(9600);pinMode(buttonPin, INPUT);}// loop checks the button pin each time and will send serial if it is pressedvoid loop(){if (digitalRead(buttonPin) == HIGH)serialWrite(‘H’);elseserialWrite(‘L’);delay(1000);}ตรงกับ void setup()ตรงกับ void loop()
    • XT 494.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
    • 50XT4.2.2 คําสั่ง if...elseใชทดสอบเพื่อกําหนดเงื่อนไขการทํางานของโปรแกรมไดมากกวาคําสั่งif ธรรมดาโดยสามารถกําหนดไดวา ถาเงื่อนไขเปนจริงใหทําอะไร ถาเปนเท็จใหทําอะไร เชน ถาคาอินพุตอะนาลอกที่อานไดนอยกวา 500 ใหทําอะไร ถาคามากกวาหรือเทากับ 500 ใหทําอีกอยาง สามารถเขียนคําสั่งไดดังนี้ตัวอยางที่ 4-3if (pinFiveInput < 500){// do Thing A}else{// do Thing B}หลังคําสั่ง else สามารถตามดวยคําสั่ง if สําหรับการทดสอบอื่นๆ ทําใหรูปแบบคําสั่งกลายเปนif....else...if เปนการทดสอบเงื่อนไขตางๆ เมื่อเปนจริงใหทําตามที่ตองการ ดังตัวอยางตอไปนี้ตัวอยางที่ 4-4if (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 514.2.3 คําสั่ง for()คําสั่งนี้ใชเพื่อสั่งใหคําสั่งที่อยูภายในวงเล็บปกกาหลัง for มีการทํางานซํ้ากันตามจํานวนรอบที่ตองการคําสั่งนี้มีประโยชนมากสําหรับการทํางานใดๆที่ตองทําซํ้ากันและทราบจํานวนรอบของการทําซํ้าที่แนนอนมักใชคูกับตัวแปรอะเรยในการเก็บสะสมคาที่อานไดจากขาอินพุตอะนาลอกหลายๆ ขาที่มีหมายเลขขาตอเนื่องกันรูปแบบของคําสั่ง for() แบงได 3 สวนดังนี้for (initialization; condition; increment){//statement(s);}เริ่มตนดวยinitialization ใชกําหนดคาเริ่มตนของตัวแปรควบคุมการวนรอบ ในการทํางานแตละรอบจะทดสอบcondition ถาเงื่อนไขเปนจริงทําตามคําสั่งในวงเล็บปกกา แลวมาเพิ่มหรือลดคาตัวแปรตามที่สั่งในincrementแลวทดสอบเงื่อนไขอีก ทําซํ้าจนกวาเงื่อนไขเปนเท็จตัวอยางที่ 4-5for (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-6switch (var){case 1://do something when var == 1break;case 2://do something when var == 2break;default:// if nothing else matches, do the default}
    • 52XT4.2.5 คําสั่ง whileเปนคําสั่งวนรอบโดยจะทําคําสั่งที่เขียนในวงเล็บปกกาอยางตอเนื่องจนกวาเงื่อนไขที่เขียนในวงเล็บของคําสั่ง while() จะเปนเท็จ คําสั่งที่ใหทําซํ้าจะตองมีการเปลี่ยนแปลงคาตัวแปรที่ใชทดสอบ เชนมีการเพิ่มตาตัวแปรหรือมีเงื่อนไขภายนอกเชนอานคาจากเซ็นเซอรไดเรียบรอยแลวใหหยุดการอานคามิฉะนั้นเงื่อนไขในวงเล็บของ while() เปนจริงตลอดเวลา ทําใหคําสั่ง while ทํางานวนรอบไปเรื่อยๆ ไมรูจบรูปแบบคําสั่งwhile(expression){// statement(s)}พารามิเตอรexpression เปนคําสั่งทดสอบเงื่อนไข (ถูกหรือผิด)ตัวอยางที่ 4-7var = 0;while(var < 200){// do something repetitive 200 timesvar++;}
    • XT 534.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-8y = y + 3;x = x - 7;i = j * 6;r = r / 5;เทคนิคสําหรับการเขียนโปรแกรม เลือกขนาดของตัวแปรใหใหญพอสําหรับเก็บคาผลลัพธที่มากที่สุดของการคํานวณ ตองทราบวาที่คาใดตัวแปรที่เก็บจะมีการวนซํ้าคากลับ และวนกลับอยางไรตัวอยางเชน(0ไป 1)หรือ(0ไป-32768) สําหรับการคําณวณที่ตองการเศษสวนใหใชตัวแปรประเภทfloatแตใหระวังผลลบเชนตัวแปรมีขนาดใหญ คํานวณไดชา ใชตัวกระทํา cast เชน (int)myfloat ในการเปลี่ยนประเภทของตัวแปรชั่วคราวขณะที่โปรแกรมทํางาน
    • 54XT4.4.2 ตัวกระทํา % หารเอาเศษใชหาคาเศษที่ไดของการหารเลขจํานวนเต็ม 2 ตัว ตัวกระทําหารเอาเศษไมสามารถใชงานกับตัวแปรเลขทศนิยม (float)รูปแบบคําสั่งresult = value1 % value2;พารามิเตอรvalue1 - เปนตัวแปรประเภท byte,char,int หรือ longvalue2 - เปนตัวแปรประเภท byte,char,int หรือ longผลที่ไดเศษจากการหารคาเลขจํานวนเต็ม เปนขอมูลชนิดเลขจํานวนเต็มตัวอยางที่ 4-9x = 7 % 5; // x now contains 2x = 9 % 5; // x now contains 4x = 5 % 5; // x now contains 0x = 4 % 5; // x now contains 4ตัวกระทําหารเอาเศษ นี้ใชประโยชนมากในงานที่ตองการใหเหตุการณเกิดขึ้นดวยชวงเวลาที่สมํ่าเสมอหรือใชทําใหหนวยความที่เก็บตัวแปรอะเรยเกิดการลนคากลับ (roll over)ตัวอยางที่ 4-10// check a sensor every 10 times through a loopvoid 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 sensorint senVal[5]; // create an array for sensor dataint i, j; // counter variableslong average; // variable to store average...void loop(){// input sensor data into oldest memory slotsensVal[(i++) % 5] = analogRead(sensPin);average = 0;for (j=0; j<5; j++){average += sensVal[j]; // add samples}average = average / 5; // divide by total
    • XT 554.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-11if (x > 0 && x < 5){// ...}ใหคาเปนจริงเมื่อ x มากกวา 0 และนอยกวา 5 (มีคา 1 ถึง 4)4.5.2&& (ตรรกะ หรือ)ใหคาเปนจริง เมื่อผลการเปรียบเทียบพบวา มีตัวแปรใดเปนจริงหรือเปนจริงทั้งคูตัวอยางที่ 4-12if (x > 0 || y > 0){// ...}ใหผลเปนจริงเมื่อ x หรือ y มีคามากกวา 04.5.3 ! (ใชกลับผลเปนตรงกันขาม)ใหคาเปนจริง เมื่อผลการเปรียบเทียบเปนเท็จตัวอยางที่ 4-13if (!x){// ...}ใหผลเปนจริงถา x เปนเท็จ (เชน ถา x = 0 ใหผลเปนจริง)
    • 56XT4.5.4 ขอควรระวังระวังเรื่องการเขียนโปรแกรม ถาตองการใชตัวกระทําตรรกะและ ตองเขียนเครื่องหมาย && ถาลืมเขียนเปน & จะเปนตัวกระทําและระดับบิตกับตัวแปร ซึ่งใหผลที่แตกตางเชนกันในการใชตรรกะหรือใหเขียนเปน|| (ขีดตั้งสองตัวติดกัน)ถาเขียนเปน| (ขีดตั้งตัวเดียว)จะหมายถึงตัวกระทําหรือระดับบิตกับตัวแปรตัวกระทํา NOT ระดับบิต (~) จะแตกตางจากตัวกลับผลใหเปนตรงขาม (!) ใหเลือกใชใหถูกตองตัวอยางที่ 4-14if (a >= 10 && a <= 20){}// true if a is between 10 and 204.6 ตัวกระทําระดับบิตตัวกระทําระดับจะนําบิตของตัวแปรมาประมวลผลใชประโยชนในการแกปญหาดานการเขียนโปรแกรมไดหลากหลาย ตัวกระทําระดับของภาษาซี (ซึ่งรวมถึง Arduino) มี 6 ตัวไดแก & (bitwise AND), | (OR), ^(Exclusive OR), ~ (NOT), << (เลื่อนบิตไปทางขวา) และ >> (เลื่อนบิตไปทางซาย)4.6.1 ตัวกระทําระดับบิต AND (&)คําสั่ง AND ในระดับบิตของภาษาซีเขียนไดโดยใช & หนึ่งตัว โดยตองเขียนระหวางนิพจนหรือตัวแปรที่เปนเลขจํานวนเต็ม การทํางานจะนําขอมูลแตละบิตของตัวแปรทั้งสองตัวมากระทําทางตรรกะและโดยมีกฎดังนี้ถาอินพุตทั้งสองตัวเปน “1” ทั้งคูเอาตพุตเปน “1” กรณีอื่นๆ เอาตพุตเปน “0” ดังตัวอยางตอไปนี้ ในการดูใหคูของตัวกระทําตามแนวตั้ง0 0 1 1 Operand10 1 0 1 Operand2——————————0 0 0 1 Returned resultในArduino ตัวแปรประเภทint จะมีขนาด 16 บิตดังนั้นเมื่อใชตัวกระทําระดับบิตANDจะมีการกระทําตรรกะและพรอมกันกับขอมูลทั้ง 16 บิต ดังตัวอยางในสวนของโปรแกรมตอไปนี้ตัวอยางที่ 4-15int a = 92; // in binary: 0000000001011100int b = 101; // in binary: 0000000001100101int c = a & b; // result: 0000000001000100 or 68 in decimal.ในตัวอยางนี้จะนําขอมูลทั้ง 16 บิตของตัวแปร a และ b มากระทําทางตรรกะและ แลวนําผลลัพธที่ไดทั้ง 16 บิตไปเก็บที่ตัวแปร c ซึ่งไดคาเปน 01000100 ในเลขฐานสองหรือเทากับ 68 ฐานสิบนิยมใชตัวกระทําระดับบิตANDเพื่อใชเลือกขอมูลบิตที่ตองการ (อาจเปนหนึ่งบิตหรือหลายบิต) จากตัวแปร int ซึ่งการเลือกเพียงบางบิตนี้จะเรียกวา masking
    • XT 574.6.2ตัวกระทําระดับบิต OR (|)คําสั่งระดับบิตORของภาษาซีเขียนไดโดยใชเครื่องหมาย|หนึ่งตัว โดยตองเขียนระหวางนิพจนหรือตัวแปรที่เปนเลขจํานวนเต็ม การทํางานจะนําขอมูลแตละบิตของตัวแปรทั้งสองตัวมากระทําทางตรรกะหรือ โดยมีกฎดังนี้ถาอินพุตตัวใดตัวหนึ่งหรือทั้งสองตัวเปน“1”เอาตพุตเปน“1” กรณีที่อินพุตเปน“0” ทั้งคูเอาตพุตจึงจะเปน“0” ดังตัวอยางตอไปนี้0 0 1 1 Operand10 1 0 1 Operand2——————————0 1 1 1 Returned resultตัวอยางที่ 4-16สวนของโปรแกรมแสดงการใชตัวกระทําระดับบิต ORint a = 92; // in binary: 0000000001011100int b = 101; // in binary: 0000000001100101int c = a | b; // result: 0000000001111101 or 125 in decimal.ตัวอยางที่ 4-17โปรแกรมแสดงการใชตัวกระทําระดับบิต ANDและ ORตัวอยางงานที่ใชตัวกระทําระดับบิต AND และ OR เปนงานที่โปรแกรมเมอรเรียกวา Read-Modify-Writeonaport สําหรับไมโครคอนโทรลเลอร8บิตคาที่อานหรือเขียนไปยังพอรตมีขนาด 8บิต ซึ่งแสดงคาอินพุตที่ขาทั้ง 8 ขา การเขียนคาไปยังพอรตจะเขียนคาครั้งเดียวไดทั้ง 8 บิตตัวแปรชื่อ PORTD เปนคาที่ใชแทนสถานะของขาดิจิตอลหมายเลข 0,1,2,3,4,5,6,7 ถาบิตใดมีคาเปน 1ทําใหขานั้นมีคาลอจิกเปน HIGH (อยาลืมกําหนดใหขาพอรตนั้นๆ ทํางานเปนเอาตพุตดวยคําสั่ง pinMode()กอน) ดังนั้นถากําหนดคาให PORTD = B00110001; ก็คือตองการใหขา 2,3 และ 7 เปน HIGH ในกรณีนี้ไมตองเปลี่ยนคาสถานะของขา0และ1ซึ่งปกติแลวฮารดแวรของArduinoใชในการสื่อสารแบบอนุกรมถาไปเปลี่ยนคาแลวจะกระทบตอการสื่อสารแบบอนุกรมอัลกอริธึมสําหรับโปรแกรมเปนดังนี้ อานคาจาก PORTD แลวลางคาเฉพาะบิตที่ตองการควบคุม (ใชตัวกระทําแบบบิต AND) นําคา PORTD ที่แกไขจากขางตนมารวมกับคาบิตที่ตองการควบคุม (ใชตัวกระทําแบบบิต OR)ซึ่งเขียนเปนโปรแกรมไดดังนี้
    • 58XTint i; // counter variableint 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 7Serial.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 1PORTD = PORTD | j;// combine the port information with the new information for LED pinsSerial.println(PORTD, BIN); // debug to show maskingdelay(100);}}4.6.3 คําสั่งระดับบิต ExclusiveOR (^)เปนโอเปอรเตอรพิเศษที่ไมคอยไดใชในภาษา C/C++ ตัวกระทําระดับบิต exclusive OR (หรือ XOR)จะเขียนโดยใชสัญลักษณเครื่องหมาย ^ ตัวกระทํานี้มีการทํางานใกลเคียงกับตัวกระทําระดับบิต OR แตตางกันเมื่ออินพุตเปน “1” ทั้งคูจะใหเอาตพุตเปน “0” แสดงการทํางานไดดังนี้0 0 1 1 Operand10 1 0 1 Operand2——————————0 1 1 0 Returned resultหรือกลาวไดอีกอยางวา ตัวกระทําระดับบิต XOR จะใหเอาตพุตเปน “0” เมื่ออินพุตทั้งสองตัวมีคาเหมือนกัน และใหเอาตพุตเปน “1” เมื่ออินพุตทั้งสองมีคาตางกันตัวอยางที่ 4-18int x = 12; // binary: 1100int y = 10; // binary: 1010int 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 ORvoid setup(){DDRD = DDRD | B00100000; // set digital pin five as OUTPUTSerial.begin(9600);}void loop(){PORTD = PORTD ^ B00100000; // invert bit 5 (digital pin 5),// leave others untoucheddelay(100);}4.6.4ตัวกระทําระดับบิต NOT (~)ตัวกระทําระดับบิต NOT จะเขียนโดยใชสัญลักษณเครื่องหมาย ~ ตัวกระทํานี้จะใชงานกับตัวถูกกระทําเพียงตัวเดียวที่อยูขวามือ โดยทําการสลับบิตทุกบิตใหมีคาตรงกันขามคือ จาก “0” เปน “1” และจาก “1” เปน “0”ดังตัวอยาง0 1 Operand1—————1 0 ~ operand1int a = 103; // binary: 0000000001100111int b = ~a; // binary: 1111111110011000เมื่อกระทําแลว ทําใหตัวแปร b มีคา -104 (ฐานสิบ) ซึ่งคําตอบที่ไดติดลบเนื่องจากบิตที่มีความสําคัญสูงสุด(บิตซายมือสุด)ของตัวแปรintอันเปนบิตแจงวาตัวเลขเปนบวกหรือลบ มีคาเปน“1”แสดงวาคาที่ไดนี้ติดลบโดยในคอมพิวเตอรจะเก็บคาตัวเลขทั้งบวกและลบตามระบบทูคอมพลีเมนต (2’s complement)การประกาศตัวแปร int ซึ่งมีความหมายเหมือนกับการประกาศตัวแปรเปน signed int ตองระวังคาของตัวแปรจะติดลบได
    • 60XT4.6.5คําสั่งเลื่อนบิตไปทางซาย (<<)และเลื่อนบิตไปทางขวา (>>)ในภาษาC/C++มีตัวกระทําเลื่อนบิตไปทางซาย<< และเลื่อนบิตไปทางขวา>> ตัวกระทํานี้จะสั่งเลื่อนบิตของตัวถูกกระทําที่เขียนดานซายมือไปทางซายหรือไปทางขวาตามจํานวนบิตที่ระบุไวในดานขวามือของตัวกระทํารูปแบบคําสั่งvariable << number_of_bitsvariable >> number_of_bitsพารามิเตอรvariable เปนตัวแปรเลขจํานวนเต็มที่มีจํานวนบิตนอยกวาหรือเทากับ 32 บิต (หรือตัวแปรประเภท byte, int หรือ long)ตัวอยางที่ 4-20int a = 5; // binary: 0000000000000101int b = a << 3; // binary: 0000000000101000 or 40 in decimalint c = b >> 3; // binary: 0000000000000101 or back to 5ตัวอยางที่ 4-21เมื่อสั่งเลื่อนคาตัวแปร x ไปทางซายจํานวน y บิต (x << y) บิตขอมูลที่อยูดานซายสุดของ x จํานวน yตัวจะหายไป เนื่องจากถูกเลื่อนหายไปทางซายมือint a = 5; // binary: 0000000000000101int b = a << 14; // binary: 0100000000000000การเลื่อนบิตไปทางซายจะทําใหคาของตัวแปรดานซายมือของตัวกระทําจะถูกคูณดวยคาสองยกกําลังบิตที่เลื่อนไปทางซายมือ ดังนี้1 << 0 == 11 << 1 == 21 << 2 == 41 << 3 == 8...1 << 8 == 2561 << 9 == 5121 << 10 == 1024...เมื่อสั่งเลื่อนตัวแปร x ไปทางขวามือจํานวน y บิต (x >> y) จะมีผลแตกตางกันขึ้นกับประเภทของตัวแปร ถา x เปนตัวแปรประเภท int คาที่เก็บไดมีทั้งคาบวกและลบ โดยบิตซายมือสุดจะเปน sign bit ถาเปนคาลบคาบิตซายมือสุดจะมีคาเปน 1 กรณีนี้เมื่อสั่งเลื่อนบิตไปทางขวามือแลวโปรแกรมจะนําคา sign bit นี้มาเติมใหกับบิตทางซายมือสุดไปเรื่อยๆ ปรากฏการณนี้เรียกวา sign eXTension มีตัวอยางดังนี้ตัวอยางที่ 4-22int x = -16; // binary: 1111111111110000int y = x >> 3; // binary: 1111111111111110
    • XT 61ถาตองการเลื่อนบิตไปทางขวามือแลวใหคา 0 มาเติมยังบิตซายมือสุด (ซึ่งเกิดกับกรณีที่ตัวแปรเปนประเภทunsigned int) เราสามารถทําไดโดยใชการเปลี่ยนประเภทตัวแปรชั่วคราว (typecast) เพื่อเปลี่ยนใหตัวแปร x เปนunsigned int ชั่วคราวดังตัวอยางตอไปนี้int x = -16; // binary: 1111111111110000int y = unsigned(x) >> 3; // binary: 0001111111111110ถาคุณระมัดระวังเรื่อง sign eXTension แลว คุณสามารถใชตัวกระทําเลื่อนบิตไปทางขวามือสําหรับการหารคาตัวแปรดวย 2 ยกกําลังตางๆ ไดดังตัวอยางint x = 1000;int y = x >> 3; // integer division of 1000 by 8, causing y = 125.4.7 ไวยากรณภาษาของ Arduino4.7.1 ; (เซมิโคลอน -semicolon)ใชเขียนแจงวา จบคําสั่งตัวอยางที่ 4-23int a = 13;บรรทัดคําสั่งที่ลืมเขียนปดทายดวยเซมิโคลอนจะทําใหแปลโปรแกรมไมผานโดยตัวแปรภาษาอาจจะแจงใหทราบวา ไมพบเครื่องหมายเซมิโคลอน หรือแจงเปนการผิดพลาดอื่นๆ บางกรณีที่ตรวจสอบบรรทัดที่แจงวาเกิดการผิดพลาดแลวไมพบที่ผิด ใหตรวจสอบบรรทัดกอนหนานั้น4.7.2 { } (วงเล็บปกกา -curlybrace)เครื่องหมายวงเล็บปกกา เปนสวนสําคัญของภาษาซี โดยมีการใชงานตางตําแหนง สรางความสับสนใหกับผูที่เริ่มตนวงเล็บปกกาเปด { จะตองเขียนตามดวยวงเล็บปกกาปด } ดวยเสมอ หรือที่เรียกวาวงเล็บตองครบคู ในซอฟตแวรArduinoIDEที่ใชเขียนโปรแกรมจะมีความสามารถในการตรวจสอบการครบคูของเครื่องหมายวงเล็บผูใชงานเพียงแคคลิกที่วงเล็บ มันจะแสดงวงเล็บที่เหลือซึ่งเปนคูของมันสําหรับโปรแกรมเมอรมือใหม และโปรแกรมเมอรที่ยายจากภาษา BASIC มาเปนภาษา C มักจะสับสนกับการใชเครื่องหมายวงเล็บ แทที่จริงแลวเครื่องหมายปกกาปดนี้เทียบไดกับคําสั่ง RETURN ของ subroutine(function) หรือแทนคําสั่ง ENDIF ในการเปรียบเทียบ และแทนคําสั่ง NEXT ของคําสั่งวนรอบ FORเนื่องจากมีการใชวงเล็บปกกาไดหลากหลายดังนั้นเมื่อตองการเขียนคําสั่งที่ตองใชเครื่องหมายวงเล็บเมื่อเขียนวงเล็บเปดแลวใหเขียนเครื่องหมายวงเล็บปดทันที ถัดมาจึงคอยเคาะปุม Enter ในระหวางเครื่องหมายวงเล็บเพื่อขึ้นบรรทัดใหม แลวเขียนคําสั่งที่ตองการ ถาทําไดตามนี้วงเล็บจะครบคูแนนอนสําหรับวงเล็บที่ไมครบคู ทําใหเกิดการผิดพลาดตอนคอมไพลโปรแกรม ถาเปนโปรแกรมขนาดใหญจะหาที่ผิดไดยาก ตําแหนงที่อยูของเครื่องหมายวงเล็บแตละตัวจะมีผลอยางมากตอไวยากรณของภาษาคอมพิวเตอรการยายตําแหนงวงเล็บไปเพียงหนึ่งหรือสองบรรทัด ทําใหตัวโปรแกรมทํางานผิดไป
    • 62XTตําแหนงที่ใชวงเล็บปกกาฟงกชั่น (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 634.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 มารวมกับไฟลโปรแกรมของเรา โดยหาไฟลจากตําแหนงที่อยูของไฟลภาษาซีของเรากอน ปกติเปนไฟลที่ผูใชสรางขึ้นเอง
    • 64XT4.8 ตัวแปรตัวแปรเปนตัวอักษรหลายตัวๆ ที่กําหนดขึ้นในโปรแกรมเพื่อใชในการเก็บคาขอมูลตางๆ เชน คาที่อานไดจากตัวตรวจจับที่ตออยูกับขาพอรตอะนาลอกของ Arduino ตัวแปรมีหลายประเภทดังนี้4.8.1 char : ตัวแปรประเภทตัวอักขระเปนตัวแปรที่มีขนาด 1 ไบต (8 บิต) มีไวเพื่อเก็บคาตัวอักษร ตัวอักษรในภาษา C จะเขียนอยูในเครื่องหมายคําพูดขีดเดียว เชน ‘A’ (สําหรับขอความ ที่ประกอบจากตัวอักษรหลายตัวเขียนตอกันจะเขียนอยูในเครื่องหมายคําพูดปกติเชน“ABC”) คุณสามารถสั่งกระทําทางคณิตศาสตรกับตัวอักษรได ในกรณีจะนําคารหัสASCIIของตัวอักษรมาใช เชน ‘A’ +1 มีคาเทากับ 66 เนื่องจากคารหัส ASCII ของตัวอักษร A เทากับ 65รูปแบบคําสั่งchar sign = ‘ ’;พารามิเตอรchar var = ‘x’;var คือชื่อของตัวแปรประเภท char ที่ตองการx คือคาที่ตองการกําหนดใหกับตัวแปร ในที่นี้เปนตัวอักษรหนึ่งตัว4.8.2 byte: ตัวแปรประเภทตัวเลบ 8 บิตหรือ 1 ไบตตัวแปร byteใชเก็บคาตัวเลขขนาด 8 บิต มีคาไดจาก 0 - 255ตัวอยางที่ 4-26byte b = B10010; // “B” is the binary formatter (18 decimal)4.8.3 int : ตัวแปรประเภทตัวเลขจํานวนเต็มยอจากintergerซึ่งแปลวาเลขจํานวนเต็มintเปนตัวแปรพื้นฐานสําหรับเก็บตัวเลข ตัวแปรหนึ่งตัวมีขนาด2 ไบต เก็บคาไดจาก-32,768 ถึง 32,767 (คาตํ่าสุดจาก -215 คาสูงสุดจาก (215-1)ในการเก็บคาตัวเลขติดลบจะใชเทคนิคที่เรียกวาทูคอมพลีเมนต(2’scomplement)บิตสูงสุดบางทีจะเรียกวาเปนบิตเครื่องหมายหรือ sign bit ถามีคาเปน “1” แสดงวาคาติดลบใน Arduino จะจัดการกับตัวเลขคาติดลบใหเอง ทําใหนําคาตัวแปรไปคํานวณไดอยางถูกตอง อยางไรก็ตามเมื่อนําตัวเลขคาติดลบนี้ไปเลื่อนบิตไปทางขวา (>>) จะมีปญหาเรื่องคาของตัวเลขที่ผิดพลาดรูปแบบคําสั่งint var = val;พารามิเตอรvar คือชื่อของตัวแปรประเภท int ที่ตองการval คือคาที่ตองการกําหนดใหกับตัวแปร
    • XT 65ตัวอยางที่ 4-27int ledPin = 13;เทคนิคสําหรับการเขียนโปรแกรมเมื่อตัวแปรมีคามากกวาคาสูงสุดที่เก็บได จะเกิดการ “ลนกลับ” (roll over) ไปยังคาตํ่าสุดที่เก็บได และเมื่อมีคานอยกวาคาตํ่าสุดที่เก็บไดจะลนกลับไปยังคาสูงสุด ดังตัวอยางตอไปนี้ตัวอยางที่ 4-28int xx = -32,768;x = x - 1; // x now contains 32,767 - rolls over in neg. directionx = 32,767;x = x + 1; // x now contains -32,768 - rolls over4.8.4 unsigned int : ตัวแปรประเภทเลขจํานวนเต็มไมคิดเครื่องหมายตัวแปรประเภทนี้คลายกับตัวแปรintตรงที่ใชหนวยความจํา2ไบตแตจะเก็บเลขจํานวนเต็มบวกเทานั้นโดยเก็บคา 0ถึง 65,535(216-1)รูปแบบคําสั่งunsigned int var = val;พารามิเตอรvar คือชื่อของตัวแปร int ที่ตองการval คือคาที่ตองการกําหนดใหกับตัวแปรตัวอยางที่ 4-29unsigned int ledPin = 13;เทคนิคสําหรับการเขียนโปรแกรมเมื่อตัวแปรมีคามากกวาคาสูงสุดจะลนกลับไปคาตํ่าสุดและเมื่อมีคานอยกวาคาตํ่าสุดจะลนกลับเปนคาสูงสุด ดังตัวอยางตัวอยางที่ 4-30unsigned int xx = 0;x = x - 1; // x now contains 65535 - rolls over in neg directionx = x + 1; // x now contains 0 - rolls over
    • 66XT4.8.5 long : ตัวแปรประเภทเลขจํานวนเต็ม 32 บิตเปนตัวแปรเก็บคาเลขจํานวนเต็มที่ขยายความจุเพิ่มจากตัวแปรintโดยตัวแปรlongหนึ่งตัวกินพื้นที่หนวยความจํา32 บิต(4ไบต) เก็บคาไดจาก -2,147,483,648 ถึง 2,147,483,647รูปแบบคําสั่งlong var = val;พารามิเตอรvar คือชื่อของตัวแปร long ที่ตองการval คือคาที่ตองการกําหนดใหกับตัวแปรตัวอยางที่ 4-31long time;void setup(){Serial.begin(9600);}void loop(){Serial.print(“Time: “);time = millis(); //prints time since program startedSerial.println(time); // wait a second so as not to send// massive amounts of datadelay(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-32long time;void setup(){Serial.begin(9600);}void loop(){Serial.print(“Time: “);time = millis(); //prints time since program startedSerial.println(time); // wait a second so as not to send// massive amounts of datadelay(1000);}
    • XT 674.8.7 float : ตัวแปรประเภทเลขทศนิยมเปนตัวแปรสําหรับเก็บคาเลขเลขทศนิยม ซึ่งนิยมใชในการเก็บคาสัญญาณอะนาล็อกหรือคาที่ตอเนื่องเนื่องจากสามารถเก็บคาไดละเอียดกวาตัวแปร int ตัวแปร float เก็บคาไดจาก 4.4028235 x 1038 ถึง -4.4028235 x1038 โดยหนึ่งตัวจะกินพื้นที่หนวยความจํา 32 บิต (4 ไบต)ในการคํานวณคณิตศาสตรกับตัวแปรfloatจะชากวาการคํานวณของตัวแปรint ดังนั้นพยายามหลีกเลี่ยงการคํานวณกับตัวแปร float เชน ในคําสั่งวนรอบที่ทํางานดวยความเร็วสูงสุดสําหรับฟงกชั่นทางเวลาที่ตองแมนยําอยางมาก โปรแกรมเมอรบางคนจะทําการแปลงตัวเลขทศนิยมใหเปนเลขจํานวนเต็มกอนแลวจึงคํานวณเพื่อใหทํางานไดเร็วขึ้นจะเห็นไดวาการคํานวณคณิตศาสตรของเลขfloatingpointจะมีการใชงานมากสําหรับการคํานวณคาขอมูลที่รับจากภายนอกซึ่งเปนตัวเลขทศนิยม ซึ่งทางผูศึกษาระบบไมโครคอนโทรลเลอรมักจะมองขามไปรูปแบบคําสั่งfloat var = val;พารามิเตอรvar คือชื่อของตัวแปร float ที่ตองการval คือคาที่ตองการกําหนดใหกับตัวแปรตัวอยางที่ 4-33float myfloat;float sensorCalbrate = 1.117;ตัวอยางที่ 4-34int x;int y;float z;x = 1;y = x / 2; // y now contains 0, integers can’t hold fractionsz = (float)x / 2.0; // z now contains .5 (you have to use 2.0, not 2)
    • 68XT4.8.8double :ตัวแปรประเภทเลขทศนิยมความละเอียดสองเทาเปนตัวแปรทศนิยมความละเอียดสองเทามีขนาด8ไบตคาสูงสุดที่เก็บไดคือ 1.7976931348623157x10308ใน 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”; Str1 เปนการประกาศตัวแปรสตริงโดยไมไดกําหนดคาเริ่มตน Str2 ประกาศตัวแปรสตริงพรอมกําหนดคาใหกับขอความทีละตัวอักษร จากตัวอยาง คอมไพเลอรจะเพิ่ม null character ใหเอง Str3 ประกาศตัวแปรสตริงพรอมกําหนดคาใหกับขอความทีละตัวอักษร จากตัวอยาง เพิ่มคา nullstring เอง Str4 ประกาศตัวแปรสตริงคพรอมกําหนคคาตัวแปรในเครื่องหมายคําพูดจากตัวอยางไมไดกําหนดขนาดตัวแปร คอมไพเลอรจะกําหนดขนาดใหเองตามจํานวนตัวอักษร + 1 สําหรับ null string Str5 ประกาศตัวแปรสตริงพรอมกําหนคคาตัวแปรในเครื่องหมายคําพูด จากตัวอยาง กําหนดขนาดตัวแปรเอง Str6 ประกาศตัวแปรสตริง โดยกําหนดขนาดเผื่อไวสําหรับขอความอื่นที่ยาวมากกวานี้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 694.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
    • 70XT4.9 ขอบเขตของตัวแปรตัวแปรในภาษาซีที่ใชในArduinoจะมีคุณสมบัติที่เรียกวา“ขอบเขตของตัวแปร”(scope)ซึ่งแตกตางจากภาษา BASIC ซึ่งตัวแปรทุกตัวมีสถานะเทาเทียมกันหมดคือ เปนแบบ global4.9.1ตัวแปรโลคอลและโกลบอลตัวแปรแบบโกลบอล(globalvariable)เปนตัวแปรที่ทุกฟงกชั่นในโปรแกรมรูจักโดยตองประกาศตัวแปรนอกฟงกชั่น สําหรับตัวแปรแบบโลคอลหรือตัวแปรทองถิ่น เปนตัวแปรที่ประกาศตัวแปรอยูภายในเครื่องหมายวงเล็บปกกาของฟงกชั่น และรูจักเฉพาะแคภายในฟงกชั่นนั้นเมื่อโปรแกรมเริ่มมีขนาดใหญและซับซอนมากขึ้นการใชตัวแปรโลคอลจะมีประโยชนมากเนื่องจากแนใจไดวามีแคฟงกชั่นนั้นเทานั้นที่สามารถใชงานตัวแปร ชวยปองกันการเกิดการผิดพลาดเมื่อฟงกชั่นทําการแกไขคาตัวแปรที่ใชงานโดยฟงกชั่นอื่นตัวอยางที่ 4-36int gPWMval; // any function will see this variablevoid setup(){// ...}void loop(){int i; // “i” is only “visible” inside of “loop”float f; // “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 714.10.2INPUT, OUTPUT : กําหนดทิศทางของขาพอรตดิจิตอลขาพอรตดิจิตอลทําหนาที่ได 2 อยางคือ เปนอินพุตและเอาตพุตเมื่อกําหนดเปน INPUT หมายถึง กําหนดใหขาพอรตนั้นๆ เปนขาอินพุตเมื่อกําหนดเปน OUTPUT หมายถึง กําหนดใหขาพอรตนั้นๆ เปนขาเอาตพุตการกําหนดคาคงที่เลขจํานวนเต็มเปนเลขฐานตางๆ ของ Arduinoคาคงที่เลขจํานวนเต็มก็คือตัวเลขที่คุณเขียนในโปรแกรมของ Arduino โดยตรงเชน 123 โดยปกติแลวตัวเลขเหลานี้จะเปนเลขฐานสิบ (decimal) ถาตองการกําหนดเปนเลขฐานอื่นจะตองใชเครื่องหมายพิเศษระบ ุเชนฐาน ตัวอยาง10 (decimal) 1232 (binary) B11110118 (octal) 017316 (hexadecimal) 0x7BDecimal ก็คือเลขฐานสิบ ซึ่งเราใชในชีวิตประจําวันตัวอยาง 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 byteOctal เปนเลขฐานแปด ตัวเลขแตละหลักมีคาจาก 0 ถึง 7 เทานั้นตัวอยาง 0101 == 65 decimal ((1 * 8^2) + (0 * 8^1) + 1)ขอควรระวังในการกําหนดคาคงที่ อยาเผลอใสเลข 0 นําหนา มิฉะนั้นตัวคอมไพเลอรจะแปลความหมายผิดไปวาคาตัวเลขเปนเลขฐาน 8Hexadecimal (hex) เปนเลขฐานสิบหก ตัวเลขแตละหลักมีคาจาก 0 ถึง 9 และตัวอักษร A คือ 10, B คือ 11ไปจนถึง F ซึ่งเทากับ 15ตัวอยาง 0x101 == 257 decimal ((1 * 16^2) + (0 * 16^1) + 1)POP-Note
    • 72XT4.11 ตัวกระทําอื่นๆ ที่เกี่ยวของกับตัวแปร4.11.1 cast : การเปลี่ยนประเภทตัวแปรชั่วคราวcastเปนตัวกระทําที่ใชสั่งใหเปลี่ยนประเภทของตัวแปรไปเปนประเภทอื่นและบังคับใหคํานวณคาตัวแปรเปนประเภทใหมรูปแบบคําสั่ง(type)variableเมื่อ Type เปนประเภทของตัวแปรใดๆ (เชน int, float, long)Variable เปนตัวแปรหรือคาคงที่ใดๆตัวอยางที่ 4-37int i;float f;f = 4.6;i = (int) f; // now i is 3ในการเปลี่ยนประเภทตัวแปรจาก float เปน int คาที่ไดจะถูกตัดเศษออก ดังนั้น (int)4.2 และ (int)4.7มีคาเทากันคือ 34.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 734.12 คําสงวนของ Arduinoคําสงวนคือ คาคงที่ ตัวแปร และฟงกชั่นที่ไดกําหนดไวเปนสวนหนึ่งของภาษา C ของ Arduino หามนําคําเหลานี้ไปตั้งชื่อตัวแปร สามารถแสดงไดดังนี้# ConstantsHIGHLOWINPUTOUTPUTSERIALDISPLAYPIHALF_PITWO_PILSBFIRSTMSBFIRSTCHANGEFALLINGRISINGfalsetruenull# Port ConstantsDDRBPINBPORTBDDRCPINCPORTCDDRDPINDPORTD# Datatypesbooleanbytecharclassdefaultdodoubleintlongprivateprotectedpublicreturnshortsignedstaticswitchthrowtryunsignedvoid# Otherabsacos+=+[]asin=atanatan2&&=||=booleanbytecaseceilcharcharclass,//?:constraincos{}—defaultdelaydelayMicroseconds//**.else==expfalsefloatfloatfloorfor<<=HALF_PIif++!=int<<<<=log&&!||^^=loopmaxmillismin-%/**newnull()PIIreturn>>;SerialSetupsinsqsqrt-=switchtanthistrueTWO_PIvoidwhileSerialbeginreadprintwriteprintlnavailabledigitalWritedigitalReadpinModeanalogReadanalogWriteattachInterruptsdetachInterruptsbeginSerialserialWriteserialReadserialAvailableprintStringprintIntegerprintByteprintHexprintOctalprintBinaryprintNewlinepulseInshiftOut
    • 74XT
    • XT 75XTชุดหุนยนตPOP-BOTXT ไดรับการออกแบบใหรองรับกับการเรียนรูดานเทคโนโลยีและฝกกระบวนการคิดผานทางการเขียนโปรแกรมควบคุมดวยภาษาCเปนหลักในบทนี้เปนการนําเสนอถึงองคประกอบทั้งหมดโดยสรุปของสื่อการเรียนรูชุดนี้พรอมกับแนะนําตัวอยางการใชงานเครื่องมือสําหรับพัฒนาโปรแกรมและตัวอยางของการทดสอบการทํางานทางฮารดแวรในขั้นตน เพื่อใชเปนแนวทางในการพัฒนาโปรแกรมสําหรับควบคุมสื่อหุนยนตเพื่อการศึกษาตัวนี้5.1 องคประกอบหลักทางฮารดแวรที่ใชสรางหุนยนต POP-BOT XT5.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
    • 76XTรูปที่5-1แสดงผังงานของการพัฒนาโปรแกรมเพื่อควบคุมหุนยนตPOP-BOTXT ดวยภาษาCโดยใชArduino1.0สรางไฟลสเก็ตชเขียนโปรแกรมภาษา C บน Arduino IDEคอมไพลอัปโหลดโปรแกรมอัปโหลดโปรแกรมผานพอรต USB1. ตอสาย USB-miniB เขากับพอรต USBและหุนยนต POP-BOT XT2. ตรวจสอบตําแหนง USB Serial port (COMx)ที่เกิดขึ้น3. เลือกฮารดแวรเปน Unicon Board เนื่องจากแผงวงจร POP-XT ในหุนยนต POP-BOT XTเปนหนึ่งในอนุกรมของแผงวงจร Uniconซึ่งเขากันไดกับฮารดแวร Arduino Leonardo4. ทําการโปรแกรมรันโปรแกรมหลังจากอัปโหลดโปรแกรมเสร็จสมบูรณแลวกดสวิตช RESET บนแผงวงจรควบคุมของหุนยนตPOP-BOT XT จากนั้นหุนยนตจะเริ่มทํางานทันทีติดตั้งซอฟตแวร- Arduino1.0 ซอฟตแวรพัฒนาโปรแกรมภาษา C/C++ มีทั้งสวนของเท็กซเอดิเตอรสําหรับเขียนโปรแกรม, คอมไพเลอร และซอฟตแวรสําหรับโปรแกรมไมโครคอนโทรลเลอร- ไดรเวอรของแผงวงจร POP-XT ซึ่งเปนหนึ่งในอนุกรมของบอรดUnicon ที่เขากันไดกับ Arduino Leonardoพอรต USB
    • XT 775.4ทดสอบการทํางานของแผงวงจรควบคุมของหุนยนต POP-BOT XTหลังจากที่ติดตั้งโปรแกรมและไดรเวอรของPOP-XTอันเปนแผงวงจรควบคุมการทํางานของหุนยนต POP-BOTXT เรียบรอยแลวตั้งแตบทที่3ในหัวขอนี้เปนการทดสอบการทํางานในเบื้องตนดวยการนําโปรแกรมตัวอยางมาคอมไพลและอัปโหลดโปรแกรมไปยังหุนยนต POP-BOT XTเรียกโปรแกรม Arduino1.0 ขึ้นมาใชงาน โดยคลิกปุม Start > Arduino1.0 > Arduinoเมื่อ Arduino ทํางานในครั้งแรกจะมีหนาจอดังรูป
    • 78XT5.4.1 กําหนดคาทางฮารดแวรเพื่อใชกับหุนยนต POP-BOT XTในการใชงานโปรแกรม Arduino ครั้งแรกจะตองกําหนดคาของฮารดแวรที่ใชงานรวมดวย ซึ่งประกอบดวยการเลือกแผงวงจรไมโครคอนโทรลเลอรที่ใชและเลือกพอรตอนุกรมของคอมพิวเตอรที่ตองการเชื่อมตอเมื่อกําหนดคาแลว ครั้งตอไปที่เปดโปรแกรมจะนําคาที่กําหนดไวมาใชงานทันที5.4.1.1เลือกเบอรของไมโครคอนโทรลเลอรเลือกเมนู Tools  Board  POP-XT หรือ Unicon Board (ใชไดทั้งสองรุน) ดังรูป5.4.1.2กําหนดพอรตอนุกรมที่ใชในการติดตอกับโมดูลการอัปโหลดโปรแกรมจาก Arduino ไปยังหุนยนต POP-BOT XT จะกระทําผานพอรตอนุกรม ซึ่งจะตองกําหนดหมายเลขพอรตที่ใชดังนี้ เลือกเมนูTools SerialPortโปรแกรมจะแสดงพอรตอนุกรมที่มีในคอมพิวเตอรใหผูใชเลื่อนเคอรเซอรของเมาสไปยังพอรตอนุกรมที่ตองการ ดังรูปพอรตอนุกรมที่ใชกับหุนยนต POP-BOT XT เปนพอรตอนุกรมเสมือน(virtualCOMport) ที่เกิดจากการติดตั้งไดรเวอร ปกติคือพอรต COM ที่มีหมายเลขมากกวา 2 ขึ้นไป ในตัวอยางเลือกพอรต COM104
    • XT 795.4.2ทดลองสรางไฟลสเก็ตชตัวอยางArduinoจะเรียกโปรแกรมที่เขียนขึ้นวาสเก็ตชบุก(Sketchbook)เริ่มตนการสรางไฟลสเก็ตชดวยคําสั่งNew(1) คลิกเลือกเมนู File > New จากนั้นพิมพโคดตัวอยางดังตอไปนี้#include <popxt.h> //Include POP-XT libraryvoid setup(){glcd(1,0,"Hello World"); //Show message on GLCD}void loop(){}(2) บันทึกเปนไฟลชื่อ HelloWorld.ino(3) จากนั้นทําการคอมไพลโปรแกรม เลือกเมนู Sketch  Verify/Compile ดังรูปหรือกดที่ปุม
    • 80XT(4) เมื่อคอมไพลโปรแกรมแลว ที่แถบแสดงสถานะและหนาตางแสดงผลการคอมไพล ซึ่งเปนหนาตางสีดําอยูดานลางของโปรแกรม ที่แถบแสดงสถานะจะปรากฏขอความDonecompilingและหนาตางแสดงผลแสดงขอความวา 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)มีขั้นตอนโดยสรุปดังนี้(1)เปดสวิตชของหุนยนตPOP-BOTXT รอใหตัวหุนยนตพรอมทํางานประมาณ10วินาทีจากนั้นตอสายUSB เขากับคอมพิวเตอรสาย USB-miniBตอกับพอรต USBของคอมพิวเตอรคอมพิวเตอรหุนยนต POP-BOT XT220F100FTB6612ATMega32U4100
    • 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 มีความสะดวกและสามารถดําเนินการขั้นตอนทั้งหมดภายในหนาตางการทํางานหลักเพียงหนาตางเดียว
    • 82XT
    • 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 หรือหุนยนตPOP-BOTXT ตองรอใหตัวควบคุมพรอมทํางานเสียกอนซึ่งใชเวลาประมาณ10วินาทีหลังจากเปดไฟเลี้ยงหรือหลังจากการกดสวิตชRESETหากมีการอัปโหลดกอนที่แผงวงจรPOP-XTจะพรอมทํางาน อาจทําใหเกิดความผิดพลาดในการเชื่อมตอ หรือโคดที่อัปโหลดลงไปไมทํางานตามที่ควบจะเปน แตจะไมสงผลจนทําใหแผงวงจรเกิดความเสียหายสิ่งที่เกิดขึ้นมีเพียงแผงวงจรไมทํางานหรือทํางานไมถูกตองเทานั้น
    • 84XT(A1.1.1) เปดโปรแกรม Arduino1.0 พิมพโปรแกรมที่ A1-1 แลวบันทึกไฟล(A1.1.2) เปดสวิตชจายไฟแกแผงวงจร POP-XT แลว เชื่อมตอสาย USB เขากับคอมพิวเตอรสาย USB-miniBตอกับพอรต USBของคอมพิวเตอรคอมพิวเตอรหุนยนต POP-BOT XT220F100FTB6612ATMega32U4100(A1.1.3)เลือกชนิดหรือรุนของฮารดแวรใหถูกตอง โดยเลือกที่เมนูTools>Board> POP-XTหรือ Unicon Board(ใชไดทั้งสองรุน) ดังรูป
    • XT 85(A1.1.4)เลือกพอรตอนุกรมสําหรับติดตอกับแผงวงจรPOP-XTหรือหุนยนตPOP-BOTXT โดยเลือกที่เมนูTools> Serial Port ดังรูป (ตําแหนงของพอรตที่ใชเชื่อมตออาจแตกตางกันในคอมพิวเตอรแตละเครื่อง)(A1.1.5) คอมไพลและอัปโหลดไปยังแผงวงจร POP-XT โดยคลิกที่ปุม หรือเลือกที่เมนู File > Uploadที่หนาจอแสดงผลกราฟก LCD ของแผงวงจร POP-XT แสดงขอความ Hello World220 F100 FTB6612ATMega32U4100Hello World#include <popxt.h> // ผนวกไลบรารีหลักvoid setup(){glcd(1,0,"Hello World"); // แสดงขอความบนจอแสดงผล}void loop(){}คําอธิบายโปรแกรมโปรแกรมนี้จะทํางานโดยสงขอความ Hello World ออกไปแสดงผลที่บรรทัด 1 คอลัมน 0 ของจอแสดงผล จะทํางานเพียงครั้งเดียว จึงเขียนโปรแกรมไวที่ตําแหนงของ void setup() เทานั้นโปรแกรมที่A1-1ไฟลHelloWorld.inoสําหรับทดสอบการแสดงผลของแผงวงจรPOP-XT
    • 86XTจอแสดงผลของแผงวงจร 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++) // วนลูป 16 รอบเพื่อแสดงขอความ{glcd(i,0," Row %d ",i); // แสดงขอความที่จอแสดงผล}}void loop(){}โปรแกรมที่A1-2ไฟลMultipleTextline.inoสําหรับทดสอบการแสดงผลของแผงวงจรPOP-XTคําอธิบายโปรแกรมในโปรแกรมนี้เพิ่มเติมคําสั่งสําหรับการใชงานจอแสดงผลอีก 3 คําสั่งคือ1. glcdFillScreen เปนคําสั่งกําหนดสีพื้นหลังของจอแสดงผล2. setTextColor สําหรับกําหนดสีใหแกตัวอักษร3. setTextBackground สําหรับกําหนดสีพื้นหลังของตัวอักษรเมื่อตั้งคาของจอแสดงผลแลว จึงทําการสงขอความ Row ตามดวยหมายเลขบรรทัดซึ่งมาจากการเพิ่มคาของตัวแปร i และมีการเลื่อนตําแหนงตามคาของ i ดวย ดังนั้นที่บรรทัดแรก ขอความ Row0 ถูกแสดงที่คอลัมน 0 ที่บรรทัด 2 แสดงขอความ Row 1 ที่คอลัมน 1 ไลไปตามลําดับจนถึงบรรทัด 15 (บรรทัดที่ 16)จะแสดงเปน Row 15 ที่คอลัมน 15
    • XT 87(A1.2.2) เปดสวิตชจายไฟแกแผงวงจร POP-XT แลว เชื่อมตอสาย USB เขากับคอมพิวเตอร(A1.2.3)คอมไพลและอัปโหลดโปรแกรมไปยังแผงวงจรPOP-XTโดยคลิกที่ปุม หรือเลือกที่เมนูFile > Uploadที่หนาจอแสดงผลกราฟกLCD ของแผงวงจร POP-XTแสดงขอความ Row 0 ถึง Row 15 เรียงไปบรรทัดละขอความ220 F100 FTB6612ATMega32U4100Row00Row01RRRow02RRRRow03RRRRRow04RRRRRRow05RRRRRRRow06RRRRRRRRow07RRRRRRRRRow08RRRRRRRRRRow09RRRRRRRRRRRow010RRRRRRRRRRRRow011RRRRRRRRRRRRRow012RRRRRRRRRRRRRRow013RRRRRRRRRRRRRRRow014RRRRRRRRRRRRRRRRow015
    • 88XTขนาดตัวอักษรปกติที่แสดงบนจอแสดงผลของแผงวงจร 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 ทิศทาง โดยดูจากคา MM = 0 จอแสดงขอความแนวตั้ง M = 1 หมุนการแสดงผลไป 90 องศาทางขวาตัวอักษรขนาด 3 เทา ตัวอักษรขนาด 4 เทาM = 2 หมุนการการแสดงผลไป 180 องศา M = 3 หมุนการแสดงผลไป 270 องศาจะไดภาพที่กลับหัวเมื่อเทียบกับ M = 0 ตัวอักษรขนาด 5 เทาตัวอักษรขนาด 4 เทา
    • 90XTฟงกชั่น glcd เปนฟงกชั่นหลักในการติดตอกับจอแสดงผลกราฟก LCD นอกจากมีคําสั่งแสดงขอความแลว ยังมีคําสั่งในการวาดลายเสนกราฟกอีกหลายคําสั่ง ประกอบดวย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แลวอัปโหลดเพื่อทดสอบการทํางานไปยังแผงวงจรPOP-XT จะไดผลดังรูป
    • 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); // วาดเสนสีขาวจากพิกัด 0,0 ไปยังจุดที่กําหนด}for (i=0;i<128;i+=4){glcdLine(0,0,i,160,GLCD_RED); // วาดเสนสีแดงจากพิกัด 0,0 ไปยังจุดที่กําหนด}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);}โปรแกรมที่A1-4ไฟลSimplegraphic.inoสําหรับทดสอบการแสดงผลของแผงวงจรPOP-XT
    • 92XTนอกจากวงกลมและสี่เหลี่ยมแลวเสนโคงก็เปนสวนประกอบสําคัญในการสรางภาพกราฟกในชุดคําสั่งเกี่ยวกับการแสดงผลจอภาพแบบกราฟกสีของแผงวงจร 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 องศา แลววนกลับมาที่หนาเริ่มตน จะวนแสดงผลไปตลอดเวลา
    • 94XTบนแผงวงจร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); // ขับเสียงที่มีความถี่ 500Hz นาน 0.5 วินาทีsound(2500,500); // ขับเสียงที่มีความถี่ 2500Hz นาน 0.5 วินาที}โปรแกรมที่ A2-2 ไฟล SoundTest.ino สําหรับทดสอบการขับเสียงออกลําโพงของแผงวงจร POP-XTแบบกําหนดความถี่และเวลาได
    • 96XTในระบบควบคุมพื้นฐานจะตองมีการปรับตั้งคา มีเมนู มีสวิตชในการสั่งงานตางๆ บนแผงวงจร POP-XTก็มีสวนติดตตอกับผูใชงานดวยเชนกันประกอบดวยปุมKNOBสําหรับปรับเลือกรายการ และสวิตชOKสําหรับยืนยันการเขาสูรายการทางเลือกนั้นๆ220 F100 FTB6612ATMega32U4100เขียนโปรแกรมที่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); // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติglcd(1,1,"Press OK"); // แสดงขอความออกหนาจอแสดงผลsw_ok_press(); // วนรอจนกระทั่งกดสวิตช OKbeep(); // ขับเสียง “ติ้ด” ออกลําโพงglcdClear; // เคลียรหนาจอแสดงผล กําหนดพื้นหลังเปนสีดํา}void loop(){if (sw_ok()) // ตรวจสอบการกดสวิตช OK{sound(500,500); // หากมีการกดสวิตช ขับเสียงความถี่ 500 Hz นาน 0.5 วินาที}glcd(1,0,"Knob value"); // แสดงขอความที่จอแสดงผลsetTextSize(3); // เลือกขนาดตัวอักษรใหญเปน 3 เทาจากขนาดปกติglcd(2,2,"%d ",knob()); // แสดงคาที่อานไดจากการปรับปุม KNOB ที่หนาจอแสดงผลsetTextSize(2); // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ}โปรแกรมที่A3-1ไฟลKnobSwitchTest.inoสําหรับทดสอบอานคาจากปุมKNOB และสวิตชOK
    • 98XTในไฟลไลบรารี 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(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 ทั้งสองชุดติดและดับสลับกันไปอยางตอเนื่องแผงวงจร ZX-LED
    • XT 99#include <popxt.h> // ผนวกไฟลไลบรารี่หลักvoid setup(){setTextSize(2); // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติglcd(1,1,"Press OK"); // แสดงขอความออกหนาจอ GLCDsw_ok_press(); // วนรอการกดสวิตช OK}void loop(){out(4,1); // ทําให LED ที่ตออยูกับพอรต 4 (Di 4) ติดสวางout(6,0); // ทําให LED ที่ตออยูกับพอรต 6 (Di 6) ดับsleep(400);out(4,0); // ทําให LED ที่ตออยูกับพอรต 4 (Di 4) ดับout(6,1); // ทําให LED ที่ตออยูกับพอรต 6 (Di 6) ติดสวางsleep(400);}โปรแกรมที่A4-1ไฟลLEDTest.inoสําหรับทดสอบการขับอุปกรณเอาตพุตอยางงาย
    • XT 101XTการพัฒนาโปรแกรมภาษา C/C++ ดวย Arduino สําหรับหุนยนต POP-BOT XT ดําเนินการภายใตการสนับสนุนของไฟลไลบรารี popxt.h ทั้งนี้เพื่อชวยลดขั้นตอนและความซับซอนในการเขียนโปรแกรมควบคุมสวนตางๆของฮารดแวรลง เนื่องจากตองการใหความสําคัญของการพัฒนาโปรแกรมควบคุมหุนยนต POP-BOTXT ไปอยูที่การเขียนโปรแกรมสําหรับรองรับการเรียนรูและกิจกรรมการแขงขันโครงสรางของไฟลไลบรารี popxt.h แสดงดังรูป
    • 102XT7.1 ไลบรารียอยภายในไฟลไลบรารี popxt.h glcd บรรจุฟงกชั่นและคําสั่งสําหรับแสดงผลขอความ, ตัวเลขและสรางภาพกราฟกสีที่จอแสดงผลแบบกราฟกLCDสีของ POP-BOT XT (ยังไมรองรับการทํางานกับไฟลรูปภาพ) sleep บรรจุฟงกชั่นและคําสั่งสําหรับการหนวงเวลา in_out บรรจุฟงกชั่นและคําสั่งสําหรับอานคาอินพุตดิจิตอลและสงคาออกทางขาพอรตเอาตพุตดิจิตอล analog บรรจุฟงกชั่นและคําสั่งสําหรับอานคาจากอินพุตอะนาลอกที่ตอกับตัวตรวจจับ sound บรรจุฟงกชั่นและคําสั่งสําหรับสรางเสียงเพื่อขับออกลําโพง motor บรรจุฟงกชั่นและคําสั่งสําหรับขับมอเตอรไฟตรง servo บรรจุฟงกชั่นและคําสั่งสําหรับขับเซอรโวมอเตอร serial บรรจุฟงกชั่นและคําสั่งสําหรับสื่อสารขอมูลอนุกรมผานทางพอรต USB และผานทางขาพอรตTxDและRxD ของแผงวงจร POP-XTในการเรียกใชงานชุดคําสั่งยอยตางๆเพื่อการพัฒนาโปรแกรมควบคุมหุนยนตPOP-BOTXT ผูพัฒนาตองผนวกไฟลไลบรารีหลัก popbot.h ไวในตอนตนของโปรแกรมดวยคําสั่ง#include <popxt.h>เพื่อประกาศใหใหตัวแปลภาษาหรือคอมไพเลอรรูจักชุดคําสั่งยอยตางๆที่กําลังจะถูกเรียกใชงานจากไฟลไลบรารี popxt.h
    • XT 1037.2 รายละเอียดของฟงกชั่นหรือคําสั่งหลักในไฟลไลบรารี popxt.h7.2.1ฟงกชั่นเกี่ยวกับการแสดงผลจอภาพแบบกราฟก LCDสี7.2.1.1 glcdเปนฟงกชั่นแสดงขอความที่หนาจอแสดงผลกราฟกLCDสีโดยแสดงตัวอักษรขนาดปกติได21ตัวอักษร16 บรรทัดรูปแบบvoid glcd(unsigned char x, unsigned char y ,char *p,...)พารามิเตอรx คือตําแหนงบรรทัดมีคาตั้งแต 0 ถึง 15y คือตําแหนงตัวอักษรมีคาตั้งแต 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-1glcd(2,0,“Hello World“); // แสดงขอความ HelloWorldที่ตําแหนงซายสุดของบรรทัด2 (บรรทัดที่3)100 FHelloRWorldRRRRow03RRRRRow04RRRRRRow05RRRRRRRow06RRRRRRRRow07ตัวอยางที่ 7-2int x=20;glcd(1,2,”Value = %d”,x); // แสดงตัวอักษรและตัวเลขบนบรรทัดเดียวกัน// เริ่มตนที่คอลัมน 2 ของบรรทัด 1 (บรรทัดที่ 2)100 FRow00RRValueR=R20RRRow02RRRRow03RRRRRow04RRRRRRow05RRRRRRRow06RRRRRRRRow07
    • 104XT7.2.1.2 colorRGBเปนฟงกชั่นเปลี่ยนคาสีในรูปแบบ RGB (แดง เขียว นํ้าเงิน) ใหอยูในรูปของตัวเลข 16 บิต โดยแบงเปนคาของสีแดง 5 บิต ตอดวยสีเขียว 6 บิต และปดทายดวยคาของสีนํ้าเงิน 5 บิตรูปแบบunsigned int colorRGB(uint red,uint green,uint blue)พารามิเตอรred - เปนคาของสีแดง มีคาระหวาง 0 ถึง 31 ถาคาที่ปอนมากกวา 31 จะปรับลดใหเทากับ 31green - คาของสีเขียว มีคาระหวาง 0 ถึง 63 ถาคาที่ปอนมากกวา 63 จะถูกปรับลดใหเทากับ 63blue - คาของสีนํ้าเงิน มีคาระหวาง0 ถึง 31 ถาคาที่ปอนมากกวา 31 จะปรับลดใหเทากับ 31ตัวอยางที่ 7-3#include <popxt.h>int colors;void setup(){int colors;colors=colorRGB(31,0,0); // สงคาสี 16 บิตของสีแดงใหตัวแปร colorsglcdFillScreen(colors); // นําคาไปแสดงเปนสีพื้นของจอแสดงผล}void loop(){}220 F100 FTB6612ATMega32U4100Row00RRValueR=R20RRRow02RRRRow03RRRRRow04RRRRRRow05RRRRRRRow06RRRRRRRRow07RRRRRRRRRow08RRRRRRRRRRow09RRRRRRRRRRRow010RRRRRRRRRRRRow011RRRRRRRRRRRRRow012RRRRRRRRRRRRRRow013RRRRRRRRRRRRRRRow014RRRRRRRRRRRRRRRRow015
    • XT 1057.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-4glcdFillScreen(color[5]) // กําหนดใหพื้นหลังเปนสีขาวตัวอยาง 7-5glcdFillScreen(GLCD_BLUE) // กําหนดใหพื้นหลังเปนสีนํ้าเงิน
    • 106XT7.2.1.4 setTextColorเปนการกําหนดคาสีของตัวอักษรที่แสดงดวยฟงกชั่น glcd() โดยคาตั้งตนกําหนดเปนสีขาวรูปแบบvoid setTextColor(unsigned int newColor)พารามิเตอรnewColor คือสีที่ตองการ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[]ตัวอยางที่ 7-6setTextColor(GLCD_YELLOW); // กําหนดใหสีของตัวอักษรเปนสีเหลือง7.2.1.5 setTextBackgroundColorเปนฟงกชั่นกําหนดสีของพื้นหลังตัวอักษรโดยคาตั้งตนเปนสีดํา สีของพื้นหลังตัวอักษรจะเปนคนละสวนกับสีของพื้นจอภาพ (screen background) ซึ่งตองกําหนดคาผานฟงกชั่น glcdFillScreenรูปแบบvoid setTextBackgroundColor(unsigned int newColor)พารามิเตอรnewColor คือสีที่ตองการ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[]ตัวอยางที่ 7-7setTextBackgroundColor(GLCD_GREEN); // กําหนดใหสีพื้นหลังตัวอักษรเปนสีเขียว220 F100 FTB6612ATMega32U4100RRValueR=R20RRRow02RRRRow03RRRRRow04RRRRRRow05RRRRRRRow06RRRRRRRRow07RRRRRRRRRow08RRRRRRRRRRow09RRRRRRRRRRRow010RRRRRRRRRRRRow011RRRRRRRRRRRR Row012RRRRRRRRRRRRR Row013RRRRRRRRRRRRRR Row014RRRRRRRRRRRRRRR Row015Hello World
    • XT 1077.2.1.6 glcdClearเปนการเคลียรหนาจอแสดงผลโดยสีของพื้นหลังจะเปนสีพื้นหลังของตัวอักษรลาสุดโดยถาไมไดกําหนดดวยคําสั่ง setTextBackGroundColor() มากอนหนานี้หลังจากทําคําสั่ง glcdClear() แลวพื้นหลังจะเปนสีดํารูปแบบvoid glcdClear()ตัวอยางที่ 7-8glcdClear(); // เคลียรหนาจอแสดงผล7.2.1.7 glcdFillScreenเปนการเคลียรหนาจอแสดงผล แลวเปลี่ยนสีพื้นหลังของจอแสดงผลดวยสีที่ระบุรูปแบบvoid glcdFillScreen(unsigned int color)พารามิเตอรcolor คือสีที่ตองการ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[]ตัวอยางที่ 7-9glcdFillScreen(GLCD_BLUE); // กําหนดสีพื้นหลังของจอภาพเปนสีนํ้าเงิน
    • 108XT7.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); // ขนาดตัวอักษร 2 เทา}void loop(){glcdClear(); // เคลียรหนาจอglcdMode(0); // โหมด 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();}
    • XT 1097.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(){}
    • 110XT7.2.1.10 getTextColorเปนคําสั่งคืนคาสีปจจุบันของตัวอักษรรูปแบบunsigned int getTextColor()การคืนคาtextColor เปนคาสีแสดงอยูในรูปของตัวเลข 16 บิต ดูรูปแบบไดจากฟงกชั่น colorRGB()ตัวอยางที่ 7-12unsigned int color;color=getTextColor(); // นําคาสีของตัวอักษรเก็บไวที่ตัวแปร color7.2.1.11 getTextBackgroundColorคืนคาสีพื้นหลังของตัวอักษรรูปแบบunsigned int getTextBackgroundColor()การคืนคาtextBackgroundColor เปนคาสีแสดงอยูในรูปของตัวเลข 16 บิต ดูรูปแบบไดจากฟงกชั่น colorRGB()ตัวอยางที่ 7-13unsigned int color;color=getTextBackgroundColor(); // นําคาสีพื้นหลังของตัวอักษรเก็บในตัวแปร color7.2.1.12 getTextSizeคืนคาขนาดของตัวอักษรออกมาเปนจํานวนเทาของคาปกติรูปแบบunsigned int getTextSize()การคืนคาtextSize เปนคาจํานวนเทาของขนาดตัวอักษรตัวอยางที่ 7-14unsigned int textSize;textSize=getTextSize(); // นําคาจํานวนเทาของขนาดของตัวอักษรเก็บในตัวแปร textSize
    • XT 1117.2.1.13 glcdGetModeคืนคาของโหมดทิศทางการแสดงผลรูปแบบunsigned int glcdGetMode()การคืนคาmode เปนคาของโหมดทิศทางการแสดงผล เปนตัวเลข 0 ถึง 3 เพื่อแสดงผลในทิศทาง 0 องศา, หมุน 90องศา, หมุน 180 องศา และหมุน 270 องศาตามลําดับตัวอยางที่ 7-15unsigned int Mode;Mode=glcdGetMode(); // คืนคาทิศทางการแสดงผลของหนาจอ GLCD7.2.1.14 glcdPixelเปนการพล็อตจุดบนจอภาพตามพิกัดที่กําหนด โดยอางอิงจอภาพขนาด 128 x 160 พิกเซลรูปแบบvoid glcdPixel(unsigned int x,unsigned int y,unsigned int color)พารามิเตอรx คือคาพิกัดในแนวนอนหรือแกน x มีคาระหวาง 0 ถึง 127y คือคาพิกัดในแนวตั้งหรือแกน y มีคาระหวาง 0 ถึง 159color คือคาของสีที่ตองการ เปนตัวเลข 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(){}
    • 112XT7.2.1.18 glcdRectเปนฟงกชั่นลากเสนจากพิกัดที่กําหนดมายังพิกัดปลายทางรูปแบบvoid glcdRect(unsigned int x1,unsigned int y1,unsigned int width,unsigned intheight,unsigned int color)พารามิเตอรx1 คือ คาตําแหนงเริ่มตนของรูปสี่เหลี่ยมในแกน x มีคาระหวาง 0 ถึง 127y1 คือ คาตําแหนงเริ่มตนของรูปสี่เหลี่ยมในแกน y มีคาระหวาง 0 ถึง 159width คือ คาความกวางของรูปสี่เหลี่ยม (แนวนอน) มีคาระหวาง 1 ถึง 128height คือ คาความสูงของรูปสี่เหลี่ยม (แนวตั้ง) มีคาระหวาง 1 ถึง 158color คือ สีของเสน เปนคาตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[] ก็ไดตัวอยางที่ 7-17#include <popxt.h>void setup(){glcdRect(32,40,64,80,GLCD_RED); // วาดรูปสี่เหลี่ยมเสนสีแดง ขนาด 64 x 80 พิกเซล}void loop(){}
    • XT 1137.2.1.19 glcdFillRectเปนการระบายสีพื้นของรูปสี่เหลี่ยม โดยกําหนดจุดเริ่มตนและความกวางยาวของรูปสี่เหลี่ยมที่ตองการฟงกชั่นนี้เปนการสรางรูปสี่เหลี่ยมที่มีสีพื้นแตไมมีเสนกรอบ ในขณะที่ฟงกชั่น glcdRect เปนการวาดรูปกรอบสี่เหลี่ยมที่กําหนดสีของเสนกรอบได แตภายในกรอบไมมีสีรูปแบบvoid glcdFillRect(unsigned int x1, unsigned int y1, unsigned int width, unsigned intheight,unsigned int color)พารามิเตอรx1 คือ คาตําแหนงเริ่มตนของรูปสี่เหลี่ยมในแกน x มีคาระหวาง 0 ถึง 127y1 คือ คาตําแหนงเริ่มตนของรูปสี่เหลี่ยมในแกน y มีคาระหวาง 0 ถึง 159width คือ คาความกวางของรูปสี่เหลี่ยม (แนวนอน) มีคาระหวาง 1 ถึง 128height คือ คาความสูงของรูปสี่เหลี่ยม (แนวตั้ง) มีคาระหวาง 1 ถึง 158color คือ สีของเสน เปนคาตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[] ก็ไดตัวอยางที่ 7-18#include <popxt.h>void setup(){glcdFillRect(32,40,64,80,GLCD_RED); // สรางภาพสี่เหลี่ยมพื้นสีแดง ขนาด 64 x 80 พิกเซล}void loop(){}
    • 114XT7.2.1.20 glcdLineเปนฟงกชั่นหนวงเวลาโดยประมาณภายในโปรแกรมในหนวยมิลลิวินาทีรูปแบบvoid glcdLine(unsigned int x1, unsigned int y1, unsigned int x2, unsigned inty2,unsigned int color)พารามิเตอรx1 คือคาตําแหนงเริ่มตนของเสนบนแกน x มีคาระหวาง 0 ถึง 127y1 คือคาตําแหนงเริ่มตนของเสนบนแกน y มีคาระหวาง 0 ถึง 159x2 คือคาตําแหนงสิ้นสุดของเสนบนแกน x มีคาระหวาง 0 ถึง 127y2 คือคาตําแหนงสิ้นสุดของเสนบนแกน y มีคาระหวาง 0 ถึง 159color คือ คาสีของเสน เปนตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[] ก็ไดตัวอยางที่ 7-19#include <popxt.h>void setup(){glcdLine(0,0,127,159,GLCD_RED); // ลากเสนสีแดงทแยงมุมจากดานบนซายลงมาดานลางขวา}void loop(){}
    • XT 1157.2.1.21 glcdCircleเปนฟงกชั่นวาดเสนรูปวงกลมจากการกําหนดจุดกึ่งกลางของวงกลมและความยาวของรัศมีรูปแบบvoid glcdCircle(unsgined int x, unsgined int y, unsgined int radius,unsgined int color)พารามิเตอรx คือ พิกัดจุดศูนยกลางของวงกลมบนแกน x มีคาระหวาง 0 ถึง 127y คือ พิกัดจุดศูนยกลางของวงกลมบนแกน y มีคาระหวาง 0 ถึง 159radius คือ คารัศมีของวงกลมcolor คือ คาสีของเสน เปนตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[] ก็ไดตัวอยางที่ 7-20#include <popxt.h>void setup(){glcdCircle(32,120,31,GLCD_MAGENTA); // สรางเสนวงกลมสีบานเย็น มีรัศมี 31 พิกเซล}void loop(){}
    • 116XT7.2.1.22 glcdFillCircleเปนฟงกชั่นวาดรูปวงกลมที่มีสีพื้นจากการกําหนดจุดศูนยกลางของวงกลมและความยาวของรัศมี ฟงกชั่นนี้เปนการสรางรูปวงกลมที่มีสีพื้นแตไมมีเสนกรอบในขณะที่ฟงกชั่นglcdCircleเปนการวาดรูปวงกลมที่กําหนดสีของเสนรอบวงได แตภายในวงกลมไมมีสีรูปแบบvoid glcdFillCircle(unsigned int x, unsigned int y, unsigned int radius,unsigned int color)พารามิเตอรx คือ พิกัดจุดศูนยกลางของวงกลมบนแกน x มีคาระหวาง 0 ถึง 127y คือ พิกัดจุดศูนยกลางของวงกลมบนแกน y มีคาระหวาง 0 ถึง 159radius คือ คารัศมีของวงกลมcolor คือ คาสีของพื้นวงกลม เปนตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[]ตัวอยางที่ 7-21#include <popxt.h>void setup(){glcdFillCircle(32,120,31,GLCD_MAGENTA); // สรางรูปวงกลมพื้นสีบานเย็น รัศมี 31 พิกเซล}void loop(){}
    • XT 1177.2.1.23 glcdArcเปนฟงกชั่นวาดสวนโคงของวงกลม โดยระบุตําแหนงจุดกึ่งกลาง รัศมี ตําแหนงจุดเริ่ม จุดสิ้นสุดและสีของเสนรูปแบบvoid glcdArc(unsigned int x,unsigned int y,unsigned int r,int start_angle,intend_angle,uint color)พารามิเตอรx คือตําแหนงจุดกึ่งกลางในแนวแกน xy คือตําแหนงจุดกึ่งกลางในแนวแกน yr คือรัศมีของเสนโคง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(){}
    • 118XT7.2.2 ฟงกชั่นเกี่ยวกับเวลา7.2.2.1 sleep และ delayเปนฟงกชั่นหนวงเวลาโดยประมาณภายในโปรแกรมในหนวยมิลลิวินาทีรูปแบบvoid sleep(unsigned int ms)void delay(unsigned int ms)พารามิเตอรms - กําหนดคาเวลาที่ตองการหนวงในหนวยมิลลิวินาที มีคา 0 ถึง 65,535ตัวอยางที่ 7-23sleep(20); // หนวงเวลาประมาณ 20 มิลลิวินาทีdelay(1000); // หนวงเวลาประมาณ 1 วินาที7.2.2.2 delay_usเปนฟงกชั่นหนวงเวลาโดยประมาณภายในโปรแกรมในหนวยไมโครวินาทีรูปแบบvoid delay_us(unsigned int us)พารามิเตอรus - กําหนดคาเวลาที่ตองการหนวงในหนวยไมโครวินาที มีคา 0 ถึง 65,535ตัวอยางที่ 7-24delay_us(100); // หนวงเวลาประมาณ 100 ไมโครวินาที7.2.3 ฟงกชั่นเกี่ยวกับเสียง7.2.3.1 beepเปนฟงกชั่นกําเนิดเสียง“ติ๊ด”มีความถี่500Hzนาน100มิลลิวินาทีเพื่อขับออกลําโพงเปยโซของ POP-BOTXTรูปแบบvoid beep()ตัวอยางที่ 7-25beep(); // กําเนิดเสียงความถี่ 500Hz นาน 100 มิลลิวินาที7.2.3.2 soundเปนฟงกชั่นกําเนิดสัญญาณเสียงที่กําหนดความถี่และระยะเวลาในการกําเนิดสัญญาณไดรูปแบบvoid sound(int freq,int time)พารามิเตอรfreq - กําหนดความถี่สัญญาณเสียง มีคา 0 ถึง 32,767time - กําหนดคาเวลาในการกําเนิดสัญญาณเสียงในหนวย 1 มิลลิวินาที มีคา 0 ถึง 32,767ตัวอยางที่ 7-26sound(1200,500); // กําเนิดสัญญาณเสียงความถี่ 1200Hz นาน 500 มิลลิวินาที
    • XT 1197.2.4ฟงกชั่นเกี่ยวกับพอรตอินพุตเอาตพุต7.2.4.1 inเปนฟงกชั่นอานคาสถานะลอจิกของพอรตที่กําหนด เปนหนึ่งในฟงกชั่นการอานและเขียนคากับพอรตอินพุตเอาตพุตของหุนยนต POP-BOT XTรูปแบบchar in(x)พารามิเตอรx - กําหนดขาพอรตที่ตองการอานคาการคืนคาเปน 0 หรือ 1ตัวอยางที่ 7-27char x; // ประกาศตัวแปร x เพื่อเก็บคาผลลัพธจาการอานคาระดับสัญญาณx = in(2); // อานคาดิจิตอลจากพอรตดิจิตอล 2 (Di2) มาเก็บไวที่ตัวแปร x7.2.4.2 outเปนฟงกชั่นกําหนดระดับสัญญาณหรือขอมูลดิจิตอลไปยังพอรตที่กําหนดรูปแบบout(char _bit,char _dat)พารามิเตอร_bit - กําหนดขาพอรตที่ตองการตัวอยางที่ 7-28out(4,1); // กําหนดใหขาพอรต 4/A6 เปนเอาตพุตดิจิตอลและมีคาเปน “1”out(6,0); // กําหนดใหขาพอรต 6/A7 เปนเอาตพุตดิจิตอลและมีคาเปน “0”
    • 120XT7.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,0237.2.5.2 knobเปนฟงกชั่นอานคาขอมูลจากตัวตานทานปรับคาไดKNOBบนแผงวงจรPOP-XTมีการทํางานเหมือนกับคําสั่ง analog(8) แตคาที่อานไดมีคาในชวง 80 ถึง 1023 เนื่องจากตัวตานทานปรับคาไดนี้เชื่อมตอกับสวิตช OKที่ติดตั้งบนแผงวงจร POP-XT ดวยรูปแบบunsigned int knob()การคืนคาคาที่อานไดจากตัวตานทานปรับคาได KNOB บนแผงวงจร POP-XT มีคาระหวาง 80 ถึง 1023ตัวอยางที่ 7-29int val=0; // กําหนดคาตัวแปรสําหรับเก็บคาอะนาลอกval=knob(); // อานคาจากตัวตานทานปรับคาได KNOB บนแผงวงจร POP-XT เก็บในตัวแปร val7.2.5.3 sw_ok()เปนฟงกชั่นตรวจสอบสถานะสวิตช OK บนแผงวงจร POP-XT โดยใหสถานะ “เปนจริง” เมื่อมีการกดสวิตชและ “เปนเท็จ” เมื่อไมมีการกดสวิตชรูปแบบunsigned char sw_ok()การคืนคา1 (เปนจริง) เมื่อมีการกดสวิตช0 (เปนเท็จ) เมื่อไมมีการกดสวิตชหมายเหตุ การกดสวิตช OK มีผลทําใหคาที่อานไดจาก Knob เปน 0 ดวย
    • XT 121ตัวอยางที่ 7-30if(sw_ok()){beep(); // เมื่อกดสวิตช OK จะมีเสียง “ติ้ด” ดังออกลําโพง}7.2.5.4 sw_ok_press()เปนฟงกชั่นวนตรวจสอบการกดสวิตช OK บนแผงวงจร POP-XT ตองรอจนกระทั่งสวิตชถูกปลอยหลังจากการกดสวิตชจึงจะผานฟงกชั่นนี้ไปกระทําคําสั่งอื่นๆตัวอยางที่ 7-31........sw_ok_press(); // รอจนกระทั้งเกิดกดสวิตช OK......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-32motor(1,60); // ขับมอเตอรชอง A ดวยกําลัง 60% ของกําลังสูงสุดmotor(1,-60); // ขับมอเตอรชอง A ดวยกําลัง 60% มีทิศทางการหมุนตรงขามกับคําสั่งกอนหนาตัวอยางที่ 7-33motor(2,100); // ขับมอเตอรชอง B ดวยกําลัง 100% อันเปนคากําลังสูงสุด
    • 122XT7.2.6.2 motor_stopเปนฟงกชั่นหยุดขับมอเตอรรูปแบบvoid motor_stop(char _channel)พารามิเตอร_channel - กําหนดชองเอาตพุตมอเตอรไฟตรง มีคา 1, 2 และ ALL โดย ALLเปนการเลือกใหมอเตอรทั้ง 2ชองหยุดทํางานพรอมกันตัวอยางที่ 7-34motor_stop(1); // หยุดขับมอเตอรชอง Amotor_stop(2); // หยุดขับมอเตอรชอง Bตัวอยางที่ 7-35motor_stop(ALL); // มอเตอรทั้ง 2 ชองหยุดทํางานพรอมกัน7.2.6.3 fdมาจากคําวา forward เปนฟงกชั่นกําหนดใหหุนยนต POP-BOT XT เคลื่อนที่ไปขางหนารูปแบบfd(unsigned int speed)พารามิเตอรspeed คือเปอรเซ็นตความเร็วของมอเตอรมีคาตั้งแต 0 ถึง 100ตัวอยางที่ 7-36fd(60); // สั่งใหหุนยนตเคลื่อนที่ไปขางหนาดวยความเร็ว 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-37fd2(30,80); //ควบคุมใหหุนยนตเคลื่อนที่เปนวงกลมเนื่องจากมอเตอรBหมุนเร็วกวามอเตอรAมาก
    • XT 1237.2.6.5 bkมาจากคําวา backward เปนฟงกชันกําหนดใหหุนยนต POP-BOT XT เคลื่อนที่ถอยหลังรูปแบบbk(unsigned int speed)พารามิเตอรspeed คือเปอรเซ็นตความเร็วของมอเตอรมีคาตั้งแต 0 ถึง 100ตัวอยางที่ 7-38bk(90); // กําหนดใหหุนยนต POP-BOT XT เคลื่อนที่ถอยหลังดวยความเร็ว 90 เปอรเซ็นต7.2.6.6 bk2มาจากคําวาbackward2เปนฟงกชั่นกําหนดใหหุนยนตPOP-BOTXT เคลื่อนที่ถอยหลังแบบกําหนดความเร็วมอเตอรอิสระรูปแบบbk2(unsigned int speed1 ,unsigned int speed2)พารามิเตอรspeed1 คือเปอรเซ็นตความเร็วของมอเตอร A มีคาตั้งแต 0 ถึง 100speed2 คือเปอรเซ็นตความเร็วของมอเตอร B มีคาตั้งแต 0 ถึง 100ตัวอยางที่ 7-39bk2(80,80); // เปนคําสั่งเคลื่อนถอยหลังตรงดวยความเร็วเทากัน ซึ่งทํางานเหมือนกับคําสั่ง bk()ทั้งฟงกชั่นfd2()และbk2() มีไวเพื่อปรับแตงการทํางานของมอเตอรไฟตรงทั้ง 2 ตัวของหุนยนต POP-BOTXT ซึ่งอาจแตกตางกันดานความเร็วในการหมุน ใหทํางานไดอยางใกลเคียงกันดวยการปรับคา speed1 และ speed27.2.6.7 tl และ trมาจากคําวา turn left และ turn right หรือเลี้ยวซายและเลี้ยวขวานั่นเอง โดยการเลี้ยวของฟงกชั่นทั้งสองนี้จะกําหนดใหมอเตอรตัวใดตัวหนึ่งของหุนยนตหยุดอยูกับที่ จุดหมุนของหุนยนตจะอยูที่ลอของมอเตอรที่หยุดอยูกับที่รูปแบบtl(unsigned int speed) และ tr(unsigned int speed)พารามิเตอรspeed คือ คาความเร็วของมอเตอร มีคาตั้งแต 0 ถึง 100 เปอรเซ็นตตัวอยางที่ 7-40tl(60); // กําหนดใหหุนยนตเลี้ยวซายดวยความเร็ว 60 เปอรเซ็นตtr(100); // กําหนดใหหุนยนตเลี้ยวขวาดวยความเร็ว 100 เปอรเซ็นต
    • 124XT7.2.6.8 sl และ srมาจากคําวาspinleft และspinrightหรือหมุนตัวทางซายและทางขวาในฟงกชั่นนี้จะกําหนดใหมอเตอรไฟตรงทั้งสองตัวของหุนยนตหมุนในทิศทางตรงกันขาม จุดหมุนของการเลี้ยวจึงอยูที่กึ่งกลางของหุนยนตรูปแบบsl(unsigned int speed) และ sr(unsigned int speed)พารามิเตอรspeed คือ คาความเร็วของมอเตอร มีคา 0 ถึง 100%ตัวอยางที่ 7-41sl(70); // กําหนดใหหุนยนตเลี้ยวซายดวยความเร็ว 70%sr(100); // กําหนดใหหุนยนตเลี้ยวขวาดวยความเร็ว 100%7.2.6.9 aoมาจากคําวาallmotoroffเปนฟงกชั่นหยุดการทํางานของมอเตอรทั้งสองตัวพรอมกันเหมือนกับการเรียกใชฟงกชั่น motor_stop(ALL);รูปแบบao()ตัวอยางที่ 7-42void setup(){fd(100); // หุนยนตเคลื่อนที่ไปขางหนาดวยความเร็วสูงสุดsleep(2000); // เปนเวลา 2 วินาทีao(); // กําหนดใหมอเตอรหยุดทํางาน หุนยนตจะหยุดเคลื่อนที่ทันที}7.2.7 ฟงกชั่นเกี่ยวกับการขับเซอรโวมอเตอรในไฟลไลบรารีนี้มี1ฟงกชั่นคือservoเปนฟงกชั่นกําหนดตําแหนงแกนหมุนของเซอรโวมอเตอรควบคุมได 3 ตัวรูปแบบvoid servo(unsigned char _ch, int _pos)พารามิเตอร_ch - ชองเอาตพุตเซอรโวมอเตอร มีคา 8 ถึง 13_pos - กําหนดตําแหนงแกนหมุนของเซอรโวมอเตอร มีคาในชวง 0 ถึง 180 และ -1ถากําหนดเปน -1 หมายถึง ไมใชงานเซอรโวมอเตอรที่ชองนั้นๆ
    • XT 1257.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-43uart_set_baud(4800); // กําหนดอัตราบอดในการสื่อสารขอมูลเปน 4,800 บิตตอวินาที
    • 126XT7.2.8.4 uart_availableเปนฟงกชั่นตรวจสอบการรับขอมูลเขามาของโมดูล UART0 เมื่อติดตอกับคอมพิวเตอรรูปแบบunsigned char uart_available(void)การคืนคา- เปน “0” เมื่อยังไมมีขอมูลเขามา- มากกวา 0 เมื่อมีขอมูลเขามา โดยมีคาเทากับจํานวนของอักขระที่ไดรับตัวอยางที่ 7-44char 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!”); // แสดงขอความเพื่อตอบสนองตอการตรวจพบวามีการคีย asleep(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อยางไรก็ตาม ตองคํานึงดวยวา เมื่ออัตราบอดสูงขึ้นอาจสงผลกระทบตอความถูกตองในการสื่อสารขอมูล
    • 128XT7.2.8.6 uart1เปนฟงกชั่นสงขอมูลสายอักขระออกทางภาคสงของโมดูล UART1 มีอัตราบอดเริ่มตนที่9,600 บิตตอวินาทีรูปแบบvoid uart1(char *p,...)พารามิเตอรp - รับรหัสของกลุมขอความที่ตองการสงออกจากภาคสงของโมดูล UART1 โดยสามารถกําหนดรูปแบบการแทรกสัญลักษณพิเศษเพื่อใชรวมในการแสดงผลเหมือนกับฟงกชั่น uart7.2.8.7 uart1_set_baudเปนฟงกชั่นกําหนดอัตราบอดในการสื่อสารของโมดูล UART1 กับคอมพิวเตอรรูปแบบvoid uart1_set_baud(unsigned int baud)พารามิเตอรbaud - กําหนดคาอัตราบอดในการสื่อสารของโมดูล UART1 มีคา 2400 ถึง 115,200ตัวอยางที่ 7-46uart1_set_baud(19200); // กําหนดอัตราบอดในการสื่อสารเปน 19,200 บิตตอวินาที7.2.8.8 uart1_availableเปนฟงกชั่นตรวจสอบการรับขอมูลเขามาของโมดูล UART1 เมื่อติดตอกับคอมพิวเตอรรูปแบบunsigned char uart1_available(void)การคืนคา- เปน 0 เมื่อไมมีขอมูลเขามา- มากกวา 0 โดยมีคาเทากับจํานวนของอักขระที่ไดรับตัวอยางที่ 7-47char x =uart1_available();// ตรวจสอบวามีขอมูลเขามาทางภาครับของโมดูล UART1 หรือไม// ถา x มีคามากกวา 0 แสดงวามีขอมูลเขามาแลว ควรอานออกไปดวยฟงกชั่น uart1_getkey ทันที7.2.8.9 uart1_getkeyเปนฟงกชั่นอานขอมูลจากบัฟเฟอรตัวรับของโมดูล UART1รูปแบบchar uart1_getkey(void)การคืนคา- เปน 0 เมื่อยังไมมีการรับอักขระใดๆ- เปนคาของอักขระที่รับไดในรูปแบบของรหัสแอสกี้
    • XT 1297.3ไลบรารีเพิ่มเติมสําหรับใชงานGP2D120โมดูลวัดระยะทางดวยแสงอินฟราเรดนอกจากไฟลไลบรารี popbot.h ซึ่งเปนไลบรารีหลักของการเขียนโปรแกรมเพื่อควบคุมการทํางานของหุนยนตPOP-BOT XT ยังมีไฟลไลบรารีสําหรับติดตอกับตัวตรวจจับหนาที่พิเศษอื่นๆ ของหุนยนต POP-BOT XTที่มิไดรวมไวในไฟลไลบรารี popxt.h ดังนั้นเมื่อตองการใชงานจึงตองผนวกเพิ่มเติมไวในตอนตนของโปรแกรมสําหรับตัวตรวจจับแบบพิเศษที่มีในชุดหุนยนต POP-BOT XT มีอยู 1 ตัวคือ โมดูล GP2D120 อันเปนโมดูล ตรวจจับและวัดระยะทางดวยแสงอินฟราเรด ไฟลไลบรารีสําหรับใชงาน GP2D120 คือ gp2d120_lib.hไลบรารีgp2d120_lib.hมีฟงกชั่นสนับสนุนการทํางานกับGP2D120โมดูลตรวจจับและวัดระยะทางดวยแสงอินฟราเรด กอนเรียกใชงานฟงกชั่นภายในไลบรารีนี้จะตองผนวกไฟลไลบรารีไวในตอนตนของโปรแกรมดวยคําสั่ง#include <gp2d120_lib.h>เนื่องจากโมดูลGP2D120ใหผลการทํางานเปนแรงดันไฟตรงที่สัมพันธกับระยะทางที่ตรวจวัดไดดังนั้นในการใชงานผูพัฒนาจึงตองตอโมดูลตรวจจับนี้เขากับอินพุตสัญญาณอะนาลอกใดๆ ของ POP-BOT XT นั่นคือพอรต A0 ถึง A77.3.1 getdistเปนฟงกชั่นอานคาระยะทางที่วัดไดจากโมดูลวัดระยะทางดวยแสงอินฟราเรด GP2D120รูปแบบunsigned int getdist(char adc_ch)พารามิเตอรadc_ch ทําหนาที่รับการกําหนดชองอะนาลอกที่ใชงานตั้งแต 0 ถึง 7การคืนคาระยะทางในหนวยเซนติเมตรตัวอยางที่ 7-48dist = getdist(3); // อานคาระยะทางจาก GP2D120 ที่ตอกับพอรต A3
    • 130XT
    • XT 131XTในบทนี้นําเสนอการเขียนโปรแกรมเพื่อขับเคลื่อนหุนยนต POP-BOT X T โดยหัวใจหลักคือ การเขียนโปรแกรมเพื่อควบคุมใหแผงวงจร POP-XT สงสัญญาณไปยังวงจรขับมอเตอรซึ่งใชไอซีเบอร TB6612 เพื่อขับใหมอเตอรหมุนไปในทิศทางและดวยความเร็วตามที่ตองการ8.1 ไมโครคอนโทรลเลอรกับการขับมอเตอรไฟตรงการใชงานไมโครคอนโทรลเลอรเพื่อขับโหลดกระแสสูงอยางมอเตอร มีวิธีการควบคุมอยางมากมาย ตั้งแตควบคุมใหหมุนหรือหยุดหมุน, ควบคุมการล็อกหรือปลอยแกนหมุน, ควบคุมทิศทางการหมุน และควบคุมความเร็วในการหมุนซึ่งแตละวิธีจะใชอุปกรณและวิธีการที่แตกตางกันแตสิ่งหนึ่งที่จําเปนอยางยิ่งคือวงจรขับมอเตอร(motordriver) ทั้งนี้เนื่องจากไมโครคอนโทรลเลอรมีความสามารถในการจายกระแสที่จํากัดและคอนขางตํ่าคือ 20mA (ในกรณีใชไมโครคอนโทรลเลอร ATmega32U4) ในขณะที่มอเตอรตองการกระแสไฟฟามากกวานั้น ดังนั้นวงจรขับมอเตอรจะเขามาทําหนาที่นั้น โดยรับสัญญาณกระตุน และสัญญาณกําหนดความเร็วในการควบคุมมอเตอรมาจากไมโครคอนโทรลเลอรสวนวงจรขับมอเตอรทําหนาที่ขับมอเตอรโดยตรงใหหมุนหรือล็อกแกนหรือหมุนในทิศทางใดและถายทอดพลังงานไปยังมอเตอรเพื่อใหสามารถหมุนไดเร็วตามที่กําหนดมาจากไมโครคอนโทรลเลอร8.2 ควบคุมความเร็วของมอเตอรในการขับมอเตอรโดยปกติจะปอนแรงดันไฟตรงใหโดยตรงมอเตอรจะทํางานเต็มกําลังซึ่งอาจมีความเร็วมากเกินไป ดังนั้นการปรับความเร็วของมอเตอรจึงใชวิธีลดแรงดันไฟฟาที่ปอนใหกับมอเตอร วิธีที่นิยมคือการปอนพัลสไปขับมอเตอรแทนแลวปรับความกวางพัลสชวงบวกเพื่อใหไดคาแรงดันเฉลี่ยตามตองการ วิธีการนี้เรียกวาพัลสวิดธมอดูเลเตอร (PWM) โดยความกวางพัลสชวงบวกเมื่อเทียบกับความกวางพัลสทั้งหมดเรียกวา ดิวตี้ไซเกิล โดยจะคิดคาดิวตี้ไซเกิลเปนเปอรเซ็นตของคาความกวางพัลสทั้งหมดตัวอยางจากรูปที่8-1(ข)มีคาดิวตี้ไซเกิล50%หมายถึงความกวางของพัลสชวงบวกมีความกวางเปน50%ของความกวางทั้งหมดดังนั้นแรงดันเฉลี่ยที่ไดเทากับ(50x4.8)/100=2.4Vสําหรับรูปที่8-1(ค)และ(ง)เปนการกําหนดคาดิวตี้ไซเกิล 75% และ 25% ตามลําดับ
    • 132XTรูปที่8-1แสดงการเปรียบเทียบคาแรงดันที่เกิดขึ้นเมื่อใช PWM(ก)ปอนสัญญาณไฟตรง(ข)PWM มีดิวตี้ไซเกิล50%(ค) PWM มีดิวตี้ไซเกิล75%(ง)PWM มีดิวตี้ไซเกิล25%(ก) (ข)(ค) (ง)4.8V3.6V4.8V1.2Vแรงดัน(V)เวลาแรงดัน(V)เวลาแรงดันเฉลี่ยแรงดันเฉลี่ยดิวตี้ไซเกิล 75% ดิวตี้ไซเกิล 25 %4.8V 4.8V2.4Vแรงดัน(V)แรงดัน(V)เวลา เวลาแรงดันเฉลี่ย ดิวตี้ไซเกิล 50%8.3 การสรางสัญญาณ PWM ของ Arduinoใน Arduino มีฟงกชั่น analogWrite() ทําใหไมโครคอนโทรลเลอรสามารถสรางสัญญาณอะนาลอกสงออกทางขาพอรตเอาตพุตไดโดยอาศัยเทคนิคการสรางสัญญาณPWM (PulseWidth 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รูปที่8-2แสดงสัญญาณPWMที่คาดิวตี้ไซเกิลตางๆ20%50%75%ดิวตี้ไซเกิลของสัญญาณพัลสสามารถคํานวณไดจากTtW100%TtD w โดยที่ tw คือความกวางของพัลสT คือ คาบเวลาของสัญญาณพัลส 1 ลูกนั่นหมายความวา ความถี่จะไมมีผลตอการปรับหรือเปลี่ยนแปลงดิวตี้ไซเกิลแตอยางใดคาแรงดันของสัญญาณพัลสจะไดเปนคาเฉลี่ยของสัญญาณพัลสซึ่งสามารถคํานวณไดจากความสัมพันธทางคณิตศาสตรตอไปนี้Output_voltage = (on_time / off_time) * max_voltageเราสามารถนําสัญญาณ PWM ที่ไดจากคําสั่ง analogWrite() นี้ไปปรับความสวางของ LED หรือตอขยายกระแสเพื่อควบคุมความเร็วของมอเตอรไฟตรงไดหลังจากเรียกใชคําสั่งนี้แลวขาพอรตที่กําหนดจะมีสัญญาณPWM สงออกมาอยางตอเนื่อง จนกวาจะมีการเรียกใชคําสั่ง analogWrite ในรอบใหม หรือเรียกคําสั่ง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)value คาดิวตี้ไซเกิลที่ตองการ คาจาก 0 ถึง 255
    • 134XT8.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-1motor(1,60); // ขับมอเตอรชอง A ดวยกําลัง 60% ของกําลังสูงสุดmotor(1,-60); // ขับมอเตอรชอง A ดวยกําลัง 60% มีทิศทางการหมุนตรงขามกับคําสั่งกอนหนาตัวอยางที่ 8-2motor(2,100); // ขับมอเตอรชอง B ดวยกําลัง 100% อันเปนคากําลังสูงสุด
    • XT 1358.4.2 motor_stopเปนฟงกชั่นหยุดขับมอเตอรรูปแบบvoid motor_stop(char _channel)พารามิเตอร_channel - กําหนดชองเอาตพุตมอเตอรไฟตรง มีคา 1, 2 และ ALL โดย ALLเปนการเลือกใหมอเตอรทั้ง 2ชองหยุดทํางานพรอมกันตัวอยางที่ 8-3motor_stop(1); // หยุดขับมอเตอรชอง 1motor_stop(2); // หยุดขับมอเตอรชอง 2ตัวอยางที่ 8-4motor_stop(ALL); // มอเตอรทั้ง 2 ชองหยุดทํางานพรอมกัน8.4.3 fdมาจากคําวา forward เปนฟงกชั่นกําหนดใหหุนยนต POP-BOT XT เคลื่อนที่ไปขางหนารูปแบบfd(unsigned int speed)พารามิเตอรspeed คือเปอรเซ็นตความเร็วของมอเตอรมีคาตั้งแต 0 ถึง 100ตัวอยางที่ 8-5fd(60); // สั่งใหหุนยนตเคลื่อนที่ไปขางหนาดวยความเร็ว 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-6fd2(30,80); // คําสั่งใหหุนยนตเคลื่อนที่เปนวงกลม เนื่องจากมอเตอร B หมุนเร็วกวามอเตอร A คอนขางมาก
    • 136XT8.4.5 bkมาจากคําวา backward เปนฟงกชันกําหนดใหหุนยนต POP-BOT XT เคลื่อนที่ถอยหลังรูปแบบbk(unsigned int speed)พารามิเตอรspeed คือเปอรเซ็นตความเร็วของมอเตอรมีคาตั้งแต 0 ถึง 100ตัวอยางที่ 8-7bk(90); // กําหนดใหหุนยนต POP-BOT XT เคลื่อนที่ถอยหลังดวยความเร็ว 90 เปอรเซ็นต8.4.6 bk2มาจากคําวาbackward2เปนฟงกชั่นกําหนดใหหุนยนตPOP-BOTXT เคลื่อนที่ถอยหลังแบบกําหนดความเร็วมอเตอรอิสระรูปแบบbk2(unsigned int speed1 ,unsigned int speed2)พารามิเตอรspeed1 คือเปอรเซ็นตความเร็วของมอเตอร A มีคาตั้งแต 0 ถึง 100speed2 คือเปอรเซ็นตความเร็วของมอเตอร B มีคาตั้งแต 0 ถึง 100ตัวอยางที่ 8-8bk2(80,80); // เปนคําสั่งเคลื่อนถอยหลังตรงดวยความเร็วเทากัน ซึ่งทํางานเหมือนกับคําสั่ง bk()ทั้งฟงกชั่น fd2() และ bk2() มีไวเพื่อปรับแตงการทํางานของมอเตอรไฟตรงทั้ง 2 ตัวของหุนยนต POP-BOTXT ซึ่งอาจมีความแตกตางกันดานความเร็วในการหมุนใหทํางานไดอยางใกลเคียงกันมากที่สุดดวยการปรับคาspeed1 และ speed28.4.7 tl และ trมาจากคําวา turn left และ turn right หรือเลี้ยวซายและเลี้ยวขวานั่นเอง โดยการเลี้ยวของฟงกชั่นทั้งสองนี้จะกําหนดใหมอเตอรตัวใดตัวหนึ่งของหุนยนตหยุดอยูกับที่ จุดหมุนของหุนยนตจะอยูที่ลอของมอเตอรที่หยุดอยูกับที่รูปแบบtl(unsigned int speed) และ tr(unsigned int speed)พารามิเตอรspeed คือ คาความเร็วของมอเตอร มีคาตั้งแต 0 ถึง 100 เปอรเซ็นตตัวอยางที่ 8-9tl(60); // กําหนดใหหุนยนตเลี้ยวซายดวยความเร็ว 60 เปอรเซ็นตtr(100); // กําหนดใหหุนยนตเลี้ยวขวาดวยความเร็ว 100 เปอรเซ็นต
    • XT 1378.4.8 sl และ srมาจากคําวาspinleft และspinrightหรือหมุนตัวทางซายและทางขวาในฟงกชั่นนี้จะกําหนดใหมอเตอรไฟตรงทั้งสองตัวของหุนยนตหมุนในทิศทางตรงกันขาม จุดหมุนของการเลี้ยวจึงอยูที่กึ่งกลางของหุนยนตรูปแบบsl(unsigned int speed) และ sr(unsigned int speed)พารามิเตอรspeed คือ คาความเร็วของมอเตอร มีคา 0 ถึง 100%ตัวอยางที่ 8-10sl(70); // กําหนดใหหุนยนตเลี้ยวซายดวยความเร็ว 70%sr(100); // กําหนดใหหุนยนตเลี้ยวขวาดวยความเร็ว 100%8.4.9 aoมาจากคําวาallmotoroffเปนฟงกชั่นหยุดการทํางานของมอเตอรทั้งสองตัวพรอมกันเหมือนกับการเรียกใชฟงกชั่น motor_stop(ALL);รูปแบบao()ตัวอยางที่ 8-7void setup(){fd(100); // หุนยนตเคลื่อนที่ไปขางหนาดวยความเร็วสูงสุดsleep(2000); // เปนเวลา 2 วินาทีao(); // กําหนดใหมอเตอรหยุดทํางาน หุนยนตจะหยุดเคลื่อนที่ทันที}
    • 138XTXTเปดโปรแกรม Arduino IDE เพื่อเขียนโปรแกรมที่ A5-1 จากนั้นทําการคอมไพล แลวอัปโหลดไปยังหุนยนต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-BOTXT ใหเคลื่อนที่ไปขางหนาและถอยหลังสลับกันอยางตอเนื่อง
    • 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 ใหเคลื่อนที่เปนวงกลม ดวยการกําหนดใหความเร็วของมอเตอรแตละตัวของหุนยนตไมเทากัน
    • 140XTโปรแกรมที่ A5-3 เปนการสั่งงานใหหุนยนตเคลื่อนที่ตรงแลวเลี้ยวสลับกันไป ทําใหเกิดเสนทางเคลื่อนที่เปนรูปสี่เหลี่ยม โดยการเคลื่อนที่จะเกิดขึ้นเมื่อกดสวิตช OK บนแผงวงจร POP-XT ของหุนยนต#include <popxt.h> // ผนวกไลบรารีหลักvoid setup(){setTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทาglcd(1,1,”Press OK”); // แสดงขอความเริ่มตนการทํางานglcd(2,1,”to Start”);sw_ok_press(); // ตรวจสอบการกดสวิตช OKglcdClear();glcd(1,1,”Moving...”); // แสดงขอความเริ่มตนการเคลื่อนที่}void loop(){fd(80); // เคลื่อนที่ตรงดวยกําลัง 80%sleep(900);tr(80); // เลี้ยวขวาดวยกําลัง 80%sleep(400);}โปรแกรมที่ A5-3ไฟลRectangle_Running.pdeโปรแกรมภาษาCของArduinoสําหรับทดสอบขับเคลื่อนหุนยนตPOP-BOTXT ใหเคลื่อนที่เปนสี่เหลี่ยม
    • XT 141โปรแกรมที่A5-4เปนการสั่งงานใหหุนยนตเคลื่อนที่ไปในทิศทางตางๆ ประกอบดวย เคลื่อนที่ตรงไปขางหนา 0.6 วินาที เลี้ยวซาย 0.4 วินาที ถอยหลัง 0.6 วินาที หมุนตัวไปทางขวา 0.3 วินาที ถอยหลัง 0.6 วินาทีหมุนตัวไปทางซาย0.3วินาทีจากนั้นวนกลับเริ่มตนเคลื่อนที่ขางหนาแลวเคลื่อนที่ตามรูปแบบเดิมอยางตอเนื่อง#include <popxt.h> // ผนวกไฟลไลบรารี่หลักvoid setup(){glcdClear(); // เคลียรหนาจอ GLCDsetTextSize(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-BOTXT ใหเคลื่อนที่ไปในทิศทางตางๆที่หลากหลาย
    • 142XTเมื่ออัปโหลดโปรแกรมเรียบรอยแลว ปลดสาย USB ออก นําหุนยนต POP-BOT XT มาวางบนพื้น แลวเปดสวิตชจยไฟ รอจนกระทั่งหุนยนตพรอมทํางาน ที่จอแสดงผลแสดงขอความPress OKto 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); // กําหนดขนาดตัวอักษรเปน 2 เทาglcd(1,1,”Press OK”); // แสดงขอความเริ่มตนการทํางานglcd(2,1,”to Start”);sw_ok_press(); // ตรวจสอบการกดสวิตช OKglcdClear();glcd(1,1,”Moving...”); // แสดงขอความเริ่มตนการเคลื่อนที่fd2(70,70); // ควบคุมใหหุนยนตเคลื่อนที่ไปขางหนาดวยความเร็ว 70%}void loop(){}โปรแกรมที่ A5-5 ไฟลMoveAlignment.ino โปรแกรมภาษาC ของ Arduino สําหรับทดสอบขับเคลื่อนหุนยนต POP-BOT XT ใหเคลื่อนที่ตรงโดยปรับแตงความเร็วผานฟงกชั่น fd เพื่อใหหุนยนตเคลื่อนที่ไดตรงมากที่สุดเทาที่เปนไปไดหลังจากอัปโหลดโปรแกรม แลวทดลองปลอยใหหุนยนตเคลื่อนที่ สังเกตทิศทางของการเคลื่อนที่กรณีที่ 1 หุนยนตเริ่มเคลื่อนที่เอียงไปทางซายแสดงวามอเตอรทางดานซายหมุนชากวามอเตอรทางดานขวาสิ่งที่ตองทําคือเพิ่มความเร็วของมอเตอรดานซายใหเร็วขึ้น โดยใหปรับที่ตัวแปร speed1 ของฟงกชั่น fd2 ซึ่งการปรับคาตองคอยๆ เพิ่มคาทีละนอย จนกระทั่งหุนยนตเคลื่อนที่ตรงมากที่สุดกรณีที่ 2 หุนยนตเริ่มเคลื่อนที่เอียงไปทางขวาแสดงวามอเตอรทางดานขวาหมุนชากวามอเตอรทางดานซายสิ่งที่ตองทําคือเพิ่มความเร็วของมอเตอรดานขวาใหเร็วขึ้น โดยใหปรับที่ตัวแปร speed2 ของฟงกชั่น fd2 ซึ่งการปรับคาตองคอยๆ เพิ่มคาทีละนอย จนกระทั่งหุนยนตเคลื่อนที่ตรงมากที่สุด
    • XT 145XT การเรียนรูในลําดับตอจากการขับเคลื่อนหุนยนตแบบพื้นฐานคือการอานคาจากตัวตรวจจับเพื่อนํามากําหนดเปนเงื่อนไขในการเคลื่อนที่ ตัวตรวจจับพื้นฐานที่สุดที่ทําหนาที่นี้คือ สวิตช (switch) ในบทนี้จะกลาวถึง การใชงานแผงวงจรสวิตชรวมกับหุนยนต POP-BOT XT เพื่อนํามาใชตรวจจับการชน ทําใหหุนยนตรับรูไดวา เคลื่อนที่ไปพบสิ่งกีดขวางจากนั้นตัวควบคุมจะทําการประมวลผลเพื่อกําหนดการเคลื่อนที่ใหหุนยนตPOP-BOTXT สามารถเคลื่อนที่พนสิ่งกีดขวางไปไดอุปกรณสําคัญที่ใชในการเรียนรูนี้คือแผงวงจรสวิตชZX-01มีวงจรและการทํางานแสดงในรูปที่9-1เมื่อสวิตชถูกกดซึ่งเทียบไดกับการชนกับสิ่งกีดขวาง สัญญาณลอจิกที่เอาตพุตจะเปลี่ยนจากลอจิก “1” เปน “0” จนกวาจะปลอยหรือไมเกิดการชน สัญญาณเอาตพุตจะเปลี่ยนกลับไปเปน “1” อีกครั้งดวยคุณสมบัติการทํางานของตัวตรวจจับแบบนี้จึงนํามากําหนดเงื่อนไขในการเคลื่อนที่ใหกับหุนยนต POP-BOT XT ได โดยติดตั้งสวิตชเขาที่ดานหนาของหุนยนต เมื่อหุนยนต POP-BOT XT เคลื่อนที่ไปชนกับสิ่งกีดขวางจะทําใหสวิตชถูกกด ตัวควบคุมรับรูถึงการเปลี่ยนแปลงของอินพุตที่ตอกับสวิตช จากนั้นทําการควบคุมใหหุนยนตเคลื่อนที่ถอยหลังตอดวยการเปลี่ยนทิศทางการเคลื่อนที่เพียงเทานี้หุนยนตก็จะสามารถเคลื่อนที่ผานสิ่งกีดขวางไปไดที่ชองเอาตพุต :ถากดสวิตช จะสงลอจิก ”0” ออกไปที่เอาตพุตLED สีแดงติดถาไมกดสวิตชจะสงลอจิก”1”ออกไปที่เอาตพุตLED สีแดงดับรูปที่9-1รูปรางและวงจรของแผงวงจรสวิตชZX-01ที่ใชในชุดหุนยนตPOP-BOTXTDATAR3220R210kR1510LED1S1SwitchIndicatorSignal outputGND+V
    • 146XTแผงวงจรสวิตช ZX-01 เปนอุปกรณอินพุตดิจิตอล เมื่อสวิตชถูกกดจะใหเอาตพุตเปนลอจิก “0” ถาไมมีการกด ใหเอาตพุตเปนลอจิก “1” ในกิจกรรมนี้เปนการเขียนโปรแกรมงายๆ เพื่อทดสอบบการอานคาสถานะของสวิตชเขามา เพื่อควบคุมการขับเสียงออกลําโพง(A6.1) ตอสายของแผงวงจรสวิตช ZX-01 เขาที่จุดตอพอรต 22/A4 และ 23/A5TB6612ATMega32U4100Press OK to Start(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); // กําหนดขนาดตัวอักษรเปน 2 เทาglcd(1,1,”Press OK”); // แสดงขอความเริ่มตนglcd(2,1,”to Start”);sw_ok_press(); // ตรวจสอบการกดสวิตช OKglcdClear();glcd(1,1,”Let’s go!”); // แสดงขอความพรอมทํางาน}void loop(){if(in(22)==0) // ถากดสวิตชตําแหนง 22{sound(1000,300); // ขับเสียงความถี่ 1kHzglcdFillScreen(GLCD_RED); // เปลี่ยนสีหนาจอเปนสีแดง}if(in(23)==0) // ถากดสวิตชตําแหนง 23{sound(2000,300); // ขับเสียงความถี่ 2kHzglcdFillScrren(GLCD_YELLOW); // เปลี่ยนสีหนาจอเปนสีเหลือง}}โปรแกรมที่ A6-1ไฟลTouchSwitchTest.inoโปรแกรมภาษาC ของArduino1.0สําหรับทดสอบการอานคาจากสวิตชที่พอรตดิจิตอลของหุนยนตPOP-BOTXT
    • 148XT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(); // ตรวจสอบการกดสวิตช OKglcdClear();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-BOTXT
    • XT 149จากเหตุการณขางตนนํามากําหนดเปนเงื่อนไขเพื่อเขียนโปรแกรมควบคุมการเคลื่อนที่ของหุนยนตPOP-BOT XT ไดตามโปรแกรมที่ A7-1(A7.1)ทําการถอดแผงวงจรสวิตช ZX-01 ทั้งสองตัวออกจากโครงหุนยนต โดยยังคงตอสายกับแผงวงจร POP-XTบนหุนยนต POP-BOT XT อยู ดังนั้นจึงดูเหมือนแผงวงจรสวิตช ZX-01 เปนรีโมตคอนโทรลแบบมีสายที่ตอเขากับตัวหุนยนต POP-BOT XT(A7.2) เขียนโปรแกรมที่ A7-1 ทําการคอมไพลและอัปโหลดไปยังหุนยนต POP-BOT XT(A7.3) รันโปรแกรม แลวทดลองใชสวิตชทั้งสองตัวควบคุมการเคลื่อนที่ของหุนยนต POP-BOT XT ตามตองการ
    • 150XTจากกิจกรรมที่7ไดเรียนรูการใชสวิตชในการควบคุมการเคลื่อนที่ของหุนยนตPOP-BOTXT เมื่อนําสวิตชกลับมาติดตั้งที่ดานหนาของหุนยนต 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 OKto Startใหกดสวิตช OK ที่หุนยนต POP-BOT XT สังเกตการเคลื่อนที่ของหุนยนต POP-BOT XT ในภาวะที่ชนและไมชนสิ่งกีดขวาง ตรวจสอบดูวา มีการทํางานตรงตามเงื่อนไขที่กําหนดไวหรือไม
    • 152XT#include <popxt.h> // ผนวกไฟลไลบรารีหลักvoid setup(){setTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทาglcd(1,1,”Press OK”); // แสดงขอความเริ่มตนglcd(2,1,”to Start”);sw_ok_press(); // ตรวจสอบการกดสวิตช OKglcdClear();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-BOTXT ใหเคลื่อนที่หลบหลีกสิ่งกีดขวางดวยการชนหรือสัมผัส
    • XT 153XTหนึ่งภาระกิจของการเรียนรูเพื่อควบคุมหุนยนตอัตโนมัติขนาดเล็กคือ การตรวจจับเสนและการเคลื่อนที่ตามเสนสําหรับชุดหุนยนตPOP-BOTXT ก็สามารถปฏิบัติภาระกิจนี้ไดโดยเนื้อหาในบทนี้จะเริ่มตนดวยการอธิบายการทํางานของตัวตรวจจับแสงสะทอนอินฟราเรดซึ่งนํามาประยุกตใชงานเปนตัวตรวจจับเสนการอานคาจากตัวตรวจจับในพื้นที่ที่มีสีตางกันจากนั้นเขาสูการทดลองเขียนโปรแกรมภาษาCเพื่อควบคุมใหหุนยนตPOP-BOTXT เคลื่อนที่ตามเสนทั้งแบบไมพิจารณาทางแยกและพิจารณาทางแยก10.1 คุณสมบัติของแผงวงจรตรวจจับแสงสะทอนอินฟราเรดเปนแผงวงจรที่ใชในการตรวจสอบการสะทอนของแสงอินฟราเรดของตัวตรวจจับแสงสะทอนอินฟราเรดซึ่งรวมตัวสงและตัวรับไวในตัวถังเดียวกันโดยตัวตรวจจับแสงสะทอนอินฟราเรดที่นํามาใชคือ TCRT5000 ในรูปที่10-1 แสดงการทํางานของแผงวงจรตรวจจับแสงสะทอนอินฟราเรดเมื่อนํามาใชงานกับพื้นผิวสีขาวและดําเมื่อจายไฟเลี้ยง LED อินฟราเรดภายในตัวโมดูล TCRT5000 จะเปลงแสงออกมาตลอดเวลา สวนตัวรับซึ่งเปนโฟโตทรานซิสเตอรจะไดรับแสงอินฟราเรดจากการสะทอนกลับ โดยปริมาณของแสงที่ไดรับจะมากหรือนอยขึ้นอยูกับวามีวัตถุมากีดขวางหรือไมและวัตถุนั้นมีความสามารถในการสะทอนแสงอินฟราเรดไดดีเพียงไรซึ่งขึ้นกับลักษณะพื้นผิวและสีของวัตถุ โดยวัตถุสีขาวผิวเรียบจะสะทอนแสงอินฟราเรดไดดี ทําใหตัวรับแสงอินฟราเรดไดรับแสงสะทอนมาก สงผลใหแรงดันที่เอาตพุตของวงจรสูงตามไปดวย ในขณะที่วัตถุสีดําสะทอนแสงอินฟราเรดไดนอยทําใหตัวรับอินฟราเรดสงแรงดันออกมาตํ่า ดวยคุณสมบัติดังกลาวจึงนิยมนําแผงวงจรตรวจจับแสงสะทอนอินฟราเรดนี้มาใชในการตรวจจับพื้นหรือเสน โดยตองติดตั้งไวดานลางของโครงหุนยนตรูปที่10-1แสดงการทํางานของแผงวงจรตรวจจับแสงสะทอนอินฟราเรดกับพื้นผิวสีขาวและดําLED อินฟราเรดโฟโตทรานซิสเตอรพื้นสีขาว10kTCRT5000510+VGNDOUTแรงดันเอาตพุตคาสูงLED อินฟราเรดโฟโตทรานซิสเตอรพื้นสีดํา10kTCRT5000510+VGNDOUTแรงดันเอาตพุตคาต่ํากระแสไฟฟากระแสไฟฟา
    • 154XT10.2การเตรียมความพรอมกอนพัฒนาโปรแกรมเพื่อขับเคลื่อนหุนยนตตรวจจับเสน10.2.1เตรียมอุปกรณสําหรับสรางสนามทดสอบในการพัฒนาโปรแกรมเพื่อควบคุมใหหุนยนตเคลื่อนที่ตามเสนโดยใชตัวตรวจจับแสงสะทอนอินฟราเรดในการวิเคราะหเสนและพื้นสนามนั้นจะเปนการกําหนดเงื่อนไขเพี่อเปรียบเทียบกับคาอางอิงคาหนึ่งที่ไดจากการทดสอบอานคาของสภาวะแสงที่ไดจากเสนและพื้นสนามที่ใชงานจริงโดยอาศัยความแตกตางของการสะทอนแสงอินฟราเรดของแตละพื้นผิวที่มีสีตางกันเชนพื้นผิวสีขาวสามารถสะทอนแสงอินฟราเรดไดดีสวนพื้นผิวสีดําสามารถสะทอนแสงอินฟราเรดไดนอยเนื่องจากสีดํามีความสามารถในการดูดกลืนแสงอินฟราเรดไดมากการเรียนรูในบทนี้เลือกใชสนามทดสอบอางอิงที่มีพื้นสนามเปนสีขาวและเสนเปนสีดํา ดังนั้นขอแนะนําใหผูพัฒนาสรางสนามทดสอบขึ้นมากอนสําหรับสนามทดสอบตัวอยางที่ใชในหนังสือเลมนี้ทําจากแผนพลาสติกลูกฟูก(หรือชื่อเรียกกันทั่วไปวาแผนฟวเจอรบอรด) มาติดเทปสีดํา โดยมีอุปกรณและเครื่องมือที่ใชดังนี้1.แผนพลาสติกลูกฟูก(หรือชื่อเรียกทั่วไปวาแผนฟวเจอรบอรด)สีขาวและดําขนาด90x60เซนติเมตรอาจเล็กใหญกวานี้ก็ไดอยางละ 1 แผนขอใหมีพื้นที่มากพอสําหรับการเคลื่อนที่ของหุนยนต POP-BOT XT2. เทปพันสายไฟสีดําขนาด 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 ซม. ดังรูป(A9.4) ตรวจสอบการเชื่อมตอแผงวงจร ZX-03 ทั้งสองตัวใหถูกตองกอนการทดสอบ โดย ZX-03 ดานซายตองตอกับพอรต 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-BOTXT
    • 156XT(A9.5) นําหุนยนต POP-BOT XT ที่โปรแกรมแลวจากขั้นตอนที่ (A9.3) ไปวางบนแผนทดสอบฝงสีดําอานคาได 80 ถึง 250TB6612100TB6612100L=100R=100(A9.6) นําหุนยนต POP-BOT XT ไปวางบนแผนทดสอบฝงสีขาวอานคาได 700 ถึง 1000TB6612100TB6612100L=900R=900จากการทดลองพบวา คาที่อานไดจากสีขาวมีคาอยูประมาณ 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) // ตรวจสอบคาจาก ZX-03 ดานซาย{sound(2500,500); // สงเสียงเตือนออกลําโพงglcdFillScreen(GLCD_RED); // พื้นจอแสดงผลเปลี่ยนเปนสีแดง}else{glcdClear(); // พื้นจอแสดงผลเปนสีดํา}}โปรแกรมที่ A10-1 ไฟล AlarmBOT.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับตรวจจับการยกหุนยนต POP-BOTXT ขึ้นจากพื้น
    • 158XTกิจกรรมนี้ตอยอดมาจากกิจกรรมที่10เมื่อหุนยนต POP-BOTXT สามารถตรวจจับสภาวะการไมมีแสงสะทอนได จึงนําความสามารถนี้มาใชในการตรวจจับพื้นที่ที่มีขอบเขต เชน บนโตะ หรือบนกระดานที่อยูสูงจากพื้น แลวเขียนโปรแกรมเพื่อทําใหหุนยนต POP-BOT XT สามารถเคลื่อนที่อยูในพื้นที่กําหนดในกิจกรรมนี้หุนยนต POP-BOTXT จะเคลื่อนที่บนโตะอยางตอเนื่องโดยมีแผงวงจรตรวจจับแสงสะทอนZX-03ทั้งสองตัวทําหนาที่ตรวจจับวาหุนยนตยังอยูเคลื่อนที่อยูบนโตะเมื่อใดก็ตามที่แผงวงจรตรวจจับZX-03อานคาแสงสะทอนไดนอย แสดงวา หุนยนตกําลังจะออกนอกพื้นที่หรือกําลังจะเคลื่อนที่ตกโตะ ก็จะตองควบคุมใหหุนยนตเคลื่อนที่ถอยหลังทันที จากนั้นเปลี่ยนเสนทาง ดวยการทํางานแบบนี้หุนยนต POP-BOT XT จะสามารถเคลื่อนที่อยูบนโตะไดอยางตอเนื่อง(A11.1) เปดโปรแกรม Arduino1.0 เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A11-1#include <popxt.h> // ผนวกไฟลไลบรารี่หลักint L,R;void setup(){setTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทาglcd(1,1,"Press OK"); // แสดงขอความเริ่มตนglcd(2,1,"to Start");sw_ok_press(); // ตรวจสอบการกดสวิตช OKglcdClear();glcd(1,1,"Moving..."); // แสดงขอความพรอมทํางาน}
    • XT 159void 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ไมใหเคลื่อนที่ตกโตะ
    • 160XT(A11.2) จากนั้นทําการคอมไพล แลวอัปโหลดไปยังหุนยนต POP-BOT XT ปดสวิตช ปลดสาย USB ออก(A11.3) นําหุนยนตวางไวบนโตะ เปดสวิตชจายไฟแกหุนยนต กดสวิตช OK เพื่อเริ่มตนการทํางานหุนยนตจะเคลื่อนที่ตรงมาขางหนาอยางตอเนื่องจนกระทั่งแผงวงจตรวจจับแสงสะทอนอินฟราเรด ZX-03ตัวใดตัวหนึ่งหรือทั้งคูเลยขอบโตะออกมา นั่นคือ พบวา หุนยนตกําลังจะเคลื่อนที่ตกโตะ หุนยนตจะถอยหลังแลวหมุนตัวไปในทิศทางตรงขามกับแผงวงจรตรวจจับ ZX-03 ดานที่ตรวจพบวา ไมมีการสะทอนแสง นั่นคือแผงวงจรตรวจจับไมอยูบนโตะแลวกรณีตัวตรวจจับทั้งสองตัวพนขอบโตะ การเคลื่อนที่เปนดังนี้TB6612100TB6612100TB 6612100TB 6612100TB661 2100TB661210014 5 62 3กรณีตัวตรวจจับดานซายพนขอบโตะ การเคลื่อนที่เปนดังนี้TB6612100TB6612100TB6612100กรณีตัวตรวจจับดานขวาพนขอบโตะ การเคลื่อนที่เปนดังนี้TB6612100TB6612100TB6612100
    • XT 161XTจากกิจกรรมที่ 9 เปนการทดสอบใหทราบวา หุนยนต POP-BOT XT ตัวที่กําลังใชงานนี้มีคาอางอิงหรือจุดตัดสินใจระหวางสีดําและขาวอยูที่500 ดังนั้นถาคาที่อานไดจากแผงวงจรตรวจับแสงะสะทอนอินฟราเรด ZX-03 ตํ่ากวา 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
    • 162XT#include <popxt.h> // ผนวกไฟลไลบรารีหลักvoid setup(){setTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทาglcd(1,1,"Press OK"); // แสดงขอความเริ่มตนsw_ok_press(); // ตรวจสอบการกดสวิตช OKglcd(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-BOTXT#include <popxt.h> // ผนวกไฟลไลบรารีหลักvoid setup(){setTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทาglcd(1,1,"Press OK"); // แสดงขอความเริ่มตนsw_ok_press(); // ตรวจสอบการกดสวิตช OKglcd(1,1,"Moving..."); // แสดงขอความการทํางานfd(60);while(analog(0)>500); // ตรวจสอบคาจากตัวตรวจจับที่ชอง A0 จนกระทั่งเงื่อนไขเปนเท็จbk(100); // ถอยหลังสั้นๆ เพื่อทําการหยุดsleep(100);ao(); // หยุดการทํางานของมอเตอร}void loop(){}โปรแกรมที่ A12-2 ไฟล BlackLineDetect2.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับตรวจจับเสนสีดําของหุนยนต POP-BOTXT และหยุดไดแมนยํามากขึ้นดวยการเพิ่มคําสั่งbk();กอนหยุด
    • XT 163XTหัวใจหลักของหุนยนตเคลื่อนที่ตามเสนคือควบคุมใหหุนยนตเคลื่อนที่โดยที่ตัวตรวจจับเสนทั้งสองตัวอยูในตําแหนงที่ครอมเสน ดังนั้นจะเกิดเหตุการณขึ้น 4 กรณี ซึ่งนํามาใชกําหนดเงื่อนไขของการทํางานไดดังนี้กรณีที่ 1 หุนยนตอยูในแนวเสนของสนามหรือครอมเสนTB6612100ตองกําหนดใหหุนยนตเคลื่อนที่ตรงไปขางหนากรณีที่2หุนยนตเคลื่อนที่เอียงไปทางขวาตัวตรวจจับเสนดานซายพบเสนสีดําTB6612100ตองกําหนดใหหุนยนตเคลื่อนที่มาทางซาย
    • 164XTกรณีที่3 หุนยนตเคลื่อนที่เอียงไปทางซาย ตัวตรวจจับเสนดานขวาพบเสนสีดําTB6612100ตองกําหนดใหหุนยนตเคลื่อนที่มาทางขวากรณีที่ 4หุนยนตพบเสนตัด ตัวตรวจจับเสนทั้งคูพบเสนสีดําTB6612100ตองเลือกวา ตองการใหหุนยนตเคลื่อนที่ไปทางตรง เลี้ยวซาย หรือเลี้ยวขวา(A13.1) เปดโปรแกรม Arduino1.0 เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A12-1(A13.2) จากนั้นทําการคอมไพล แลวอัปโหลดไปยังหุนยนต POP-BOT XT ปดสวิตช ปลดสาย USB ออก
    • XT 165(A13.3) ใชแผนพลาสติกลูกฟูกขนาด 90 x 60 เซนติเมตร (หรือขนาดอื่นก็ไดตามตองการ แตควรมีขนาดใหญเพียงพอใหหุนยนตสามารถเคลื่อนที่ไดโดยสะดวก) มาทําเปนพื้นสนาม แลวติดเทปสีดําตามรูป(A13.4)นําหุนยนตPOP-BOT XT วางไวครอมเสนเปดสวิตชจายไฟแกหุนยนตกดสวิตชOKเพื่อเริ่มตนการทํางานหุนยนต POP-BOT XT จะเคลื่อนที่ตามเสนอยางตอเนื่องเมื่อพบเสนตัด หุนยนตจะเคลื่อนที่ขามเสนตัดและขับเสียง “ติ้ด” ออกทางลําโพง(A13.5)ทดลองเพิ่มความเร็วของหุนยนตPOP-BOTXT จนกระทั่งไดความเร็วสูงสุดที่หุนยนตยังคงสามารถเคลื่อนที่ไดโดยไมหลุดออกจากเสนคําแนะนําตอไปนี้ เปนสวนหนึ่งของการตรวจสอบและคนหาสาเหตุในกรณีที่หุนยนตไมเคลื่อนที่ตามเสนโดยรวบรวมจากประสบการณตรงที่ไดจากการแนะนําและอบรมทั้งจากผูใชงานทั่วไป นักเรียน และนักศึกษา1.ตรวจสอบการเชื่อมตอสายของแผงวงจรตรวจจับแสงสะทอนอินฟราเรดZX-03ที่นํามาใชเปนตัวตรวจจับเสนทั้งสองตัววา มีการตอสลับขาพอรตกันหรือไม โดยตัวตรวจจับเสนดานซายตองตอกับพอรต A0/18 สวนตัวตรวจจับเสนดานขวาตอกับพอรต A1/192. ตรวจสอบการตอสายมอเตอรวา มีการตอสลับกันระหวางมอเตอร A และมอเตอร B หรือไม โดยมอเตอร A (หรือมอเตอร 1) ในที่นี้คือ มอเตอรดานซาย สวนมอเตอร B (หรือมอเตอร 2) คือ มอเตอรดานขวา3. การติดตั้งตัวตรวจจับเสนสูงหรือตํ่ากวาคาที่ควรจะเปนหรือไม ควรติดตั้งสูงจากพื้นในชวง 5 ถึง 10มิลลิเมตร4. ทดสอบการอานคาและเลือกคาอางอิงสําหรับใชตัดสินวา เปนสีดําหรือขาวอีกครั้งตามขั้นตอนในกิจกรรมที่ 9 เพื่อตรวจสอบการทํางานของตัวตรวจจับเสนวา ยังทํางานถูกตองอยูหรือไม
    • 166XT#include <popxt.h> // ผนวกไฟลไลบรารีหลักint L,R;void setup(){setTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทาglcd(1,1,"Press OK"); // แสดงขอความเริ่มตนsw_ok_press(); // ตรวจสอบการกดสวิตช OKglcd(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);}}โปรแกรมที่ A13-1 ไฟล SimpleLineTracking.ino โปรแกรมภาษา C ของ Arduino1.0 สําหรับควบคุมหุนยนต POP-BOTXT เคลื่อนที่ตามเสนสีดําโดยใชตัวตรวจจับเสน 2ตัว
    • XT 167ในกิจกรรมนี้เปนตัวอยางที่จําลองมาจากการแขงขันเขาวงกตแบบเสนหรือ Maze Solving อันเปนการกิจกรรมที่ตองการใหหุนยนตเคลื่อนที่ตามเสนเมื่อพบจุดตัดจะตองมีการเลี้ยวเพื่อเปลี่ยนเสนทางและจะเคลื่อนที่ในลักษณะนี้ไปจนกระทั่งพบเสนตัดทั้งหมดที่มีในสนามแขงขันใชเทปผาหรือเทปพันสายไฟสีดําติดลงบนแผนพลาสติกลูกฟูกขนาด 90x60 เซนติเมตร (หรือขนาดอื่นก็ไดตามตองการ แตควรมีขนาดใหญเพียงพอใหหุนยนตสามารถเคลื่อนที่ไดโดยสะดวก) ตามรูปในการทํากิจกรรมลักษณะนี้ปจจัยหนึ่งที่มีความสําคัญมากคือ การเลี้ยวแบบ90องศาอยางแมนยํามาพอ จึงตองมีการสรางฟงกชั่นสําหรับทําหนาที่นี้โดยเฉพาะ ซึ่งในที่นี้ตั้งชื่อวา ฟงกชั่น R90() เปนฟงกชั่นเลี้ยวขวา 90 องศาเมื่อพบเสนตัดการเลี้ยวขวาเมื่อพบเสนตัดใหเกิดความแมนยํานั้น หุนยนตจะตองเคลื่อนที่ตรงไปขางหนาเล็กนอยจากนั้นสั่งใหหุนยนตเลี้ยวในขณะที่เลี้ยวจะตองตรวจสอบตัวตรวจจับเสนในที่นี้คือแผงวงจรZX-03ในดานที่เลี้ยววา พบเสนตัดทั้งแถบแลวหรือไม หากพบแลวถือวา การเลี้ยวนั้นสมบูรณ ก็จะเคลื่อนที่ตรงตอไป ในรูปที่ A14-1แสดงลักษณะการทํางานของหุนยนตเมื่อกระทําฟงกชั่น R90()ฟงกชั่นนี้จะถูกเรียกใชเมื่อหุนยนต POP-BOT XT เคลื่อนที่ไปพบเสนตัด
    • 168XTรูปที่A14-1การทํางานของหุนยนตเมื่อกระทําฟงกชั่น R90()เพื่อใหการเลี้ยวขวาแมนยําขึ้น(A14.1) เปดโปรแกรม Arduino1.0 เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A14-1(A14.2) จากนั้นทําการคอมไพล แลวอัปโหลดไปยังหุนยนต POP-BOT XT ปดสวิตช ปลดสาย USB ออก(A14.3) นําหุนยนตPOP-BOTXT วางไวครอมเสนเปดสวิตชจายไฟแกหุนยนตกดสวิตช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(); // ตรวจสอบการกดสวิตช OKglcd(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-BOTXT เคลื่อนที่ตามเสนสีดําและเลี้ยวขวาเมื่อพบเสนตัด
    • 170XT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); // กําหนดขนาดตัวอักษรเปน 2 เทาglcd(1,1,"Press OK"); // แสดงขอความเริ่มตนsw_ok_press(); // ตรวจสอบการกดสวิตช OKglcd(1,1,"Moving..."); // แสดงขอความการทํางาน}void loop(){L=analog(0); // อานและเก็บคาจากตัวตรวจจับเสนดานซายR=analog(1); // อานและเก็บคาจากตัวตรวจจับเสนดานขวา
    • 172XTif (L<500&&R<500) // พบเสนตัดสีดํา (ทางแยก) หรือไม{if(x==6) // ตรวจสอบการนับทางแยก ครบ 1 รอบแลวหรือไม{x=0; // ถาครบ ลางคาการนับทางแยก}x++; // เพิ่มคา x ขึ้นหนึ่งคาเพื่อนับทางแยกif (x==3) // เปนทางแยกที่ 3 หรือไม{R90(); // ถาเปนทางแยกที่ 3 ใหเลี้ยวขวา}else{L90(); // ถาไมใชทางแยกที่ 3 ใหเลี้ยวซาย}}else if(L>500&&R>500) // ตรวจสอบวา หุนยนตครอมเสนอยูหรือไม{fd(60); // ถายังครอมเสนอยู ควบคุมใหเคลื่อนที่ตรงตอไปดวยชวงเวลาสั้นๆ}else if(L<500) // ตรวจพบวา หุนยนตเคลื่อนที่เอียงไปทางขวา{sl(60); // หมุนตัวทางซายเล็กนอย เพื่อใหกลับมาครอมเสนsleep(20);}else if(R<500) // ตรวจพบวา หุนยนตเคลื่อนที่เอียงไปทางซาย{sr(60); // หมุนตัวทางขวาเล็กนอย เพื่อใหกลับมาครอมเสนsleep(20);}}สวนเพิ่มเติมจากโปรแกรมสนามที่ใชในการทดสอบมีทางแยกเดียวที่เมื่อพบแลวตองเลี้ยวขวา นั่นคือ ทางแยกที่ 3 สวนทางแยกอื่นๆ เมื่อหุนยนตตรวจพบ ใหทําการเลี้ยวซายทั้งหมด การกําหนดเงื่อนไขในการทํางานคือ ตรวจสอบวาทางแยกที่พบ เปนทางแยกที่ตองเลี้ยวขวาหรือไม ถาใช เรียกโปรแกรมยอยเลี้ยวขวา [R90()] มาทํางาน แตถาไมใช เรียกโปรแกรมยอยเลี้ยวซาย [L90()]มาทํางานแทนโปรแกรมที่A15-1ไฟลMultipleCrossingTrack.inoโปรแกรมภาษาCของArduino1.0สําหรับควบคุมหุนยนต POP-BOTXT เคลื่อนที่ตามเสนและตรวจจับทางแยกที่ซับซอน
    • XT 173(A15.4) นําหุนยนตPOP-BOTXT วางไวครอมเสนเปดสวิตชจายไฟแกหุนยนตกดสวิตชOKเพื่อเริ่มตนการทํางานหุนยนต POP-BOT XT จะเคลื่อนที่ตามเสนอยางตอเนื่องเมื่อพบทางแยกที่ 1, 2, 4, 5, 6, 7 และ 8หุนยนตจะเลี้ยวซายทั้งหมด และจะเลี้ยวขาวเมื่อพบทางแยกที่ 3 ทุกครั้งที่พบทางแยก หุนยนตจะขับเสียง “ติ้ด”ออกมาเพื่อแจงสถานะการทํางาน
    • 174XT
    • XT 175XTอีกหนึ่งตัวอยางการใชงานอินพุตอะนาลอกของแผงวงจรPOP-XTและฟงกชั่นอานคาสัญญาณอะนาลอกของArduino คือ การติดตอกับตัวตรวจจับพิเศษที่ใหผลการทํางานเปนแรงดัน แตสามารถใหผลการทํางานเปนคาหรือปริมาณทางฟสิกสที่ชัดเจนโมดูลวัดระยะทางดวยแสงอินฟราเรดGP2D120เปนตัวอยางของตัวตรวจจับที่มีการทํางานในลักษณะนี้ ผลของการตรวจจับของ GP2D120 สามารถนําไปคํานวณดวยกระบวนการทางซอฟตแวรเพื่อใหไดผลการทํางานออกมาเปนระยะทางในหนวยเซนติเมตรหรือนิ้วไดตามตองการการใชงานโมดูล GP2D120 ในหุนยนต POP-BOT XT คือ นํามาใชตรวจจับวัตถุแบบไมสัมผัส (contactless) รวมไปถึงสามารถนําไปใชในการคนหาวัตถุหรือสิ่งกีดขวางได11.1 คุณสมบัติของ GP2D120 ใชการตรวจจับระยะทางดวยการสะทอนแสงอินฟราเรด วัดระยะทางได 4 ถึง 30 เซนติเมตร ไฟเลี้ยง 4.5 ถึง 5V กระแสไฟฟา 33 mA ใหเอาตพุตเปนแรงดันในยาน 0.4 ถึง 2.4V ที่ไฟเลี้ยง +5Vรูปที่11-1แสดงการจัดขาไดอะแกรมเวลาจังหวะการทํางานและกราฟแสดงการทํางานของGP2D120LED อินฟราเรดตัวสง ตัวรับแสงอินฟราเรดGNDVout VccGP2D120วัดครั้งที่ 1 วัดครั้งที่ 2ไมแนนอน เอาตพุตครั้งที่ 1 เอาตพุตครั้งที่ 2 เอาตพุตครั้งที่ nวัดครั้งที่ n38.3ฑ9.6 มิลลิวินาที5 มิลลิวินาทีการวัดระยะหางแรงดันเอาตพุตไฟเลี้ยง*ใชกระดาษเทาขาวรุน R-27 ของ Kodak ซึ่งดานขาวมีอัตราการสะทอนแสง 90% เปนวัตถุสําหรับสะทอนแสงเพื่อวัดระยะทาง4 8 12 16 20 24 28 32000.40.81.21.62.02.42.8แรงดันเอาตพุต(V)ระยะหางจากวัตถุที่ตรวจจับ (cm)กราฟแสดงการทํางานของGP2D120
    • 176XTGP2D120เปนโมดูลตรวจจับระยะทางแบบอินฟราเรดมีขาตอใชงาน3ขาคือขาตอไฟเลี้ยง(Vcc),ขากราวด(GND) และขาแรงดันเอาตพุต (Vout) การอานคาแรงดันจาก GP2D120 จะตองรอใหพนชวงเตรียมความพรอมของโมดูลกอนซึ่งใชเวลาประมาณ 32.7 ถึง 52.9 มิลลิวินาที ดังนั้นในการอานคาแรงดันจึงควรรอใหพนชวงเวลาดังกลาวไปกอน ดังแสดงขอมูลเบื้องตนในรูปที่10-1คาแรงดันเอาตพุตของ GP2D120ที่ระยะทาง 30เซนติเมตรที่ไฟเลี้ยง +5Vอยูในชวง0.25 ถึง0.55Vโดยคากลางคือ 0.4V ชวงของการเปลี่ยนแปลงแรงดันเอาตพุตที่ระยะทาง 4 เซนติเมตรคือ 2.25V 0.3V11.2 คําเตือนเกี่ยวกับสายสัญญาณของโมดูล GP2D120เนื่องจากโมดูลGPD120มีการจัดขาสัญญาณที่แตกตางจากจุดตอบนแผงวงจรควบคุมของหุนยนตPOP-BOTXT แมวาจะมีรูปรางเหมือนกันก็ตาม ดังนั้นจึงมีการตอสายสัญญาณแบบพิเศษใหแกโมดูล GP2D120 โดยตอกับโมดูลไวแลว ผูใชงานเพียงนําปลายของสายสัญญาณอีกดานหนึ่งตอเขากับจุดตอสัญญาณบนแผงวงจรควบคุมหลักไดเลยโดยตองไมถอดสายสัญญาณที่ติดกับตัวโมดูลและหามเปลี่ยนสายสัญญาณของโมดูลGP2D120สลับกับสายสัญญาณของตัวตรวจจับแบบอื่นๆ เด็ดขาด11.3การอานคาขอมูลจากGP2D120ดวยวงจรแปลงสัญญาณอะนาลอกเปนดิจิตอลคาแรงดันเอาตพุตจากGP2D120จะเปลี่ยนแปลงตามระยะทางที่ตรวจวัดไดเชนวัดแรงดันVoutเทากับ0.5Vจะเทียบเปนระยะทางได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-1dist = getdist(3); // อานคาระยะทางจาก GP2D120 จากชอง An3
    • XT 177ตารางที่11-1แสดงความสัมพันธระหวางระดับแรงดัน Voutของ GP2D120 กับคาจากวงจรแปลงสัญญาณอะนาลอกเปนดิจิตอลและระยะทางที่วัดได(ไดจากการคํานวณ)
    • 178XTXTXT(A16.1.1)นําฉากโลหะ 2x3 รูยึดเขากับรูยึดของโมดูล GP2D120ทั้งสองรู โดยใชสกรู 3x10 มม.และนอต 3มม.ดังรูป(A16.1.2) นําโมดูล GP2D120 ยึดเขากับบริเวณดานหนาของหุนยนต โดยใชสกรู 3x10 มม. และนอต 3 มม.ขันยึดเขากับดานหนาของหุนยนต ดังรูป
    • XT 179(A16.1.3) เสียบสายของโมดูล GP2D120 เขาที่ตําแหนง 20/A2จะไดหุนยนต POP-BOT XT ที่พรอมสําหรับการทําภารกิจตรวจจับวัตถุแบบไมสัมผัสโมดูล GP2D120 ใหผลการตรวจจับเปนแรงดันไฟตรงที่สัมพันธกับระยะทาง การอานคาของหุนยนตPOP-BOTXT จึงตองใชคําสั่งอานคาสัญญาณอะนาลอก หากคาที่อานไดมีคามากแสดงวา อยูใกลวัตถุที่ตรวจจับ ถาคาที่ไดนอยแสดงวาวัตถุอยูไกล อยางไรก็ตาม เพื่อชวยใหหุนยนต POP-BOT XT สามารถอานคาระยะหางจากโมดูล GP2D120 เปนคาในหนวยเซนติเมตร จึงเรียกใชไฟลไลบรารี gp2d120_lib.h(A16.2.1) เปดโปรแกรม Arduino1.0 เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A16-1จุดตอ 20/A2โปรแกรมที่A16-1ไฟลGP2D120_Reading.inoโปรแกรมภาษาC ของ Arduino1.0สําหรับทดสอบอานคาจากโมดูลวัดระยะทางGP2D120ของหุนยนตPOP-BOTXT#include <popxt.h> // ผนวกไฟลไลบรารี่หลัก#include <gp2d120_lib.h>int raw,dist;void setup(){setTextSize(2);glcdMode(1);glcd(1,1,”Press OK”); // แสดงขอความออกหนาจอ GLCDsw_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);}
    • 180XT(A16.2.2) จากนั้นทําการคอมไพล แลวอัปโหลดไปยังหุนยนต POP-BOT XT จากนั้นรันโปรแกรม(A16.2.3) ทดลองนําวัตถุมาวางขวางหนาหุนยนต POP-BOT XT แลวเลื่อนใหเขาใกลหรือหางออกจากโมดูลGP2D120 สังเกตผลการทํางานผานจอแสดงผลของหุนยนต220 F100 FTB6612ATMega32U4100ปรับระยะหางของสิ่งกีดขวางใหเขาใกลและหางออกในชวง 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(); // ตรวจสอบการกดสวิตช OKglcdClear();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-BOTXT ในการตรวจจับวัตถุแบบไมสัมผัส
    • 182XT(A17.4) นําวัตถุมาวางขวางหนาหุนยนต แลวสังเกตการเคลื่อนที่ของหุนยนตเพื่อตรวจจับพบสิ่งกีดขวางเมื่อหุนยนต POP-BOT XT เคลื่อนที่เขาใกลวัตถุมากกวา 10 เซนติเมตร (โดยประมาณ) หุนยนตจะทําการเคลื่อนที่ถอยหลังเปนเวลา 0.3 วินาที ขณะที่ถอยหลังมีการแสดงสถานะที่หนาจอดวยการเปลี่ยนสีพื้นของจอแสดงผลแบบสุม มีดวยกัน 8 สีคือ สีแดง, สีเขียว,สีนํ้าเงิน, สีเหลือง, สีดํา, สีขาว, สีฟา และสีบานเย็น จากนั้นหมุนตัวไปทางซาย 0.6 วินาทีเพื่อเปลี่ยนเสนทางการเคลื่อนที่TB6612100TB6612100TB6612100TB6612100TB661210014 52 3
    • XT 183ในบทนี้นําเสนอการควบคุมเซอรโวมอเตอรของหุนยนตPOP-BOTXT โดยแผงวงจรPOP-XTของหุนยนตสามารถขับเซอรโวมอเตอรได 3 ตัว ผานทางจุดตอพอรต 30 (SV1), 12 (SV2) และ 13 (SV3) ซึ่งเรียกวา เอาตพุตเซอรโวมอเตอร12.1 หลักการทํางานของเซอรโวมอเตอรเซอรโวมอเตอรที่ใชในหุนยนตPOP-BOTXT เปนเซอรโวมอเตอรแบบอะนาลอกขนาดเล็กบางครั้งเรียกวาR/Cเซอรโวมอเตอรโดย R/Cมาจากคําวา RadioControl เนื่องจากในอดีตเซอรโวมอเตอรมักนําไปใชในการขับเคลื่อนกลไกในเครื่องบิน, รถ หรือเรือที่บังคับดวยคลื่นวิทยุ การกําหนดชื่อ R/C เพื่อใหทราบถึงประเภทของงานที่นําเซอรโวมอเตอรนี้ไปใชนั่นเองเซอรโวมอเตอรเปนอุปกรณแมเหล็กไฟฟาแบบหนึ่งที่ใชในการหมุนตัวขับ(actuator)ไปยังตําแหนงตางๆดวยความแมนยําปกติแลวเซอรโวมอเตอรที่ยังไมไดรับการปรับแตงใดๆนั้นจะใชงานกันอยูในรถ,เรือหรือเครื่องบินบังคับวิทยุเพื่อทําหนาที่ควบคุมตําแหนงของอุปกรณเชนการบังคับเลี้ยวของรถบังคับวิทยุหรือใชสําหรับปรับหางเสือของเรือหรือเครื่องบิน ซึ่งงานเหลานี้ตองการแรงบิดของมอเตอรที่สูงพอสมควรดังนั้นเซอรโวมอเตอรจึงมีอัตราทดที่มากพอสมควรเพื่อใหสามารถรองรับงานดังกลาวไดเซอรโวมอเตอรมีมุมในการหมุนมาตรฐานคือ 0ถึง 90องศา และ0ถึง180 องศาปจจุบันนิยมในแบบ 0ถึง180 องศา โดยสามารถดัดแปลงใหหมุนไดครบรอบ 360องศาดวย สายตอใชงานมาตรฐานมี 3 เสนคือ สายสัญญาณ(S), สายไฟเลี้ยง (+V) และสายกราวด (G) โดยในรูปที่ 12-1 แสดงสวนประกอบตางๆ และการจัดขาของปลั๊กหรือคอนเน็กเตอรของเซอรโวมอเตอรXTรูปที่12-1แสดงสวนประกอบของเซอรโวมอเตอรSTANDARDSERVO MOTOR
    • 184XTปจจุบันเซอรโวมอเตอรมีดวยกัน 2 ชนิดหลักๆ คือ ชนิดอะนาลอกและดิจิตอล รูปรางภายนอกของเซอรโวมอเตอรทั้งสองชนิดจะคลายกันมาก ความแตกตางจะอยูที่วงจรควบคุมที่อยูภายใน โดยในชนิดอะนาลอกจะใชวงจรอิเล็กทรอนกสที่ประกอบดวยอุปกรณสารกึ่งตัวนํา จําพวก ทรานซิสเตอร มอสเฟต หรือไอซีออปแอมปเปนหลัก ในขณะที่ชนิดดิจิตอลจะใชไมโครโปรเซสเซอรหรือไมโครคอนโทรลเลอรเปนตัวควบคุมหลัก12.1.1 คอนเน็กตอรของเซอรโวมอเตอรรูปที่12-2 แสดงลักษณะของคอนเน็กเตอรที่ใชในการเชื่อมตอของเซอรโวมอเตอร มีดวยกัน 2 มาตรฐานคือแบบ S และแบบ J การจัดขาจะเหมือนกัน ความแตกตางคือ ลักษณะของคอนเน็กเตอรและการกําหนดสีของสายสัญญาณ สําหรับยี่หอ Futaba ของญี่ปุน กําหนดใหคอนเน็กเตอรแบบ J มีปกยื่นออกมาเพิ่มขึ้นในดานเดียวกับสายสัญญาณและกําหนดใหสายสัญญาณมีสีขาวสวนแบบSสายสัญญาณจะเปนสีขาวและคอนเน็กเตอรจะเรียบเหมือนกันทั้งสองดานของสายเชื่อมตอ สวนสายไฟเลี้ยงเปนสีแดง และสายกราวดเปนสีดําเหมือนกันทั้งสองแบบอยางไรก็ตาม มีความเปนไปไดที่ผูผลิตอื่นๆ อาจกําหนดรูปแบบและสีของสายสัญญาณแตกตางออกไปแตการจัดเรียงตําแหนงจะเหมือนกัน12.1.2โครงสรางของเซอรโวมอเตอรในรูปที่ 12-3 แสดงโครงสรางภายในของเซอรโวมอเตอร สวนประกอบหลักคือ มอเตอรไฟตรงขนาดเล็ก,ชุดเฟองทด, แผงวงจรควบคุม และตัวตานทานปรับคาได (POT : Potentiometer) แกนของมอเตอรไฟตรงจะตอเขากับชุดเฟอง เพื่อลดความเร็วรอบลง สงผลใหแรงบิดที่แกนหมุนมากขึ้น ทั้งหมดทํางานรวมกันภายใตความสัมพันธP = kwgโดยที่ P คือ พลังงานที่ปอนใหแกมอเตอรk คือ คาคงที่w คือ ความเร็วรอบ ในหนวย รอบตอนาที (rpm : round per minute)g คือ แรงบิดหรือทอรค (torque)ถาหากพลังงานที่จายใหคงที่ เมื่อลดความเร็วรอบลง นั่นยอมทําแรงบิดของมอเตอรเพิ่มขึ้นรูปที่12-2ลักษณะคอนเน็กเตอรของเซอรโวมอเตอร
    • 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 มิลลิวินาที
    • 186XTรูปที่12-4แสดงพัลสที่ใชควบคุมเซอรโวมอเตอรSTANDARDSERVO MOTORSTANDARDSERVO MOTORSTANDARDSERVO MOTOR
    • XT 18712.1.4การทํางานของแผงวงจรควบคุมในเซอรโวมอเตอรชนิดอะนาลอกการหมุนของเซอรโวมอเตอรนั้นจะไมไดหมุนเปนอิสระเหมือนมอเตอรทั่วๆ ไป โดยชวงระยะการหมุนปกติจะอยูระหวาง0ถึง180องศาตําแหนงการหมุนของแกนมอเตอรในเซอรโวมอเตอรนี้สามารถควบคุมไดอยางแมนยําเนื่องจากภายในเซอรโวมอเตอรมีวงจรอิเล็กทรอนิกสทําหนาที่ตรวจสอบตําแหนงของเซอรโวมอเตอรอยูตลอดเวลา ลักษณะการตรวจสอบจะใชการปอนกลับคาตําแหนงจากตัวตานทานปรับคาได แลวนําคานี้ไปเปรียบเทียบกับคาพัลสที่ปอนเขาทางขาควบคุม คาของผลตางที่ไดจะไปปรับตําแหนงของมอเตอรจนไมเกิดคาผลตางก็จะไดตําแหนงของมอเตอรที่แมนยําในรูปที่12-5แสดงไดอะแกรมการทํางานของแผงวงจรควบคุมในเซอรโวมอเตอรชนิดอะนาลอกสัญญาณพัลสควบคุมถูกสงเขามาทางอินพุตจะถูกสงไปยังวงจรกําเนิดสัญญาณพัลสภายในดวยโดยมีความกวางที่เปนสัดสวนกับตําแหนงของแกนหมุนในปจจุบันทั้งสัญญาณพัลสที่กําเนิดขึ้นภายในกับสัญญาณพัลสควบคุมจะถูกสงไปยังวงจรเปรียบเทียบเพื่อทําการหักลางสัญญาณโดยทิศทางของสัญญาณจะขึ้นอยูกับวาระหวางสัญญาณพัลสควบคุมทางอินพุตกับสัญญาณพัลสภายใน สัญญาณพัลสใดมีความกวางมากกวา โดยเอาตพุตที่ไดเปนสัญญาณลอจิก“0”หรือ “1”แลวสงไปยังวงจรขับมอเตอรแบบ H-บริดจ เพื่อกําหนดทิศทางการหมุน ทางดานคาความแตกตางที่เกิดขึ้นระหวางพัลสทั้งสองสัญญาณจะถูกสงไปยังวงจรเพิ่มความกวางพัลสเพื่อสรางสัญญาณพัลสสําหรับสงไปขับมอเตอรผานวงจรขับมอเตอรแบบ H-บริดจ โดยความแตกตางของความกวางพัลส 1% ทําใหเกิดสัญญาณพัลสสําหรับขับมอเตอรในระดับ50%และความเร็วนี้จะลดลงเมื่อแกนหมุนของมอเตอรเคลื่อนที่เขาสูตําแหนงที่กําหนดอันเปนผลมาจากความแตกตางของความกวางสัญญาณพัลสเริ่มลดลงและหยุดลงเมื่อสัญญาณพัลสที่นํามาเปรียบเทียบมีคาความกวางเทากันรูปที่12-5ไดอะแกรมการทํางานของแผงวงจรควบคุมในเซอรโวมอเตอรชนิดอะนาลอก
    • 188XT12.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นอกจากนั้นยังมีปจจัยเกี่ยวกับแรงเสียดทานในระบบเฟองภายในเซอรโวมอเตอรการหลอลื่นการเชื่อมโยงระหวางเฟองตอเฟองในชุดเฟองทดที่สงผลใหความเร็วและแรงบิดของเซอรโวมอเตอรเปลี่ยนแปลงไปได12.2ฟงกชั่นสําหรับขับเซอรโวมอเตอรของหุนยนต POP-BOT XTการควบคุมเซอรโวมอเตอรของหุนยนต POP-BOT XT จะใชฟงกชั่นที่อยูในไฟลไลบรารี popxt.h ดังนี้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-BOTXT จากนั้นปดสวิตชปลดสายดาวนโหลดออก(A18.3) ตอเซอรโวมอเตอรเขาที่จุดตอเซอรโวมอเตอร SV1 บนแผงวงจรควบคุม POP-XT โดยสังเกตขั้วตอใหดีสีดําคือขั้วลบ, สีแดงเปนขั้วบวก และสีขาวหรือสีเหลืองเปนสายสัญญาณ (S)(A18.4)เปดสวิตชเพื่อจายไฟใหแกแผงวงจรPOP-XTกดสวิตชOKเพื่อเริ่มการทํางานตามดวยปรับปถุมKNOBบนแผงวงจร POP-XT สังเกตการทํางานของเซอรโวมอเตอรเมื่อหมุนปรับคาของปุม KNOB ที่จอแสดงผลจะแสดงคาของ KNOB และเซอรโวมอเตอรถูกขับใหแกนหมุนไปมาตามทิศทางของการหมุนปุม KNOB
    • 190XT#include <popxt.h> // ผนวกไฟลไลบรารีหลักint x;void setup(){glcdMode(1); // เลือกการแสดงผลโหมด 1 แสดงผลในแนวนอนsetTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทาglcd(1,1,"Press OK"); // แสดงขอความเริ่มตนsw_ok_press(); // ตรวจสอบการกดสวิตช OKglcdClear();}void loop(){x=map(knob(),80,1023,0,180); // อานคาจาก KNOB แปลงเปนคา 0 ถึง 180 เก็บในตัวแปร xglcd(2,1,"Servo = %d ",x); // สงคาตําแหนงของเซอรโวมอเตอรไปแสดงที่หนาจอแสดงผลservo(1,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 มม. ขันยึดดังรูป
    • 192XT(A20.1.3)นําเซอรโวมอเตอรยึดเขาที่ดานหนาของหุนยนต(ดูจากตําแหนงที่วงกลมไว)โดยใชสกรู 3x10มม. อีก2 ตัวกับนอต 3 มม. ขันยึด(A20.1.4) ทําแขนสําหรับตีโดยใชแทงตอลพาสติก 12 รู ยึดกับแกนหมุนของเซอรโวมอเตอร โดยใชสกรูยึดกานหมุนที่ถอดไวจากขั้นตอนที่ (A20.1.2) มาขันยึดแทงตอใหแนน ตอสายของเซอรโวมอเตอรเขาที่จุดตอเอาตพุตเซอรโวมอเตอรชองที่ 1 หรือ SV1 เพียงเทานี้ก็จะไดหุนยนตสําหรับภารกิจ ObjectHitter-BOT
    • XT 193#include <popxt.h> // ผนวกไฟลไลบรารีหลักint L,R,x=0;void setup(){setTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทาglcd(1,1,"Press OK"); // แสดงขอความเริ่มตนglcd(2,1,"to Start");sw_ok_press(); // ตรวจสอบการกดสวิตช OKglcdClear();glcd(1,1,"Let’s go!"); // แสดงขอความพรอมทํางานservo(1,0); // ใหเซอรโวไปอยูที่ตําแหนง 0 องศาsleep(1000);fd(60); // เริ่มตนขับเคลื่อนหุนยนต}void loop(){if(analog(0)<500) // ตรวจสอบวาเจอเสนตัด{ao();servo(1,180); // หมุนเซอรโวไปที่ตําแหนง 180 องศาsleep(1000); // รอใหเซอรโวหมุนไปที่ตําแหนงนั้นservo(1,0); // หมุนเซอรโวกลับมาที่ตําแหนง 0 องศาwhile(1); // หยุดที่นี่}}หลังจากสรางหุนยนตPOP-BOTXTสําหรับภารกิจObjectHitter-BOTเสร็จแลวลําดับตอไปคือการเขียนโปรแกรมเพื่อทดสอบการเลคื่อนที่ตามเสนเพื่อคนหาจุดตัดและควบคุมการทํางานของเซอรโวมอเตอร(A20.2.1) เปดโปรแกรม Arduino IDE เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A20-1(A20.2.2)ทําการคอมไพลแลวอัปโหลดไปยังแผงวงจรควบคุมPOP-XTบนหุนยนตPOP-BOTXT จากนั้นปดสวิตชปลดสายดาวนโหลดออก(A20.2.3) ติดเทปสีดําบนพื้น จากนั้นนําหุนยนตมาวางใหหางเสนประมาณ 30 ซม.(A20.2.4) เปดสวิตชเพื่อจายไฟ แลวกดสวิตช OK ใหหุนยนตเริ่มทํางานหุนยนต POP-BOT XT จะเคลื่อนที่ตรงเขาหาเสนสีดํา เมื่อพบเสน หุนยนตจะหยุดเคลื่อนที่แลวทําการขับเซอรโวมอเตอรใหแกนหมุนเคลื่อนที่ไปยังตําแหนง 180 องศาจากนั้นหมุนกลับมายังตําแหนง 0องศา มีลักษณะอาการคลายกับหุนยนตทําการเหวี่ยงแขนตีโปรแกรมที่A20-1ไฟลServoHitting.inoโปรแกรมภาษาCของArduinoสําหรับควบคุมเซอรโวมอเตอรของหุนยนตPOP-BOTXT ในภารกิจObjectHitter-BOT
    • 194XTหลังจากทดสอบการควบคุมเซอรโวมอเตอรเรียบรอย ลําดับตอไปคือ เขียนโปรแกรมเพื่อปฏิบัติภารกิจโดยสนามของภารกิจนี้แสดงดังรูปSTARTSTOPจากจุด START หุนยนตตองเคลื่อนที่ตามเสน มีสิ่งที่ตองทํา 4 อยางเมื่อตรวจพบ เสนตัดคือ1. เลี้ยวซาย ในทางโปรแกรมตองเขียนใหหุนยนตทํางานดวยฟงกชั่น L90()2. เลี้ยวขวา ในทางโปรแกรมตองเขียนใหหุนยนตทํางานดวยฟงกชั่น R90()3. เดินตรง ในทางโปรแกรมตองเขียนใหหุนยนตทํางานดวยฟงกชั่น FF()4. ตีวัตถุที่วางอยูที่ปลายเสนรูปตัว T แลวหมุนตัวกลับ ในทางโปรแกรมตองเขียนใหหุนยนตทํางานดวยฟงกชั่น hit()เมื่อพิจารณาจากสนามของภารกิจนี้จะพบวาหุนยนตจะเคลื่อนที่และทํางานตามฟงกชั่นเหมือนๆกันทั้ง4 ทางแยกของสนาม ดังนั้นผูพัฒนาโปรแกรมสามารถวนทํางาน4 รอบเพื่อปฏิบัติตามเงื่อนไขได โดยกําหนดตัวแปรขึ้นมาตัวหนึ่ง (y) สําหรับนับการเกิดขึ้นซํ้าของเหตุการณ และกําหนดตัวแปรอีกตัวหนึ่ง (x) สําหรับนับทางแยก ในการทําภารกิจ 1 รอบ จะมีเหตุการณที่เกิดขึ้นเมื่อพบทางแยกดังนี้
    • XT 1951. พบทางแยกครั้งที่หนึ่ง หุนยนตเลี้ยวซาย2. พบทางแยกครั้งที่สอง หุนยนตตีวัตถุ แลวหมุนตัวกลับ จากนั้นเคลื่อนที่ตรง3. พบทางแยกครั้งที่สาม หุนยนตเคลื่อนที่ตรงขามทางแยกไป4. พบทางแยกครั้งที่สี่ หุนยนตตีวัตถุ แลวหมุนตัวกลับ จากนั้นเคลื่อนที่ตรง5. พบทางแยกครั้งที่หา หุนยนตเลี้ยวขวา(A20.3.1) เปดโปรแกรม Arduino IDE เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A20-2(A20.3.2)ทําการคอมไพลแลวอัปโหลดไปยังแผงวงจรควบคุมPOP-XTบนหุนยนต POP-BOTXT จากนั้นปดสวิตชปลดสายดาวนโหลดออก
    • 196XT#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 197void setup(){setTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทาglcd(1,1,"Press OK"); // แสดงขอความเริ่มตนglcd(2,1,"to Start");sw_ok_press(); // ตรวจสอบการกดสวิตช OKglcdClear();glcd(1,1,"Let’s go!"); // แสดงขอความพรอมทํางาน}void loop(){L=analog(0); // เก็บคาตัวตรวจจับเสนดานซายR=analog(1); // เก็บคาตัวตรวจจับเสนดานขวาif (L<500&&R<500) // พบเสนตัดสีดําหรือไม{if(x==5) // ตรวจสอบการนับแยกครบ 1 รอบ{x=0; // ถาครบแลว ทําการเคลียรคาการนับแยกy++; // เพิ่มคาแขนยอยทางแยกif (y==4) // ถาหุนยนตเคลื่อนที่ครบทั้ง 4 แขนของสนาม{ao(); // หยุดการทํางานของหุนยนตservo (1,-1); // หยุดการทํางานของเซอรโวมอเตอรwhile(1);}}x++; // เพิ่มคา x ขึ้นหนึ่งคา เพื่อนับทางแยกif (x==1) // แยกที่ 1 เลี้ยวซาย{L90();}else if(x==2||x==4) // แยกที่ 2 หรือ 4 ตีวัตถุ{hit();}else if (x==3) // แยกที่ 3 เคลื่อนที่ตรงเพื่อขามทางแยก{FF();}else if (x==5) // แยกที่ 5 เลี้ยวขวา{R90();}}
    • 198XTโปรแกรมที่A20-1ไฟลObjectHitterBOT.inoโปรแกรมภาษาCของArduinoสําหรับควบคุมการเคลื่อนที่ตามเสนและขับเซอรโวมอเตอรของหุนยนตPOP-BOTXT ในภารกิจObjectHitter-BOT(A20.3.4) เปดสวิตชเพื่อจายไฟ แลวกดสวิตช OK ใหหุนยนตเริ่มทํางานelse if(L>500&&R>500) // ตรวจสอบวา หุนยนตครอมเสนอยูหรือไม{fd(60); // ถายังครอมเสนอยู ควบคุมใหเคลื่อนที่ตรงตอไปดวยชวงเวลาสั้นๆ}else if(L<500) // ตรวจพบวา หุนยนตเคลื่อนที่เอียงไปทางขวา{sl(60); // หมุนตัวทางซายเล็กนอย เพื่อใหกลับมาครอมเสนsleep(20);}else if(R<500) // ตรวจพบวา หุนยนตเคลื่อนที่เอียงไปทางซาย{sr(60); // หมุนตัวทางขวาเล็กนอย เพื่อใหกลับมาครอมเสนsleep(20);}}หุนยนตจะเคลื่อนที่ตามเสน เมื่อพบจุดตัดแรกจะเลี้ยวซายแลวเคลื่อนที่ตรงไปจนกระทั่งพบทางแยกหรือจุดตัดที่สอง ซึ่งเปนตําแหนงที่ใกลกับวัตถุหุนยนตจะทําการตีวัตถุใหลม แลวหมุนตัวกลับเคลื่อนที่ตรงกลับมาตามเสนทางเดิม จนกระทั่งพบทางแยกที่สามหุนยนตเคลื่อนที่ตรงขามทางแยกไป จากนั้นจะพบทางแยกที่สี่ที่ตําแหนงนี้เปนปลายแขนอีกดานหนึ่งของสนาม ซึ่งมีวัตถุอยูหุนยนตจะทําการตีวัตถุแลวหมุนตัวกลับมาเพื่อ เคลื่อนที่ตรงกลับมา จนกระทั่งพบทางแยกที่หา หุนยนตจะเลี้ยวขวา จากนั้นการทํางานก็จะวนในลักษณะเดิมจนครบทุกแขนของสนาม หุนยนตจะเคลื่อนที่ไปยังจุดSTOP แลวหยุด